diff --git a/js/ui/layout.js b/js/ui/layout.js index e9eeceeb7c..84972bf940 100644 --- a/js/ui/layout.js +++ b/js/ui/layout.js @@ -637,6 +637,8 @@ Chrome.prototype = { global.display.connect('restacked', Lang.bind(this, this._windowsRestacked)); global.display.connect('in-fullscreen-changed', Lang.bind(this, this._updateVisibility)); + global.display.connect('notify::focus-window', Lang.bind(this, this._updateVisibility)); + global.display.connect('window-monitor-changed', Lang.bind(this, this._updateVisibility)); global.window_manager.connect('switch-workspace', Lang.bind(this, this._queueUpdateRegions)); // Need to update struts on new workspaces when they are added @@ -773,18 +775,23 @@ Chrome.prototype = { }, _updateVisibility: function() { - for (let i = 0; i < this._trackedActors.length; i++) { - let actorData = this._trackedActors[i], visible; + const monitorsInFullscreen = []; + this._monitors.forEach( monitor => { + const topWindow = this._getTopWindowOnMonitor(monitor.index) + monitorsInFullscreen[monitor.index] = topWindow && topWindow.is_fullscreen(); + }); + + this._trackedActors.forEach( actorData => { + const monitor = this.findMonitorForActor(actorData.actor); + let visible = false; if (!actorData.isToplevel) - continue; + return; else if (global.stage_input_mode == Cinnamon.StageInputMode.FULLSCREEN) { - let monitor = this.findMonitorForActor(actorData.actor); - if (global.display.get_n_monitors() == 1 || !monitor.inFullscreen) { visible = true; } else { if (Main.modalActorFocusStack.length > 0) { - let modalActor = Main.modalActorFocusStack[Main.modalActorFocusStack.length - 1].actor; + const modalActor = Main.modalActorFocusStack[Main.modalActorFocusStack.length - 1].actor; if (this.findMonitorForActor(modalActor) == monitor) { visible = true; @@ -794,18 +801,38 @@ Chrome.prototype = { } else if (this._inOverview) visible = true; else { - let monitor = this.findMonitorForActor(actorData.actor); - - if (!actorData.visibleInFullscreen && monitor && monitor.inFullscreen) - visible = false; - else + if (actorData.visibleInFullscreen || !monitorsInFullscreen[monitor.index]) { visible = true; + } } Main.uiGroup.set_skip_paint(actorData.actor, !visible); - } + }); + this._queueUpdateRegions(); }, + _getTopWindowOnMonitor: function(monitorIndex) { + const focusedWindow = global.display.get_focus_window(); + if (focusedWindow && focusedWindow.get_monitor() === monitorIndex) { + return focusedWindow; + } else { + let topWindow = null, topWindowTime = 0; + global.get_window_actors().forEach(actor=> { + const window = actor.meta_window; + if (!window || window.get_monitor() !== monitorIndex || + window.minimized || !window.showing_on_its_workspace() || + window.get_workspace() !== global.workspace_manager.get_active_workspace()) + return; + if (window.get_user_time() > topWindowTime) { + topWindowTime = window.get_user_time(); + topWindow = window; + } + }); + + return topWindow; + } + }, + _overviewShowing: function() { this._inOverview = true; this._updateVisibility(); diff --git a/js/ui/panel.js b/js/ui/panel.js index bf7d47d474..d85ec2d390 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -1293,7 +1293,7 @@ PanelDummy.prototype = { this.actor = new Cinnamon.GenericContainer({style_class: "panel-dummy", reactive: true, track_hover: true, important: true}); - Main.layoutManager.addChrome(this.actor, { addToWindowgroup: false }); + Main.layoutManager.addChrome(this.actor, { addToWindowgroup: false, visibleInFullscreen: true }); // // layouts set to be full width horizontal panels, and vertical panels set to use as much available space as is left //