From bfe7a760d16ac6589980b258d61c2b3211eb89ec Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Fri, 26 Oct 2012 17:12:00 +0200 Subject: [PATCH] NativeWindowPlacement: reduce the number of hacks to work better with 3.7.1 3.7 is brought some big changes in the window layout code, but I'm not going to take advantage of them (as the assume some sort of row based layout). Instead, just work around them in a way that makes the extension work without major issues. --- .../native-window-placement/extension.js | 89 ++++--------------- .../native-window-placement/stylesheet.css | 2 +- 2 files changed, 19 insertions(+), 72 deletions(-) diff --git a/extensions/native-window-placement/extension.js b/extensions/native-window-placement/extension.js index b11d3828..98379a19 100644 --- a/extensions/native-window-placement/extension.js +++ b/extensions/native-window-placement/extension.js @@ -123,6 +123,7 @@ function enable() { let settings = Convenience.getSettings(); let useMoreScreen = settings.get_boolean('use-more-screen'); + let windowCaptionsOnTop = settings.get_boolean('window-captions-on-top'); let signalId = settings.connect('changed::use-more-screen', function() { useMoreScreen = settings.get_boolean('use-more-screen'); }); @@ -148,7 +149,13 @@ function enable() { let ratio = this._width / this._height; let x_gap = Math.max(WORKSPACE_BORDER_GAP, WINDOW_AREA_TOP_GAP * ratio); let y_gap = Math.max(WORKSPACE_BORDER_GAP / ratio, WINDOW_AREA_TOP_GAP); - let area = new Rect(this._x + x_gap/2, this._y + y_gap, this._width - x_gap, this._height - y_gap); + let bottom_padding = 0; + + // If the window captions are below the window, put an additional gap to account for them + if (!windowCaptionsOnTop && this._windowOverlays.length) + bottom_padding += this._windowOverlays[0].chromeHeights()[1]; + + let area = new Rect(this._x + x_gap/2, this._y + y_gap, this._width - x_gap, this._height - y_gap - bottom_padding); let bounds = area.copy(); @@ -321,17 +328,17 @@ function enable() { let animate = flags & WindowPositionFlags.ANIMATE; // Start the animations - let targets = []; + let targets = []; let scales = []; [clones, targets] = this._calculateWindowTransformationsNatural(clones); - let currentWorkspace = global.screen.get_active_workspace(); + let currentWorkspace = global.screen.get_active_workspace(); let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; for (let i = 0; i < clones.length; i++) { let clone = clones[i]; - let [x, y , scale] = targets[i]; + let [x, y , scale] = targets[i]; let metaWindow = clone.metaWindow; let mainIndex = this._lookupIndex(metaWindow); let overlay = this._windowOverlays[mainIndex]; @@ -375,63 +382,15 @@ function enable() { } /// position window titles on top of windows in overlay //// - if (settings.get_boolean('window-captions-on-top')) { - winInjections['_init'] = Workspace.WindowOverlay.prototype._init; - Workspace.WindowOverlay.prototype._init = function(windowClone, parentActor) { - let metaWindow = windowClone.metaWindow; - - this._windowClone = windowClone; - this._parentActor = parentActor; - this._hidden = false; - - let title = new St.Label({ style_class: 'window-caption', - text: metaWindow.title }); - title.clutter_text.ellipsize = Pango.EllipsizeMode.END; - title._spacing = 0; - title._overlap = 0; - - this._updateCaptionId = metaWindow.connect('notify::title', Lang.bind(this, function(w) { - this.title.text = w.title; - })); - - let button = new St.Button({ style_class: 'window-close' }); - button._overlap = 0; - - this._idleToggleCloseId = 0; - button.connect('clicked', Lang.bind(this, this._closeWindow)); - - windowClone.actor.connect('destroy', Lang.bind(this, this._onDestroy)); - windowClone.actor.connect('enter-event', Lang.bind(this, this._onEnter)); - windowClone.actor.connect('leave-event', Lang.bind(this, this._onLeave)); - - this._windowAddedId = 0; - windowClone.connect('zoom-start', Lang.bind(this, this.hide)); - windowClone.connect('zoom-end', Lang.bind(this, this.show)); - - button.hide(); - - this.title = title; - this.closeButton = button; - - parentActor.add_actor(this.title); - parentActor.add_actor(this.closeButton); - title.connect('style-changed', Lang.bind(this, this._onStyleChanged)); - button.connect('style-changed', Lang.bind(this, this._onStyleChanged)); - - // force a style change if we are already on a stage - otherwise - // the signal will be emitted normally when we are added - if (parentActor.get_stage()) - this._onStyleChanged(); - }, - + if (windowCaptionsOnTop) { winInjections['chromeHeights'] = Workspace.WindowOverlay.prototype.chromeHeights; - Workspace.WindowOverlay.prototype.chromeHeights = function () { + Workspace.WindowOverlay.prototype.chromeHeights = function () { return [Math.max( this.closeButton.height - this.closeButton._overlap, this.title.height - this.title._overlap), - 0]; - }, + 0]; + }; winInjections['updatePositions'] = Workspace.WindowOverlay.prototype.updatePositions; - Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight, animate) { + Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight, animate) { let button = this.closeButton; let title = this.title; @@ -463,7 +422,7 @@ function enable() { let titleWidth = Math.min(title.fullWidth, cloneWidth); let titleX = cloneX + (cloneWidth - titleWidth) / 2; - let titleY = cloneY - title.height + title._overlap; + let titleY = cloneY - title.height + title._spacing; if (animate) this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), titleWidth); @@ -471,19 +430,7 @@ function enable() { title.width = titleWidth; title.set_position(Math.floor(titleX), Math.floor(titleY)); } - }, - - winInjections['_onStyleChanged'] = Workspace.WindowOverlay.prototype._onStyleChanged; - Workspace.WindowOverlay.prototype._onStyleChanged = function() { - let titleNode = this.title.get_theme_node(); - this.title._spacing = titleNode.get_length('-shell-caption-spacing'); - this.title._overlap = titleNode.get_length('-shell-caption-overlap'); - - let closeNode = this.closeButton.get_theme_node(); - this.closeButton._overlap = closeNode.get_length('-shell-close-overlap'); - - this._parentActor.queue_relayout(); - } + }; } } diff --git a/extensions/native-window-placement/stylesheet.css b/extensions/native-window-placement/stylesheet.css index 1977e2ec..7264521f 100644 --- a/extensions/native-window-placement/stylesheet.css +++ b/extensions/native-window-placement/stylesheet.css @@ -1,3 +1,3 @@ .window-caption { - -shell-caption-overlap: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */ + -shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */ }