diff options
| author | rustn00b <83183600+rustn00b@users.noreply.github.com> | 2025-01-09 08:29:36 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-09 08:29:36 +0000 |
| commit | 80815a1591aa3362a5e1c095e9ab81b2945041a7 (patch) | |
| tree | a09a434ff35efc61e1596a34d7d90ba5f69f4111 /src/layout/mod.rs | |
| parent | 8412bfb8136544549e3174fd48859d0be0090c78 (diff) | |
| download | niri-80815a1591aa3362a5e1c095e9ab81b2945041a7.tar.gz niri-80815a1591aa3362a5e1c095e9ab81b2945041a7.tar.bz2 niri-80815a1591aa3362a5e1c095e9ab81b2945041a7.zip | |
Add a window swap operation (#899)
Swap the active window with the a neighboring column's active window.
---------
Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Take into account PR comments
- no longer behave like an expel when a swap is made in a direction
where there is no column to swap with
- fix janky animation
Diffstat (limited to 'src/layout/mod.rs')
| -rw-r--r-- | src/layout/mod.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 4923282b..9fa4681a 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -55,6 +55,7 @@ pub use self::monitor::MonitorRenderElement; use self::monitor::{Monitor, WorkspaceSwitch}; use self::workspace::{OutputId, Workspace}; use crate::animation::Clock; +use crate::layout::scrolling::ScrollDirection; use crate::niri_render_elements; use crate::render_helpers::renderer::NiriRenderer; use crate::render_helpers::snapshot::RenderSnapshot; @@ -2025,6 +2026,13 @@ impl<W: LayoutElement> Layout<W> { monitor.expel_from_column(); } + pub fn swap_window_in_direction(&mut self, direction: ScrollDirection) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.swap_window_in_direction(direction); + } + pub fn center_column(&mut self) { let Some(monitor) = self.active_monitor() else { return; @@ -4382,6 +4390,10 @@ mod tests { ] } + fn arbitrary_scroll_direction() -> impl Strategy<Value = ScrollDirection> { + prop_oneof![Just(ScrollDirection::Left), Just(ScrollDirection::Right)] + } + #[derive(Debug, Clone, Copy, Arbitrary)] enum Op { AddOutput(#[proptest(strategy = "1..=5usize")] usize), @@ -4462,6 +4474,9 @@ mod tests { }, ConsumeWindowIntoColumn, ExpelWindowFromColumn, + SwapWindowInDirection( + #[proptest(strategy = "arbitrary_scroll_direction()")] ScrollDirection, + ), CenterColumn, CenterWindow { #[proptest(strategy = "proptest::option::of(1..=5usize)")] @@ -4984,6 +4999,7 @@ mod tests { } Op::ConsumeWindowIntoColumn => layout.consume_into_column(), Op::ExpelWindowFromColumn => layout.expel_from_column(), + Op::SwapWindowInDirection(direction) => layout.swap_window_in_direction(direction), Op::CenterColumn => layout.center_column(), Op::CenterWindow { id } => { let id = id.filter(|id| layout.has_window(id)); |
