altTab: Check for reentrancy in override function of _onItemMotion()

Just like in the parent _onItemMotion() function, we should check for
reentrancy in our override.

Because the hover timeout will prevent a new selection from happening
for some time, in addition to checking for this._highlighted reentrancy,
we also need to track the item that's being hovered during the timeout.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2098>
This commit is contained in:
Jonas Dreßler 2018-04-25 21:34:00 +02:00 committed by Marge Bot
parent 1e2a10f83b
commit 7f65fa49db

View File

@ -707,6 +707,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
} }
this._altTabPopup = altTabPopup; this._altTabPopup = altTabPopup;
this._delayedHighlighted = -1;
this._mouseTimeOutId = 0; this._mouseTimeOutId = 0;
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
@ -792,16 +793,26 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
// We override SwitcherList's _onItemMotion method to delay // We override SwitcherList's _onItemMotion method to delay
// activation when the thumbnail list is open // activation when the thumbnail list is open
_onItemMotion(item) { _onItemMotion(item) {
if (item === this._items[this._highlighted] ||
item === this._items[this._delayedHighlighted])
return Clutter.EVENT_PROPAGATE;
const index = this._items.indexOf(item); const index = this._items.indexOf(item);
if (this._mouseTimeOutId != 0) if (this._mouseTimeOutId !== 0) {
GLib.source_remove(this._mouseTimeOutId); GLib.source_remove(this._mouseTimeOutId);
this._delayedHighlighted = -1;
this._mouseTimeOutId = 0;
}
if (this._altTabPopup.thumbnailsVisible) { if (this._altTabPopup.thumbnailsVisible) {
this._delayedHighlighted = index;
this._mouseTimeOutId = GLib.timeout_add( this._mouseTimeOutId = GLib.timeout_add(
GLib.PRIORITY_DEFAULT, GLib.PRIORITY_DEFAULT,
APP_ICON_HOVER_TIMEOUT, APP_ICON_HOVER_TIMEOUT,
() => { () => {
this._enterItem(index); this._enterItem(index);
this._delayedHighlighted = -1;
this._mouseTimeOutId = 0; this._mouseTimeOutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });