From af6eab850ebea0394d35402f4ac9eb286e9eb835 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 4 Nov 2014 19:26:25 +0100 Subject: [PATCH] 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 file changed, 27 insertions(+), 8 deletions(-) diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index b49dda32fe..a7e23b52d8 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -1283,6 +1283,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, @@ -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); } } }