From 2e932eb688fc6c4faa1f39d103b2813f9a190239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 20 Jan 2022 20:06:02 +0100 Subject: [PATCH] window-list: Track window-created/unmanaged Shell's WindowTracker switched to those signals instead of tracking windows through MetaWorkspace's window-added/removed signals. As ::window-created is only emitted after a window has been added to its workspace, looking up its app on ::window-added now fails because the window isn't tracked yet. Address this by switching to the same signals for window tracking (which is simpler anyway). https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/372 --- extensions/window-list/extension.js | 61 +++++++++-------------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js index 8bca68c2..e122cf5f 100644 --- a/extensions/window-list/extension.js +++ b/extensions/window-list/extension.js @@ -761,10 +761,9 @@ class WindowList extends St.Widget { let workspaceManager = global.workspace_manager; - this._workspaceSignals = new Map(); this._nWorkspacesChangedId = workspaceManager.connect( - 'notify::n-workspaces', this._onWorkspacesChanged.bind(this)); - this._onWorkspacesChanged(); + 'notify::n-workspaces', this._updateWorkspaceIndicatorVisibility.bind(this)); + this._updateWorkspaceIndicatorVisibility(); this._switchWorkspaceId = global.window_manager.connect( 'switch-workspace', this._checkGrouping.bind(this)); @@ -784,6 +783,10 @@ class WindowList extends St.Widget { this._updateKeyboardAnchor(); }); + this._windowSignals = new Map(); + this._windowCreatedId = global.display.connect( + 'window-created', (dsp, win) => this._addWindow(win)); + this._dragBeginId = Main.xdndHandler.connect('drag-begin', this._monitorDrag.bind(this)); this._dragEndId = Main.xdndHandler.connect('drag-end', @@ -906,7 +909,7 @@ class WindowList extends St.Widget { w2.metaWindow.get_stable_sequence(); }); for (let i = 0; i < windows.length; i++) - this._onWindowAdded(null, windows[i].metaWindow); + this._addWindow(windows[i].metaWindow); } else { let apps = this._appSystem.get_running().sort((a1, a2) => { return _getAppStableSequence(a1) - @@ -946,7 +949,7 @@ class WindowList extends St.Widget { child.destroy(); } - _onWindowAdded(ws, win) { + _addWindow(win) { if (!this._grouped) this._checkGrouping(); @@ -957,21 +960,26 @@ class WindowList extends St.Widget { if (children.find(c => c.metaWindow === win)) return; + this._windowSignals.set( + win, win.connect('unmanaged', () => this._removeWindow(win))); + let button = new WindowButton(win, this._perMonitor, this._monitor.index); this._settings.bind('display-all-workspaces', button, 'ignore-workspace', Gio.SettingsBindFlags.GET); this._windowList.add_child(button); } - _onWindowRemoved(ws, win) { + _removeWindow(win) { if (this._grouped) this._checkGrouping(); if (this._grouped) return; - if (win.get_compositor_private()) - return; // not actually removed, just moved to another workspace + const id = this._windowSignals.get(win); + if (id) + win.disconnect(id); + this._windowSignals.delete(id); let children = this._windowList.get_children(); let child = children.find(c => c.metaWindow === win); @@ -979,39 +987,6 @@ class WindowList extends St.Widget { child.destroy(); } - _onWorkspacesChanged() { - let workspaceManager = global.workspace_manager; - let numWorkspaces = workspaceManager.n_workspaces; - - for (let i = 0; i < numWorkspaces; i++) { - let workspace = workspaceManager.get_workspace_by_index(i); - if (this._workspaceSignals.has(workspace)) - continue; - - let signals = { windowAddedId: 0, windowRemovedId: 0 }; - signals._windowAddedId = workspace.connect_after( - 'window-added', this._onWindowAdded.bind(this)); - signals._windowRemovedId = workspace.connect( - 'window-removed', this._onWindowRemoved.bind(this)); - this._workspaceSignals.set(workspace, signals); - } - - this._updateWorkspaceIndicatorVisibility(); - } - - _disconnectWorkspaceSignals() { - let workspaceManager = global.workspace_manager; - let numWorkspaces = workspaceManager.n_workspaces; - - for (let i = 0; i < numWorkspaces; i++) { - let workspace = workspaceManager.get_workspace_by_index(i); - let signals = this._workspaceSignals.get(workspace); - this._workspaceSignals.delete(workspace); - workspace.disconnect(signals._windowAddedId); - workspace.disconnect(signals._windowRemovedId); - } - } - _monitorDrag() { DND.addDragMonitor(this._dragMonitor); } @@ -1075,18 +1050,20 @@ class WindowList extends St.Widget { Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId); this._keyboardVisiblechangedId = 0; - this._disconnectWorkspaceSignals(); global.workspace_manager.disconnect(this._nWorkspacesChangedId); this._nWorkspacesChangedId = 0; global.window_manager.disconnect(this._switchWorkspaceId); this._switchWorkspaceId = 0; + this._windowSignals.forEach((id, win) => win.disconnect(id)); + this._windowSignals.clear(); Main.overview.disconnect(this._overviewShowingId); Main.overview.disconnect(this._overviewHidingId); global.display.disconnect(this._fullscreenChangedId); + global.display.disconnect(this._windowCreatedId); this._stopMonitoringDrag(); Main.xdndHandler.disconnect(this._dragBeginId);