[gtk/wip/matthiasc/popup5: 141/152] surface: Make only toplevels control events



commit fcb4a8b8d9e81a8a5437865a2ecf28136d69fe50
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed May 22 20:58:24 2019 +0000

    surface: Make only toplevels control events
    
    There is no need for popups to connect to the frame
    clock to pause and unpause events on the display -
    the toplevel already does it.
    
    And don't connect to paint either - handle paint
    on popups recursively.

 gdk/gdksurface.c | 62 ++++++++++++++++++++++++++++++++------------------------
 1 file changed, 35 insertions(+), 27 deletions(-)
---
diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c
index 9cf784f1b1..8c123ef4e3 100644
--- a/gdk/gdksurface.c
+++ b/gdk/gdksurface.c
@@ -1365,9 +1365,8 @@ static void
 gdk_surface_paint_on_clock (GdkFrameClock *clock,
                             void          *data)
 {
-  GdkSurface *surface;
-
-  surface = GDK_SURFACE (data);
+  GdkSurface *surface = GDK_SURFACE (data);
+  GList *l;
 
   g_return_if_fail (GDK_IS_SURFACE (surface));
 
@@ -1388,6 +1387,9 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock,
       gdk_surface_remove_update_surface (surface);
     }
 
+  for (l = surface->children; l; l = l->next)
+    gdk_surface_paint_on_clock (clock, l->data);
+
   g_object_unref (surface);
 }
 
@@ -3823,34 +3825,40 @@ gdk_surface_set_frame_clock (GdkSurface     *surface,
   if (clock)
     {
       g_object_ref (clock);
-      g_signal_connect (G_OBJECT (clock),
-                        "flush-events",
-                        G_CALLBACK (gdk_surface_flush_events),
-                        surface);
-      g_signal_connect (G_OBJECT (clock),
-                        "paint",
-                        G_CALLBACK (gdk_surface_paint_on_clock),
-                        surface);
-      g_signal_connect (G_OBJECT (clock),
-                        "resume-events",
-                        G_CALLBACK (gdk_surface_resume_events),
-                        surface);
+      if (surface->parent == NULL)
+        {
+          g_signal_connect (G_OBJECT (clock),
+                            "flush-events",
+                            G_CALLBACK (gdk_surface_flush_events),
+                            surface);
+          g_signal_connect (G_OBJECT (clock),
+                            "resume-events",
+                            G_CALLBACK (gdk_surface_resume_events),
+                            surface);
+          g_signal_connect (G_OBJECT (clock),
+                            "paint",
+                            G_CALLBACK (gdk_surface_paint_on_clock),
+                            surface);
+        }
     }
 
   if (surface->frame_clock)
     {
-      if (surface->frame_clock_events_paused)
-        gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface));
-
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_flush_events),
-                                            surface);
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_paint_on_clock),
-                                            surface);
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_resume_events),
-                                            surface);
+      if (surface->parent == NULL)
+        {
+          if (surface->frame_clock_events_paused)
+            gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface));
+
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_flush_events),
+                                                surface);
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_resume_events),
+                                                surface);
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_paint_on_clock),
+                                                surface);
+        }
       g_object_unref (surface->frame_clock);
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]