From e2e72966128edf7bdb5376473d5c6755fd09fcaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 14 Sep 2018 19:03:38 +0200 Subject: [PATCH 1/2] window: Move out 'updates frozen' state into implementations Implementation of said state was just related to X11, so move it into window-x11.c. The Wayland path always fell back on the returning TRUE, so just do that for now. https://gitlab.gnome.org/GNOME/mutter/merge_requests/229 --- src/core/window-private.h | 1 + src/core/window.c | 9 +-------- src/wayland/meta-window-wayland.c | 7 +++++++ src/x11/window-x11.c | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/core/window-private.h b/src/core/window-private.h index c47de087aae..26206c3d148 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 a0a986e798a..c51cd29dc09 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 42fcde7b02f..46ee7809586 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -573,6 +573,12 @@ 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) +{ + return FALSE; +} + static void meta_window_wayland_class_init (MetaWindowWaylandClass *klass) { @@ -593,6 +599,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 b2b2c9cb302..4b27892acd2 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 -- GitLab From 7d82cdeea307608c9f4e6442eb4ea64d7dee0c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 14 Sep 2018 19:06:55 +0200 Subject: [PATCH 2/2] window/wayland: Freeze updates until shown Not until the window is shown do we know what monitor it's on, thus the size, so freeze updates (shape etc) until the window is shown. https://gitlab.gnome.org/GNOME/mutter/merge_requests/229 --- src/wayland/meta-window-wayland.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index 46ee7809586..c71cc9a0ba2 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 @@ -576,7 +593,9 @@ meta_window_wayland_is_stackable (MetaWindow *window) static gboolean meta_window_wayland_are_updates_frozen (MetaWindow *window) { - return FALSE; + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + + return !wl_window->has_been_shown; } static void -- GitLab