Fix crash when leaving search after resize

This fixes a crash which could occur when leaving search with a visible
match after shrinking the terminal height to be lower than the original
line the focused match was in.

Closes #7054.
This commit is contained in:
Christian Duerr 2023-11-03 05:50:45 +01:00 committed by GitHub
parent 609499640f
commit 46f8e39880
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 11 deletions

View File

@ -64,6 +64,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- `Command` modifier persisting after `Cmd + Tab` on macOS
- Crash on exit when using NVIDIA binary drivers on Wayland
- `window.startup_mode` applied to window again when creating new tab
- Crash when leaving search after resize
### Removed

View File

@ -598,7 +598,7 @@ impl Display {
terminal: &mut Term<T>,
pty_resize_handle: &mut dyn OnResize,
message_buffer: &MessageBuffer,
search_active: bool,
search_state: &mut SearchState,
config: &UiConfig,
) where
T: EventListener,
@ -643,6 +643,7 @@ impl Display {
);
// Update number of column/lines in the viewport.
let search_active = search_state.history_index.is_some();
let message_bar_lines = message_buffer.message().map_or(0, |m| m.text(&new_size).len());
let search_lines = usize::from(search_active);
new_size.reserve_lines(message_bar_lines + search_lines);
@ -658,10 +659,14 @@ impl Display {
// Resize terminal.
terminal.resize(new_size);
// Queue renderer update if terminal dimensions/padding changed.
// Check if dimensions have changed.
if new_size != self.size_info {
// Queue renderer update.
let renderer_update = self.pending_renderer_update.get_or_insert(Default::default());
renderer_update.resize = true;
// Clear focused search match.
search_state.clear_focused_match();
}
self.size_info = new_size;
}

View File

@ -154,6 +154,11 @@ impl SearchState {
self.focused_match.as_ref()
}
/// Clear the focused match.
pub fn clear_focused_match(&mut self) {
self.focused_match = None;
}
/// Active search dfas.
pub fn dfas(&mut self) -> Option<&mut RegexSearch> {
self.dfas.as_mut()

View File

@ -480,7 +480,7 @@ impl WindowContext {
&mut self.display,
&mut self.notifier,
&self.message_buffer,
&self.search_state,
&mut self.search_state,
old_is_searching,
&self.config,
);
@ -546,7 +546,7 @@ impl WindowContext {
display: &mut Display,
notifier: &mut Notifier,
message_buffer: &MessageBuffer,
search_state: &SearchState,
search_state: &mut SearchState,
old_is_searching: bool,
config: &UiConfig,
) {
@ -559,13 +559,7 @@ impl WindowContext {
search_state.direction == Direction::Left
};
display.handle_update(
terminal,
notifier,
message_buffer,
search_state.history_index.is_some(),
config,
);
display.handle_update(terminal, notifier, message_buffer, search_state, config);
let new_is_searching = search_state.history_index.is_some();
if !old_is_searching && new_is_searching {