diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-06 08:42:09 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-10 07:29:33 -0800 |
| commit | 8f9e0d029c84f6a15c842c3bccd694fac0516c0a (patch) | |
| tree | 0d26dac9ac4b9519b6a0f3f39010f56a354e67a7 /src | |
| parent | 90f24da6317dea022fff89d538c9ba21a580e97b (diff) | |
| download | niri-8f9e0d029c84f6a15c842c3bccd694fac0516c0a.tar.gz niri-8f9e0d029c84f6a15c842c3bccd694fac0516c0a.tar.bz2 niri-8f9e0d029c84f6a15c842c3bccd694fac0516c0a.zip | |
Add set-column-display action
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 6 | ||||
| -rw-r--r-- | src/layout/mod.rs | 7 | ||||
| -rw-r--r-- | src/layout/monitor.rs | 6 | ||||
| -rw-r--r-- | src/layout/scrolling.rs | 31 | ||||
| -rw-r--r-- | src/layout/tests.rs | 6 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 9 |
6 files changed, 57 insertions, 8 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index 54b8a827..8abccd67 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1265,6 +1265,12 @@ impl State { // FIXME: granular self.niri.queue_redraw_all(); } + Action::SetColumnDisplay(display) => { + self.niri.layout.set_column_display(display); + self.maybe_warp_cursor_to_focus(); + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::SwitchPresetColumnWidth => { self.niri.layout.toggle_width(); } diff --git a/src/layout/mod.rs b/src/layout/mod.rs index d9121c07..c9c4e72d 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -2151,6 +2151,13 @@ impl<W: LayoutElement> Layout<W> { monitor.toggle_column_tabbed_display(); } + pub fn set_column_display(&mut self, display: ColumnDisplay) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.set_column_display(display); + } + pub fn center_column(&mut self) { let Some(monitor) = self.active_monitor() else { return; diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index a9e76d5e..8abaf5f6 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -2,7 +2,7 @@ use std::cmp::min; use std::rc::Rc; use std::time::Duration; -use niri_ipc::SizeChange; +use niri_ipc::{ColumnDisplay, SizeChange}; use smithay::backend::renderer::element::utils::{ CropRenderElement, Relocate, RelocateRenderElement, }; @@ -736,6 +736,10 @@ impl<W: LayoutElement> Monitor<W> { self.active_workspace().toggle_column_tabbed_display(); } + pub fn set_column_display(&mut self, display: ColumnDisplay) { + self.active_workspace().set_column_display(display); + } + pub fn center_column(&mut self) { self.active_workspace().center_column(); } diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index b7e240c2..9be308e6 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -1968,8 +1968,26 @@ impl<W: LayoutElement> ScrollingSpace<W> { } let col = &mut self.columns[self.active_column_idx]; + let display = match col.display_mode { + ColumnDisplay::Normal => ColumnDisplay::Tabbed, + ColumnDisplay::Tabbed => ColumnDisplay::Normal, + }; + + self.set_column_display(display); + } + + pub fn set_column_display(&mut self, display: ColumnDisplay) { + if self.columns.is_empty() { + return; + } + + let col = &mut self.columns[self.active_column_idx]; + if col.display_mode == display { + return; + } + cancel_resize_for_column(&mut self.interactive_resize, col); - col.toggle_tabbed_display(); + col.set_column_display(display); // Disable fullscreen if needed. if col.display_mode != ColumnDisplay::Tabbed && col.tiles.len() > 1 { @@ -4101,11 +4119,12 @@ impl<W: LayoutElement> Column<W> { self.update_tile_sizes(false); } - fn toggle_tabbed_display(&mut self) { - self.display_mode = match self.display_mode { - ColumnDisplay::Normal => ColumnDisplay::Tabbed, - ColumnDisplay::Tabbed => ColumnDisplay::Normal, - }; + fn set_column_display(&mut self, display: ColumnDisplay) { + if self.display_mode == display { + return; + } + + self.display_mode = display; self.update_tile_sizes(true); } diff --git a/src/layout/tests.rs b/src/layout/tests.rs index d9ac64c2..8f3e4d58 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -320,6 +320,10 @@ fn arbitrary_scroll_direction() -> impl Strategy<Value = ScrollDirection> { prop_oneof![Just(ScrollDirection::Left), Just(ScrollDirection::Right)] } +fn arbitrary_column_display() -> impl Strategy<Value = ColumnDisplay> { + prop_oneof![Just(ColumnDisplay::Normal), Just(ColumnDisplay::Tabbed)] +} + #[derive(Debug, Clone, Copy, Arbitrary)] enum Op { AddOutput(#[proptest(strategy = "1..=5usize")] usize), @@ -407,6 +411,7 @@ enum Op { ExpelWindowFromColumn, SwapWindowInDirection(#[proptest(strategy = "arbitrary_scroll_direction()")] ScrollDirection), ToggleColumnTabbedDisplay, + SetColumnDisplay(#[proptest(strategy = "arbitrary_column_display()")] ColumnDisplay), CenterColumn, CenterWindow { #[proptest(strategy = "proptest::option::of(1..=5usize)")] @@ -971,6 +976,7 @@ impl Op { Op::ExpelWindowFromColumn => layout.expel_from_column(), Op::SwapWindowInDirection(direction) => layout.swap_window_in_direction(direction), Op::ToggleColumnTabbedDisplay => layout.toggle_column_tabbed_display(), + Op::SetColumnDisplay(display) => layout.set_column_display(display), Op::CenterColumn => layout.center_column(), Op::CenterWindow { id } => { let id = id.filter(|id| layout.has_window(id)); diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index f811b37e..9fd57baa 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -3,7 +3,7 @@ use std::rc::Rc; use std::time::Duration; use niri_config::{CenterFocusedColumn, OutputName, PresetSize, Workspace as WorkspaceConfig}; -use niri_ipc::{PositionChange, SizeChange}; +use niri_ipc::{ColumnDisplay, PositionChange, SizeChange}; use smithay::backend::renderer::gles::GlesRenderer; use smithay::desktop::{layer_map_for_output, Window}; use smithay::output::Output; @@ -1029,6 +1029,13 @@ impl<W: LayoutElement> Workspace<W> { self.scrolling.toggle_column_tabbed_display(); } + pub fn set_column_display(&mut self, display: ColumnDisplay) { + if self.floating_is_active.get() { + return; + } + self.scrolling.set_column_display(display); + } + pub fn center_column(&mut self) { if self.floating_is_active.get() { self.floating.center_window(None); |
