diff --git a/src/input/mod.rs b/src/input/mod.rs index c71f9d1e..5d2ac908 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1832,7 +1832,7 @@ impl State { Action::ToggleWindowFloating => { let output = seat.active_output(); let workspace = self.common.shell.active_space_mut(&output); - workspace.toggle_floating_window(seat); + workspace.toggle_floating_window_focused(seat); } Action::Spawn(command) => { let (token, data) = self diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index 9b2e20a4..87be6fb2 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -753,19 +753,27 @@ impl Workspace { } } - pub fn toggle_floating_window(&mut self, seat: &Seat) { + pub fn toggle_floating_window(&mut self, seat: &Seat, window: &CosmicMapped) { if self.tiling_enabled { - if let Some(window) = self.focus_stack.get(seat).iter().next().cloned() { - if self.tiling_layer.mapped().any(|(_, m, _)| m == &window) { - self.tiling_layer.unmap(&window); - self.floating_layer.map(window, None); - } else if self.floating_layer.mapped().any(|w| w == &window) { - let focus_stack = self.focus_stack.get(seat); - self.floating_layer.unmap(&window); - self.tiling_layer - .map(window, Some(focus_stack.iter()), None) - } + if window.is_maximized(false) { + self.unmaximize_request(&window.active_window()); } + if self.tiling_layer.mapped().any(|(_, m, _)| m == window) { + self.tiling_layer.unmap(window); + self.floating_layer.map(window.clone(), None); + } else if self.floating_layer.mapped().any(|w| w == window) { + let focus_stack = self.focus_stack.get(seat); + self.floating_layer.unmap(&window); + self.tiling_layer + .map(window.clone(), Some(focus_stack.iter()), None) + } + } + } + + pub fn toggle_floating_window_focused(&mut self, seat: &Seat) { + let maybe_window = self.focus_stack.get(seat).iter().next().cloned(); + if let Some(window) = maybe_window { + self.toggle_floating_window(seat, &window); } }