[gtk+] wayland: Schedule a clock tick instead of wl_surface_commit()ting directly



commit af6eab850ebea0394d35402f4ac9eb286e9eb835
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Nov 4 19:26:25 2014 +0100

    wayland: Schedule a clock tick instead of wl_surface_commit()ting directly
    
    Instead of possibly calling wl_surface_commit() out of
    GdkFrameClock::after-paint, tick the transient parent clock so ::after-paint
    can be eventually run.
    
    This ensures that the subsurface coordinates (considered part of the state
    of the parent) aren't committed untimely, and guaranteed to be orderly with
    the wl_subsurface-relative state.
    
    This is a gtk-side fix for https://bugzilla.gnome.org/show_bug.cgi?id=738887

 gdk/wayland/gdkwindow-wayland.c |   35 +++++++++++++++++++++++++++--------
 1 files changed, 27 insertions(+), 8 deletions(-)
---
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index b49dda3..a7e23b5 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -1284,6 +1284,32 @@ gdk_window_wayland_restack_toplevel (GdkWindow *window,
 }
 
 static void
+gdk_window_request_transient_parent_commit (GdkWindow *window)
+{
+  GdkWindowImplWayland *window_impl, *impl;
+  GdkFrameClock *frame_clock;
+
+  window_impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+  if (!window_impl->transient_for)
+    return;
+
+  impl = GDK_WINDOW_IMPL_WAYLAND (window_impl->transient_for->impl);
+
+  if (!impl->surface || impl->pending_commit)
+    return;
+
+  frame_clock = gdk_window_get_frame_clock (window_impl->transient_for);
+
+  if (!frame_clock)
+    return;
+
+  impl->pending_commit = TRUE;
+  gdk_frame_clock_request_phase (frame_clock,
+                                 GDK_FRAME_CLOCK_PHASE_AFTER_PAINT);
+}
+
+static void
 gdk_window_wayland_move_resize (GdkWindow *window,
                                 gboolean   with_move,
                                 gint       x,
@@ -1305,15 +1331,8 @@ gdk_window_wayland_move_resize (GdkWindow *window,
 
           if (impl->subsurface)
             {
-              GdkWindowImplWayland *parent_impl;
-
               wl_subsurface_set_position (impl->subsurface, x, y);
-
-              g_assert (impl->transient_for != NULL);
-              parent_impl = GDK_WINDOW_IMPL_WAYLAND (impl->transient_for->impl);
-
-              if (parent_impl->surface && !parent_impl->pending_commit)
-                wl_surface_commit (parent_impl->surface);
+              gdk_window_request_transient_parent_commit (window);
             }
         }
     }


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