workspace: Check if index is valid before using it

If the window wasn't in _windowSlots, the index is -1, so the last
element of the array is removed, leading to
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3547

I logged the stack trace from removeWindow() and it seems that when you
move the window from the second monitor to another workspace like shown
in https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3547,
removeWindow() is called twice for it, presumably once for the second
monitor workspace, and then once for the first monitor workspace for
some reason. It is during that call that _windowSlots doesn't contain
the window, so instead the last element (index -1) is removed, leading
to the animation bug.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1727>
This commit is contained in:
Ivan Molodetskikh 2021-02-27 09:59:21 +03:00 committed by Marge Bot
parent ff163a03b9
commit 35fb221a7e

View File

@ -784,8 +784,9 @@ var WorkspaceLayout = GObject.registerClass({
// The layout might be frozen and we might not update the windowSlots // The layout might be frozen and we might not update the windowSlots
// on the next allocation, so remove the slot now already // on the next allocation, so remove the slot now already
this._windowSlots.splice( const index = this._windowSlots.findIndex(s => s[4] === window);
this._windowSlots.findIndex(s => s[4] === window), 1); if (index !== -1)
this._windowSlots.splice(index, 1);
// The window might have been reparented by DND // The window might have been reparented by DND
if (window.get_parent() === this._container) if (window.get_parent() === this._container)