workspaceThumbnail: Update monitor index on 'monitors-changed'

For the primary monitor workspace thumbnail, we must keep the monitor
index in sync with what is currently the primary monitor index,
otherwise we might end up trying to move windows to non-existing
monitors.

For example, if the primary monitor index was 1 when the thumbnail box
was created, but later, the primary monitor index changed to 0, with the
other monitor being turned off, moving a window to one of the workspaces
on the workspace thumbnail, gnome-shell would attempt to move it to the
monitor with the index the primary monitor had in the past, with the
problem being that that monitor no longer exists.

Fix this by listening on the 'monitors-changed' signal on the layout
manager, and update the monitor index of the primary workspace
thumbnails box. Make sure to connect to the signal before creating the
thumbnails box, as the thumbnails box itself will listen to the signal
and recreate its actual thumbnails, and it must do this with the up to
date monitor index.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4075
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1810>
This commit is contained in:
Jonas Ådahl 2021-04-14 17:12:12 +02:00 committed by Marge Bot
parent f76e6877c7
commit 1f0ef7fb46
2 changed files with 7 additions and 0 deletions

View File

@ -341,6 +341,9 @@ class ControlsManager extends St.Widget {
this.dash.showAppsButton);
this._searchController.connect('notify::search-active', this._onSearchChanged.bind(this));
Main.layoutManager.connect('monitors-changed', () => {
this._thumbnailsBox.setMonitorIndex(Main.layoutManager.primaryIndex);
});
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox(
this._workspaceAdjustment, Main.layoutManager.primaryIndex);
this._thumbnailsBox.connect('notify::should-show', () => {

View File

@ -715,6 +715,10 @@ var ThumbnailsBox = GObject.registerClass({
() => this._updateIndicator());
}
setMonitorIndex(monitorIndex) {
this._monitorIndex = monitorIndex;
}
_onDestroy() {
this._unqueueUpdateStates();