aboutsummaryrefslogtreecommitdiff
path: root/src/layout/floating.rs
diff options
context:
space:
mode:
authorSaid Kadrioski <said@kadrioski.de>2025-08-28 03:42:04 +0200
committerIvan Molodetskikh <yalterz@gmail.com>2025-08-29 09:13:52 +0300
commit0c3223ac72f3bee35c954764c2012f0d495deeb0 (patch)
tree5877b977aa4000f0fdb8ba22c9dbdc85062193f8 /src/layout/floating.rs
parent1ffda91e0cc3938af1a9d4f1f1b6a87afa3c210f (diff)
downloadniri-0c3223ac72f3bee35c954764c2012f0d495deeb0.tar.gz
niri-0c3223ac72f3bee35c954764c2012f0d495deeb0.tar.bz2
niri-0c3223ac72f3bee35c954764c2012f0d495deeb0.zip
Add cycle back feature for presets of column/window width/height.
Diffstat (limited to 'src/layout/floating.rs')
-rw-r--r--src/layout/floating.rs48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/layout/floating.rs b/src/layout/floating.rs
index bd976d7d..ad67c5ff 100644
--- a/src/layout/floating.rs
+++ b/src/layout/floating.rs
@@ -624,7 +624,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
}
}
- pub fn toggle_window_width(&mut self, id: Option<&W::Id>) {
+ pub fn toggle_window_width(&mut self, id: Option<&W::Id>, forwards: bool) {
let Some(id) = id.or(self.active_window_id.as_ref()).cloned() else {
return;
};
@@ -632,18 +632,22 @@ impl<W: LayoutElement> FloatingSpace<W> {
let available_size = self.working_area.size.w;
+ let len = self.options.preset_column_widths.len();
let tile = &mut self.tiles[idx];
let preset_idx = if let Some(idx) = tile.floating_preset_width_idx {
- (idx + 1) % self.options.preset_column_widths.len()
+ (idx + if forwards { 1 } else { len - 1 }) % len
} else {
let current_window = tile.window_expected_or_current_size().w;
let current_tile = tile.tile_expected_or_current_size().w;
- self.options
+ let mut it = self
+ .options
.preset_column_widths
.iter()
- .position(|preset| {
- let resolved = resolve_preset_size(*preset, available_size);
+ .map(|preset| resolve_preset_size(*preset, available_size));
+
+ if forwards {
+ it.position(|resolved| {
match resolved {
// Some allowance for fractional scaling purposes.
ResolvedSize::Tile(resolved) => current_tile + 1. < resolved,
@@ -651,6 +655,16 @@ impl<W: LayoutElement> FloatingSpace<W> {
}
})
.unwrap_or(0)
+ } else {
+ it.rposition(|resolved| {
+ match resolved {
+ // Some allowance for fractional scaling purposes.
+ ResolvedSize::Tile(resolved) => resolved + 1. < current_tile,
+ ResolvedSize::Window(resolved) => resolved + 1. < current_window,
+ }
+ })
+ .unwrap_or(len - 1)
+ }
};
let preset = self.options.preset_column_widths[preset_idx];
@@ -670,7 +684,7 @@ impl<W: LayoutElement> FloatingSpace<W> {
true
}
- pub fn toggle_window_height(&mut self, id: Option<&W::Id>) {
+ pub fn toggle_window_height(&mut self, id: Option<&W::Id>, forwards: bool) {
let Some(id) = id.or(self.active_window_id.as_ref()).cloned() else {
return;
};
@@ -678,18 +692,22 @@ impl<W: LayoutElement> FloatingSpace<W> {
let available_size = self.working_area.size.h;
+ let len = self.options.preset_window_heights.len();
let tile = &mut self.tiles[idx];
let preset_idx = if let Some(idx) = tile.floating_preset_height_idx {
- (idx + 1) % self.options.preset_window_heights.len()
+ (idx + if forwards { 1 } else { len - 1 }) % len
} else {
let current_window = tile.window_expected_or_current_size().h;
let current_tile = tile.tile_expected_or_current_size().h;
- self.options
+ let mut it = self
+ .options
.preset_window_heights
.iter()
- .position(|preset| {
- let resolved = resolve_preset_size(*preset, available_size);
+ .map(|preset| resolve_preset_size(*preset, available_size));
+
+ if forwards {
+ it.position(|resolved| {
match resolved {
// Some allowance for fractional scaling purposes.
ResolvedSize::Tile(resolved) => current_tile + 1. < resolved,
@@ -697,6 +715,16 @@ impl<W: LayoutElement> FloatingSpace<W> {
}
})
.unwrap_or(0)
+ } else {
+ it.rposition(|resolved| {
+ match resolved {
+ // Some allowance for fractional scaling purposes.
+ ResolvedSize::Tile(resolved) => resolved + 1. < current_tile,
+ ResolvedSize::Window(resolved) => resolved + 1. < current_window,
+ }
+ })
+ .unwrap_or(len - 1)
+ }
};
let preset = self.options.preset_window_heights[preset_idx];