/* Ignores (x, y) on input, translates event coordinates to * allocation relative (x, y) of the returned widget. */ static GtkWidget * find_topmost_widget_coords_from_event (GdkEvent *event, gint *x, gint *y) { gint tx, ty; gdouble dx, dy; GtkWidget *tmp; gdk_event_get_coords (event, &dx, &dy); tx = dx; ty = dy; /* Returns coordinates relative to tmp's allocation. */ tmp = find_widget_under_pointer (event->any.window, &tx, &ty); if (!tmp) return NULL; /* Make sure the pointer can actually be on the widget returned. */ if (tx < 0 || tx >= tmp->allocation.width || ty < 0 || ty >= tmp->allocation.height) return NULL; if (x) *x = tx; if (y) *y = ty; return tmp; }
static gboolean gimp_ui_manager_item_key_press (GtkWidget *widget, GdkEventKey *kevent, GimpUIManager *manager) { gchar *help_id = NULL; while (! help_id) { GtkWidget *menu_item = GTK_MENU_SHELL (widget)->active_menu_item; if (! menu_item && GTK_IS_MENU (widget)) { GtkWidget *parent = gtk_widget_get_parent (widget); GdkWindow *window = gtk_widget_get_window (parent); gint x, y; gdk_window_get_pointer (window, &x, &y, NULL); menu_item = find_widget_under_pointer (window, &x, &y); if (menu_item && ! GTK_IS_MENU_ITEM (menu_item)) { menu_item = gtk_widget_get_ancestor (menu_item, GTK_TYPE_MENU_ITEM); if (! GTK_IS_MENU_ITEM (menu_item)) menu_item = NULL; } } /* first, get the help page from the item... */ if (menu_item) { help_id = g_object_get_qdata (G_OBJECT (menu_item), GIMP_HELP_ID); if (help_id && ! strlen (help_id)) help_id = NULL; } /* ...then try the parent menu... */ if (! help_id) { help_id = g_object_get_qdata (G_OBJECT (widget), GIMP_HELP_ID); if (help_id && ! strlen (help_id)) help_id = NULL; } /* ...finally try the menu's parent (if any) */ if (! help_id) { menu_item = NULL; if (GTK_IS_MENU (widget)) menu_item = gtk_menu_get_attach_widget (GTK_MENU (widget)); if (! menu_item) break; widget = gtk_widget_get_parent (menu_item); if (! widget) break; } } /* For any valid accelerator key except F1, continue with the * standard GtkMenuShell callback and assign a new shortcut, but * don't assign a shortcut to the help menu entries ... */ if (kevent->keyval != GDK_KEY_F1) { if (help_id && gtk_accelerator_valid (kevent->keyval, 0) && (strcmp (help_id, GIMP_HELP_HELP) == 0 || strcmp (help_id, GIMP_HELP_HELP_CONTEXT) == 0)) { return TRUE; } return FALSE; } /* ...finally, if F1 was pressed over any menu, show its help page... */ if (help_id) { gchar *help_domain = NULL; gchar *help_string = NULL; gchar *domain_separator; help_id = g_strdup (help_id); domain_separator = strchr (help_id, '?'); if (domain_separator) { *domain_separator = '\0'; help_domain = g_strdup (help_id); help_string = g_strdup (domain_separator + 1); } else { help_string = g_strdup (help_id); } gimp_help (manager->gimp, NULL, help_domain, help_string); g_free (help_domain); g_free (help_string); g_free (help_id); } return TRUE; }
static void gtk_tooltip_show_tooltip (GdkDisplay *display) { gint x, y; GdkScreen *screen; GdkWindow *window; GtkWidget *tooltip_widget; GtkWidget *pointer_widget; GtkTooltip *tooltip; gboolean has_tooltip; gboolean return_value = FALSE; tooltip = g_object_get_data (G_OBJECT (display), "gdk-display-current-tooltip"); if (tooltip->keyboard_mode_enabled) { x = y = -1; pointer_widget = tooltip_widget = tooltip->keyboard_widget; } else { window = tooltip->last_window; if (!GDK_IS_WINDOW (window)) return; gdk_window_get_origin (window, &x, &y); x = tooltip->last_x - x; y = tooltip->last_y - y; pointer_widget = tooltip_widget = find_widget_under_pointer (window, &x, &y); } if (!tooltip_widget) return; g_object_get (tooltip_widget, "has-tooltip", &has_tooltip, NULL); return_value = gtk_tooltip_run_requery (&tooltip_widget, tooltip, &x, &y); if (!return_value) return; if (!tooltip->current_window) { if (gtk_widget_get_tooltip_window (tooltip_widget)) tooltip->current_window = gtk_widget_get_tooltip_window (tooltip_widget); else tooltip->current_window = GTK_WINDOW (GTK_TOOLTIP (tooltip)->window); } screen = gtk_widget_get_screen (tooltip_widget); /* FIXME: should use tooltip->current_window iso tooltip->window */ if (screen != gtk_widget_get_screen (tooltip->window)) { g_signal_handlers_disconnect_by_func (display, gtk_tooltip_display_closed, tooltip); gtk_window_set_screen (GTK_WINDOW (tooltip->window), screen); g_signal_connect (display, "closed", G_CALLBACK (gtk_tooltip_display_closed), tooltip); } gtk_tooltip_position (tooltip, display, tooltip_widget); /* Now a tooltip is visible again on the display, make sure browse * mode is enabled. */ tooltip->browse_mode_enabled = TRUE; if (tooltip->browse_mode_timeout_id) { g_source_remove (tooltip->browse_mode_timeout_id); tooltip->browse_mode_timeout_id = 0; } }