From 153ed8d0a5e6026386913f42a04204e2dee95395 Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Thu, 7 Mar 2024 12:22:39 +0100 Subject: [PATCH] workspace: Re-maximize windows when changing tile mode --- src/shell/layout/floating/mod.rs | 19 +++++++------ src/shell/mod.rs | 2 +- src/shell/workspace.rs | 48 ++++++++++++++++++++++++++------ 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index 6e7041dd..524a2d4e 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -307,6 +307,7 @@ impl FloatingLayout { &mut self, mapped: CosmicMapped, previous_geometry: Rectangle, + animate: bool, ) { let output = self.space.outputs().next().unwrap().clone(); let layers = layer_map_for_output(&output); @@ -324,13 +325,15 @@ impl FloatingLayout { mapped.moved_since_mapped.store(true, Ordering::SeqCst); - self.animations.insert( - mapped.clone(), - Animation::Tiled { - start: Instant::now(), - previous_geometry, - }, - ); + if animate { + self.animations.insert( + mapped.clone(), + Animation::Tiled { + start: Instant::now(), + previous_geometry, + }, + ); + } if mapped.floating_tiled.lock().unwrap().take().is_some() { if let Some(state) = mapped.maximized_state.lock().unwrap().as_mut() { if let Some(real_old_geo) = mapped.last_geometry.lock().unwrap().clone() { @@ -1010,7 +1013,7 @@ impl FloatingLayout { }); std::mem::drop(maximized_state); - self.map_maximized(focused.clone(), start_rectangle); + self.map_maximized(focused.clone(), start_rectangle, true); return MoveResult::Done; } diff --git a/src/shell/mod.rs b/src/shell/mod.rs index d1f1471c..16829a16 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -2779,7 +2779,7 @@ impl Shell { original_layer, }); std::mem::drop(state); - floating_layer.map_maximized(mapped.clone(), original_geometry); + floating_layer.map_maximized(mapped.clone(), original_geometry, true); } } diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index 9eb826f8..41172225 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -60,6 +60,7 @@ use super::{ element::{ resize_indicator::ResizeIndicator, stack::CosmicStackRenderElement, swap_indicator::SwapIndicator, window::CosmicWindowRenderElement, CosmicMapped, + MaximizedState, }, focus::{ target::{KeyboardFocusTarget, PointerFocusTarget, WindowGroup}, @@ -669,11 +670,11 @@ impl Workspace { let previous_geometry = self.tiling_layer.element_geometry(&window.window).unwrap(); self.floating_layer - .map_maximized(window.window, previous_geometry); + .map_maximized(window.window, previous_geometry, true); } } else { if was_maximized { - self.floating_layer.map_maximized(window.window, from); + self.floating_layer.map_maximized(window.window, from, true); } else { self.floating_layer.map(window.window.clone(), None); // get the right animation @@ -890,15 +891,21 @@ impl Workspace { seat: &Seat, workspace_state: &mut WorkspaceUpdateGuard<'_, State>, ) { + let mut maximized_windows = Vec::new(); if tiling { + let floating_windows = self.floating_layer.mapped().cloned().collect::>(); + + for window in floating_windows.iter().filter(|w| w.is_maximized(false)) { + let original_geometry = { + let state = window.maximized_state.lock().unwrap(); + state.as_ref().unwrap().original_geometry.clone() + }; + self.unmaximize_request(&window); + maximized_windows.push((window.clone(), ManagedLayer::Tiling, original_geometry)); + } + let focus_stack = self.focus_stack.get(seat); - for window in self - .floating_layer - .mapped() - .cloned() - .collect::>() - .into_iter() - { + for window in floating_windows.into_iter() { self.floating_layer.unmap(&window); self.tiling_layer .map(window, Some(focus_stack.iter()), None) @@ -913,12 +920,35 @@ impl Workspace { .collect::>() .into_iter() { + if window.is_maximized(false) { + let original_geometry = { + let state = window.maximized_state.lock().unwrap(); + state.as_ref().unwrap().original_geometry.clone() + }; + self.unmaximize_request(&window); + maximized_windows.push(( + window.clone(), + ManagedLayer::Floating, + original_geometry, + )); + } self.tiling_layer.unmap(&window); self.floating_layer.map(window, None); } workspace_state.set_workspace_tiling_state(&self.handle, TilingState::FloatingOnly); self.tiling_enabled = false; } + for (window, original_layer, original_geometry) in maximized_windows { + let mut state = window.maximized_state.lock().unwrap(); + *state = Some(MaximizedState { + original_geometry, + original_layer, + }); + std::mem::drop(state); + + self.floating_layer + .map_maximized(window, original_geometry, false); + } } pub fn toggle_floating_window(&mut self, seat: &Seat, window: &CosmicMapped) {