Handle failure when enabling bracketed paste (#9353)

* match instead of crash

* pulling bracketedpaste out, refactor, tracking for bracketed paste

* sending disable bracketed paste only when supports true

* move disable bracketed paste to throwaway
pull/9145/merge
Ahmed Hagi 5 months ago committed by GitHub
parent 1bc7aac780
commit 9c56afeff3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -79,6 +79,7 @@ pub struct CrosstermBackend<W: Write> {
capabilities: Capabilities, capabilities: Capabilities,
supports_keyboard_enhancement_protocol: OnceCell<bool>, supports_keyboard_enhancement_protocol: OnceCell<bool>,
mouse_capture_enabled: bool, mouse_capture_enabled: bool,
supports_bracketed_paste: bool,
} }
impl<W> CrosstermBackend<W> impl<W> CrosstermBackend<W>
@ -91,6 +92,7 @@ where
capabilities: Capabilities::from_env_or_default(config), capabilities: Capabilities::from_env_or_default(config),
supports_keyboard_enhancement_protocol: OnceCell::new(), supports_keyboard_enhancement_protocol: OnceCell::new(),
mouse_capture_enabled: false, mouse_capture_enabled: false,
supports_bracketed_paste: true,
} }
} }
@ -134,9 +136,16 @@ where
execute!( execute!(
self.buffer, self.buffer,
terminal::EnterAlternateScreen, terminal::EnterAlternateScreen,
EnableBracketedPaste,
EnableFocusChange EnableFocusChange
)?; )?;
match execute!(self.buffer, EnableBracketedPaste,) {
Err(err) if err.kind() == io::ErrorKind::Unsupported => {
log::warn!("Bracketed paste is not supported on this terminal.");
self.supports_bracketed_paste = false;
}
Err(err) => return Err(err),
Ok(_) => (),
};
execute!(self.buffer, terminal::Clear(terminal::ClearType::All))?; execute!(self.buffer, terminal::Clear(terminal::ClearType::All))?;
if config.enable_mouse_capture { if config.enable_mouse_capture {
execute!(self.buffer, EnableMouseCapture)?; execute!(self.buffer, EnableMouseCapture)?;
@ -177,9 +186,11 @@ where
if self.supports_keyboard_enhancement_protocol() { if self.supports_keyboard_enhancement_protocol() {
execute!(self.buffer, PopKeyboardEnhancementFlags)?; execute!(self.buffer, PopKeyboardEnhancementFlags)?;
} }
if self.supports_bracketed_paste {
execute!(self.buffer, DisableBracketedPaste,)?;
}
execute!( execute!(
self.buffer, self.buffer,
DisableBracketedPaste,
DisableFocusChange, DisableFocusChange,
terminal::LeaveAlternateScreen terminal::LeaveAlternateScreen
)?; )?;
@ -195,12 +206,8 @@ where
// disable without calling enable previously // disable without calling enable previously
let _ = execute!(stdout, DisableMouseCapture); let _ = execute!(stdout, DisableMouseCapture);
let _ = execute!(stdout, PopKeyboardEnhancementFlags); let _ = execute!(stdout, PopKeyboardEnhancementFlags);
execute!( let _ = execute!(stdout, DisableBracketedPaste);
stdout, execute!(stdout, DisableFocusChange, terminal::LeaveAlternateScreen)?;
DisableBracketedPaste,
DisableFocusChange,
terminal::LeaveAlternateScreen
)?;
terminal::disable_raw_mode() terminal::disable_raw_mode()
} }

Loading…
Cancel
Save