From b55696e551c7dd4a0da38ae9ba893e49318e042b Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 7 Mar 2018 17:59:22 +0100 Subject: gtkmain: Don't use special paths for key event propagation Set the event_widget to the window focus, and let event capture/bubble handling do the rest. --- gtk/gtkmain.c | 59 ++++++++++++----------------------------------------------- 1 file changed, 12 insertions(+), 47 deletions(-) (limited to 'gtk/gtkmain.c') diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 9b0009e59c..6dea428409 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1682,6 +1682,16 @@ gtk_main_do_event (GdkEvent *event) if (is_pointing_event (event)) event_widget = handle_pointing_event (event); + else if (GTK_IS_WINDOW (event_widget) && + (event->any.type == GDK_KEY_PRESS || + event->any.type == GDK_KEY_RELEASE)) + { + GtkWidget *focus_widget; + + focus_widget = gtk_window_get_focus (GTK_WINDOW (event_widget)); + if (focus_widget) + event_widget = focus_widget; + } if (!event_widget) goto cleanup; @@ -2451,59 +2461,14 @@ propagate_event_down (GtkWidget *widget, return handled_event; } -static gboolean -propagate_event (GtkWidget *widget, - GdkEvent *event, - gboolean captured, - GtkWidget *topmost) -{ - gboolean handled_event = FALSE; - gboolean (* propagate_func) (GtkWidget *widget, const GdkEvent *event); - - propagate_func = captured ? _gtk_widget_captured_event : gtk_widget_event; - - if (event->any.type == GDK_KEY_PRESS || event->any.type == GDK_KEY_RELEASE) - { - /* Only send key events within Window widgets to the Window - * The Window widget will in turn pass the - * key event on to the currently focused widget - * for that window. - */ - GtkWidget *window; - - window = gtk_widget_get_toplevel (widget); - if (GTK_IS_WINDOW (window)) - { - g_object_ref (widget); - /* If there is a grab within the window, give the grab widget - * a first crack at the key event - */ - if (widget != window && gtk_widget_has_grab (widget)) - handled_event = propagate_func (widget, event); - - if (!handled_event && - gtk_widget_is_sensitive (window)) - handled_event = propagate_func (window, event); - - g_object_unref (widget); - return handled_event; - } - } - - /* Other events get propagated up/down the widget tree */ - return captured ? - propagate_event_down (widget, event, topmost) : - propagate_event_up (widget, event, topmost); -} - void gtk_propagate_event_internal (GtkWidget *widget, GdkEvent *event, GtkWidget *topmost) { /* Propagate the event down and up */ - if (!propagate_event (widget, event, TRUE, topmost)) - propagate_event (widget, event, FALSE, topmost); + if (!propagate_event_down (widget, event, topmost)) + propagate_event_up (widget, event, topmost); } /** -- cgit v1.2.1