From 362fe3dd06395405160114d76b35099ba9e79e2d Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 30 Sep 2025 14:35:37 +0200 Subject: [PATCH 1/7] window: Add a map inhibit API A compositor (such as GNOME Kiosk) may need to prevent windows from showing on screen for various reasons, yet there is no appropriate API to tell mutter that a window that could be mapped on screen should not actually show up. To solve that problem, add a new API that allows to caller to inhibit mapping windows. Part-of: (cherry picked from commit 6f77df353a48dc394e1921d29bfd1175ffd09575) --- src/core/window.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++- src/meta/window.h | 9 ++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/core/window.c b/src/core/window.c index 8f44f60d22..b7b62fbda5 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -191,6 +191,8 @@ typedef struct _MetaWindowPrivate gboolean is_queued; guint idle_handle_id; } auto_maximize; + + unsigned int mapped_inhibit_count; } MetaWindowPrivate; G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaWindow, meta_window, G_TYPE_OBJECT, @@ -1757,6 +1759,7 @@ meta_window_showing_on_its_workspace (MetaWindow *window) gboolean showing; gboolean is_desktop_or_dock; MetaWorkspace *workspace_of_window; + MetaWindowPrivate *priv = meta_window_get_instance_private (window); showing = TRUE; @@ -1764,7 +1767,11 @@ meta_window_showing_on_its_workspace (MetaWindow *window) if (window->minimized) showing = FALSE; - /* 2. See if we're in "show desktop" mode */ + /* 2. See if mapping state is inhibited */ + if (priv->mapped_inhibit_count > 0) + showing = FALSE; + + /* 3. See if we're in "show desktop" mode */ is_desktop_or_dock = FALSE; is_desktop_or_dock_foreach (window, &is_desktop_or_dock); @@ -8700,3 +8707,49 @@ meta_window_show_in_window_list (MetaWindow *window) window->skip_from_window_list = FALSE; meta_window_recalc_features (window); } + +/** + * meta_window_inhibit_mapped + * @window: A #MetaWindow + * + * Inhibits the mapped state of the window. + */ +void +meta_window_inhibit_mapped (MetaWindow *window) +{ + MetaWindowPrivate *priv = meta_window_get_instance_private (window); + + if (++priv->mapped_inhibit_count == 1) + meta_window_queue (window, META_QUEUE_CALC_SHOWING); +} + +/** + * meta_window_uninhibit_mapped + * @window: A #MetaWindow + * + * Uninhibits the mapped state of the window. + */ +void +meta_window_uninhibit_mapped (MetaWindow *window) +{ + MetaWindowPrivate *priv = meta_window_get_instance_private (window); + + g_return_if_fail (priv->mapped_inhibit_count > 0); + + if (--priv->mapped_inhibit_count == 0) + meta_window_queue (window, META_QUEUE_CALC_SHOWING); +} + +/** + * meta_window_is_mapped_inhibited + * @window: A #MetaWindow + * + * Returns whether the mapped state of the window is inhibited. + */ +gboolean +meta_window_is_mapped_inhibited (MetaWindow *window) +{ + MetaWindowPrivate *priv = meta_window_get_instance_private (window); + + return priv->mapped_inhibit_count > 0; +} diff --git a/src/meta/window.h b/src/meta/window.h index 9670987843..4f6390f0a1 100644 --- a/src/meta/window.h +++ b/src/meta/window.h @@ -460,3 +460,12 @@ void meta_window_set_maximize_flags (MetaWindow *window, META_EXPORT void meta_window_set_unmaximize_flags (MetaWindow *window, MetaMaximizeFlags directions); + +META_EXPORT +void meta_window_inhibit_mapped (MetaWindow *window); + +META_EXPORT +void meta_window_uninhibit_mapped (MetaWindow *window); + +META_EXPORT +gboolean meta_window_is_mapped_inhibited (MetaWindow *window); -- 2.53.0