[gtk+/wip/garnacho/window-dragging: 1/7] wayland: Thaw the clock if we hide a GdkWindow mid-frame



commit bd268bd4d21d01c682b7f1bb59f4e23edb016aac
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Feb 25 14:46:54 2015 +0100

    wayland: Thaw the clock if we hide a GdkWindow mid-frame
    
    When a window is hidden, its surface and all its roles are destroyed,
    if this happens when we already issued a wl_surface_commit and are
    awaiting for a frame callback, the clock will remain frozen for the
    next time the window is shown.
    
    To avoid this, keep track of the wl_surface_frame() calls issued,
    and ensure the clock is thawed after hiding. If we happen to receive
    the frame callback, it is just ignored.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=743427

 gdk/wayland/gdkwindow-wayland.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 23d6d08..d10b152 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -107,6 +107,7 @@ struct _GdkWindowImplWayland
   unsigned int mapped : 1;
   unsigned int use_custom_surface : 1;
   unsigned int pending_commit : 1;
+  unsigned int awaiting_frame : 1;
   GdkWindowTypeHint hint;
   GdkWindow *transient_for;
 
@@ -320,6 +321,10 @@ frame_callback (void               *data,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
+  if (!impl->awaiting_frame)
+    return;
+
+  impl->awaiting_frame = FALSE;
   _gdk_frame_clock_thaw (clock);
 
   timings = gdk_frame_clock_get_timings (clock, impl->pending_frame_counter);
@@ -397,6 +402,7 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
 
   impl->pending_commit = FALSE;
   impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
+  impl->awaiting_frame = TRUE;
 
   callback = wl_surface_frame (impl->surface);
   wl_callback_add_listener (callback, &frame_listener, window);
@@ -1238,6 +1244,12 @@ gdk_wayland_window_hide_surface (GdkWindow *window)
           impl->subsurface = NULL;
         }
 
+      if (impl->awaiting_frame)
+        {
+          impl->awaiting_frame = FALSE;
+          _gdk_frame_clock_thaw (gdk_window_get_frame_clock (window));
+        }
+
       wl_surface_destroy (impl->surface);
       impl->surface = NULL;
 


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