diff options
| author | Said Kadrioski <said@kadrioski.de> | 2025-08-28 03:42:04 +0200 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-08-29 09:13:52 +0300 |
| commit | 0c3223ac72f3bee35c954764c2012f0d495deeb0 (patch) | |
| tree | 5877b977aa4000f0fdb8ba22c9dbdc85062193f8 /src/layout/floating.rs | |
| parent | 1ffda91e0cc3938af1a9d4f1f1b6a87afa3c210f (diff) | |
| download | niri-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.rs | 48 |
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]; |
