[gnome-shell/gnome-41] shell/window-tracker: Track ::window-added again
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gnome-41] shell/window-tracker: Track ::window-added again
- Date: Thu, 20 Jan 2022 21:56:23 +0000 (UTC)
commit 2108c5b59e922247e864e707925d44b43299cd52
Author: Florian Müllner <fmuellner gnome org>
Date: Thu Jan 20 20:39:51 2022 +0100
shell/window-tracker: Track ::window-added again
Switching from ::window-added to ::window-created broke extensions
that look up a window's app on ::window-added, as that signal is
emitted before ::window-created and the window is therefore not
tracked yet.
For the upcoming release we can expect extensions to adjust to the
change, but for stable branches it is better to unbreak extensions
by tracking ::window-added again.
This partially reverts commit 973c2599f6a644d6febbb.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2119>
src/shell-window-tracker.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
---
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
index 7ef94e7591..bc15c2d812 100644
--- a/src/shell-window-tracker.c
+++ b/src/shell-window-tracker.c
@@ -560,6 +560,17 @@ static void
on_window_created (MetaDisplay *display,
MetaWindow *window,
gpointer user_data)
+{
+ ShellWindowTracker *self = user_data;
+
+ if (!g_hash_table_contains (self->window_to_app, window))
+ track_window (self, window);
+}
+
+static void
+shell_window_tracker_on_window_added (MetaWorkspace *workspace,
+ MetaWindow *window,
+ gpointer user_data)
{
track_window (SHELL_WINDOW_TRACKER (user_data), window);
}
@@ -602,15 +613,48 @@ load_initial_windows (ShellWindowTracker *tracker)
}
}
+static void
+shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_manager,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
+ GList *workspaces;
+ GList *l;
+
+ workspaces = meta_workspace_manager_get_workspaces (workspace_manager);
+ for (l = workspaces; l; l = l->next)
+ {
+ MetaWorkspace *workspace = l->data;
+
+ /* This pair of disconnect/connect is idempotent if we were
+ * already connected, while ensuring we get connected for
+ * new workspaces.
+ */
+ g_signal_handlers_disconnect_by_func (workspace,
+ shell_window_tracker_on_window_added,
+ self);
+
+ g_signal_connect (workspace, "window-added",
+ G_CALLBACK (shell_window_tracker_on_window_added), self);
+ }
+}
+
static void
init_window_tracking (ShellWindowTracker *self)
{
MetaDisplay *display = shell_global_get_display (shell_global_get ());
+ MetaWorkspaceManager *workspace_manager =
+ meta_display_get_workspace_manager (display);
+ g_signal_connect (workspace_manager, "notify::n-workspaces",
+ G_CALLBACK (shell_window_tracker_on_n_workspaces_changed), self);
g_signal_connect (display, "notify::focus-window",
G_CALLBACK (on_focus_window_changed), self);
g_signal_connect(display, "window-created",
G_CALLBACK (on_window_created), self);
+
+ shell_window_tracker_on_n_workspaces_changed (workspace_manager, NULL, self);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]