support gtk >= 2.14

This commit is contained in:
wdlkmpx 2020-08-24 19:27:15 +08:00
parent e6328e50a8
commit 54c03a2099
4 changed files with 411 additions and 0 deletions

View File

@ -5,6 +5,7 @@ AM_CPPFLAGS = @GTK_CFLAGS@
bin_PROGRAMS = gmrun
gmrun_SOURCES = \
gtkcompat.c gtkcompat.h \
gtkcompletionline.cc gtkcompletionline.h \
history.cc history.h \
main.cc main.h \

245
src/gtkcompat.c Normal file
View File

@ -0,0 +1,245 @@
/*
* Copyright (C) 2020
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
*/
#include "gtkcompat.h"
/* ================================================== */
/* GTK < 3.0 */
/* ================================================== */
#if ! GTK_CHECK_VERSION (3, 0, 0)
GtkWidget *
gtk_box_new (GtkOrientation orientation, gint spacing)
{
// the HOMOGENEOUS property defaults to FALSE
// add this to make it TRUE
// gtk_box_set_homogeneous (GTK_BOX(hbox), TRUE);
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hbox_new (FALSE, spacing);
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vbox_new (FALSE, spacing);
}
return NULL;
}
GtkWidget *
gtk_button_box_new (GtkOrientation orientation)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hbutton_box_new ();
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vbutton_box_new ();
}
return NULL;
}
GtkWidget *
gtk_scale_new (GtkOrientation orientation, GtkAdjustment *adjustment)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hscale_new (adjustment);
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vscale_new (adjustment);
}
return NULL;
}
GtkWidget *
gtk_scale_new_with_range (GtkOrientation orientation,
gdouble min,
gdouble max,
gdouble step)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hscale_new_with_range (min, max, step);
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vscale_new_with_range (min, max, step);
}
return NULL;
}
GtkWidget *
gtk_separator_new (GtkOrientation orientation)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hseparator_new ();
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vseparator_new ();
}
return NULL;
}
GtkWidget *
gtk_scrollbar_new (GtkOrientation orientation, GtkAdjustment *adjustment)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hscrollbar_new (adjustment);
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vscrollbar_new (adjustment);
}
return NULL;
}
GtkWidget *
gtk_paned_new (GtkOrientation orientation)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL) {
return gtk_hpaned_new ();
}
if (orientation == GTK_ORIENTATION_VERTICAL) {
return gtk_vpaned_new ();
}
return NULL;
}
#endif
/* ================================================== */
/* GTK < 2.22 */
/* ================================================== */
#if ! (GTK_CHECK_VERSION (2, 22, 0))
gboolean gtk_window_has_group (GtkWindow *window)
{
return window->group != NULL;
}
GtkWidget * gtk_window_group_get_current_grab (GtkWindowGroup *window_group)
{
if (window_group->grabs) {
return GTK_WIDGET (window_group->grabs->data);
}
return NULL;
}
#endif
/* ================================================== */
/* GTK < 2.20 */
/* ================================================== */
#if ! (GTK_CHECK_VERSION (2, 20, 0))
void
gtk_widget_set_mapped (GtkWidget *widget, gboolean mapped)
{
if (mapped)
GTK_OBJECT_FLAGS (widget) |= GTK_MAPPED;
else
GTK_OBJECT_FLAGS (widget) &= ~(GTK_MAPPED);
}
void
gtk_widget_set_realized (GtkWidget *widget, gboolean realized)
{
if (realized)
GTK_OBJECT_FLAGS (widget) |= GTK_REALIZED;
else
GTK_OBJECT_FLAGS (widget) &= ~(GTK_REALIZED);
}
GtkWindowType
gtk_window_get_window_type (GtkWindow *window)
{
return (window->type);
}
#endif
/* ================================================== */
/* GTK < 2.18 */
/* ================================================== */
#if ! (GTK_CHECK_VERSION (2, 18, 0))
void gtk_widget_get_allocation (GtkWidget *widget, GtkAllocation *allocation)
{
*allocation = widget->allocation;
}
void gtk_widget_set_allocation (GtkWidget *widget, const GtkAllocation *allocation)
{
widget->allocation = *allocation;
}
void gtk_widget_set_can_default (GtkWidget *widget, gboolean can_default)
{
if (can_default != gtk_widget_get_can_default (widget))
{
if (can_default)
GTK_OBJECT_FLAGS (widget) |= GTK_CAN_DEFAULT;
else
GTK_OBJECT_FLAGS (widget) &= ~(GTK_CAN_DEFAULT);
}
}
void gtk_widget_set_can_focus (GtkWidget *widget, gboolean can_focus)
{
if (can_focus != gtk_widget_get_can_focus (widget))
{
if (can_focus)
GTK_OBJECT_FLAGS (widget) |= GTK_CAN_FOCUS;
else
GTK_OBJECT_FLAGS (widget) &= ~(GTK_CAN_FOCUS);
}
}
void gtk_widget_set_has_window (GtkWidget *widget, gboolean has_window)
{
if (has_window)
GTK_OBJECT_FLAGS (widget) &= ~(GTK_NO_WINDOW);
else
GTK_OBJECT_FLAGS (widget) |= GTK_NO_WINDOW;
}
void gtk_widget_set_visible (GtkWidget *widget, gboolean visible)
{
if (visible)
gtk_widget_show (widget);
else
gtk_widget_hide (widget);
}
#endif
/* ================================================== */
/* GTK < 2.14 */
/* ================================================== */
#if ! (GTK_CHECK_VERSION (2, 14, 0))
GtkWidget * gtk_dialog_get_action_area (GtkDialog *dialog) {
return (dialog->action_area);
}
GtkWidget * gtk_dialog_get_content_area (GtkDialog *dialog) {
return (dialog->vbox);
}
GdkWindow * gtk_widget_get_window (GtkWidget *widget) {
return (widget->window);
}
GtkWidget * gtk_window_get_default_widget (GtkWindow *window) {
return (window->default_widget);
}
#endif

164
src/gtkcompat.h Normal file
View File

@ -0,0 +1,164 @@
/*
* Copyright (C) 2020
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
*/
#ifndef __GTKCOMPAT_H
#define __GTKCOMPAT_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
// ==================================================
// GLIB < 2.58
#if ! GLIB_CHECK_VERSION (2, 58, 0)
#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f))
#endif
// GLIB < 2.32
#if ! GLIB_CHECK_VERSION (2, 32, 0)
#define G_SOURCE_REMOVE FALSE
#define G_SOURCE_CONTINUE TRUE
#define g_hash_table_add(ht, key) g_hash_table_replace(ht, key, key)
#define g_hash_table_contains(ht, key) g_hash_table_lookup_extended(ht, key, NULL, NULL)
#define GRecMutex GStaticRecMutex
#define g_rec_mutex_init(x) g_static_rec_mutex_init(x)
#define g_rec_mutex_lock(x) g_static_rec_mutex_lock(x)
#define g_rec_mutex_unlock(x) g_static_rec_mutex_unlock(x)
#define g_thread_new(name,func,data) g_thread_create(func,data,TRUE,NULL)
#define g_thread_try_new(name,func,data,error) g_thread_create(func,data,TRUE,error)
#endif
// ==================================================
// GTK < 3.0
#if ! GTK_CHECK_VERSION (3, 0, 0)
GtkWidget *gtk_box_new (GtkOrientation orientation, gint spacing) ;
GtkWidget *gtk_button_box_new (GtkOrientation orientation);
GtkWidget *gtk_scale_new (GtkOrientation orientation, GtkAdjustment *adjustment);
GtkWidget *gtk_scale_new_with_range (GtkOrientation orientation, gdouble min, gdouble max, gdouble step);
GtkWidget *gtk_separator_new (GtkOrientation orientation);
GtkWidget *gtk_scrollbar_new (GtkOrientation orientation, GtkAdjustment *adjustment);
GtkWidget *gtk_paned_new (GtkOrientation orientation);
#define gtk_widget_get_allocated_height(widget) ( ((GtkWidget *)(widget))->allocation.height )
#define gtk_widget_get_allocated_width(widget) ( ((GtkWidget *)(widget))->allocation.width )
#endif
// GTK < 2.24
#if ! GTK_CHECK_VERSION (2, 24, 0)
typedef struct _GtkComboBox GtkComboBoxText;
typedef struct _GtkComboBoxClass GtkComboBoxTextClass;
typedef struct _GtkComboBoxPrivate GtkComboBoxTextPrivate;
#define GTK_TYPE_COMBO_BOX_TEXT (gtk_combo_box_get_type ())
#define GTK_COMBO_BOX_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_COMBO_BOX, GtkComboBoxText))
#define GTK_COMBO_BOX_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_COMBO_BOX, GtkComboBoxTextClass))
#define GTK_IS_COMBO_BOX_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_COMBO_BOX))
#define GTK_IS_COMBO_BOX_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COMBO_BOX))
#define GTK_COMBO_BOX_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COMBO_BOX, GtkComboBoxTextClass))
#define gtk_combo_box_text_new() gtk_combo_box_new_text()
#define gtk_combo_box_text_append_text(combo,text) gtk_combo_box_append_text(combo,text)
#define gtk_combo_box_text_insert_text(combox,pos,text) gtk_combo_box_insert_text(combox,pos,text)
#define gtk_combo_box_text_prepend_text(combo,text) gtk_combo_box_prepend_text(combo,text)
#define gtk_combo_box_text_remove(combo,pos) gtk_combo_box_remove_text(combo,pos)
#define gtk_combo_box_text_get_active_text(combo) gtk_combo_box_get_active_text(combo)
#endif
// GTK < 2.22
#if ! (GTK_CHECK_VERSION (2, 22, 0))
gboolean gtk_window_has_group (GtkWindow *window);
GtkWidget * gtk_window_group_get_current_grab (GtkWindowGroup *window_group);
#endif
// GTK < 2.20
#if ! (GTK_CHECK_VERSION (2, 20, 0))
#define gtk_widget_get_mapped(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_MAPPED) != 0)
#define gtk_widget_get_realized(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_REALIZED) != 0)
void gtk_widget_set_mapped (GtkWidget *widget, gboolean mapped);
void gtk_widget_set_realized (GtkWidget *widget, gboolean realized);
GtkWindowType gtk_window_get_window_type (GtkWindow *window);
#endif
// GTK < 2.18
#if ! (GTK_CHECK_VERSION (2, 18, 0))
//GtkStateType gtk_widget_get_state (GtkWidget *widget);
#define gtk_widget_get_state(wid) (GTK_WIDGET (wid)->state)
#define gtk_widget_is_toplevel(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_TOPLEVEL) != 0)
#define gtk_widget_get_has_window(wid) !((GTK_WIDGET_FLAGS (wid) & GTK_NO_WINDOW) != 0)
#define gtk_widget_get_visible(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_VISIBLE) != 0)
#define gtk_widget_is_drawable(wid) (GTK_WIDGET_VISIBLE (wid) && GTK_WIDGET_MAPPED (wid))
#define gtk_widget_get_sensitive(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_SENSITIVE) != 0)
#define gtk_widget_get_can_focus(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_CAN_FOCUS) != 0)
#define gtk_widget_has_focus(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_FOCUS) != 0)
#define gtk_widget_get_can_default(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_CAN_DEFAULT) != 0)
#define gtk_widget_get_receives_default(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_RECEIVES_DEFAULT) != 0)
#define gtk_widget_has_default(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_DEFAULT) != 0)
#define gtk_widget_has_grab(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_GRAB) != 0)
#define gtk_widget_get_app_paintable(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_APP_PAINTABLE) != 0)
#define gtk_widget_get_double_buffered(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_DOUBLE_BUFFERED) != 0)
void gtk_widget_get_allocation (GtkWidget *widget, GtkAllocation *allocation);
void gtk_widget_set_allocation (GtkWidget *widget, const GtkAllocation *allocation);
void gtk_widget_set_can_default (GtkWidget *widget, gboolean can_default);
void gtk_widget_set_can_focus (GtkWidget *widget, gboolean can_focus);
void gtk_widget_set_has_window (GtkWidget *widget, gboolean has_window);
void gtk_widget_set_receives_default (GtkWidget *widget, gboolean receives_default);
void gtk_widget_set_visible (GtkWidget *widget, gboolean visible);
#endif
// GTK < 2.14
#if ! (GTK_CHECK_VERSION (2, 14, 0))
GtkWidget * gtk_dialog_get_action_area (GtkDialog *dialog);
GtkWidget * gtk_dialog_get_content_area (GtkDialog *dialog);
GdkWindow * gtk_widget_get_window (GtkWidget *widget);
GtkWidget * gtk_window_get_default_widget (GtkWindow *window);
#endif
// KEYS
#ifndef GDK_KEY_a
# define GDK_KEY_Control_R GDK_Control_R
# define GDK_KEY_Control_L GDK_Control_L
# define GDK_KEY_Shift_R GDK_Shift_R
# define GDK_KEY_Shift_L GDK_Shift_L
# define GDK_KEY_Alt_R GDK_Alt_R
# define GDK_KEY_Alt_L GDK_Alt_L
# define GDK_KEY_Tab GDK_Tab
# define GDK_KEY_Up GDK_Up
# define GDK_KEY_space GDK_space
# define GDK_KEY_Down GDK_Down
# define GDK_KEY_Return GDK_Return
# define GDK_KEY_exclam GDK_exclam
# define GDK_KEY_R GDK_R
# define GDK_KEY_r GDK_r
# define GDK_KEY_S GDK_S
# define GDK_KEY_s GDK_s
# define GDK_KEY_BackSpace GDK_BackSpace
# define GDK_KEY_Home GDK_Home
# define GDK_KEY_End GDK_End
# define GDK_KEY_Escape GDK_Escape
# define GDK_KEY_G GDK_G
# define GDK_KEY_g GDK_g
# define GDK_KEY_E GDK_E
# define GDK_KEY_e GDK_e
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -12,6 +12,7 @@
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include "gtkcompat.h"
#include <stddef.h>
#include <stdio.h>