Add support for DECRPM/DECRQM

This commit is contained in:
Kirill Chibisov 2023-11-17 07:13:20 +04:00
parent 8240a9b90d
commit 0589b71894
3 changed files with 97 additions and 0 deletions

View File

@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Inline vi-mode search using `f`/`F`/`t`/`T`
- `window.blur` config option to request blur for transparent windows
- `--option` argument for `alacritty msg create-window`
- Support for `DECRQM`/`DECRPM` escape sequences
### Changed

View File

@ -1921,6 +1921,58 @@ impl<T: EventListener> Handler for Term<T> {
}
}
#[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<T: EventListener> Handler for Term<T> {
}
}
#[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<usize>) {
// Fallback to the last line as default.
@ -2079,6 +2151,28 @@ impl<T: EventListener> Handler for Term<T> {
}
}
/// 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<bool> 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

View File

@ -71,6 +71,8 @@ brevity.
| | REJECTED | `11`-`19`, `51`-`55` |
| `CSI n` | IMPLEMENTED | |
| `CSI P` | IMPLEMENTED | |
| `CSI $ p` | IMPLEMENTED | |
| `CSI ? $ p`| IMPLEMENTED | |
| `CSI SP q` | IMPLEMENTED | |
| `CSI r` | IMPLEMENTED | |
| `CSI S` | IMPLEMENTED | |