@@ -637,6 +637,8 @@ Chrome.prototype = {
637
637
global . display . connect ( 'restacked' ,
638
638
Lang . bind ( this , this . _windowsRestacked ) ) ;
639
639
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 ) ) ;
640
642
global . window_manager . connect ( 'switch-workspace' , Lang . bind ( this , this . _queueUpdateRegions ) ) ;
641
643
642
644
// Need to update struts on new workspaces when they are added
@@ -773,18 +775,23 @@ Chrome.prototype = {
773
775
} ,
774
776
775
777
_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 ;
778
787
if ( ! actorData . isToplevel )
779
- continue ;
788
+ return ;
780
789
else if ( global . stage_input_mode == Cinnamon . StageInputMode . FULLSCREEN ) {
781
- let monitor = this . findMonitorForActor ( actorData . actor ) ;
782
-
783
790
if ( global . display . get_n_monitors ( ) == 1 || ! monitor . inFullscreen ) {
784
791
visible = true ;
785
792
} else {
786
793
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 ;
788
795
789
796
if ( this . findMonitorForActor ( modalActor ) == monitor ) {
790
797
visible = true ;
@@ -794,18 +801,38 @@ Chrome.prototype = {
794
801
} else if ( this . _inOverview )
795
802
visible = true ;
796
803
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 ] ) {
802
805
visible = true ;
806
+ }
803
807
}
804
808
Main . uiGroup . set_skip_paint ( actorData . actor , ! visible ) ;
805
- }
809
+ } ) ;
810
+
806
811
this . _queueUpdateRegions ( ) ;
807
812
} ,
808
813
814
+ _getTopWindowOnMonitor : function ( monitorIndex ) {
815
+ const focusedWindow = global . display . get_focus_window ( ) ;
816
+ if ( focusedWindow && focusedWindow . get_monitor ( ) === monitorIndex ) {
817
+ return focusedWindow ;
818
+ } else {
819
+ let topWindow = null , topWindowTime = 0 ;
820
+ global . get_window_actors ( ) . forEach ( actor => {
821
+ const window = actor . meta_window ;
822
+ if ( ! window || window . get_monitor ( ) !== monitorIndex ||
823
+ window . minimized || ! window . showing_on_its_workspace ( ) ||
824
+ window . get_workspace ( ) !== global . workspace_manager . get_active_workspace ( ) )
825
+ return ;
826
+ if ( window . get_user_time ( ) > topWindowTime ) {
827
+ topWindowTime = window . get_user_time ( ) ;
828
+ topWindow = window ;
829
+ }
830
+ } ) ;
831
+
832
+ return topWindow ;
833
+ }
834
+ } ,
835
+
809
836
_overviewShowing : function ( ) {
810
837
this . _inOverview = true ;
811
838
this . _updateVisibility ( ) ;
0 commit comments