[gnome-shell-extensions] NativeWindowPlacement: reduce the number of hacks to work better with 3.7.1



commit bfe7a760d16ac6589980b258d61c2b3211eb89ec
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Fri Oct 26 17:12:00 2012 +0200

    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.

 extensions/native-window-placement/extension.js   |   89 ++++----------------
 extensions/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 b11d382..98379a1 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 1977e2e..7264521 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 */
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]