@@ -27,6 +27,7 @@ use crossterm::event::PopKeyboardEnhancementFlags;
27
27
use crossterm:: event:: PushKeyboardEnhancementFlags ;
28
28
use crossterm:: terminal:: EnterAlternateScreen ;
29
29
use crossterm:: terminal:: LeaveAlternateScreen ;
30
+ use crossterm:: terminal:: supports_keyboard_enhancement;
30
31
use ratatui:: backend:: Backend ;
31
32
use ratatui:: backend:: CrosstermBackend ;
32
33
use ratatui:: crossterm:: execute;
@@ -160,6 +161,7 @@ pub struct Tui {
160
161
alt_screen_active : Arc < AtomicBool > ,
161
162
// True when terminal/tab is focused; updated internally from crossterm events
162
163
terminal_focused : Arc < AtomicBool > ,
164
+ enhanced_keys_supported : bool ,
163
165
}
164
166
165
167
#[ cfg( unix) ]
@@ -266,6 +268,10 @@ impl Tui {
266
268
}
267
269
} ) ;
268
270
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
+
269
275
Self {
270
276
frame_schedule_tx,
271
277
draw_tx,
@@ -278,6 +284,7 @@ impl Tui {
278
284
suspend_cursor_y : Arc :: new ( AtomicU16 :: new ( 0 ) ) ,
279
285
alt_screen_active : Arc :: new ( AtomicBool :: new ( false ) ) ,
280
286
terminal_focused : Arc :: new ( AtomicBool :: new ( true ) ) ,
287
+ enhanced_keys_supported,
281
288
}
282
289
}
283
290
@@ -287,6 +294,10 @@ impl Tui {
287
294
}
288
295
}
289
296
297
+ pub fn enhanced_keys_supported ( & self ) -> bool {
298
+ self . enhanced_keys_supported
299
+ }
300
+
290
301
pub fn event_stream ( & self ) -> Pin < Box < dyn Stream < Item = TuiEvent > + Send + ' static > > {
291
302
use tokio_stream:: StreamExt ;
292
303
let mut crossterm_events = crossterm:: event:: EventStream :: new ( ) ;
0 commit comments