diff --git a/src/core/window-private.h b/src/core/window-private.h index c47de087aae2fe7d55b5f620a27b9d9b41a71d8e..26206c3d14852e69d108c1e4a86f4aac9a373c7e 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -565,6 +565,7 @@ struct _MetaWindowClass gboolean (*shortcuts_inhibited) (MetaWindow *window, ClutterInputDevice *source); gboolean (*is_stackable) (MetaWindow *window); + gboolean (*are_updates_frozen) (MetaWindow *window); }; /* These differ from window->has_foo_func in that they consider diff --git a/src/core/window.c b/src/core/window.c index a0a986e798a0756ea2088aeab8cc04e38448ace4..c51cd29dc09318ade806f77ec4ee2771af62b630 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -3743,14 +3743,7 @@ meta_window_activate_with_workspace (MetaWindow *window, gboolean meta_window_updates_are_frozen (MetaWindow *window) { - if (window->extended_sync_request_counter && - window->sync_request_serial % 2 == 1) - return TRUE; - - if (window->sync_request_serial < window->sync_request_wait_serial) - return TRUE; - - return FALSE; + return META_WINDOW_GET_CLASS (window)->are_updates_frozen (window); } static void diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index 42fcde7b02f41417929774e1cafd137cdc2d8264..c71cc9a0ba2a621799d96c71591cf04345ef6d6c 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -57,6 +57,8 @@ struct _MetaWindowWayland int last_sent_y; int last_sent_width; int last_sent_height; + + gboolean has_been_shown; }; struct _MetaWindowWaylandClass @@ -538,6 +540,19 @@ appears_focused_changed (GObject *object, surface_state_changed (window); } +static void +on_window_shown (MetaWindow *window) +{ + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + gboolean has_been_shown; + + has_been_shown = wl_window->has_been_shown; + wl_window->has_been_shown = TRUE; + + if (!has_been_shown) + meta_compositor_sync_updates_frozen (window->display->compositor, window); +} + static void meta_window_wayland_init (MetaWindowWayland *wl_window) { @@ -547,6 +562,8 @@ meta_window_wayland_init (MetaWindowWayland *wl_window) g_signal_connect (window, "notify::appears-focused", G_CALLBACK (appears_focused_changed), NULL); + g_signal_connect (window, "shown", + G_CALLBACK (on_window_shown), NULL); } static void @@ -573,6 +590,14 @@ meta_window_wayland_is_stackable (MetaWindow *window) return meta_wayland_surface_get_buffer (window->surface) != NULL; } +static gboolean +meta_window_wayland_are_updates_frozen (MetaWindow *window) +{ + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + + return !wl_window->has_been_shown; +} + static void meta_window_wayland_class_init (MetaWindowWaylandClass *klass) { @@ -593,6 +618,7 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass) window_class->force_restore_shortcuts = meta_window_wayland_force_restore_shortcuts; window_class->shortcuts_inhibited = meta_window_wayland_shortcuts_inhibited; window_class->is_stackable = meta_window_wayland_is_stackable; + window_class->are_updates_frozen = meta_window_wayland_are_updates_frozen; } MetaWindow * diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index b2b2c9cb302c2f83f2f4938216c3e63d5020124b..4b27892acd210b19f9ccd785754d33e8bca2d8b9 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -1577,6 +1577,19 @@ meta_window_x11_is_stackable (MetaWindow *window) return !window->override_redirect; } +static gboolean +meta_window_x11_are_updates_frozen (MetaWindow *window) +{ + if (window->extended_sync_request_counter && + window->sync_request_serial % 2 == 1) + return TRUE; + + if (window->sync_request_serial < window->sync_request_wait_serial) + return TRUE; + + return FALSE; +} + static void meta_window_x11_class_init (MetaWindowX11Class *klass) { @@ -1601,6 +1614,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass) window_class->force_restore_shortcuts = meta_window_x11_force_restore_shortcuts; window_class->shortcuts_inhibited = meta_window_x11_shortcuts_inhibited; window_class->is_stackable = meta_window_x11_is_stackable; + window_class->are_updates_frozen = meta_window_x11_are_updates_frozen; } void