From 0589b7189445e5ee236a7ab17b4f3a2047543481 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Fri, 17 Nov 2023 07:13:20 +0400 Subject: Add support for DECRPM/DECRQM --- alacritty_terminal/src/term/mod.rs | 94 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) (limited to 'alacritty_terminal/src') diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index e66c914f..3df1d128 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -1921,6 +1921,58 @@ impl Handler for Term { } } + #[inline] + fn report_private_mode(&mut self, mode: PrivateMode) { + trace!("Reporting private mode {mode:?}"); + let state = match mode { + PrivateMode::Named(mode) => match mode { + NamedPrivateMode::CursorKeys => self.mode.contains(TermMode::APP_CURSOR).into(), + NamedPrivateMode::Origin => self.mode.contains(TermMode::ORIGIN).into(), + NamedPrivateMode::LineWrap => self.mode.contains(TermMode::LINE_WRAP).into(), + NamedPrivateMode::BlinkingCursor => { + let style = self.cursor_style.get_or_insert(self.config.default_cursor_style); + style.blinking.into() + }, + NamedPrivateMode::ShowCursor => self.mode.contains(TermMode::SHOW_CURSOR).into(), + NamedPrivateMode::ReportMouseClicks => { + self.mode.contains(TermMode::MOUSE_REPORT_CLICK).into() + }, + NamedPrivateMode::ReportCellMouseMotion => { + self.mode.contains(TermMode::MOUSE_DRAG).into() + }, + NamedPrivateMode::ReportAllMouseMotion => { + self.mode.contains(TermMode::MOUSE_MOTION).into() + }, + NamedPrivateMode::ReportFocusInOut => { + self.mode.contains(TermMode::FOCUS_IN_OUT).into() + }, + NamedPrivateMode::Utf8Mouse => self.mode.contains(TermMode::UTF8_MOUSE).into(), + NamedPrivateMode::SgrMouse => self.mode.contains(TermMode::SGR_MOUSE).into(), + NamedPrivateMode::AlternateScroll => { + self.mode.contains(TermMode::ALTERNATE_SCROLL).into() + }, + NamedPrivateMode::UrgencyHints => { + self.mode.contains(TermMode::URGENCY_HINTS).into() + }, + NamedPrivateMode::SwapScreenAndSetRestoreCursor => { + self.mode.contains(TermMode::ALT_SCREEN).into() + }, + NamedPrivateMode::BracketedPaste => { + self.mode.contains(TermMode::BRACKETED_PASTE).into() + }, + NamedPrivateMode::SyncUpdate => ModeState::Reset, + NamedPrivateMode::ColumnMode => ModeState::NotSupported, + }, + PrivateMode::Unknown(_) => ModeState::NotSupported, + }; + + self.event_proxy.send_event(Event::PtyWrite(format!( + "\x1b[?{};{}$p", + mode.raw(), + state as u8, + ))); + } + #[inline] fn set_mode(&mut self, mode: ansi::Mode) { let mode = match mode { @@ -1958,6 +2010,26 @@ impl Handler for Term { } } + #[inline] + fn report_mode(&mut self, mode: ansi::Mode) { + trace!("Reporting mode {mode:?}"); + let state = match mode { + ansi::Mode::Named(mode) => match mode { + NamedMode::Insert => self.mode.contains(TermMode::INSERT).into(), + NamedMode::LineFeedNewLine => { + self.mode.contains(TermMode::LINE_FEED_NEW_LINE).into() + }, + }, + ansi::Mode::Unknown(_) => ModeState::NotSupported, + }; + + self.event_proxy.send_event(Event::PtyWrite(format!( + "\x1b[{};{}$p", + mode.raw(), + state as u8, + ))); + } + #[inline] fn set_scrolling_region(&mut self, top: usize, bottom: Option) { // Fallback to the last line as default. @@ -2079,6 +2151,28 @@ impl Handler for Term { } } +/// The state of the [`Mode`] and [`PrivateMode`]. +#[repr(u8)] +#[derive(Debug, Clone, Copy)] +enum ModeState { + /// The mode is not supported. + NotSupported = 0, + /// The mode is currently set. + Set = 1, + /// The mode is currently not set. + Reset = 2, +} + +impl From for ModeState { + fn from(value: bool) -> Self { + if value { + Self::Set + } else { + Self::Reset + } + } +} + /// Terminal version for escape sequence reports. /// /// This returns the current terminal version as a unique number based on alacritty_terminal's -- cgit