diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-04 09:51:23 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-02-10 07:29:33 -0800 |
| commit | df70140b3631bc1ffdaa2e27be621a35ef491a44 (patch) | |
| tree | 67664342c929d27259aea66be775d7e7fcd9ec61 /src | |
| parent | f90eb0cbe4ca8f59b9664bac54f8c8b8a0cbd526 (diff) | |
| download | niri-df70140b3631bc1ffdaa2e27be621a35ef491a44.tar.gz niri-df70140b3631bc1ffdaa2e27be621a35ef491a44.tar.bz2 niri-df70140b3631bc1ffdaa2e27be621a35ef491a44.zip | |
Allow tabbed columns to go fullscreen
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout/scrolling.rs | 44 | ||||
| -rw-r--r-- | src/layout/tests.rs | 19 |
2 files changed, 50 insertions, 13 deletions
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index ffa111ba..9a5e081f 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -816,9 +816,9 @@ impl<W: LayoutElement> ScrollingSpace<W> { self.data[col_idx].update(target_column); // If the target column is the active column and its window was requested to, but hasn't - // gone into fullscreen yet, then clear the stored view offset, since we just asked it to + // gone into fullscreen yet, then clear the stored view offset, if we just asked it to // stop going into fullscreen. - if col_idx == self.active_column_idx && !was_fullscreen { + if col_idx == self.active_column_idx && !was_fullscreen && !target_column.is_fullscreen { self.view_offset_before_fullscreen = None; } @@ -1212,7 +1212,12 @@ impl<W: LayoutElement> ScrollingSpace<W> { // We might need to move the view to ensure the resized window is still visible. // Upon unfullscreening, restore the view offset. - let is_fullscreen = self.columns[col_idx].tiles[tile_idx].is_fullscreen(); + // + // In tabbed display mode, there can be multiple tiles in a fullscreen column. They + // will unfullscreen one by one, and the column width will shrink only when the + // last tile unfullscreens. This is when we want to restore the view offset, + // otherwise it will immediately reset back by the animate_view_offset below. + let is_fullscreen = self.columns[col_idx].tiles.iter().any(Tile::is_fullscreen); if was_fullscreen && !is_fullscreen { if let Some(prev_offset) = self.view_offset_before_fullscreen.take() { self.animate_view_offset(col_idx, prev_offset); @@ -1965,6 +1970,12 @@ impl<W: LayoutElement> ScrollingSpace<W> { let col = &mut self.columns[self.active_column_idx]; cancel_resize_for_column(&mut self.interactive_resize, col); col.toggle_tabbed_display(); + + // Disable fullscreen if needed. + if col.display_mode != ColumnDisplay::Tabbed && col.tiles.len() > 1 { + let window = col.tiles[col.active_tile_idx].window().id().clone(); + self.set_fullscreen(&window, false); + } } pub fn center_column(&mut self) { @@ -2405,18 +2416,17 @@ impl<W: LayoutElement> ScrollingSpace<W> { return false; } - if is_fullscreen - && col_idx == self.active_column_idx - && self.columns[col_idx].tiles.len() == 1 + let mut col = &mut self.columns[col_idx]; + let is_tabbed = col.display_mode == ColumnDisplay::Tabbed; + + if is_fullscreen && col_idx == self.active_column_idx && (col.tiles.len() == 1 || is_tabbed) { self.view_offset_before_fullscreen = Some(self.view_offset.stationary()); } - let mut col = &mut self.columns[col_idx]; - cancel_resize_for_column(&mut self.interactive_resize, col); - if is_fullscreen && col.tiles.len() > 1 { + if is_fullscreen && (col.tiles.len() > 1 && !is_tabbed) { // This wasn't the only window in its column; extract it into a separate column. let activate = self.active_column_idx == col_idx && col.active_tile_idx == tile_idx; @@ -3399,7 +3409,10 @@ impl<W: LayoutElement> Column<W> { let mut prev_offsets = Vec::with_capacity(self.tiles.len() + 1); prev_offsets.extend(self.tile_offsets().take(self.tiles.len())); - self.is_fullscreen = false; + if self.display_mode != ColumnDisplay::Tabbed { + self.is_fullscreen = false; + } + self.data .insert(idx, TileData::new(&tile, WindowHeight::auto_1())); self.tiles.insert(idx, tile); @@ -3475,7 +3488,9 @@ impl<W: LayoutElement> Column<W> { fn update_tile_sizes_with_transaction(&mut self, animate: bool, transaction: Transaction) { if self.is_fullscreen { - self.tiles[0].request_fullscreen(); + for tile in &mut self.tiles { + tile.request_fullscreen(); + } return; } @@ -4078,7 +4093,10 @@ impl<W: LayoutElement> Column<W> { return; } - assert_eq!(self.tiles.len(), 1); + if is_fullscreen { + assert!(self.tiles.len() == 1 || self.display_mode == ColumnDisplay::Tabbed); + } + self.is_fullscreen = is_fullscreen; self.update_tile_sizes(false); } @@ -4234,7 +4252,7 @@ impl<W: LayoutElement> Column<W> { assert_eq!(self.tiles.len(), self.data.len()); if self.is_fullscreen { - assert_eq!(self.tiles.len(), 1); + assert!(self.tiles.len() == 1 || self.display_mode == ColumnDisplay::Tabbed); } if let Some(idx) = self.preset_width_idx { diff --git a/src/layout/tests.rs b/src/layout/tests.rs index 55bbecb9..d9ac64c2 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -3106,6 +3106,25 @@ fn preset_column_width_reset_after_set_width() { assert_eq!(win.requested_size().unwrap().w, 500); } +#[test] +fn disable_tabbed_mode_in_fullscreen() { + let ops = [ + Op::AddOutput(0), + Op::AddWindow { + params: TestWindowParams::new(0), + }, + Op::AddWindow { + params: TestWindowParams::new(1), + }, + Op::ConsumeOrExpelWindowLeft { id: None }, + Op::ToggleColumnTabbedDisplay, + Op::FullscreenWindow(0), + Op::ToggleColumnTabbedDisplay, + ]; + + check_ops(&ops); +} + fn parent_id_causes_loop(layout: &Layout<TestWindow>, id: usize, mut parent_id: usize) -> bool { if parent_id == id { return true; |
