From 55662e9d98f2dc6e2667d5a4b66518a967d1ff96 Mon Sep 17 00:00:00 2001 From: Ahmed Hagi Date: Thu, 18 Jan 2024 12:34:06 +0000 Subject: [PATCH] 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 --- helix-tui/src/backend/crossterm.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/helix-tui/src/backend/crossterm.rs b/helix-tui/src/backend/crossterm.rs index c55ab6bbd0bd..88e70f32e684 100644 --- a/helix-tui/src/backend/crossterm.rs +++ b/helix-tui/src/backend/crossterm.rs @@ -79,6 +79,7 @@ pub struct CrosstermBackend { capabilities: Capabilities, supports_keyboard_enhancement_protocol: OnceCell, mouse_capture_enabled: bool, + supports_bracketed_paste: bool, } impl CrosstermBackend @@ -91,6 +92,7 @@ where capabilities: Capabilities::from_env_or_default(config), supports_keyboard_enhancement_protocol: OnceCell::new(), mouse_capture_enabled: false, + supports_bracketed_paste: true, } } @@ -134,9 +136,16 @@ where execute!( self.buffer, terminal::EnterAlternateScreen, - EnableBracketedPaste, 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))?; if config.enable_mouse_capture { execute!(self.buffer, EnableMouseCapture)?; @@ -177,9 +186,11 @@ where if self.supports_keyboard_enhancement_protocol() { execute!(self.buffer, PopKeyboardEnhancementFlags)?; } + if self.supports_bracketed_paste { + execute!(self.buffer, DisableBracketedPaste,)?; + } execute!( self.buffer, - DisableBracketedPaste, DisableFocusChange, terminal::LeaveAlternateScreen )?; @@ -195,12 +206,8 @@ where // disable without calling enable previously let _ = execute!(stdout, DisableMouseCapture); let _ = execute!(stdout, PopKeyboardEnhancementFlags); - execute!( - stdout, - DisableBracketedPaste, - DisableFocusChange, - terminal::LeaveAlternateScreen - )?; + let _ = execute!(stdout, DisableBracketedPaste); + execute!(stdout, DisableFocusChange, terminal::LeaveAlternateScreen)?; terminal::disable_raw_mode() }