@@ -574,10 +574,9 @@ impl Workspace {
574574 pub fn unmap_element ( & mut self , mapped : & CosmicMapped ) -> Option < WorkspaceRestoreData > {
575575 let was_maximized = if mapped. maximized_state . lock ( ) . unwrap ( ) . is_some ( ) {
576576 // If surface is maximized then unmaximize it, so it is assigned to only one layer
577- let _ = self . unmaximize_request ( & mapped) ;
578- true
577+ self . unmaximize_request ( & mapped)
579578 } else {
580- false
579+ None
581580 } ;
582581
583582 self . focus_stack
@@ -598,20 +597,24 @@ impl Workspace {
598597 } ) ;
599598 }
600599
601- if let Some ( floating_geometry) = self . floating_layer . unmap ( & mapped, None ) {
602- return Some ( WorkspaceRestoreData :: Floating ( Some ( FloatingRestoreData {
603- geometry : floating_geometry,
604- output_size : self . output . geometry ( ) . size . as_logical ( ) ,
605- was_maximized,
606- } ) ) ) ;
607- } ;
608600 if let Ok ( state) = self . tiling_layer . unmap ( & mapped, None ) {
609601 return Some ( WorkspaceRestoreData :: Tiling ( Some ( TilingRestoreData {
610602 state,
611- was_maximized,
603+ was_maximized : was_maximized . is_some ( ) ,
612604 } ) ) ) ;
613605 }
614606
607+ // unmaximize_request might have triggered a `floating_layer.refresh()`,
608+ // which may have already removed a non-alive surface.
609+ if let Some ( floating_geometry) = self . floating_layer . unmap ( & mapped, None ) . or ( was_maximized)
610+ {
611+ return Some ( WorkspaceRestoreData :: Floating ( Some ( FloatingRestoreData {
612+ geometry : floating_geometry,
613+ output_size : self . output . geometry ( ) . size . as_logical ( ) ,
614+ was_maximized : was_maximized. is_some ( ) ,
615+ } ) ) ) ;
616+ } ;
617+
615618 None
616619 }
617620
@@ -935,12 +938,12 @@ impl Workspace {
935938 self . floating_layer . recalculate ( ) ;
936939 }
937940
938- pub fn unmaximize_request ( & mut self , elem : & CosmicMapped ) -> Option < Size < i32 , Logical > > {
941+ pub fn unmaximize_request ( & mut self , elem : & CosmicMapped ) -> Option < Rectangle < i32 , Local > > {
939942 let mut state = elem. maximized_state . lock ( ) . unwrap ( ) ;
940943 if let Some ( state) = state. take ( ) {
941944 if let Some ( minimized) = self . minimized_windows . iter_mut ( ) . find ( |m| * m == elem) {
942945 minimized. unmaximize ( state. original_geometry ) ;
943- Some ( state. original_geometry . size . as_logical ( ) )
946+ Some ( state. original_geometry )
944947 } else {
945948 match state. original_layer {
946949 ManagedLayer :: Tiling if self . tiling_enabled => {
@@ -951,9 +954,7 @@ impl Workspace {
951954 elem. set_geometry ( state. original_geometry . to_global ( & self . output ) ) ;
952955 elem. configure ( ) ;
953956 self . tiling_layer . recalculate ( ) ;
954- self . tiling_layer
955- . element_geometry ( & elem)
956- . map ( |geo| geo. size . as_logical ( ) )
957+ self . tiling_layer . element_geometry ( & elem)
957958 }
958959 ManagedLayer :: Sticky => unreachable ! ( ) ,
959960 _ => {
@@ -964,7 +965,7 @@ impl Workspace {
964965 Some ( state. original_geometry . size . as_logical ( ) ) ,
965966 None ,
966967 ) ;
967- Some ( state. original_geometry . size . as_logical ( ) )
968+ Some ( state. original_geometry )
968969 }
969970 }
970971 }
0 commit comments