From ca08cf94d3f677b088efc9e7f9f048f5c4f85980 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 7 Jun 2018 16:47:44 +0200 Subject: gtkwindow: Move map/delete/configure event management to gtkmain Toplevels are about the only widgets interested in these events, just handle those without going through the capture/bubble handling code. --- gtk/gtkmain.c | 36 +++++++++++++++++++++++++---- gtk/gtkwindow.c | 62 ++++++-------------------------------------------- gtk/gtkwindowprivate.h | 5 ++++ 3 files changed, 43 insertions(+), 60 deletions(-) diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 05996399d3..b285c517b6 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1788,9 +1788,13 @@ gtk_main_do_event (GdkEvent *event) case GDK_DELETE: g_object_ref (event_widget); - if ((!gtk_window_group_get_current_grab (window_group) || gtk_widget_get_toplevel (gtk_window_group_get_current_grab (window_group)) == event_widget) && - !gtk_widget_event (event_widget, event)) - gtk_widget_destroy (event_widget); + if (!gtk_window_group_get_current_grab (window_group) || + gtk_widget_get_toplevel (gtk_window_group_get_current_grab (window_group)) == event_widget) + { + if (!GTK_IS_WINDOW (event_widget) || + !gtk_window_emit_close_request (GTK_WINDOW (event_widget))) + gtk_widget_destroy (event_widget); + } g_object_unref (event_widget); break; @@ -1813,9 +1817,31 @@ gtk_main_do_event (GdkEvent *event) gtk_widget_render (event_widget, event->any.surface, event->expose.region); break; - case GDK_FOCUS_CHANGE: - case GDK_CONFIGURE: case GDK_MAP: + if (GTK_IS_WINDOW (event_widget) && !_gtk_widget_get_mapped (event_widget)) + { + /* we should be be unmapped, but are getting a MapEvent, this may happen + * to toplevel XWindows if mapping was intercepted by a window manager + * and an unmap request occurred while the MapRequestEvent was still + * being handled. we work around this situation here by re-requesting + * the window being unmapped. more details can be found in: + * http://bugzilla.gnome.org/show_bug.cgi?id=316180 + */ + gdk_surface_hide (_gtk_widget_get_surface (event_widget)); + } + break; + + case GDK_CONFIGURE: + if (GTK_IS_WINDOW (event_widget) && + _gtk_widget_get_surface (event_widget) == event->any.surface) + { + gtk_window_configure (GTK_WINDOW (event_widget), + event->configure.width, + event->configure.height); + } + + break; + case GDK_FOCUS_CHANGE: case GDK_UNMAP: case GDK_GRAB_BROKEN: if (!_gtk_widget_captured_event (event_widget, event)) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index a64f7fe417..2c92de1906 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -429,11 +429,6 @@ static void gtk_window_size_allocate (GtkWidget *widget, const GtkAllocation *allocation, int baseline); static gboolean gtk_window_close_request (GtkWindow *window); -static gboolean gtk_window_emit_close_request (GtkWindow *window); -static gboolean gtk_window_configure_event (GtkWidget *widget, - GdkEvent *event); -static gboolean gtk_window_event (GtkWidget *widget, - GdkEvent *event); static void gtk_window_focus_in (GtkWidget *widget); static void gtk_window_focus_out (GtkWidget *widget); static void surface_state_changed (GtkWidget *widget); @@ -805,7 +800,6 @@ gtk_window_class_init (GtkWindowClass *klass) widget_class->realize = gtk_window_realize; widget_class->unrealize = gtk_window_unrealize; widget_class->size_allocate = gtk_window_size_allocate; - widget_class->event = gtk_window_event; widget_class->focus = gtk_window_focus; widget_class->move_focus = gtk_window_move_focus; widget_class->measure = gtk_window_measure; @@ -1603,12 +1597,8 @@ drag_gesture_update_cb (GtkGestureDrag *gesture, GdkEventSequence *sequence; gdouble start_x, start_y; gint x_root, y_root; - const GdkEvent *event; - GtkWidget *event_widget; sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - event_widget = gtk_get_event_target (event); if (gtk_event_controller_get_propagation_phase (GTK_EVENT_CONTROLLER (gesture)) == GTK_PHASE_CAPTURE) { @@ -5922,7 +5912,7 @@ gtk_window_close_request (GtkWindow *window) return FALSE; } -static gboolean +gboolean gtk_window_emit_close_request (GtkWindow *window) { GtkWindowPrivate *priv = gtk_window_get_instance_private (window); @@ -7204,12 +7194,13 @@ gtk_window_size_allocate (GtkWidget *widget, gtk_widget_size_allocate (child, &child_allocation, -1); } -static gboolean -gtk_window_configure_event (GtkWidget *widget, - GdkEvent *event) +gboolean +gtk_window_configure (GtkWindow *window, + guint width, + guint height) { GtkAllocation allocation; - GtkWindow *window = GTK_WINDOW (widget); + GtkWidget *widget = GTK_WIDGET (window); GtkWindowPrivate *priv = gtk_window_get_instance_private (window); check_scale_changed (window); @@ -7217,9 +7208,6 @@ gtk_window_configure_event (GtkWidget *widget, if (!_gtk_widget_is_toplevel (widget)) return FALSE; - if (_gtk_widget_get_surface (widget) != event->any.surface) - return TRUE; - /* If this is a gratuitous ConfigureNotify that's already * the same as our allocation, then we can fizzle it out. * This is the case for dragging windows around. @@ -7230,8 +7218,7 @@ gtk_window_configure_event (GtkWidget *widget, */ _gtk_widget_get_allocation (widget, &allocation); if (priv->configure_request_count == 0 && - (allocation.width == ((GdkEventConfigure *)event)->width && - allocation.height == ((GdkEventConfigure *)event)->height)) + (allocation.width == width && allocation.height == height)) { return TRUE; } @@ -7459,41 +7446,6 @@ get_active_region_type (GtkWindow *window, gint x, gint y) return GTK_WINDOW_REGION_CONTENT; } -static gboolean -gtk_window_event (GtkWidget *widget, - GdkEvent *event) -{ - GdkEventType event_type; - - event_type = gdk_event_get_event_type (event); - - if (event_type == GDK_DELETE) - { - if (gtk_window_emit_close_request (GTK_WINDOW (widget))) - return GDK_EVENT_STOP; - } - else if (event_type == GDK_MAP) - { - if (!_gtk_widget_get_mapped (widget)) - { - /* we should be be unmapped, but are getting a MapEvent, this may happen - * to toplevel XWindows if mapping was intercepted by a window manager - * and an unmap request occoured while the MapRequestEvent was still - * being handled. we work around this situaiton here by re-requesting - * the window being unmapped. more details can be found in: - * http://bugzilla.gnome.org/show_bug.cgi?id=316180 - */ - gdk_surface_hide (_gtk_widget_get_surface (widget)); - } - } - else if (event_type == GDK_CONFIGURE) - { - return gtk_window_configure_event (widget, event); - } - - return GDK_EVENT_PROPAGATE; -} - static void gtk_window_real_activate_default (GtkWindow *window) { diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h index bdbb013b27..031e90c170 100644 --- a/gtk/gtkwindowprivate.h +++ b/gtk/gtkwindowprivate.h @@ -60,6 +60,11 @@ typedef void (*GtkWindowKeysForeachFunc) (GtkWindow *window, gboolean is_mnemonic, gpointer data); +gboolean gtk_window_emit_close_request (GtkWindow *window); +gboolean gtk_window_configure (GtkWindow *window, + guint width, + guint height); + /* --- internal (GtkAcceleratable) --- */ gboolean _gtk_window_query_nonaccels (GtkWindow *window, guint accel_key, -- cgit v1.2.1