aboutsummaryrefslogtreecommitdiff
path: root/src/app/runtime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/runtime.rs')
-rw-r--r--src/app/runtime.rs46
1 files changed, 37 insertions, 9 deletions
diff --git a/src/app/runtime.rs b/src/app/runtime.rs
index 97edc471..269de37d 100644
--- a/src/app/runtime.rs
+++ b/src/app/runtime.rs
@@ -3,7 +3,7 @@ use std::time::{Duration, Instant};
use crossterm::terminal;
use super::{
- background_update_check_enabled, repeat_key_identity, App, Mode, ANIMATION_INTERVAL,
+ background_update_check_enabled, pressed_key_identity, App, ANIMATION_INTERVAL,
AUTO_UPDATE_CHECK_INTERVAL, GIT_REMOTE_STATUS_REFRESH_INTERVAL, MIN_RENDER_INTERVAL,
RESIZE_POLL_INTERVAL, SELECTION_AUTOSCROLL_INTERVAL,
};
@@ -139,20 +139,42 @@ impl App {
let previous_mode = self.state.mode;
let changed = match event {
crate::raw_input::RawInputEvent::Key(key) => {
- let key_id = repeat_key_identity(&key);
+ let pressed_key_id = pressed_key_identity(super::LOCAL_INPUT_SOURCE, &key);
match key.kind {
crossterm::event::KeyEventKind::Press => {
- if self.state.popup_pane.is_some() || self.state.mode == Mode::Terminal {
- self.suppressed_repeat_keys.remove(&key_id);
+ if self.state.popup_pane.is_some()
+ || self.state.mode == crate::app::Mode::Terminal
+ {
+ self.suppressed_repeat_keys.remove(&pressed_key_id);
+ } else {
+ self.suppressed_repeat_keys.insert(pressed_key_id);
+ }
+ if let Some(target) = self.handle_key(key).await {
+ if !key.is_text_commit {
+ self.pressed_terminal_keys.insert(
+ pressed_key_id,
+ super::PressedTerminalKey { target, key },
+ );
+ }
} else {
- self.suppressed_repeat_keys.insert(key_id);
+ self.pressed_terminal_keys.remove(&pressed_key_id);
}
- self.handle_key(key).await;
true
}
crossterm::event::KeyEventKind::Repeat => {
- if (self.state.popup_pane.is_some() || self.state.mode == Mode::Terminal)
- && !self.suppressed_repeat_keys.contains(&key_id)
+ if let Some(pressed) =
+ self.pressed_terminal_keys.get(&pressed_key_id).cloned()
+ {
+ if !self
+ .forward_terminal_key_to_target(&pressed.target, key)
+ .await
+ {
+ self.pressed_terminal_keys.remove(&pressed_key_id);
+ }
+ true
+ } else if (self.state.popup_pane.is_some()
+ || self.state.mode == crate::app::Mode::Terminal)
+ && !self.suppressed_repeat_keys.contains(&pressed_key_id)
{
self.handle_key(key).await;
true
@@ -161,7 +183,12 @@ impl App {
}
}
crossterm::event::KeyEventKind::Release => {
- self.suppressed_repeat_keys.remove(&key_id);
+ self.suppressed_repeat_keys.remove(&pressed_key_id);
+ if let Some(pressed) = self.pressed_terminal_keys.remove(&pressed_key_id) {
+ let _ = self
+ .forward_terminal_key_to_target(&pressed.target, key)
+ .await;
+ }
false
}
}
@@ -189,6 +216,7 @@ impl App {
true
}
crate::raw_input::RawInputEvent::OuterFocusLost => {
+ self.release_input_source(super::LOCAL_INPUT_SOURCE).await;
self.send_outer_focus_event(crate::ghostty::FocusEvent::Lost);
self.state.outer_terminal_focus = Some(false);
false