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:
parent
4ff0697ee7
commit
3776c50986
@ -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,
|
this._dropRect.set_position(x, y);
|
||||||
function () {
|
this._dropRect.set_size(width, height);
|
||||||
this._dropRect.set_position(x, y);
|
return false;
|
||||||
this._dropRect.set_size(width, height);
|
}));
|
||||||
this.positionWindows(WindowPositionFlags.ANIMATE);
|
|
||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user