From 6ce07abf509320cee311337e68ed3585293b4b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 22 Jun 2011 00:28:42 +0200 Subject: [PATCH] workspaces-view: Handle clip rectangle separately After completing the overview transition, the workspace view is clipped to avoid overlapping the search entry/view selector titles while switching workspaces. For clipping, the view's position and size was used, which works well assuming that the workspace pager will start hidden or stay zoomed out while the overview is visible. However, that assumption holds no longer true, as auto-hiding the pager now depends on the number of workspaces, and thus may change while in the overview. For instance, when starting with the pager being visible, the clip area ends up being too small when moving all windows to the first workspace (and thus triggering auto-hide). As a fix, handle the clip rectangle separately from the view's geometry, and set it always to the area the workspaces would occupy with the pager hidden. https://bugzilla.gnome.org/show_bug.cgi?id=653142 --- js/ui/workspacesView.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index 19ec79600..4a37b2949 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -49,6 +49,10 @@ WorkspacesView.prototype = { this._height = 0; this._x = 0; this._y = 0; + this._clipX = 0; + this._clipY = 0; + this._clipWidth = 0; + this._clipHeight = 0; this._workspaceRatioSpacing = 0; this._spacing = 0; this._animating = false; // tweening @@ -92,7 +96,8 @@ WorkspacesView.prototype = { this._overviewShownId = Main.overview.connect('shown', Lang.bind(this, function() { - this.actor.set_clip(this._x, this._y, this._width, this._height); + this.actor.set_clip(this._clipX, this._clipY, + this._clipWidth, this._clipHeight); })); this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, @@ -136,6 +141,13 @@ WorkspacesView.prototype = { this._workspaces[i].setGeometry(x, y, width, height); }, + setClipRect: function(x, y, width, height) { + this._clipX = x; + this._clipY = y; + this._clipWidth = width; + this._clipHeight = height; + }, + _lookupWorkspaceForMetaWindow: function (metaWindow) { for (let i = 0; i < this._workspaces.length; i++) { if (this._workspaces[i].containsMetaWindow(metaWindow)) @@ -751,6 +763,13 @@ WorkspacesDisplay.prototype = { let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL); + let clipWidth = width - controlsVisible; + let clipHeight = (fullHeight / fullWidth) * clipWidth; + let clipX = rtl ? x + controlsVisible : x; + let clipY = y + (fullHeight - clipHeight) / 2; + + this.workspacesView.setClipRect(clipX, clipY, clipWidth, clipHeight); + if (this._zoomOut) { width -= controlsNatural; if (rtl)