mutter/0001-window-Add-a-map-inhibit-API.patch
2026-03-13 11:42:28 +01:00

125 lines
3.7 KiB
Diff

From 362fe3dd06395405160114d76b35099ba9e79e2d Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4692>
(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