lookingGlass: Only update window list when visible

Updating the window list in the Looking Glass is a costly
operation: it destroys a whole lot of actors, and recreates
them. This triggers CSS changes, repaints, and allocations.

It is specially bad when paired with Wayland's big number
of window creations and deletions when showing Builder's
and Epiphany's popup window.

Only update the window list in the Looking Glass when it is
visible.

Related: https://gitlab.gnome.org/GNOME/mutter/issues/556

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/719
This commit is contained in:
Georges Basile Stavracas Neto 2019-09-12 15:45:04 -03:00
parent 7eb4088f45
commit 43b4f2c7d5

View File

@ -304,6 +304,9 @@ var WindowList = class WindowList {
} }
_updateWindowList() { _updateWindowList() {
if (!this._lookingGlass.isOpen)
return;
this.actor.destroy_all_children(); this.actor.destroy_all_children();
let windows = global.get_window_actors(); let windows = global.get_window_actors();
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
@ -335,6 +338,10 @@ var WindowList = class WindowList {
} }
} }
} }
update() {
this._updateWindowList();
}
}; };
Signals.addSignalMethods(WindowList.prototype); Signals.addSignalMethods(WindowList.prototype);
@ -1099,6 +1106,8 @@ var LookingGlass = class LookingGlass {
duration, duration,
mode: Clutter.AnimationMode.EASE_OUT_QUAD mode: Clutter.AnimationMode.EASE_OUT_QUAD
}); });
this._windowList.update();
} }
close() { close() {
@ -1124,5 +1133,9 @@ var LookingGlass = class LookingGlass {
onComplete: () => this.actor.hide() onComplete: () => this.actor.hide()
}); });
} }
get isOpen() {
return this._open;
}
}; };
Signals.addSignalMethods(LookingGlass.prototype); Signals.addSignalMethods(LookingGlass.prototype);