summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-07-27 17:55:21 +0200
committerGitHub <noreply@github.com>2023-07-27 17:55:21 +0200
commitade4406a8ff3ddfac2851535283343029020f49f (patch)
tree834ce9accb18526e3f6a52e92386de2d70033723
parent5601766225be677549af8e16dd565c7c20f76b87 (diff)
fix(terminal): properly handle resizes in alternate screen (#2654)
-rw-r--r--zellij-server/src/output/mod.rs6
-rw-r--r--zellij-server/src/panes/grid.rs38
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__alternate_screen_change_size.snap32
3 files changed, 43 insertions, 33 deletions
diff --git a/zellij-server/src/output/mod.rs b/zellij-server/src/output/mod.rs
index efcb74313..a2d041970 100644
--- a/zellij-server/src/output/mod.rs
+++ b/zellij-server/src/output/mod.rs
@@ -910,6 +910,12 @@ impl OutputBuffer {
if row_width < viewport_width {
let mut padding = vec![EMPTY_TERMINAL_CHARACTER; viewport_width - row_width];
terminal_characters.append(&mut padding);
+ } else if row_width > viewport_width {
+ let width_offset = row.excess_width_until(viewport_width);
+ let truncate_position = viewport_width.saturating_sub(width_offset);
+ if truncate_position < terminal_characters.len() {
+ terminal_characters.truncate(truncate_position);
+ }
}
terminal_characters
}
diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs
index cf006d42f..3ae47327a 100644
--- a/zellij-server/src/panes/grid.rs
+++ b/zellij-server/src/panes/grid.rs
@@ -760,9 +760,16 @@ impl Grid {
if new_columns == 0 || new_rows == 0 {
return;
}
+ if self.alternate_screen_state.is_some() {
+ // in alternate screen we do nothing but log the new size, the program in the terminal
+ // is in control now...
+ self.height = new_rows;
+ self.width = new_columns;
+ return;
+ }
self.selection.reset();
self.sixel_grid.character_cell_size_possibly_changed();
- if new_columns != self.width && self.alternate_screen_state.is_none() {
+ if new_columns != self.width {
self.horizontal_tabstops = create_horizontal_tabstops(new_columns);
let mut cursor_canonical_line_index = self.cursor_canonical_line_index();
let cursor_index_in_canonical_line = self.cursor_index_in_canonical_line();
@@ -917,14 +924,6 @@ impl Grid {
},
}
};
- } else if new_columns != self.width && self.alternate_screen_state.is_some() {
- // in alternate screen just truncate exceeding width
- for row in &mut self.viewport {
- if row.width() >= new_columns {
- let truncate_at = row.position_accounting_for_widechars(new_columns);
- row.columns.truncate(truncate_at);
- }
- }
}
if new_rows != self.height {
let current_viewport_row_count = self.viewport.len();
@@ -959,18 +958,13 @@ impl Grid {
.saturating_sub(row_count_to_transfer);
};
}
- if self.alternate_screen_state.is_none() {
- transfer_rows_from_viewport_to_lines_above(
- &mut self.viewport,
- &mut self.lines_above,
- &mut self.sixel_grid,
- row_count_to_transfer,
- new_columns,
- );
- } else {
- // in alternate screen, no scroll buffer, so just remove lines
- self.viewport.drain(0..row_count_to_transfer);
- }
+ transfer_rows_from_viewport_to_lines_above(
+ &mut self.viewport,
+ &mut self.lines_above,
+ &mut self.sixel_grid,
+ row_count_to_transfer,
+ new_columns,
+ );
},
Ordering::Equal => {},
}
@@ -1340,7 +1334,7 @@ impl Grid {
if character_width == 0 {
return;
}
- if self.cursor.x + character_width > self.width {
+ if self.cursor.x + character_width > self.width && self.alternate_screen_state.is_none() {
if self.disable_linewrap {
return;
}
diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__alternate_screen_change_size.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__alternate_screen_change_size.snap
index df16b28c3..4378ebd6b 100644
--- a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__alternate_screen_change_size.snap
+++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__alternate_screen_change_size.snap
@@ -1,16 +1,26 @@
---
source: zellij-server/src/panes/./unit/grid_tests.rs
+assertion_line: 2137
expression: "format!(\"{:?}\", grid)"
-
---
-00 (C): line12aaaa
-01 (C): line13aaaa
-02 (C): line14aaaa
-03 (C): line15aaaa
-04 (C): line16aaaa
-05 (C): line17aaaa
-06 (C): line18aaaa
-07 (C): line19a🦀a
-08 (C): line20a🦀
-09 (C): line21🦀🦀
+00 (C): line2aaaaaaaaaaaaaaa
+01 (C): line3aaaaaaaaaaaaaaa
+02 (C): line4aaaaaaaaaaaaaaa
+03 (C): line5aaaaaaaaaaaaaaa
+04 (C): line6aaaaaaaaaaaaaaa
+05 (C): line7aaaaaaaaaaaaaaa
+06 (C): line8aaaaaaaaaaaaaaa
+07 (C): line9aaaaaaaaaaaaaaa
+08 (C): line10aaaaaaaaaaaaaa
+09 (C): line11aaaaaaaaaaaaaa
+10 (C): line12aaaaaaaaaaaaaa
+11 (C): line13aaaaaaaaaaaaaa
+12 (C): line14aaaaaaaaaaaaaa
+13 (C): line15aaaaaaaaaaaaaa
+14 (C): line16aaaaaaaaaaaaaa
+15 (C): line17aaaaaaaaaaaaaa
+16 (C): line18aaaaaaaaaaaaaa
+17 (C): line19a🦀aaaaaaaaaaa
+18 (C): line20a🦀🦀aaaaaaaaa
+19 (C): line21🦀🦀🦀🦀🦀🦀🦀