Cache keyboard enhancement detection before event streams (#3950)
Hopefully fixes incorrectly showing ^J instead of Shift+Enter in the key hints occasionally.
This commit is contained in:
@@ -22,7 +22,6 @@ use color_eyre::eyre::WrapErr;
|
|||||||
use crossterm::event::KeyCode;
|
use crossterm::event::KeyCode;
|
||||||
use crossterm::event::KeyEvent;
|
use crossterm::event::KeyEvent;
|
||||||
use crossterm::event::KeyEventKind;
|
use crossterm::event::KeyEventKind;
|
||||||
use crossterm::terminal::supports_keyboard_enhancement;
|
|
||||||
use ratatui::style::Stylize;
|
use ratatui::style::Stylize;
|
||||||
use ratatui::text::Line;
|
use ratatui::text::Line;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@@ -85,7 +84,7 @@ impl App {
|
|||||||
|
|
||||||
let conversation_manager = Arc::new(ConversationManager::new(auth_manager.clone()));
|
let conversation_manager = Arc::new(ConversationManager::new(auth_manager.clone()));
|
||||||
|
|
||||||
let enhanced_keys_supported = supports_keyboard_enhancement().unwrap_or(false);
|
let enhanced_keys_supported = tui.enhanced_keys_supported();
|
||||||
|
|
||||||
let chat_widget = match resume_selection {
|
let chat_widget = match resume_selection {
|
||||||
ResumeSelection::StartFresh | ResumeSelection::Exit => {
|
ResumeSelection::StartFresh | ResumeSelection::Exit => {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ use crossterm::event::PopKeyboardEnhancementFlags;
|
|||||||
use crossterm::event::PushKeyboardEnhancementFlags;
|
use crossterm::event::PushKeyboardEnhancementFlags;
|
||||||
use crossterm::terminal::EnterAlternateScreen;
|
use crossterm::terminal::EnterAlternateScreen;
|
||||||
use crossterm::terminal::LeaveAlternateScreen;
|
use crossterm::terminal::LeaveAlternateScreen;
|
||||||
|
use crossterm::terminal::supports_keyboard_enhancement;
|
||||||
use ratatui::backend::Backend;
|
use ratatui::backend::Backend;
|
||||||
use ratatui::backend::CrosstermBackend;
|
use ratatui::backend::CrosstermBackend;
|
||||||
use ratatui::crossterm::execute;
|
use ratatui::crossterm::execute;
|
||||||
@@ -160,6 +161,7 @@ pub struct Tui {
|
|||||||
alt_screen_active: Arc<AtomicBool>,
|
alt_screen_active: Arc<AtomicBool>,
|
||||||
// True when terminal/tab is focused; updated internally from crossterm events
|
// True when terminal/tab is focused; updated internally from crossterm events
|
||||||
terminal_focused: Arc<AtomicBool>,
|
terminal_focused: Arc<AtomicBool>,
|
||||||
|
enhanced_keys_supported: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
@@ -266,6 +268,10 @@ impl Tui {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Detect keyboard enhancement support before any EventStream is created so the
|
||||||
|
// crossterm poller can acquire its lock without contention.
|
||||||
|
let enhanced_keys_supported = supports_keyboard_enhancement().unwrap_or(false);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
frame_schedule_tx,
|
frame_schedule_tx,
|
||||||
draw_tx,
|
draw_tx,
|
||||||
@@ -278,6 +284,7 @@ impl Tui {
|
|||||||
suspend_cursor_y: Arc::new(AtomicU16::new(0)),
|
suspend_cursor_y: Arc::new(AtomicU16::new(0)),
|
||||||
alt_screen_active: Arc::new(AtomicBool::new(false)),
|
alt_screen_active: Arc::new(AtomicBool::new(false)),
|
||||||
terminal_focused: Arc::new(AtomicBool::new(true)),
|
terminal_focused: Arc::new(AtomicBool::new(true)),
|
||||||
|
enhanced_keys_supported,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,6 +294,10 @@ impl Tui {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn enhanced_keys_supported(&self) -> bool {
|
||||||
|
self.enhanced_keys_supported
|
||||||
|
}
|
||||||
|
|
||||||
pub fn event_stream(&self) -> Pin<Box<dyn Stream<Item = TuiEvent> + Send + 'static>> {
|
pub fn event_stream(&self) -> Pin<Box<dyn Stream<Item = TuiEvent> + Send + 'static>> {
|
||||||
use tokio_stream::StreamExt;
|
use tokio_stream::StreamExt;
|
||||||
let mut crossterm_events = crossterm::event::EventStream::new();
|
let mut crossterm_events = crossterm::event::EventStream::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user