workspace: Position windows only when needed

Right now, when entering the overview, we compute the window slots about
four or five times, from scratch each time. Move to a queued system where
extraneous calls to positionWindows don't matter.

https://bugzilla.gnome.org/show_bug.cgi?id=582650
This commit is contained in:
Jasper St. Pierre 2012-08-08 14:16:28 -03:00
parent 4ff0697ee7
commit 3776c50986

View File

@ -726,6 +726,9 @@ const Workspace = new Lang.Class({
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
this.leavingOverview = false; this.leavingOverview = false;
this._positionWindowsFlags = 0;
this._positionWindowsId = 0;
}, },
setGeometry: function(x, y, width, height) { setGeometry: function(x, y, width, height) {
@ -734,15 +737,13 @@ const Workspace = new Lang.Class({
this._width = width; this._width = width;
this._height = height; this._height = height;
// This is sometimes called during allocation, so we do this later Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function () {
this._dropRect.set_position(x, y); this._dropRect.set_position(x, y);
this._dropRect.set_size(width, height); this._dropRect.set_size(width, height);
this.positionWindows(WindowPositionFlags.ANIMATE);
return false; return false;
})); }));
this.positionWindows(WindowPositionFlags.ANIMATE);
}, },
_lookupIndex: function (metaWindow) { _lookupIndex: function (metaWindow) {
@ -1003,7 +1004,21 @@ const Workspace = new Lang.Class({
* INITIAL - this is the initial positioning of the windows. * INITIAL - this is the initial positioning of the windows.
* ANIMATE - Indicates that we need animate changing position. * ANIMATE - Indicates that we need animate changing position.
*/ */
positionWindows : function(flags) { positionWindows: function(flags) {
this._positionWindowsFlags |= flags;
if (this._positionWindowsId > 0)
return;
this._positionWindowsId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._realPositionWindows(this._positionWindowsFlags);
this._positionWindowsFlags = 0;
this._positionWindowsId = 0;
return false;
}));
},
_realPositionWindows : function(flags) {
if (this._repositionWindowsId > 0) { if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
@ -1372,6 +1387,9 @@ const Workspace = new Lang.Class({
if (this._repositionWindowsId > 0) if (this._repositionWindowsId > 0)
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
if (this._positionWindowsId > 0)
Meta.later_remove(this._positionWindowsId);
// Usually, the windows will be destroyed automatically with // Usually, the windows will be destroyed automatically with
// their parent (this.actor), but we might have a zoomed window // their parent (this.actor), but we might have a zoomed window
// which has been reparented to the stage - _windows[0] holds // which has been reparented to the stage - _windows[0] holds