Skip to content

Commit 42d335d

Browse files
Cache keyboard enhancement detection before event streams (#3950)
Hopefully fixes incorrectly showing ^J instead of Shift+Enter in the key hints occasionally.
1 parent ad0c2b4 commit 42d335d

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

codex-rs/tui/src/app.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use color_eyre::eyre::WrapErr;
2222
use crossterm::event::KeyCode;
2323
use crossterm::event::KeyEvent;
2424
use crossterm::event::KeyEventKind;
25-
use crossterm::terminal::supports_keyboard_enhancement;
2625
use ratatui::style::Stylize;
2726
use ratatui::text::Line;
2827
use std::path::PathBuf;
@@ -85,7 +84,7 @@ impl App {
8584

8685
let conversation_manager = Arc::new(ConversationManager::new(auth_manager.clone()));
8786

88-
let enhanced_keys_supported = supports_keyboard_enhancement().unwrap_or(false);
87+
let enhanced_keys_supported = tui.enhanced_keys_supported();
8988

9089
let chat_widget = match resume_selection {
9190
ResumeSelection::StartFresh | ResumeSelection::Exit => {

codex-rs/tui/src/tui.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use crossterm::event::PopKeyboardEnhancementFlags;
2727
use crossterm::event::PushKeyboardEnhancementFlags;
2828
use crossterm::terminal::EnterAlternateScreen;
2929
use crossterm::terminal::LeaveAlternateScreen;
30+
use crossterm::terminal::supports_keyboard_enhancement;
3031
use ratatui::backend::Backend;
3132
use ratatui::backend::CrosstermBackend;
3233
use ratatui::crossterm::execute;
@@ -160,6 +161,7 @@ pub struct Tui {
160161
alt_screen_active: Arc<AtomicBool>,
161162
// True when terminal/tab is focused; updated internally from crossterm events
162163
terminal_focused: Arc<AtomicBool>,
164+
enhanced_keys_supported: bool,
163165
}
164166

165167
#[cfg(unix)]
@@ -266,6 +268,10 @@ impl Tui {
266268
}
267269
});
268270

271+
// Detect keyboard enhancement support before any EventStream is created so the
272+
// crossterm poller can acquire its lock without contention.
273+
let enhanced_keys_supported = supports_keyboard_enhancement().unwrap_or(false);
274+
269275
Self {
270276
frame_schedule_tx,
271277
draw_tx,
@@ -278,6 +284,7 @@ impl Tui {
278284
suspend_cursor_y: Arc::new(AtomicU16::new(0)),
279285
alt_screen_active: Arc::new(AtomicBool::new(false)),
280286
terminal_focused: Arc::new(AtomicBool::new(true)),
287+
enhanced_keys_supported,
281288
}
282289
}
283290

@@ -287,6 +294,10 @@ impl Tui {
287294
}
288295
}
289296

297+
pub fn enhanced_keys_supported(&self) -> bool {
298+
self.enhanced_keys_supported
299+
}
300+
290301
pub fn event_stream(&self) -> Pin<Box<dyn Stream<Item = TuiEvent> + Send + 'static>> {
291302
use tokio_stream::StreamExt;
292303
let mut crossterm_events = crossterm::event::EventStream::new();

0 commit comments

Comments
 (0)