workspace: Re-maximize windows when changing tile mode

This commit is contained in:
Victoria Brekenfeld 2024-03-07 12:22:39 +01:00
parent d65016b4d4
commit 153ed8d0a5
3 changed files with 51 additions and 18 deletions

View file

@ -307,6 +307,7 @@ impl FloatingLayout {
&mut self, &mut self,
mapped: CosmicMapped, mapped: CosmicMapped,
previous_geometry: Rectangle<i32, Local>, previous_geometry: Rectangle<i32, Local>,
animate: bool,
) { ) {
let output = self.space.outputs().next().unwrap().clone(); let output = self.space.outputs().next().unwrap().clone();
let layers = layer_map_for_output(&output); let layers = layer_map_for_output(&output);
@ -324,13 +325,15 @@ impl FloatingLayout {
mapped.moved_since_mapped.store(true, Ordering::SeqCst); mapped.moved_since_mapped.store(true, Ordering::SeqCst);
self.animations.insert( if animate {
mapped.clone(), self.animations.insert(
Animation::Tiled { mapped.clone(),
start: Instant::now(), Animation::Tiled {
previous_geometry, start: Instant::now(),
}, previous_geometry,
); },
);
}
if mapped.floating_tiled.lock().unwrap().take().is_some() { if mapped.floating_tiled.lock().unwrap().take().is_some() {
if let Some(state) = mapped.maximized_state.lock().unwrap().as_mut() { if let Some(state) = mapped.maximized_state.lock().unwrap().as_mut() {
if let Some(real_old_geo) = mapped.last_geometry.lock().unwrap().clone() { if let Some(real_old_geo) = mapped.last_geometry.lock().unwrap().clone() {
@ -1010,7 +1013,7 @@ impl FloatingLayout {
}); });
std::mem::drop(maximized_state); std::mem::drop(maximized_state);
self.map_maximized(focused.clone(), start_rectangle); self.map_maximized(focused.clone(), start_rectangle, true);
return MoveResult::Done; return MoveResult::Done;
} }

View file

@ -2779,7 +2779,7 @@ impl Shell {
original_layer, original_layer,
}); });
std::mem::drop(state); std::mem::drop(state);
floating_layer.map_maximized(mapped.clone(), original_geometry); floating_layer.map_maximized(mapped.clone(), original_geometry, true);
} }
} }

View file

@ -60,6 +60,7 @@ use super::{
element::{ element::{
resize_indicator::ResizeIndicator, stack::CosmicStackRenderElement, resize_indicator::ResizeIndicator, stack::CosmicStackRenderElement,
swap_indicator::SwapIndicator, window::CosmicWindowRenderElement, CosmicMapped, swap_indicator::SwapIndicator, window::CosmicWindowRenderElement, CosmicMapped,
MaximizedState,
}, },
focus::{ focus::{
target::{KeyboardFocusTarget, PointerFocusTarget, WindowGroup}, target::{KeyboardFocusTarget, PointerFocusTarget, WindowGroup},
@ -669,11 +670,11 @@ impl Workspace {
let previous_geometry = let previous_geometry =
self.tiling_layer.element_geometry(&window.window).unwrap(); self.tiling_layer.element_geometry(&window.window).unwrap();
self.floating_layer self.floating_layer
.map_maximized(window.window, previous_geometry); .map_maximized(window.window, previous_geometry, true);
} }
} else { } else {
if was_maximized { if was_maximized {
self.floating_layer.map_maximized(window.window, from); self.floating_layer.map_maximized(window.window, from, true);
} else { } else {
self.floating_layer.map(window.window.clone(), None); self.floating_layer.map(window.window.clone(), None);
// get the right animation // get the right animation
@ -890,15 +891,21 @@ impl Workspace {
seat: &Seat<State>, seat: &Seat<State>,
workspace_state: &mut WorkspaceUpdateGuard<'_, State>, workspace_state: &mut WorkspaceUpdateGuard<'_, State>,
) { ) {
let mut maximized_windows = Vec::new();
if tiling { if tiling {
let floating_windows = self.floating_layer.mapped().cloned().collect::<Vec<_>>();
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); let focus_stack = self.focus_stack.get(seat);
for window in self for window in floating_windows.into_iter() {
.floating_layer
.mapped()
.cloned()
.collect::<Vec<_>>()
.into_iter()
{
self.floating_layer.unmap(&window); self.floating_layer.unmap(&window);
self.tiling_layer self.tiling_layer
.map(window, Some(focus_stack.iter()), None) .map(window, Some(focus_stack.iter()), None)
@ -913,12 +920,35 @@ impl Workspace {
.collect::<Vec<_>>() .collect::<Vec<_>>()
.into_iter() .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.tiling_layer.unmap(&window);
self.floating_layer.map(window, None); self.floating_layer.map(window, None);
} }
workspace_state.set_workspace_tiling_state(&self.handle, TilingState::FloatingOnly); workspace_state.set_workspace_tiling_state(&self.handle, TilingState::FloatingOnly);
self.tiling_enabled = false; 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<State>, window: &CosmicMapped) { pub fn toggle_floating_window(&mut self, seat: &Seat<State>, window: &CosmicMapped) {