fix: do not redraw on read-only actions (#5682)

This commit is contained in:
Aram Drevekenin
2026-10-05 10:02:47 +02:00
committed by GitHub
parent 66e6676698
commit 0dac1906ad
2 changed files with 61 additions and 2 deletions
+5 -2
View File
@@ -2350,13 +2350,16 @@ impl Tab {
None
};
}
let was_dimmed = self.dimmed_clients.contains(&client_id);
self.mode_info.borrow_mut().remove(&client_id);
self.connected_clients.borrow_mut().remove(&client_id);
self.mouse_help_text_visible.remove(&client_id);
self.mouse_last_pane_id.remove(&client_id);
self.last_mouse_activity_time.remove(&client_id);
self.set_client_dimmed(client_id, false);
self.set_force_render();
if is_connected_to_this_tab || was_dimmed {
self.set_client_dimmed(client_id, false);
self.set_force_render();
}
}
pub fn drain_connected_clients(
&mut self,
+56
View File
@@ -894,6 +894,62 @@ pub fn cannot_split_panes_horizontally_when_active_pane_is_too_small() {
);
}
#[test]
pub fn removing_a_client_not_connected_to_the_tab_does_not_force_render() {
let size = Size {
cols: 121,
rows: 20,
};
let stacked_resize = true;
let mut tab = create_new_tab(size, stacked_resize);
for pane in tab.tiled_panes.panes.values_mut() {
pane.set_should_render(false);
}
tab.remove_client(99);
assert!(
tab.tiled_panes.panes.values().all(|p| !p.should_render()),
"removing a client that never viewed this tab must not trigger a full re-render"
);
}
#[test]
pub fn removing_a_client_not_connected_to_the_tab_clears_its_dimming() {
let size = Size {
cols: 121,
rows: 20,
};
let stacked_resize = true;
let mut tab = create_new_tab(size, stacked_resize);
tab.set_client_dimmed(99, true);
for pane in tab.tiled_panes.panes.values_mut() {
pane.set_should_render(false);
}
tab.remove_client(99);
assert!(!tab.dimmed_clients.contains(&99));
assert!(
tab.tiled_panes.panes.values().all(|p| p.should_render()),
"removing a dimmed client must re-render to clear the dimming"
);
}
#[test]
pub fn removing_a_client_connected_to_the_tab_forces_render() {
let size = Size {
cols: 121,
rows: 20,
};
let stacked_resize = true;
let mut tab = create_new_tab(size, stacked_resize);
for pane in tab.tiled_panes.panes.values_mut() {
pane.set_should_render(false);
}
tab.remove_client(1);
assert!(
tab.tiled_panes.panes.values().all(|p| p.should_render()),
"removing a client that was viewing this tab must re-render it for the remaining clients"
);
}
#[test]
pub fn split_in_direction_without_a_connected_client_still_creates_the_pane() {
let size = Size {