From e79c093d808a453ec02e36b39b9e48028141d3a7 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 1 Sep 2011 10:20:52 -0400 Subject: [PATCH] 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 b595365e9..05c36ad23 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 c646d6166..dd221377a 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 15f176660..58b4d4127 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);