mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 14:10:30 +00:00
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
This commit is contained in:
parent
964abf7423
commit
af6eab850e
@ -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
|
static void
|
||||||
gdk_window_wayland_move_resize (GdkWindow *window,
|
gdk_window_wayland_move_resize (GdkWindow *window,
|
||||||
gboolean with_move,
|
gboolean with_move,
|
||||||
@ -1305,15 +1331,8 @@ gdk_window_wayland_move_resize (GdkWindow *window,
|
|||||||
|
|
||||||
if (impl->subsurface)
|
if (impl->subsurface)
|
||||||
{
|
{
|
||||||
GdkWindowImplWayland *parent_impl;
|
|
||||||
|
|
||||||
wl_subsurface_set_position (impl->subsurface, x, y);
|
wl_subsurface_set_position (impl->subsurface, x, y);
|
||||||
|
gdk_window_request_transient_parent_commit (window);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user