gtkwindow: Move map/delete/configure event management to gtkmain
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 7 Jun 2018 14:47:44 +0000 (16:47 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 21 Jun 2018 10:54:03 +0000 (12:54 +0200)
Toplevels are about the only widgets interested in these events,
just handle those without going through the capture/bubble handling
code.

gtk/gtkmain.c
gtk/gtkwindow.c
gtk/gtkwindowprivate.h

index 05996399d391e5ec8e37e65f78195d08b9bb7c22..b285c517b6f5e224e1af5c33eccf93c103fb4c2a 100644 (file)
@@ -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))
index a64f7fe417d198c8993f9487ab607c2ea784181d..2c92de19061e0069b87c418a929263fec6260052 100644 (file)
@@ -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)
 {
index bdbb013b278f66511c63c2e9760b25c0215fb5ac..031e90c170cbf0ce334daa632670e6851df217ec 100644 (file)
@@ -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,