tui: Handle keyboard enhancement check failure (#6438)

If the terminal doesn't send the primary device attributes response to
the query, the `terminal::supports_keyboard_enhancement` function from
crossterm may timeout and return an Err.

We should interpret this error to mean that the terminal doesn't support
the keyboard enhancement protocol rather than an error in claiming the
terminal.
This commit is contained in:
Michael Davis 2023-03-28 22:51:11 -05:00 committed by GitHub
parent 6a323c0b1b
commit bbcdcd04a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -78,21 +78,20 @@ where
} }
#[inline] #[inline]
fn supports_keyboard_enhancement_protocol(&self) -> io::Result<bool> { fn supports_keyboard_enhancement_protocol(&self) -> bool {
self.supports_keyboard_enhancement_protocol *self.supports_keyboard_enhancement_protocol
.get_or_try_init(|| { .get_or_init(|| {
use std::time::Instant; use std::time::Instant;
let now = Instant::now(); let now = Instant::now();
let support = terminal::supports_keyboard_enhancement(); let supported = matches!(terminal::supports_keyboard_enhancement(), Ok(true));
log::debug!( log::debug!(
"The keyboard enhancement protocol is {}supported in this terminal (checked in {:?})", "The keyboard enhancement protocol is {}supported in this terminal (checked in {:?})",
if matches!(support, Ok(true)) { "" } else { "not " }, if supported { "" } else { "not " },
Instant::now().duration_since(now) Instant::now().duration_since(now)
); );
support supported
}) })
.copied()
} }
} }
@ -125,7 +124,7 @@ where
if config.enable_mouse_capture { if config.enable_mouse_capture {
execute!(self.buffer, EnableMouseCapture)?; execute!(self.buffer, EnableMouseCapture)?;
} }
if self.supports_keyboard_enhancement_protocol()? { if self.supports_keyboard_enhancement_protocol() {
execute!( execute!(
self.buffer, self.buffer,
PushKeyboardEnhancementFlags( PushKeyboardEnhancementFlags(
@ -143,7 +142,7 @@ where
if config.enable_mouse_capture { if config.enable_mouse_capture {
execute!(self.buffer, DisableMouseCapture)?; execute!(self.buffer, DisableMouseCapture)?;
} }
if self.supports_keyboard_enhancement_protocol()? { if self.supports_keyboard_enhancement_protocol() {
execute!(self.buffer, PopKeyboardEnhancementFlags)?; execute!(self.buffer, PopKeyboardEnhancementFlags)?;
} }
execute!( execute!(