61
static GObject * gimp_ui_manager_constructor (GType type,
63
GObjectConstructParam *params);
64
static void gimp_ui_manager_dispose (GObject *object);
65
static void gimp_ui_manager_finalize (GObject *object);
66
static void gimp_ui_manager_set_property (GObject *object,
70
static void gimp_ui_manager_get_property (GObject *object,
74
static void gimp_ui_manager_connect_proxy (GtkUIManager *manager,
77
static GtkWidget * gimp_ui_manager_get_widget (GtkUIManager *manager,
79
static GtkAction * gimp_ui_manager_get_action (GtkUIManager *manager,
81
static void gimp_ui_manager_real_update (GimpUIManager *manager,
82
gpointer update_data);
83
static GimpUIManagerUIEntry *
84
gimp_ui_manager_entry_get (GimpUIManager *manager,
85
const gchar *ui_path);
86
static gboolean gimp_ui_manager_entry_load (GimpUIManager *manager,
87
GimpUIManagerUIEntry *entry,
89
static GimpUIManagerUIEntry *
90
gimp_ui_manager_entry_ensure (GimpUIManager *manager,
92
static void gimp_ui_manager_menu_position (GtkMenu *menu,
96
static void gimp_ui_manager_menu_pos (GtkMenu *menu,
102
gimp_ui_manager_delete_popdown_data (GtkObject *object,
103
GimpUIManager *manager);
104
static void gimp_ui_manager_item_realize (GtkWidget *widget,
105
GimpUIManager *manager);
106
static void gimp_ui_manager_menu_item_select (GtkWidget *widget,
107
GimpUIManager *manager);
108
static void gimp_ui_manager_menu_item_deselect (GtkWidget *widget,
109
GimpUIManager *manager);
110
static gboolean gimp_ui_manager_item_key_press (GtkWidget *widget,
112
GimpUIManager *manager);
61
static GObject * gimp_ui_manager_constructor (GType type,
63
GObjectConstructParam *params);
64
static void gimp_ui_manager_dispose (GObject *object);
65
static void gimp_ui_manager_finalize (GObject *object);
66
static void gimp_ui_manager_set_property (GObject *object,
70
static void gimp_ui_manager_get_property (GObject *object,
74
static void gimp_ui_manager_connect_proxy (GtkUIManager *manager,
77
static GtkWidget *gimp_ui_manager_get_widget (GtkUIManager *manager,
79
static GtkAction *gimp_ui_manager_get_action (GtkUIManager *manager,
81
static void gimp_ui_manager_real_update (GimpUIManager *manager,
82
gpointer update_data);
83
static GimpUIManagerUIEntry *
84
gimp_ui_manager_entry_get (GimpUIManager *manager,
85
const gchar *ui_path);
86
static gboolean gimp_ui_manager_entry_load (GimpUIManager *manager,
87
GimpUIManagerUIEntry *entry,
89
static GimpUIManagerUIEntry *
90
gimp_ui_manager_entry_ensure (GimpUIManager *manager,
92
static void gimp_ui_manager_menu_position (GtkMenu *menu,
96
static void gimp_ui_manager_menu_pos (GtkMenu *menu,
101
static void gimp_ui_manager_delete_popdown_data (GtkObject *object,
102
GimpUIManager *manager);
103
static void gimp_ui_manager_item_realize (GtkWidget *widget,
104
GimpUIManager *manager);
105
static void gimp_ui_manager_menu_item_select (GtkWidget *widget,
106
GimpUIManager *manager);
107
static void gimp_ui_manager_menu_item_deselect (GtkWidget *widget,
108
GimpUIManager *manager);
109
static gboolean gimp_ui_manager_item_key_press (GtkWidget *widget,
111
GimpUIManager *manager);
112
static GtkWidget *find_widget_under_pointer (GdkWindow *window,
115
117
G_DEFINE_TYPE (GimpUIManager, gimp_ui_manager, GTK_TYPE_UI_MANAGER)
1056
/* Stuff below taken from gtktooltip.c
1060
#warning FIXME: remove this crack as soon as a GTK+ widget_under_pointer() is available
1063
struct ChildLocation
1066
GtkWidget *container;
1073
child_location_foreach (GtkWidget *child,
1077
struct ChildLocation *child_loc = data;
1079
/* Ignore invisible widgets */
1080
if (!GTK_WIDGET_DRAWABLE (child))
1083
/* (child_loc->x, child_loc->y) are relative to
1084
* child_loc->container's allocation.
1087
if (!child_loc->child &&
1088
gtk_widget_translate_coordinates (child_loc->container, child,
1089
child_loc->x, child_loc->y,
1092
#ifdef DEBUG_TOOLTIP
1093
g_print ("candidate: %s alloc=[(%d,%d) %dx%d] (%d, %d)->(%d, %d)\n",
1094
gtk_widget_get_name (child),
1095
child->allocation.x,
1096
child->allocation.y,
1097
child->allocation.width,
1098
child->allocation.height,
1099
child_loc->x, child_loc->y,
1101
#endif /* DEBUG_TOOLTIP */
1103
/* (x, y) relative to child's allocation. */
1104
if (x >= 0 && x < child->allocation.width
1105
&& y >= 0 && y < child->allocation.height)
1107
if (GTK_IS_CONTAINER (child))
1109
struct ChildLocation tmp = { NULL, NULL, 0, 0 };
1111
/* Take (x, y) relative the child's allocation and
1116
tmp.container = child;
1118
gtk_container_forall (GTK_CONTAINER (child),
1119
child_location_foreach, &tmp);
1122
child_loc->child = tmp.child;
1124
child_loc->child = child;
1127
child_loc->child = child;
1132
/* Translates coordinates from dest_widget->window relative (src_x, src_y),
1133
* to allocation relative (dest_x, dest_y) of dest_widget.
1136
window_to_alloc (GtkWidget *dest_widget,
1142
/* Translate from window relative to allocation relative */
1143
if (!GTK_WIDGET_NO_WINDOW (dest_widget) && dest_widget->parent)
1146
gdk_window_get_position (dest_widget->window, &wx, &wy);
1148
/* Offset coordinates if widget->window is smaller than
1149
* widget->allocation.
1151
src_x += wx - dest_widget->allocation.x;
1152
src_y += wy - dest_widget->allocation.y;
1156
src_x -= dest_widget->allocation.x;
1157
src_y -= dest_widget->allocation.y;
1167
find_widget_under_pointer (GdkWindow *window,
1171
GtkWidget *event_widget;
1172
struct ChildLocation child_loc = { NULL, NULL, 0, 0 };
1174
gdk_window_get_user_data (window, (void **)&event_widget);
1179
#ifdef DEBUG_TOOLTIP
1180
g_print ("event window %p (belonging to %p (%s)) (%d, %d)\n",
1181
window, event_widget, gtk_widget_get_name (event_widget),
1185
/* Coordinates are relative to event window */
1189
/* We go down the window hierarchy to the widget->window,
1190
* coordinates stay relative to the current window.
1191
* We end up with window == widget->window, coordinates relative to that.
1193
while (window && window != event_widget->window)
1197
gdk_window_get_position (window, &px, &py);
1201
window = gdk_window_get_parent (window);
1204
/* Failing to find widget->window can happen for e.g. a detached handle box;
1205
* chaining ::query-tooltip up to its parent probably makes little sense,
1206
* and users better implement tooltips on handle_box->child.
1207
* so we simply ignore the event for tooltips here.
1212
/* Convert the window relative coordinates to allocation
1213
* relative coordinates.
1215
window_to_alloc (event_widget,
1216
child_loc.x, child_loc.y,
1217
&child_loc.x, &child_loc.y);
1219
if (GTK_IS_CONTAINER (event_widget))
1221
GtkWidget *container = event_widget;
1223
child_loc.container = event_widget;
1224
child_loc.child = NULL;
1226
gtk_container_forall (GTK_CONTAINER (event_widget),
1227
child_location_foreach, &child_loc);
1229
/* Here we have a widget, with coordinates relative to
1230
* child_loc.container's allocation.
1233
if (child_loc.child)
1234
event_widget = child_loc.child;
1235
else if (child_loc.container)
1236
event_widget = child_loc.container;
1238
/* Translate to event_widget's allocation */
1239
gtk_widget_translate_coordinates (container, event_widget,
1240
child_loc.x, child_loc.y,
1241
&child_loc.x, &child_loc.y);
1245
/* We return (x, y) relative to the allocation of event_widget. */
1251
return event_widget;