125 lines
3.7 KiB
Diff
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
|
|
|