diff --git a/src/shell/mod.rs b/src/shell/mod.rs index d689ab97..cf983061 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -3017,6 +3017,8 @@ impl Shell { ) -> Option<(KeyboardFocusTarget, Point)> { let from_output = self.workspaces.space_for_handle(from)?.output.clone(); let to_output = self.workspaces.space_for_handle(to)?.output.clone(); + let to_is_tiling = self.workspaces.space_for_handle(to).unwrap().tiling_enabled; + let from_workspace = self.workspaces.space_for_handle_mut(from).unwrap(); // checked above let is_minimized = window.is_minimized(); @@ -3035,13 +3037,25 @@ impl Shell { } // update fullscreen state to restore to the new workspace if let WorkspaceRestoreData::Fullscreen(Some(FullscreenRestoreData { - previous_state: - FullscreenRestoreState::Tiling { workspace, .. } - | FullscreenRestoreState::Floating { workspace, .. }, + previous_state: previous, .. })) = &mut window_state { - *workspace = *to; + if to_is_tiling && !from_workspace.tiling_enabled { + *previous = FullscreenRestoreState::Tiling { + workspace: *to, + state: TilingRestoreData { + state: None, + was_maximized: previous.was_maximized(), + }, + }; + } else { + if let FullscreenRestoreState::Tiling { workspace, .. } + | FullscreenRestoreState::Floating { workspace, .. } = previous + { + *workspace = *to; + } + } } if is_minimized { diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index fd6d14ff..306df11d 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -253,6 +253,16 @@ pub enum FullscreenRestoreState { }, } +impl FullscreenRestoreState { + pub fn was_maximized(&self) -> bool { + match self { + FullscreenRestoreState::Floating { state, .. } + | FullscreenRestoreState::Sticky { state, .. } => state.was_maximized, + FullscreenRestoreState::Tiling { state, .. } => state.was_maximized, + } + } +} + #[derive(Debug, Clone)] pub enum WorkspaceRestoreData { Fullscreen(Option),