aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-02-06 08:42:09 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-02-10 07:29:33 -0800
commit8f9e0d029c84f6a15c842c3bccd694fac0516c0a (patch)
tree0d26dac9ac4b9519b6a0f3f39010f56a354e67a7 /src
parent90f24da6317dea022fff89d538c9ba21a580e97b (diff)
downloadniri-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.rs6
-rw-r--r--src/layout/mod.rs7
-rw-r--r--src/layout/monitor.rs6
-rw-r--r--src/layout/scrolling.rs31
-rw-r--r--src/layout/tests.rs6
-rw-r--r--src/layout/workspace.rs9
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);