@@ -637,6 +637,8 @@ Chrome.prototype = {
637637 global . display . connect ( 'restacked' ,
638638 Lang . bind ( this , this . _windowsRestacked ) ) ;
639639 global . display . connect ( 'in-fullscreen-changed' , Lang . bind ( this , this . _updateVisibility ) ) ;
640+ global . display . connect ( 'notify::focus-window' , Lang . bind ( this , this . _updateVisibility ) ) ;
641+ global . display . connect ( 'window-monitor-changed' , Lang . bind ( this , this . _updateVisibility ) ) ;
640642 global . window_manager . connect ( 'switch-workspace' , Lang . bind ( this , this . _queueUpdateRegions ) ) ;
641643
642644 // Need to update struts on new workspaces when they are added
@@ -773,18 +775,23 @@ Chrome.prototype = {
773775 } ,
774776
775777 _updateVisibility : function ( ) {
776- for ( let i = 0 ; i < this . _trackedActors . length ; i ++ ) {
777- let actorData = this . _trackedActors [ i ] , visible ;
778+ const monitorsInFullscreen = [ ] ;
779+ this . _monitors . forEach ( monitor => {
780+ const topWindow = this . getTopWindowOnMonitor ( monitor . index )
781+ monitorsInFullscreen [ monitor . index ] = topWindow && topWindow . is_fullscreen ( ) ;
782+ } ) ;
783+
784+ this . _trackedActors . forEach ( actorData => {
785+ const monitor = this . findMonitorForActor ( actorData . actor ) ;
786+ let visible = false ;
778787 if ( ! actorData . isToplevel )
779- continue ;
788+ return ;
780789 else if ( global . stage_input_mode == Cinnamon . StageInputMode . FULLSCREEN ) {
781- let monitor = this . findMonitorForActor ( actorData . actor ) ;
782-
783790 if ( global . display . get_n_monitors ( ) == 1 || ! monitor . inFullscreen ) {
784791 visible = true ;
785792 } else {
786793 if ( Main . modalActorFocusStack . length > 0 ) {
787- let modalActor = Main . modalActorFocusStack [ Main . modalActorFocusStack . length - 1 ] . actor ;
794+ const modalActor = Main . modalActorFocusStack [ Main . modalActorFocusStack . length - 1 ] . actor ;
788795
789796 if ( this . findMonitorForActor ( modalActor ) == monitor ) {
790797 visible = true ;
@@ -794,18 +801,33 @@ Chrome.prototype = {
794801 } else if ( this . _inOverview )
795802 visible = true ;
796803 else {
797- let monitor = this . findMonitorForActor ( actorData . actor ) ;
798-
799- if ( ! actorData . visibleInFullscreen && monitor && monitor . inFullscreen )
800- visible = false ;
801- else
804+ if ( actorData . visibleInFullscreen || ! monitorsInFullscreen [ monitor . index ] ) {
802805 visible = true ;
806+ }
803807 }
804808 Main . uiGroup . set_skip_paint ( actorData . actor , ! visible ) ;
805- }
809+ } ) ;
810+
806811 this . _queueUpdateRegions ( ) ;
807812 } ,
808813
814+ getTopWindowOnMonitor : function ( monitorIndex ) {
815+ let topWindow = null , topWindowTime = 0 ;
816+ global . get_window_actors ( ) . forEach ( actor => {
817+ const window = actor . meta_window ;
818+ if ( ! window || window . get_monitor ( ) !== monitorIndex ||
819+ window . minimized || ! window . showing_on_its_workspace ( ) ||
820+ window . get_workspace ( ) !== global . workspace_manager . get_active_workspace ( ) )
821+ return ;
822+ if ( window . get_user_time ( ) > topWindowTime ) {
823+ topWindowTime = window . get_user_time ( ) ;
824+ topWindow = window ;
825+ }
826+ } ) ;
827+
828+ return topWindow ;
829+ } ,
830+
809831 _overviewShowing : function ( ) {
810832 this . _inOverview = true ;
811833 this . _updateVisibility ( ) ;
0 commit comments