diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 85dbbd95..1b372254 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -3128,7 +3128,18 @@ impl Shell { let from_workspace = self.workspaces.space_for_handle_mut(from).unwrap(); // checked above let is_minimized = window.is_minimized(); - let mut window_state = from_workspace.unmap_surface(window)?.1; + let is_fullscreen = from_workspace.get_fullscreen().is_some_and(|f| f == window); + let mut window_state = if is_fullscreen { + let (previous_state, previous_geometry) = from_workspace.take_fullscreen().unwrap(); + WorkspaceRestoreData::Fullscreen(previous_state.zip(previous_geometry).map( + |(previous_state, previous_geometry)| FullscreenRestoreData { + previous_state, + previous_geometry, + }, + )) + } else { + from_workspace.unmap_surface(window)?.1 + }; toplevel_leave_workspace(window, from); if from_output != to_output { diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index 30c49493..0f855132 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -1235,6 +1235,26 @@ impl Workspace { res } + #[must_use] + pub fn take_fullscreen( + &mut self, + ) -> Option<( + Option, + Option>, + )> { + let surface = self.fullscreen.take()?; + if surface.ended_at.is_some() { + self.fullscreen = Some(surface); + return None; + } + + for focus_stack in self.focus_stack.0.values_mut() { + focus_stack.retain(|t| t != &surface.surface); + } + + Some((surface.previous_state, surface.previous_geometry)) + } + #[must_use] pub fn remove_fullscreen( &mut self,