mirror of
https://github.com/alacritty/alacritty.git
synced 2025-04-14 17:53:03 -04:00
Add support for DECRPM/DECRQM
This commit is contained in:
parent
8240a9b90d
commit
0589b71894
3 changed files with 97 additions and 0 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 | |
|
||||
|
|
Loading…
Add table
Reference in a new issue