[gnome-shell-extensions/extension-live-disable: 7/8] native-window-placement: port to new extension API



commit f8e40f2dde0aa4afcf860ade78b8792fef0d1805
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Thu Aug 18 16:21:16 2011 +0200

    native-window-placement: port to new extension API
    
    main() has been replaced by init(), enable() and disable()
    It should disable, but it is likely I overlooked something.

 extensions/native-window-placement/extension.js |   47 +++++++++++++++++++---
 1 files changed, 40 insertions(+), 7 deletions(-)
---
diff --git a/extensions/native-window-placement/extension.js b/extensions/native-window-placement/extension.js
index aabd8d8..db45a5c 100644
--- a/extensions/native-window-placement/extension.js
+++ b/extensions/native-window-placement/extension.js
@@ -46,8 +46,6 @@ function injectToFunction(parent, name, func) {
 }
 const WORKSPACE_BORDER_GAP = 10;                                    // gap between the workspace area and the workspace selector
 
-
- 
 function Rect(x, y, width, height) {
     [this.x, this.y, this.width, this.height] = arguments;
 }
@@ -107,20 +105,31 @@ Rect.prototype = {
     }
 };
 
+let winInjections, workspaceInjections, connectedSignals;
+
+function resetState() {
+    winInjections = { };
+    workspaceInjections = { };
+    workViewInjections = { };
+    connectedSignals = [ ];
+}
+
+function enable() {
+    resetState();
 
-// Put your extension initialization code here
-function main() {
     let settings = new Gio.Settings({ schema: 'org.gnome.shell.extensions.native-window-placement' });
     let placementStrategy = settings.get_enum('strategy');
-    settings.connect('changed::strategy', function() {
+    let signalId = settings.connect('changed::strategy', function() {
         placementStrategy = settings.get_enum('strategy');
         // we don't update immediately, we wait for a relayout
         // (and hope for the best)
     });
+    connectedSignals.push({ obj: settings, id: signalId });
     let useMoreScreen = settings.get_boolean('use-more-screen');
-    settings.connect('changed::use-more-screen', function() {
+    signalId = settings.connect('changed::use-more-screen', function() {
         useMoreScreen = settings.get_boolean('use-more-screen');
     });
+    connectedSignals.push({ obj: settings, id: signalId });
 
     /**
      * _calculateWindowTransformationsNatural:
@@ -290,7 +299,8 @@ function main() {
         }
 
         return [clones, targets];
-    },
+    }
+    workspaceInjections['_calculateWindowTransformationsNatural'] = undefined;
 
     /**
      * _calculateWindowTransformationsGrid:
@@ -309,6 +319,7 @@ function main() {
 
         return [clones, targets];
     }
+    workspaceInjections['_calculateWindowTransformationsGrid'] = undefined;
 
     /**
      * positionWindows:
@@ -316,6 +327,7 @@ function main() {
      *  INITIAL - this is the initial positioning of the windows.
      *  ANIMATE - Indicates that we need animate changing position.
      */
+    workspaceInjections['positionWindows'] = Workspace.Workspace.prototype.positionWindows;
     Workspace.Workspace.prototype.positionWindows = function(flags) {
         if (this._repositionWindowsId > 0) {
             Mainloop.source_remove(this._repositionWindowsId);
@@ -404,6 +416,7 @@ function main() {
 
     /// 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;
 
@@ -451,11 +464,13 @@ function main() {
 		this._onStyleChanged();
 	},
 
+        winInjections['chromeHeights'] = Workspace.WindowOverlay.prototype.chromeHeights;
 	Workspace.WindowOverlay.prototype.chromeHeights = function () {
             return [Math.max( this.closeButton.height - this.closeButton._overlap, this.title.height - this.title._overlap),
 		    0];
 	},
 
+        winInjections['updatePositions'] = Workspace.WindowOverlay.prototype.updatePositions;
 	Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight) {
             let button = this.closeButton;
             let title = this.title;
@@ -478,6 +493,7 @@ function main() {
             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');
@@ -491,4 +507,21 @@ function main() {
     }
 }
 
+function removeInjection(object, injection, name) {
+    if (injection[name] === undefined)
+        delete object[name];
+    else
+        object[name] = injection[name];
+}
+
+function disable() {
+    for (i in workspaceInjections)
+        removeInjections(Workspace.Workspace.prototype, workspaceInjections, i);
+    for (i in winInjections)
+        removeInjections(Workspace.WindowOverlay.prototype, winInjections, i);
+
+    for each (i in connectedSignals)
+        i.obj.disconnect(i.id);
 
+    resetState();
+}
\ No newline at end of file



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