[gnome-shell] layout: add chrome actors directly to uiGroup



commit e79c093d808a453ec02e36b39b9e48028141d3a7
Author: Dan Winship <danw gnome org>
Date:   Thu Sep 1 10:20:52 2011 -0400

    layout: add chrome actors directly to uiGroup
    
    Rather than having a single chrome layer and putting all of the chrome
    into that, put the chrome actors directly into uiGroup, so that they
    can be stacked independently of one another relative to other actors.
    
    (This requires making uiGroup a ShellGenericContainer, so we can use
    skip_paint to avoid painting non-visibleInFullscreen chrome when we're
    in fullscreen.)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=657986

 js/ui/layout.js       |   59 +++++++++++++++++++++++++-----------------------
 js/ui/lookingGlass.js |    4 +-
 js/ui/main.js         |    8 +++++-
 3 files changed, 40 insertions(+), 31 deletions(-)
---
diff --git a/js/ui/layout.js b/js/ui/layout.js
index b595365..05c36ad 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -309,11 +309,11 @@ LayoutManager.prototype = {
     },
 
     // addChrome:
-    // @actor: an actor to add to the chrome layer
+    // @actor: an actor to add to the chrome
     // @params: (optional) additional params
     //
-    // Adds @actor to the chrome layer and (unless %affectsInputRegion
-    // in @params is %false) extends the input region to include it.
+    // Adds @actor to the chrome, and (unless %affectsInputRegion in
+    // @params is %false) extends the input region to include it.
     // Changes in @actor's size, position, and visibility will
     // automatically result in appropriate changes to the input
     // region.
@@ -355,9 +355,9 @@ LayoutManager.prototype = {
     },
 
     // removeChrome:
-    // @actor: a child of the chrome layer
+    // @actor: a chrome actor
     //
-    // Removes @actor from the chrome layer
+    // Removes @actor from the chrome
     removeChrome: function(actor) {
         this._chrome.removeActor(actor);
     }
@@ -556,11 +556,6 @@ Chrome.prototype = {
     _init: function(layoutManager) {
         this._layoutManager = layoutManager;
 
-        // The group itself has zero size so it doesn't interfere with DND
-        this.actor = new Shell.GenericContainer({ width: 0, height: 0 });
-        Main.uiGroup.add_actor(this.actor);
-        this.actor.connect('allocate', Lang.bind(this, this._allocated));
-
         this._monitors = [];
         this._inOverview = false;
         this._updateRegionIdle = 0;
@@ -577,6 +572,7 @@ Chrome.prototype = {
         global.screen.connect('notify::n-workspaces',
                               Lang.bind(this, this._queueUpdateRegions));
 
+        this._screenSaverActive = false;
         this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
         this._screenSaverProxy.connect('ActiveChanged', Lang.bind(this, this._onScreenSaverActiveChanged));
         this._screenSaverProxy.GetActiveRemote(Lang.bind(this,
@@ -595,14 +591,8 @@ Chrome.prototype = {
                              Lang.bind(this, this._overviewHidden));
     },
 
-    _allocated: function(actor, box, flags) {
-        let children = this.actor.get_children();
-        for (let i = 0; i < children.length; i++)
-            children[i].allocate_preferred_size(flags);
-    },
-
     addActor: function(actor, params) {
-        this.actor.add_actor(actor);
+        Main.uiGroup.add_actor(actor);
         this._trackActor(actor, params);
     },
 
@@ -614,7 +604,7 @@ Chrome.prototype = {
             index = this._findActor(ancestor);
         }
         if (!ancestor)
-            throw new Error('actor is not a descendent of the chrome layer');
+            throw new Error('actor is not a descendent of a chrome actor');
 
         let ancestorData = this._trackedActors[index];
         if (!params)
@@ -634,7 +624,7 @@ Chrome.prototype = {
     },
 
     removeActor: function(actor) {
-        this.actor.remove_actor(actor);
+        Main.uiGroup.remove_actor(actor);
         this._untrackActor(actor);
     },
 
@@ -653,6 +643,7 @@ Chrome.prototype = {
 
         let actorData = Params.parse(params, defaultParams);
         actorData.actor = actor;
+        actorData.isToplevel = actor.get_parent() == Main.uiGroup;
         actorData.visibleId = actor.connect('notify::visible',
                                             Lang.bind(this, this._queueUpdateRegions));
         actorData.allocationId = actor.connect('notify::allocation',
@@ -682,18 +673,29 @@ Chrome.prototype = {
     },
 
     _actorReparented: function(actor, oldParent) {
-        if (!this.actor.contains(actor))
+        let newParent = actor.get_parent();
+        if (!newParent)
             this._untrackActor(actor);
+        else
+            actorData.isToplevel = (newParent == Main.uiGroup);
     },
 
     _updateVisibility: function() {
         for (let i = 0; i < this._trackedActors.length; i++) {
-            let actorData = this._trackedActors[i];
-            if (!this._inOverview && !actorData.visibleInFullscreen &&
-                this._findMonitorForActor(actorData.actor).inFullscreen)
-                this.actor.set_skip_paint(actorData.actor, true);
+            let actorData = this._trackedActors[i], visible;
+            if (!actorData.isToplevel)
+                continue;
+
+            if (this._screenSaverActive)
+                visible = false;
+            else if (this._inOverview)
+                visible = true;
+            else if (!actorData.visibleInFullscreen &&
+                     this._findMonitorForActor(actorData.actor).inFullscreen)
+                visible = false;
             else
-                this.actor.set_skip_paint(actorData.actor, false);
+                visible = true;
+            Main.uiGroup.set_skip_paint(actorData.actor, !visible);
         }
     },
 
@@ -719,7 +721,8 @@ Chrome.prototype = {
     },
 
     _onScreenSaverActiveChanged: function(proxy, screenSaverActive) {
-        this.actor.visible = !screenSaverActive;
+        this._screenSaverActive = screenSaverActive;
+        this._updateVisibility();
         this._queueUpdateRegions();
     },
 
@@ -783,7 +786,7 @@ Chrome.prototype = {
         for (let i = 0; i < this._monitors.length; i++)
             this._monitors[i].inFullscreen = false;
 
-        // The chrome layer should be visible unless there is a window
+        // Ordinary chrome should be visible unless there is a window
         // with layer FULLSCREEN, or a window with layer
         // OVERRIDE_REDIRECT that covers the whole screen.
         // ('override_redirect' is not actually a layer above all
@@ -864,7 +867,7 @@ Chrome.prototype = {
 
             if (actorData.affectsInputRegion &&
                 actorData.actor.get_paint_visibility() &&
-                !this.actor.get_skip_paint(actorData.actor))
+                !Main.uiGroup.get_skip_paint(actorData.actor))
                 rects.push(rect);
 
             if (!actorData.affectsStruts)
diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js
index c646d61..dd22137 100644
--- a/js/ui/lookingGlass.js
+++ b/js/ui/lookingGlass.js
@@ -974,7 +974,7 @@ LookingGlass.prototype = {
 
         this._notebook.selectIndex(0);
         this.actor.show();
-        this.actor.lower_bottom();
+        this.actor.lower(Main.layoutManager.panelBox);
         this._open = true;
         this._history.lastItem();
 
@@ -1005,7 +1005,7 @@ LookingGlass.prototype = {
 
         Main.popModal(this._entry);
 
-        this.actor.lower_bottom();
+        this.actor.lower(Main.layoutManager.panelBox);
         Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
                                        transition: 'easeOutQuad',
                                        y: this._hiddenY,
diff --git a/js/ui/main.js b/js/ui/main.js
index 15f1766..58b4d41 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -193,7 +193,13 @@ function start() {
     loadTheme();
 
     // Set up stage hierarchy to group all UI actors under one container.
-    uiGroup = new Clutter.Group();
+    uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
+    uiGroup.connect('allocate',
+                    function (actor, box, flags) {
+                        let children = uiGroup.get_children();
+                        for (let i = 0; i < children.length; i++)
+                            children[i].allocate_preferred_size(flags);
+                    });
     St.set_ui_root(global.stage, uiGroup);
     global.window_group.reparent(uiGroup);
     global.overlay_group.reparent(uiGroup);



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