diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-08-23 15:41:06 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-08-23 15:41:06 +0300 |
| commit | c8839f7658588bfd7f0f41bf2c2726e526366abf (patch) | |
| tree | 99a2efd437d61d2b1eeda7b96bc68aa940716ef6 /src/layout/mod.rs | |
| parent | dfe3580607ff469837c23b34db34882b16d87a47 (diff) | |
| download | niri-c8839f7658588bfd7f0f41bf2c2726e526366abf.tar.gz niri-c8839f7658588bfd7f0f41bf2c2726e526366abf.tar.bz2 niri-c8839f7658588bfd7f0f41bf2c2726e526366abf.zip | |
Implement window close transaction
Mainly visible with disabled animations.
Diffstat (limited to 'src/layout/mod.rs')
| -rw-r--r-- | src/layout/mod.rs | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 9376112f..2b684ddf 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -52,7 +52,7 @@ use crate::render_helpers::snapshot::RenderSnapshot; use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderElement}; use crate::render_helpers::texture::TextureBuffer; use crate::render_helpers::{BakedBuffer, RenderTarget, SplitElements}; -use crate::utils::transaction::Transaction; +use crate::utils::transaction::{Transaction, TransactionBlocker}; use crate::utils::{output_size, round_logical_in_physical_max1, ResizeEdge}; use crate::window::ResolvedWindowRules; @@ -752,15 +752,13 @@ impl<W: LayoutElement> Layout<W> { ); } - pub fn remove_window(&mut self, window: &W::Id) -> Option<W> { - let mut rv = None; - + pub fn remove_window(&mut self, window: &W::Id, transaction: Transaction) -> Option<W> { match &mut self.monitor_set { MonitorSet::Normal { monitors, .. } => { for mon in monitors { for (idx, ws) in mon.workspaces.iter_mut().enumerate() { if ws.has_window(window) { - rv = Some(ws.remove_window(window)); + let win = ws.remove_window(window, transaction); // Clean up empty workspaces that are not active and not last. if !ws.has_windows() @@ -776,7 +774,7 @@ impl<W: LayoutElement> Layout<W> { } } - break; + return Some(win); } } } @@ -784,20 +782,20 @@ impl<W: LayoutElement> Layout<W> { MonitorSet::NoOutputs { workspaces, .. } => { for (idx, ws) in workspaces.iter_mut().enumerate() { if ws.has_window(window) { - rv = Some(ws.remove_window(window)); + let win = ws.remove_window(window, transaction); // Clean up empty workspaces. if !ws.has_windows() && workspaces[idx].name.is_none() { workspaces.remove(idx); } - break; + return Some(win); } } } } - rv + None } pub fn update_window(&mut self, window: &W::Id, serial: Option<Serial>) { @@ -1970,7 +1968,12 @@ impl<W: LayoutElement> Layout<W> { let width = column.width; let is_full_width = column.is_full_width; let window = ws - .remove_tile_by_idx(ws.active_column_idx, column.active_tile_idx, None) + .remove_tile_by_idx( + ws.active_column_idx, + column.active_tile_idx, + Transaction::new(), + None, + ) .into_window(); let workspace_idx = monitors[new_idx].active_workspace_idx; @@ -2022,7 +2025,7 @@ impl<W: LayoutElement> Layout<W> { let Some(width) = width else { return }; - let window = self.remove_window(window).unwrap(); + let window = self.remove_window(window, Transaction::new()).unwrap(); if let MonitorSet::Normal { monitors, .. } = &mut self.monitor_set { let new_idx = monitors @@ -2425,6 +2428,7 @@ impl<W: LayoutElement> Layout<W> { &mut self, renderer: &mut GlesRenderer, window: &W::Id, + blocker: TransactionBlocker, ) { let _span = tracy_client::span!("Layout::start_close_animation_for_window"); @@ -2433,7 +2437,7 @@ impl<W: LayoutElement> Layout<W> { for mon in monitors { for ws in &mut mon.workspaces { if ws.has_window(window) { - ws.start_close_animation_for_window(renderer, window); + ws.start_close_animation_for_window(renderer, window, blocker); return; } } @@ -2442,7 +2446,7 @@ impl<W: LayoutElement> Layout<W> { MonitorSet::NoOutputs { workspaces, .. } => { for ws in workspaces { if ws.has_window(window) { - ws.start_close_animation_for_window(renderer, window); + ws.start_close_animation_for_window(renderer, window, blocker); return; } } @@ -3143,7 +3147,7 @@ mod tests { layout.add_window_to_named_workspace(&ws_name, win, None, false); } Op::CloseWindow(id) => { - layout.remove_window(&id); + layout.remove_window(&id, Transaction::new()); } Op::FullscreenWindow(id) => { layout.toggle_fullscreen(&id); |
