From c66068c4356669ffb0d6705d1a056fa518a5235a Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Mon, 17 Dec 2012 00:40:48 +0100 Subject: [PATCH] Workspace: fix window clone slot reporting WindowOverlay was at times seeing bogus values reported as WindowClone sizes. Fix that by storing and passing the value from the authoritative source, that is, the LayoutStrategy. https://bugzilla.gnome.org/show_bug.cgi?id=688234 --- js/ui/workspace.js | 63 +++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/js/ui/workspace.js b/js/ui/workspace.js index 7ae9200e3..acbcd377a 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -124,6 +124,8 @@ const WindowClone = new Lang.Class({ this.actor._delegate = this; + this._slot = [0, 0, 0, 0]; + this._dragSlot = [0, 0, 0, 0]; this._stackAbove = null; this._sizeChangedId = this.realWindow.connect('size-changed', @@ -159,22 +161,15 @@ const WindowClone = new Lang.Class({ this._selected = false; }, + set slot(slot) { + this._slot = slot; + }, + get slot() { - let x, y, w, h; - - if (this.inDrag) { - x = this.dragOrigX; - y = this.dragOrigY; - w = this.actor.width * this.dragOrigScale; - h = this.actor.height * this.dragOrigScale; - } else { - x = this.actor.x; - y = this.actor.y; - w = this.actor.width * this.actor.scale_x; - h = this.actor.height * this.actor.scale_y; - } - - return [x, y, w, h]; + if (this.inDrag) + return this._dragSlot; + else + return this._slot; }, setStackAbove: function (actor) { @@ -392,6 +387,7 @@ const WindowClone = new Lang.Class({ if (this._zooming) this._zoomEnd(); + this._dragSlot = this._slot; [this.dragOrigX, this.dragOrigY] = this.actor.get_position(); this.dragOrigScale = this.actor.scale_x; this.inDrag = true; @@ -458,11 +454,7 @@ const WindowOverlay = new Lang.Class({ this._updateCaptionId = metaWindow.connect('notify::title', Lang.bind(this, function(w) { this.title.text = w.title; - // we need this for the next call to get_preferred_width - // to return useful results - this.title.set_size(-1, -1); - - this._repositionSelf(); + this.relayout(false); })); let button = new St.Button({ style_class: 'window-close' }); @@ -537,22 +529,9 @@ const WindowOverlay = new Lang.Class({ return [this.borderSize, this.borderSize]; }, - _repositionSelf: function() { + relayout: function(animate) { let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot; - this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false); - }, - /** - * @cloneX: x position of windowClone - * @cloneY: y position of windowClone - * @cloneWidth: width of windowClone - * @cloneHeight height of windowClone - */ - // These parameters are not the values retrieved with - // get_transformed_position() and get_transformed_size(), - // as windowClone might be moving. - // See Workspace._showWindowOverlay - updatePositions: function(cloneX, cloneY, cloneWidth, cloneHeight, animate) { let button = this.closeButton; let title = this.title; @@ -1194,6 +1173,7 @@ const Workspace = new Lang.Class({ continue; let [x, y, scale] = slot; + clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale]; if (overlay && initialPositioning) overlay.hide(); @@ -1225,7 +1205,7 @@ const Workspace = new Lang.Class({ Tweener.removeTweens(clone.actor); clone.actor.set_position(x, y); clone.actor.set_scale(scale, scale); - this._updateWindowOverlayPositions(clone, overlay, x, y, scale, false); + clone.overlay.relayout(false); this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace); } } @@ -1260,15 +1240,7 @@ const Workspace = new Lang.Class({ }) }); - this._updateWindowOverlayPositions(clone, overlay, x, y, scale, true); - }, - - _updateWindowOverlayPositions: function(clone, overlay, x, y, scale, animate) { - if (!overlay) - return; - - let [cloneWidth, cloneHeight] = clone.actor.get_size(); - overlay.updatePositions(x, y, cloneWidth * scale, cloneHeight * scale, animate); + clone.overlay.relayout(true); }, _showWindowOverlay: function(clone, overlay, fade) { @@ -1403,9 +1375,10 @@ const Workspace = new Lang.Class({ let scale = win._overviewHint.scale; delete win._overviewHint; + clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale]; clone.actor.set_position (x, y); clone.actor.set_scale (scale, scale); - this._updateWindowOverlayPositions(clone, overlay, x, y, scale, false); + clone.overlay.relayout(false); } else { // Position new windows at the top corner of the workspace rather // than where they were placed for real to avoid the window