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:
parent
609499640f
commit
46f8e39880
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue