1
0
Fork 0
mirror of https://github.com/alacritty/alacritty.git synced 2024-11-25 14:05:41 -05:00

Update VTE to 0.13.0

This commit is contained in:
Kirill Chibisov 2023-11-15 07:04:48 +04:00
parent 1a047d44c3
commit 8240a9b90d
3 changed files with 115 additions and 67 deletions

4
Cargo.lock generated
View file

@ -1975,9 +1975,9 @@ dependencies = [
[[package]]
name = "vte"
version = "0.12.0"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "401dc1020e10f74d38616c1f1ab92ccd85dc902705a29d0730e0fbea8534f91a"
checksum = "40eb22ae96f050e0c0d6f7ce43feeae26c348fc4dea56928ca81537cfaa6188b"
dependencies = [
"bitflags 2.4.1",
"cursor-icon",

View file

@ -23,7 +23,7 @@ parking_lot = "0.12.0"
polling = "3.0.0"
regex-automata = "0.3.6"
unicode-width = "0.1"
vte = { version = "0.12.0", default-features = false, features = ["ansi", "serde"] }
vte = { version = "0.13.0", default-features = false, features = ["ansi", "serde"] }
serde = { version = "1", features = ["derive", "rc"], optional = true }
[target.'cfg(unix)'.dependencies]

View file

@ -21,8 +21,8 @@ use crate::term::cell::{Cell, Flags, LineLength};
use crate::term::color::Colors;
use crate::vi_mode::{ViModeCursor, ViMotion};
use crate::vte::ansi::{
self, Attr, CharsetIndex, Color, CursorShape, CursorStyle, Handler, Hyperlink, NamedColor, Rgb,
StandardCharset,
self, Attr, CharsetIndex, Color, CursorShape, CursorStyle, Handler, Hyperlink, NamedColor,
NamedMode, NamedPrivateMode, PrivateMode, Rgb, StandardCharset,
};
pub mod cell;
@ -1813,100 +1813,148 @@ impl<T: EventListener> Handler for Term<T> {
}
#[inline]
fn set_mode(&mut self, mode: ansi::Mode) {
trace!("Setting mode: {:?}", mode);
fn set_private_mode(&mut self, mode: PrivateMode) {
let mode = match mode {
PrivateMode::Named(mode) => mode,
PrivateMode::Unknown(mode) => {
debug!("Ignoring unknown mode {} in set_private_mode", mode);
return;
},
};
trace!("Setting private mode: {:?}", mode);
match mode {
ansi::Mode::UrgencyHints => self.mode.insert(TermMode::URGENCY_HINTS),
ansi::Mode::SwapScreenAndSetRestoreCursor => {
NamedPrivateMode::UrgencyHints => self.mode.insert(TermMode::URGENCY_HINTS),
NamedPrivateMode::SwapScreenAndSetRestoreCursor => {
if !self.mode.contains(TermMode::ALT_SCREEN) {
self.swap_alt();
}
},
ansi::Mode::ShowCursor => self.mode.insert(TermMode::SHOW_CURSOR),
ansi::Mode::CursorKeys => self.mode.insert(TermMode::APP_CURSOR),
NamedPrivateMode::ShowCursor => self.mode.insert(TermMode::SHOW_CURSOR),
NamedPrivateMode::CursorKeys => self.mode.insert(TermMode::APP_CURSOR),
// Mouse protocols are mutually exclusive.
ansi::Mode::ReportMouseClicks => {
NamedPrivateMode::ReportMouseClicks => {
self.mode.remove(TermMode::MOUSE_MODE);
self.mode.insert(TermMode::MOUSE_REPORT_CLICK);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportCellMouseMotion => {
NamedPrivateMode::ReportCellMouseMotion => {
self.mode.remove(TermMode::MOUSE_MODE);
self.mode.insert(TermMode::MOUSE_DRAG);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportAllMouseMotion => {
NamedPrivateMode::ReportAllMouseMotion => {
self.mode.remove(TermMode::MOUSE_MODE);
self.mode.insert(TermMode::MOUSE_MOTION);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportFocusInOut => self.mode.insert(TermMode::FOCUS_IN_OUT),
ansi::Mode::BracketedPaste => self.mode.insert(TermMode::BRACKETED_PASTE),
NamedPrivateMode::ReportFocusInOut => self.mode.insert(TermMode::FOCUS_IN_OUT),
NamedPrivateMode::BracketedPaste => self.mode.insert(TermMode::BRACKETED_PASTE),
// Mouse encodings are mutually exclusive.
ansi::Mode::SgrMouse => {
NamedPrivateMode::SgrMouse => {
self.mode.remove(TermMode::UTF8_MOUSE);
self.mode.insert(TermMode::SGR_MOUSE);
},
ansi::Mode::Utf8Mouse => {
NamedPrivateMode::Utf8Mouse => {
self.mode.remove(TermMode::SGR_MOUSE);
self.mode.insert(TermMode::UTF8_MOUSE);
},
ansi::Mode::AlternateScroll => self.mode.insert(TermMode::ALTERNATE_SCROLL),
ansi::Mode::LineWrap => self.mode.insert(TermMode::LINE_WRAP),
ansi::Mode::LineFeedNewLine => self.mode.insert(TermMode::LINE_FEED_NEW_LINE),
ansi::Mode::Origin => self.mode.insert(TermMode::ORIGIN),
ansi::Mode::ColumnMode => self.deccolm(),
ansi::Mode::Insert => self.mode.insert(TermMode::INSERT),
ansi::Mode::BlinkingCursor => {
NamedPrivateMode::AlternateScroll => self.mode.insert(TermMode::ALTERNATE_SCROLL),
NamedPrivateMode::LineWrap => self.mode.insert(TermMode::LINE_WRAP),
NamedPrivateMode::Origin => self.mode.insert(TermMode::ORIGIN),
NamedPrivateMode::ColumnMode => self.deccolm(),
NamedPrivateMode::BlinkingCursor => {
let style = self.cursor_style.get_or_insert(self.config.default_cursor_style);
style.blinking = true;
self.event_proxy.send_event(Event::CursorBlinkingChange);
},
NamedPrivateMode::SyncUpdate => (),
}
}
#[inline]
fn unset_private_mode(&mut self, mode: PrivateMode) {
let mode = match mode {
PrivateMode::Named(mode) => mode,
PrivateMode::Unknown(mode) => {
debug!("Ignoring unknown mode {} in unset_private_mode", mode);
return;
},
};
trace!("Unsetting private mode: {:?}", mode);
match mode {
NamedPrivateMode::UrgencyHints => self.mode.remove(TermMode::URGENCY_HINTS),
NamedPrivateMode::SwapScreenAndSetRestoreCursor => {
if self.mode.contains(TermMode::ALT_SCREEN) {
self.swap_alt();
}
},
NamedPrivateMode::ShowCursor => self.mode.remove(TermMode::SHOW_CURSOR),
NamedPrivateMode::CursorKeys => self.mode.remove(TermMode::APP_CURSOR),
NamedPrivateMode::ReportMouseClicks => {
self.mode.remove(TermMode::MOUSE_REPORT_CLICK);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
NamedPrivateMode::ReportCellMouseMotion => {
self.mode.remove(TermMode::MOUSE_DRAG);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
NamedPrivateMode::ReportAllMouseMotion => {
self.mode.remove(TermMode::MOUSE_MOTION);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
NamedPrivateMode::ReportFocusInOut => self.mode.remove(TermMode::FOCUS_IN_OUT),
NamedPrivateMode::BracketedPaste => self.mode.remove(TermMode::BRACKETED_PASTE),
NamedPrivateMode::SgrMouse => self.mode.remove(TermMode::SGR_MOUSE),
NamedPrivateMode::Utf8Mouse => self.mode.remove(TermMode::UTF8_MOUSE),
NamedPrivateMode::AlternateScroll => self.mode.remove(TermMode::ALTERNATE_SCROLL),
NamedPrivateMode::LineWrap => self.mode.remove(TermMode::LINE_WRAP),
NamedPrivateMode::Origin => self.mode.remove(TermMode::ORIGIN),
NamedPrivateMode::ColumnMode => self.deccolm(),
NamedPrivateMode::BlinkingCursor => {
let style = self.cursor_style.get_or_insert(self.config.default_cursor_style);
style.blinking = false;
self.event_proxy.send_event(Event::CursorBlinkingChange);
},
NamedPrivateMode::SyncUpdate => (),
}
}
#[inline]
fn set_mode(&mut self, mode: ansi::Mode) {
let mode = match mode {
ansi::Mode::Named(mode) => mode,
ansi::Mode::Unknown(mode) => {
debug!("Ignoring unknown mode {} in set_mode", mode);
return;
},
};
trace!("Setting public mode: {:?}", mode);
match mode {
NamedMode::Insert => self.mode.insert(TermMode::INSERT),
NamedMode::LineFeedNewLine => self.mode.insert(TermMode::LINE_FEED_NEW_LINE),
}
}
#[inline]
fn unset_mode(&mut self, mode: ansi::Mode) {
trace!("Unsetting mode: {:?}", mode);
let mode = match mode {
ansi::Mode::Named(mode) => mode,
ansi::Mode::Unknown(mode) => {
debug!("Ignorning unknown mode {} in unset_mode", mode);
return;
},
};
trace!("Setting public mode: {:?}", mode);
match mode {
ansi::Mode::UrgencyHints => self.mode.remove(TermMode::URGENCY_HINTS),
ansi::Mode::SwapScreenAndSetRestoreCursor => {
if self.mode.contains(TermMode::ALT_SCREEN) {
self.swap_alt();
}
},
ansi::Mode::ShowCursor => self.mode.remove(TermMode::SHOW_CURSOR),
ansi::Mode::CursorKeys => self.mode.remove(TermMode::APP_CURSOR),
ansi::Mode::ReportMouseClicks => {
self.mode.remove(TermMode::MOUSE_REPORT_CLICK);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportCellMouseMotion => {
self.mode.remove(TermMode::MOUSE_DRAG);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportAllMouseMotion => {
self.mode.remove(TermMode::MOUSE_MOTION);
self.event_proxy.send_event(Event::MouseCursorDirty);
},
ansi::Mode::ReportFocusInOut => self.mode.remove(TermMode::FOCUS_IN_OUT),
ansi::Mode::BracketedPaste => self.mode.remove(TermMode::BRACKETED_PASTE),
ansi::Mode::SgrMouse => self.mode.remove(TermMode::SGR_MOUSE),
ansi::Mode::Utf8Mouse => self.mode.remove(TermMode::UTF8_MOUSE),
ansi::Mode::AlternateScroll => self.mode.remove(TermMode::ALTERNATE_SCROLL),
ansi::Mode::LineWrap => self.mode.remove(TermMode::LINE_WRAP),
ansi::Mode::LineFeedNewLine => self.mode.remove(TermMode::LINE_FEED_NEW_LINE),
ansi::Mode::Origin => self.mode.remove(TermMode::ORIGIN),
ansi::Mode::ColumnMode => self.deccolm(),
ansi::Mode::Insert => {
NamedMode::Insert => {
self.mode.remove(TermMode::INSERT);
self.mark_fully_damaged();
},
ansi::Mode::BlinkingCursor => {
let style = self.cursor_style.get_or_insert(self.config.default_cursor_style);
style.blinking = false;
self.event_proxy.send_event(Event::CursorBlinkingChange);
},
NamedMode::LineFeedNewLine => self.mode.remove(TermMode::LINE_FEED_NEW_LINE),
}
}
@ -2669,14 +2717,14 @@ mod tests {
assert_eq!(term.grid.cursor.point, Point::new(Line(9), Column(0)));
// Enter alt screen.
term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
term.set_private_mode(NamedPrivateMode::SwapScreenAndSetRestoreCursor.into());
// Increase visible lines.
size.screen_lines = 30;
term.resize(size);
// Leave alt screen.
term.unset_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
term.unset_private_mode(NamedPrivateMode::SwapScreenAndSetRestoreCursor.into());
assert_eq!(term.history_size(), 0);
assert_eq!(term.grid.cursor.point, Point::new(Line(19), Column(0)));
@ -2715,14 +2763,14 @@ mod tests {
assert_eq!(term.grid.cursor.point, Point::new(Line(9), Column(0)));
// Enter alt screen.
term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
term.set_private_mode(NamedPrivateMode::SwapScreenAndSetRestoreCursor.into());
// Increase visible lines.
size.screen_lines = 5;
term.resize(size);
// Leave alt screen.
term.unset_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
term.unset_private_mode(NamedPrivateMode::SwapScreenAndSetRestoreCursor.into());
assert_eq!(term.history_size(), 15);
assert_eq!(term.grid.cursor.point, Point::new(Line(4), Column(0)));
@ -2963,7 +3011,7 @@ mod tests {
assert!(term.damage.is_fully_damaged);
term.reset_damage();
term.set_mode(ansi::Mode::Insert);
term.set_mode(NamedMode::Insert.into());
// Just setting `Insert` mode shouldn't mark terminal as damaged.
assert!(!term.damage.is_fully_damaged);
term.reset_damage();
@ -2991,7 +3039,7 @@ mod tests {
assert!(term.damage.is_fully_damaged);
term.reset_damage();
term.unset_mode(ansi::Mode::Insert);
term.unset_mode(NamedMode::Insert.into());
assert!(term.damage.is_fully_damaged);
term.reset_damage();