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 - `Command` modifier persisting after `Cmd + Tab` on macOS
- Crash on exit when using NVIDIA binary drivers on Wayland - Crash on exit when using NVIDIA binary drivers on Wayland
- `window.startup_mode` applied to window again when creating new tab - `window.startup_mode` applied to window again when creating new tab
- Crash when leaving search after resize
### Removed ### Removed

View File

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

View File

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

View File

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