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
|
- `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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue