From 8f9e0d029c84f6a15c842c3bccd694fac0516c0a Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Thu, 6 Feb 2025 08:42:09 +0300 Subject: Add set-column-display action --- src/layout/mod.rs | 7 +++++++ src/layout/monitor.rs | 6 +++++- src/layout/scrolling.rs | 31 +++++++++++++++++++++++++------ src/layout/tests.rs | 6 ++++++ src/layout/workspace.rs | 9 ++++++++- 5 files changed, 51 insertions(+), 8 deletions(-) (limited to 'src/layout') 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 Layout { 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 Monitor { 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 ScrollingSpace { } 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 Column { 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 { prop_oneof![Just(ScrollDirection::Left), Just(ScrollDirection::Right)] } +fn arbitrary_column_display() -> impl Strategy { + 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 Workspace { 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); -- cgit