diff --git a/js/ui/workspace.js b/js/ui/workspace.js index ac53fa41c..acad9eaf7 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -158,6 +158,8 @@ var WindowClone = GObject.registerClass({ this.x = this._boundingBox.x; this.y = this._boundingBox.y; + this._computeWindowCenter(); + let clickAction = new Clutter.ClickAction(); clickAction.connect('clicked', this._onClicked.bind(this)); clickAction.connect('long-press', this._onLongPress.bind(this)); @@ -293,6 +295,18 @@ var WindowClone = GObject.registerClass({ this.layout_manager.boundingBox = rect; } + get windowCenter() { + return this._windowCenter; + } + + _computeWindowCenter() { + let box = this.realWindow.get_allocation_box(); + this._windowCenter = new Clutter.Point({ + x: box.get_x() + box.get_width() / 2, + y: box.get_y() + box.get_height() / 2, + }); + } + // Find the actor just below us, respecting reparenting done by DND code getActualStackAbove() { if (this._stackAbove == null) @@ -1017,11 +1031,7 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy { _sortRow(row) { // Sort windows horizontally to minimize travel distance. // This affects in what order the windows end up in a row. - row.windows.sort((a, b) => { - let aCenter = a.realWindow.x + a.realWindow.width / 2; - let bCenter = b.realWindow.x + b.realWindow.width / 2; - return aCenter - bCenter; - }); + row.windows.sort((a, b) => a.windowCenter.x - b.windowCenter.x); } computeLayout(windows, layout) { @@ -1040,11 +1050,7 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy { // Sort windows vertically to minimize travel distance. // This affects what rows the windows get placed in. let sortedWindows = windows.slice(); - sortedWindows.sort((a, b) => { - let aCenter = a.realWindow.y + a.realWindow.height / 2; - let bCenter = b.realWindow.y + b.realWindow.height / 2; - return aCenter - bCenter; - }); + sortedWindows.sort((a, b) => a.windowCenter.y - b.windowCenter.y); let windowIdx = 0; for (let i = 0; i < numRows; i++) {