From 84250bbf8860de5930baf946cdde1768d1a726fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Sun, 6 May 2018 17:17:33 +0200 Subject: [PATCH] altTab: Don't return from _init() if there are no windows/apps If a new SwitcherPopup is created and there are no windows or apps to switch through found, instead of returning from _init(), still initialize the SwitcherPopup and let the check in SwitcherPopup.show() return false to terminate the popup. In both cases, with or without the return statements, WindowManager._startSwitcher() will call SwicherPopup.destroy(), which will try to disconnect signal handlers, destroy actors etc. Now if the constructor can't finish creating the popup, some of the functions called from _onDestroy() will fail and throw errors. One of those cases is when window-switcher is limited to the current workspace, and a WindowCyclerPopup is initiated on an empty workspace. Because this._highlight hasn't been created, _onDestroy() will fail when trying to destroy the actor of this._highlight. Also, the actor of this._switcherList will not get destroyed in case show() returns because this._items is empty. For example, this will happen when a new AppSwitcherPopup is initialized with at least 1 running app, but 0 windows on the active workspace. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/168 --- js/ui/altTab.js | 9 --------- js/ui/switcherPopup.js | 5 +++++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/js/ui/altTab.js b/js/ui/altTab.js index 1e4cbc453..06b8d7974 100644 --- a/js/ui/altTab.js +++ b/js/ui/altTab.js @@ -64,9 +64,6 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup { let apps = Shell.AppSystem.get_default().get_running(); - if (apps.length == 0) - return; - this._switcherList = new AppSwitcher(apps, this); this._items = this._switcherList.icons; } @@ -481,9 +478,6 @@ var CyclerPopup = GObject.registerClass({ this._items = this._getWindows(); - if (this._items.length == 0) - return; - this._highlight = new CyclerHighlight(); global.window_group.add_actor(this._highlight); @@ -559,9 +553,6 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup { let windows = this._getWindowList(); - if (windows.length == 0) - return; - let mode = this._settings.get_enum('app-icon-mode'); this._switcherList = new WindowSwitcher(windows, mode); this._items = this._switcherList.icons; diff --git a/js/ui/switcherPopup.js b/js/ui/switcherPopup.js index 945f4020a..d1322106e 100644 --- a/js/ui/switcherPopup.js +++ b/js/ui/switcherPopup.js @@ -330,6 +330,11 @@ var SwitcherPopup = GObject.registerClass({ GLib.source_remove(this._initialDelayTimeoutId); if (this._noModsTimeoutId != 0) GLib.source_remove(this._noModsTimeoutId); + + // Make sure the SwitcherList is always destroyed, it may not be + // a child of the actor at this point. + if (this._switcherList) + this._switcherList.destroy(); } _select(num) {