[gnome-shell] layout: Merge Chrome and LayoutManager



commit 8e231cb2ece3c41f6f340f7d54286dc160dc38d1
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Sun Jan 27 23:34:33 2013 -0500

    layout: Merge Chrome and LayoutManager
    
    The two classes have been gaining each other's functionality for a little
    while, adding the new code wherever it was more convenient. Rather than
    have a clear delineation between "This Manages Shell Chrome" and "This
    Manages Shell Layout", I think it's better off if we just accept that
    the responsibilities are pretty much the same.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=692677

 js/ui/layout.js |  231 ++++++++++++++++++++-----------------------------------
 1 files changed, 82 insertions(+), 149 deletions(-)
---
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 51295cf..6791eba 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -95,6 +95,12 @@ const MonitorConstraint = new Lang.Class({
     }
 });
 
+const defaultParams = {
+    trackFullscreen: false,
+    affectsStruts: false,
+    affectsInputRegion: true
+};
+
 const LayoutManager = new Lang.Class({
     Name: 'LayoutManager',
 
@@ -110,7 +116,10 @@ const LayoutManager = new Lang.Class({
         this._rightPanelBarrier = 0;
         this._trayBarrier = 0;
 
-        this._chrome = new Chrome(this);
+        this._inOverview = false;
+        this._updateRegionIdle = 0;
+
+        this._trackedActors = [];
 
         this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
                                                  visible: false,
@@ -136,22 +145,40 @@ const LayoutManager = new Lang.Class({
         this.addChrome(this.keyboardBox);
         this._keyboardHeightNotifyId = 0;
 
+        // Need to update struts on new workspaces when they are added
+        global.screen.connect('notify::n-workspaces',
+                              Lang.bind(this, this._queueUpdateRegions));
+        global.screen.connect('restacked',
+                              Lang.bind(this, this._windowsRestacked));
         global.screen.connect('monitors-changed',
                               Lang.bind(this, this._monitorsChanged));
         this._monitorsChanged();
-
-        this._chrome.connect('primary-fullscreen-changed', Lang.bind(this, function(chrome, state) {
-            this.emit('primary-fullscreen-changed', state);
-        }));
     },
 
     // This is called by Main after everything else is constructed;
-    // Chrome.init() needs access to Main.overview, which didn't exist
+    // it needs access to Main.overview, which didn't exist
     // yet when the LayoutManager was constructed.
     init: function() {
-        this._chrome.init();
+        Main.overview.connect('showing', Lang.bind(this, this._overviewShowing));
+        Main.overview.connect('hidden', Lang.bind(this, this._overviewHidden));
+        Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
+    },
+
+    _overviewShowing: function() {
+        this._inOverview = true;
+        this._updateVisibility();
+        this._queueUpdateRegions();
+    },
 
-        this._startupAnimation();
+    _overviewHidden: function() {
+        this._inOverview = false;
+        this._updateVisibility();
+        this._queueUpdateRegions();
+    },
+
+    _sessionUpdated: function() {
+        this._updateVisibility();
+        this._queueUpdateRegions();
     },
 
     _updateMonitors: function() {
@@ -230,7 +257,7 @@ const LayoutManager = new Lang.Class({
             let corner = new HotCorner();
             this._hotCorners.push(corner);
             corner.actor.set_position(cornerX, cornerY);
-            this._chrome.addActor(corner.actor);
+            this.addChrome(corner.actor);
         }
     },
 
@@ -287,6 +314,9 @@ const LayoutManager = new Lang.Class({
         this._updateMonitors();
         this._updateBoxes();
         this._updateHotCorners();
+        this._updateFullscreen();
+        this._updateVisibility();
+        this._queueUpdateRegions();
 
         this.emit('monitors-changed');
     },
@@ -321,11 +351,11 @@ const LayoutManager = new Lang.Class({
             global.stage_input_mode == Shell.StageInputMode.FULLSCREEN) {
             let focusActor = global.stage.key_focus;
             if (focusActor)
-                i = this._chrome.findIndexForActor(focusActor);
+                i = this.findIndexForActor(focusActor);
         } else {
             let focusWindow = global.display.focus_window;
             if (focusWindow)
-                i = this._chrome.findIndexForWindow(focusWindow);
+                i = this.findIndexForWindow(focusWindow);
         }
 
         return i;
@@ -374,8 +404,7 @@ const LayoutManager = new Lang.Class({
     },
 
     _fadeBackgroundComplete: function() {
-        // Don't animate the strut
-        this._chrome.freezeUpdateRegions();
+        this._freezeUpdateRegions();
 
         if (this._background != null) {
             this._background.destroy();
@@ -393,7 +422,7 @@ const LayoutManager = new Lang.Class({
 
     _startupAnimationComplete: function() {
         this.emit('panel-box-changed');
-        this._chrome.thawUpdateRegions();
+        this._thawUpdateRegions();
     },
 
     showKeyboard: function () {
@@ -420,7 +449,7 @@ const LayoutManager = new Lang.Class({
     _showKeyboardComplete: function() {
         // Poke Chrome to update the input shape; it doesn't notice
         // anchor point changes
-        this._chrome.updateRegions();
+        this._updateRegions();
 
         this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', Lang.bind(this, function () {
             this.keyboardBox.anchor_y = this.keyboardBox.height;
@@ -454,7 +483,7 @@ const LayoutManager = new Lang.Class({
     },
 
     _hideKeyboardComplete: function() {
-        this._chrome.updateRegions();
+        this._updateRegions();
     },
 
     // addChrome:
@@ -477,7 +506,8 @@ const LayoutManager = new Lang.Class({
     // monitor (it will be hidden whenever a fullscreen window is visible,
     // and shown otherwise)
     addChrome: function(actor, params) {
-        this._chrome.addActor(actor, params);
+        Main.uiGroup.add_actor(actor);
+        this._trackActor(actor, params);
     },
 
     // trackChrome:
@@ -492,83 +522,6 @@ const LayoutManager = new Lang.Class({
     // though some possibilities don't make sense. By default, @actor has
     // the same params as its chrome ancestor.
     trackChrome: function(actor, params) {
-        this._chrome.trackActor(actor, params);
-    },
-
-    // untrackChrome:
-    // @actor: an actor previously tracked via trackChrome()
-    //
-    // Undoes the effect of trackChrome()
-    untrackChrome: function(actor) {
-        this._chrome.untrackActor(actor);
-    },
-
-    // removeChrome:
-    // @actor: a chrome actor
-    //
-    // Removes @actor from the chrome
-    removeChrome: function(actor) {
-        this._chrome.removeActor(actor);
-    },
-
-    findMonitorForActor: function(actor) {
-        return this.monitors[this._chrome.findIndexForActor(actor)];
-    },
-
-    findMonitorForWindow: function(window) {
-        return this.monitors[this._chrome.findIndexForWindow(window)];
-    },
-});
-Signals.addSignalMethods(LayoutManager.prototype);
-
-
-// This manages the shell "chrome"; the UI that's visible in the
-// normal mode (ie, outside the Overview), that surrounds the main
-// workspace content.
-
-const defaultParams = {
-    trackFullscreen: false,
-    affectsStruts: false,
-    affectsInputRegion: true
-};
-
-const Chrome = new Lang.Class({
-    Name: 'Chrome',
-
-    _init: function(layoutManager) {
-        this._layoutManager = layoutManager;
-
-        this._monitors = [];
-        this._inOverview = false;
-        this._updateRegionIdle = 0;
-        this._freezeUpdateCount = 0;
-
-        this._trackedActors = [];
-
-        this._layoutManager.connect('monitors-changed',
-                                    Lang.bind(this, this._relayout));
-        global.screen.connect('restacked',
-                              Lang.bind(this, this._windowsRestacked));
-
-        // Need to update struts on new workspaces when they are added
-        global.screen.connect('notify::n-workspaces',
-                              Lang.bind(this, this._queueUpdateRegions));
-
-        this._relayout();
-    },
-
-    init: function() {
-        Main.overview.connect('showing', Lang.bind(this, this._overviewShowing));
-        Main.overview.connect('hidden', Lang.bind(this, this._overviewHidden));
-        Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
-    },
-
-    addActor: function(actor, params) {
-        Main.uiGroup.add_actor(actor);
-        this._trackActor(actor, params);
-    },
-
-    trackActor: function(actor, params) {
         let ancestor = actor.get_parent();
         let index = this._findActor(ancestor);
         while (ancestor && index == -1) {
@@ -591,11 +544,19 @@ const Chrome = new Lang.Class({
         this._trackActor(actor, params);
     },
 
-    untrackActor: function(actor) {
+    // untrackChrome:
+    // @actor: an actor previously tracked via trackChrome()
+    //
+    // Undoes the effect of trackChrome()
+    untrackChrome: function(actor) {
         this._untrackActor(actor);
     },
 
-    removeActor: function(actor) {
+    // removeChrome:
+    // @actor: a chrome actor
+    //
+    // Removes @actor from the chrome
+    removeChrome: function(actor) {
         Main.uiGroup.remove_actor(actor);
         this._untrackActor(actor);
     },
@@ -673,46 +634,19 @@ const Chrome = new Lang.Class({
         }
     },
 
-    _overviewShowing: function() {
-        this._inOverview = true;
-        this._updateVisibility();
-        this._queueUpdateRegions();
-    },
-
-    _overviewHidden: function() {
-        this._inOverview = false;
-        this._updateVisibility();
-        this._queueUpdateRegions();
-    },
-
-    _sessionUpdated: function() {
-        this._updateVisibility();
-        this._queueUpdateRegions();
-    },
-
-    _relayout: function() {
-        this._monitors = this._layoutManager.monitors;
-        this._primaryIndex = this._layoutManager.primaryIndex;
-        this._primaryMonitor = this._layoutManager.primaryMonitor;
-
-        this._updateFullscreen();
-        this._updateVisibility();
-        this._queueUpdateRegions();
-    },
-
     _findMonitorForRect: function(x, y, w, h) {
         // First look at what monitor the center of the rectangle is at
         let cx = x + w/2;
         let cy = y + h/2;
-        for (let i = 0; i < this._monitors.length; i++) {
-            let monitor = this._monitors[i];
+        for (let i = 0; i < this.monitors.length; i++) {
+            let monitor = this.monitors[i];
             if (cx >= monitor.x && cx < monitor.x + monitor.width &&
                 cy >= monitor.y && cy < monitor.y + monitor.height)
                 return i;
         }
         // If the center is not on a monitor, return the first overlapping monitor
-        for (let i = 0; i < this._monitors.length; i++) {
-            let monitor = this._monitors[i];
+        for (let i = 0; i < this.monitors.length; i++) {
+            let monitor = this.monitors[i];
             if (x + w > monitor.x && x < monitor.x + monitor.width &&
                 y + h > monitor.y && y < monitor.y + monitor.height)
                 return i;
@@ -726,7 +660,7 @@ const Chrome = new Lang.Class({
         let i = this._findMonitorForRect(rect.x, rect.y, rect.width, rect.height);
         if (i >= 0)
             return i;
-        return this._primaryIndex; // Not on any monitor, pretend its on the primary
+        return this.primaryIndex; // Not on any monitor, pretend its on the primary
     },
 
     // This call guarantees that we return some monitor to simplify usage of it
@@ -737,35 +671,35 @@ const Chrome = new Lang.Class({
         let i = this._findMonitorForRect(x, y, w, h);
         if (i >= 0)
             return i;
-        return this._primaryIndex; // Not on any monitor, pretend its on the primary
+        return this.primaryIndex; // Not on any monitor, pretend its on the primary
     },
 
     findMonitorForWindow: function(window) {
         let rect = window.get_input_rect();
         let i = this._findMonitorForRect(rect.x, rect.y, rect.width, rect.height);
         if (i >= 0)
-            return this._monitors[i];
+            return this.monitors[i];
         else
             return null;
     },
 
     findMonitorForActor: function(actor) {
-        return this._monitors[this.findIndexForActor(actor)];
+        return this.monitors[this.findIndexForActor(actor)];
     },
 
     _queueUpdateRegions: function() {
         if (!this._updateRegionIdle && !this._freezeUpdateCount)
-            this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this.updateRegions),
+            this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
                                                        Meta.PRIORITY_BEFORE_REDRAW);
     },
 
-    freezeUpdateRegions: function() {
+    _freezeUpdateRegions: function() {
         if (this._updateRegionIdle)
-            this.updateRegions();
+            this._updateRegions();
         this._freezeUpdateCount++;
     },
 
-    thawUpdateRegions: function() {
+    _thawUpdateRegions: function() {
         this._freezeUpdateCount--;
         this._queueUpdateRegions();
     },
@@ -774,8 +708,8 @@ const Chrome = new Lang.Class({
         let windows = Main.getWindowActorsForWorkspace(global.screen.get_active_workspace_index());
 
         // Reset all monitors to not fullscreen
-        for (let i = 0; i < this._monitors.length; i++)
-            this._monitors[i].inFullscreen = false;
+        for (let i = 0; i < this.monitors.length; i++)
+            this.monitors[i].inFullscreen = false;
 
         // Ordinary chrome should be visible unless there is a window
         // with layer FULLSCREEN, or a window with layer
@@ -811,8 +745,8 @@ const Chrome = new Lang.Class({
                     window.height == global.screen_height);
 
                 if (isScreenSized) {
-                    for (let i = 0; i < this._monitors.length; i++)
-                        this._monitors[i].inFullscreen = true;
+                    for (let i = 0; i < this.monitors.length; i++)
+                        this.monitors[i].inFullscreen = true;
                 }
 
                 // Or whether it is monitor sized
@@ -830,16 +764,16 @@ const Chrome = new Lang.Class({
 
     _windowsRestacked: function() {
         let wasInFullscreen = [];
-        for (let i = 0; i < this._monitors.length; i++)
-            wasInFullscreen[i] = this._monitors[i].inFullscreen;
+        for (let i = 0; i < this.monitors.length; i++)
+            wasInFullscreen[i] = this.monitors[i].inFullscreen;
 
-        let primaryWasInFullscreen = this._primaryMonitor.inFullscreen;
+        let primaryWasInFullscreen = this.primaryMonitor.inFullscreen;
 
         this._updateFullscreen();
 
         let changed = false;
         for (let i = 0; i < wasInFullscreen.length; i++) {
-            if (wasInFullscreen[i] != this._monitors[i].inFullscreen) {
+            if (wasInFullscreen[i] != this.monitors[i].inFullscreen) {
                 changed = true;
                 break;
             }
@@ -850,12 +784,12 @@ const Chrome = new Lang.Class({
             this._queueUpdateRegions();
         }
 
-        if (primaryWasInFullscreen != this._primaryMonitor.inFullscreen) {
-            this.emit('primary-fullscreen-changed', this._primaryMonitor.inFullscreen);
+        if (primaryWasInFullscreen != this.primaryMonitor.inFullscreen) {
+            this.emit('primary-fullscreen-changed', this.primaryMonitor.inFullscreen);
         }
     },
 
-    updateRegions: function() {
+    _updateRegions: function() {
         let rects = [], struts = [], i;
 
         if (this._updateRegionIdle) {
@@ -908,7 +842,7 @@ const Chrome = new Lang.Class({
             // the width/height across the middle of the screen, then
             // we don't create a strut for it at all.
             let side;
-            let primary = this._primaryMonitor;
+            let primary = this.primaryMonitor;
             if (x1 <= primary.x && x2 >= primary.x + primary.width) {
                 if (y1 <= primary.y)
                     side = Meta.Side.TOP;
@@ -967,8 +901,7 @@ const Chrome = new Lang.Class({
         return false;
     }
 });
-
-Signals.addSignalMethods(Chrome.prototype);
+Signals.addSignalMethods(LayoutManager.prototype);
 
 
 // HotCorner:



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