terminal: Match trait bounds with terminal input (#31441)

The core change here is the following:

```rust
fn write_to_pty(&self, input: impl Into<Vec<u8>>);

// into
fn write_to_pty(&self, input: impl Into<Cow<'static, [u8]>>);
```

This matches the trait bounds that's used by the Alacritty crate. We are
now allowed to effectively pass `&'static str` instead of always needing
a `String`.

The main benefit comes from making the `to_esc_str` function return a
`Cow<'static, str>` instead of `String`. We save an allocation in the
following instances:

- When the user presses any special key that isn't alphanumerical (in
the terminal)
- When the uses presses any key while a modifier is active (in the
terminal)
- When focusing/un-focusing the terminal
- When completing or undoing a terminal transaction
- When starting a terminal assist

This basically saves us an allocation on **every key** press in the
terminal.

NOTE: This same optimization can be done for **nearly all** keypresses
in the entirety of Zed by changing the signature of the `Keystroke`
struct in gpui. If the Zed team is interested in a PR for it, let me
know.

Release Notes:

- N/A
This commit is contained in:
tidely 2025-06-03 06:12:28 +03:00 committed by GitHub
parent 56d4c0af9f
commit 8ab7d44d51
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 162 additions and 196 deletions

View file

@ -1,3 +1,5 @@
use std::borrow::Cow;
/// The mappings defined in this file where created from reading the alacritty source
use alacritty_terminal::term::TermMode;
use gpui::Keystroke;
@ -41,162 +43,138 @@ impl AlacModifiers {
}
}
pub fn to_esc_str(keystroke: &Keystroke, mode: &TermMode, alt_is_meta: bool) -> Option<String> {
pub fn to_esc_str(
keystroke: &Keystroke,
mode: &TermMode,
alt_is_meta: bool,
) -> Option<Cow<'static, str>> {
let modifiers = AlacModifiers::new(keystroke);
// Manual Bindings including modifiers
let manual_esc_str = match (keystroke.key.as_ref(), &modifiers) {
let manual_esc_str: Option<&'static str> = match (keystroke.key.as_ref(), &modifiers) {
//Basic special keys
("tab", AlacModifiers::None) => Some("\x09".to_string()),
("escape", AlacModifiers::None) => Some("\x1b".to_string()),
("enter", AlacModifiers::None) => Some("\x0d".to_string()),
("enter", AlacModifiers::Shift) => Some("\x0d".to_string()),
("enter", AlacModifiers::Alt) => Some("\x1b\x0d".to_string()),
("backspace", AlacModifiers::None) => Some("\x7f".to_string()),
("tab", AlacModifiers::None) => Some("\x09"),
("escape", AlacModifiers::None) => Some("\x1b"),
("enter", AlacModifiers::None) => Some("\x0d"),
("enter", AlacModifiers::Shift) => Some("\x0d"),
("enter", AlacModifiers::Alt) => Some("\x1b\x0d"),
("backspace", AlacModifiers::None) => Some("\x7f"),
//Interesting escape codes
("tab", AlacModifiers::Shift) => Some("\x1b[Z".to_string()),
("backspace", AlacModifiers::Ctrl) => Some("\x08".to_string()),
("backspace", AlacModifiers::Alt) => Some("\x1b\x7f".to_string()),
("backspace", AlacModifiers::Shift) => Some("\x7f".to_string()),
("space", AlacModifiers::Ctrl) => Some("\x00".to_string()),
("home", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => {
Some("\x1b[1;2H".to_string())
}
("end", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => {
Some("\x1b[1;2F".to_string())
}
("tab", AlacModifiers::Shift) => Some("\x1b[Z"),
("backspace", AlacModifiers::Ctrl) => Some("\x08"),
("backspace", AlacModifiers::Alt) => Some("\x1b\x7f"),
("backspace", AlacModifiers::Shift) => Some("\x7f"),
("space", AlacModifiers::Ctrl) => Some("\x00"),
("home", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => Some("\x1b[1;2H"),
("end", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => Some("\x1b[1;2F"),
("pageup", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => {
Some("\x1b[5;2~".to_string())
Some("\x1b[5;2~")
}
("pagedown", AlacModifiers::Shift) if mode.contains(TermMode::ALT_SCREEN) => {
Some("\x1b[6;2~".to_string())
Some("\x1b[6;2~")
}
("home", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOH".to_string())
}
("home", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[H".to_string())
}
("end", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOF".to_string())
}
("end", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[F".to_string())
}
("up", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOA".to_string())
}
("up", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[A".to_string())
}
("down", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOB".to_string())
}
("down", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[B".to_string())
}
("right", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOC".to_string())
}
("right", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[C".to_string())
}
("left", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => {
Some("\x1bOD".to_string())
}
("left", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => {
Some("\x1b[D".to_string())
}
("back", AlacModifiers::None) => Some("\x7f".to_string()),
("insert", AlacModifiers::None) => Some("\x1b[2~".to_string()),
("delete", AlacModifiers::None) => Some("\x1b[3~".to_string()),
("pageup", AlacModifiers::None) => Some("\x1b[5~".to_string()),
("pagedown", AlacModifiers::None) => Some("\x1b[6~".to_string()),
("f1", AlacModifiers::None) => Some("\x1bOP".to_string()),
("f2", AlacModifiers::None) => Some("\x1bOQ".to_string()),
("f3", AlacModifiers::None) => Some("\x1bOR".to_string()),
("f4", AlacModifiers::None) => Some("\x1bOS".to_string()),
("f5", AlacModifiers::None) => Some("\x1b[15~".to_string()),
("f6", AlacModifiers::None) => Some("\x1b[17~".to_string()),
("f7", AlacModifiers::None) => Some("\x1b[18~".to_string()),
("f8", AlacModifiers::None) => Some("\x1b[19~".to_string()),
("f9", AlacModifiers::None) => Some("\x1b[20~".to_string()),
("f10", AlacModifiers::None) => Some("\x1b[21~".to_string()),
("f11", AlacModifiers::None) => Some("\x1b[23~".to_string()),
("f12", AlacModifiers::None) => Some("\x1b[24~".to_string()),
("f13", AlacModifiers::None) => Some("\x1b[25~".to_string()),
("f14", AlacModifiers::None) => Some("\x1b[26~".to_string()),
("f15", AlacModifiers::None) => Some("\x1b[28~".to_string()),
("f16", AlacModifiers::None) => Some("\x1b[29~".to_string()),
("f17", AlacModifiers::None) => Some("\x1b[31~".to_string()),
("f18", AlacModifiers::None) => Some("\x1b[32~".to_string()),
("f19", AlacModifiers::None) => Some("\x1b[33~".to_string()),
("f20", AlacModifiers::None) => Some("\x1b[34~".to_string()),
("home", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOH"),
("home", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[H"),
("end", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOF"),
("end", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[F"),
("up", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOA"),
("up", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[A"),
("down", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOB"),
("down", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[B"),
("right", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOC"),
("right", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[C"),
("left", AlacModifiers::None) if mode.contains(TermMode::APP_CURSOR) => Some("\x1bOD"),
("left", AlacModifiers::None) if !mode.contains(TermMode::APP_CURSOR) => Some("\x1b[D"),
("back", AlacModifiers::None) => Some("\x7f"),
("insert", AlacModifiers::None) => Some("\x1b[2~"),
("delete", AlacModifiers::None) => Some("\x1b[3~"),
("pageup", AlacModifiers::None) => Some("\x1b[5~"),
("pagedown", AlacModifiers::None) => Some("\x1b[6~"),
("f1", AlacModifiers::None) => Some("\x1bOP"),
("f2", AlacModifiers::None) => Some("\x1bOQ"),
("f3", AlacModifiers::None) => Some("\x1bOR"),
("f4", AlacModifiers::None) => Some("\x1bOS"),
("f5", AlacModifiers::None) => Some("\x1b[15~"),
("f6", AlacModifiers::None) => Some("\x1b[17~"),
("f7", AlacModifiers::None) => Some("\x1b[18~"),
("f8", AlacModifiers::None) => Some("\x1b[19~"),
("f9", AlacModifiers::None) => Some("\x1b[20~"),
("f10", AlacModifiers::None) => Some("\x1b[21~"),
("f11", AlacModifiers::None) => Some("\x1b[23~"),
("f12", AlacModifiers::None) => Some("\x1b[24~"),
("f13", AlacModifiers::None) => Some("\x1b[25~"),
("f14", AlacModifiers::None) => Some("\x1b[26~"),
("f15", AlacModifiers::None) => Some("\x1b[28~"),
("f16", AlacModifiers::None) => Some("\x1b[29~"),
("f17", AlacModifiers::None) => Some("\x1b[31~"),
("f18", AlacModifiers::None) => Some("\x1b[32~"),
("f19", AlacModifiers::None) => Some("\x1b[33~"),
("f20", AlacModifiers::None) => Some("\x1b[34~"),
// NumpadEnter, Action::Esc("\n".into());
//Mappings for caret notation keys
("a", AlacModifiers::Ctrl) => Some("\x01".to_string()), //1
("A", AlacModifiers::CtrlShift) => Some("\x01".to_string()), //1
("b", AlacModifiers::Ctrl) => Some("\x02".to_string()), //2
("B", AlacModifiers::CtrlShift) => Some("\x02".to_string()), //2
("c", AlacModifiers::Ctrl) => Some("\x03".to_string()), //3
("C", AlacModifiers::CtrlShift) => Some("\x03".to_string()), //3
("d", AlacModifiers::Ctrl) => Some("\x04".to_string()), //4
("D", AlacModifiers::CtrlShift) => Some("\x04".to_string()), //4
("e", AlacModifiers::Ctrl) => Some("\x05".to_string()), //5
("E", AlacModifiers::CtrlShift) => Some("\x05".to_string()), //5
("f", AlacModifiers::Ctrl) => Some("\x06".to_string()), //6
("F", AlacModifiers::CtrlShift) => Some("\x06".to_string()), //6
("g", AlacModifiers::Ctrl) => Some("\x07".to_string()), //7
("G", AlacModifiers::CtrlShift) => Some("\x07".to_string()), //7
("h", AlacModifiers::Ctrl) => Some("\x08".to_string()), //8
("H", AlacModifiers::CtrlShift) => Some("\x08".to_string()), //8
("i", AlacModifiers::Ctrl) => Some("\x09".to_string()), //9
("I", AlacModifiers::CtrlShift) => Some("\x09".to_string()), //9
("j", AlacModifiers::Ctrl) => Some("\x0a".to_string()), //10
("J", AlacModifiers::CtrlShift) => Some("\x0a".to_string()), //10
("k", AlacModifiers::Ctrl) => Some("\x0b".to_string()), //11
("K", AlacModifiers::CtrlShift) => Some("\x0b".to_string()), //11
("l", AlacModifiers::Ctrl) => Some("\x0c".to_string()), //12
("L", AlacModifiers::CtrlShift) => Some("\x0c".to_string()), //12
("m", AlacModifiers::Ctrl) => Some("\x0d".to_string()), //13
("M", AlacModifiers::CtrlShift) => Some("\x0d".to_string()), //13
("n", AlacModifiers::Ctrl) => Some("\x0e".to_string()), //14
("N", AlacModifiers::CtrlShift) => Some("\x0e".to_string()), //14
("o", AlacModifiers::Ctrl) => Some("\x0f".to_string()), //15
("O", AlacModifiers::CtrlShift) => Some("\x0f".to_string()), //15
("p", AlacModifiers::Ctrl) => Some("\x10".to_string()), //16
("P", AlacModifiers::CtrlShift) => Some("\x10".to_string()), //16
("q", AlacModifiers::Ctrl) => Some("\x11".to_string()), //17
("Q", AlacModifiers::CtrlShift) => Some("\x11".to_string()), //17
("r", AlacModifiers::Ctrl) => Some("\x12".to_string()), //18
("R", AlacModifiers::CtrlShift) => Some("\x12".to_string()), //18
("s", AlacModifiers::Ctrl) => Some("\x13".to_string()), //19
("S", AlacModifiers::CtrlShift) => Some("\x13".to_string()), //19
("t", AlacModifiers::Ctrl) => Some("\x14".to_string()), //20
("T", AlacModifiers::CtrlShift) => Some("\x14".to_string()), //20
("u", AlacModifiers::Ctrl) => Some("\x15".to_string()), //21
("U", AlacModifiers::CtrlShift) => Some("\x15".to_string()), //21
("v", AlacModifiers::Ctrl) => Some("\x16".to_string()), //22
("V", AlacModifiers::CtrlShift) => Some("\x16".to_string()), //22
("w", AlacModifiers::Ctrl) => Some("\x17".to_string()), //23
("W", AlacModifiers::CtrlShift) => Some("\x17".to_string()), //23
("x", AlacModifiers::Ctrl) => Some("\x18".to_string()), //24
("X", AlacModifiers::CtrlShift) => Some("\x18".to_string()), //24
("y", AlacModifiers::Ctrl) => Some("\x19".to_string()), //25
("Y", AlacModifiers::CtrlShift) => Some("\x19".to_string()), //25
("z", AlacModifiers::Ctrl) => Some("\x1a".to_string()), //26
("Z", AlacModifiers::CtrlShift) => Some("\x1a".to_string()), //26
("@", AlacModifiers::Ctrl) => Some("\x00".to_string()), //0
("[", AlacModifiers::Ctrl) => Some("\x1b".to_string()), //27
("\\", AlacModifiers::Ctrl) => Some("\x1c".to_string()), //28
("]", AlacModifiers::Ctrl) => Some("\x1d".to_string()), //29
("^", AlacModifiers::Ctrl) => Some("\x1e".to_string()), //30
("_", AlacModifiers::Ctrl) => Some("\x1f".to_string()), //31
("?", AlacModifiers::Ctrl) => Some("\x7f".to_string()), //127
("a", AlacModifiers::Ctrl) => Some("\x01"), //1
("A", AlacModifiers::CtrlShift) => Some("\x01"), //1
("b", AlacModifiers::Ctrl) => Some("\x02"), //2
("B", AlacModifiers::CtrlShift) => Some("\x02"), //2
("c", AlacModifiers::Ctrl) => Some("\x03"), //3
("C", AlacModifiers::CtrlShift) => Some("\x03"), //3
("d", AlacModifiers::Ctrl) => Some("\x04"), //4
("D", AlacModifiers::CtrlShift) => Some("\x04"), //4
("e", AlacModifiers::Ctrl) => Some("\x05"), //5
("E", AlacModifiers::CtrlShift) => Some("\x05"), //5
("f", AlacModifiers::Ctrl) => Some("\x06"), //6
("F", AlacModifiers::CtrlShift) => Some("\x06"), //6
("g", AlacModifiers::Ctrl) => Some("\x07"), //7
("G", AlacModifiers::CtrlShift) => Some("\x07"), //7
("h", AlacModifiers::Ctrl) => Some("\x08"), //8
("H", AlacModifiers::CtrlShift) => Some("\x08"), //8
("i", AlacModifiers::Ctrl) => Some("\x09"), //9
("I", AlacModifiers::CtrlShift) => Some("\x09"), //9
("j", AlacModifiers::Ctrl) => Some("\x0a"), //10
("J", AlacModifiers::CtrlShift) => Some("\x0a"), //10
("k", AlacModifiers::Ctrl) => Some("\x0b"), //11
("K", AlacModifiers::CtrlShift) => Some("\x0b"), //11
("l", AlacModifiers::Ctrl) => Some("\x0c"), //12
("L", AlacModifiers::CtrlShift) => Some("\x0c"), //12
("m", AlacModifiers::Ctrl) => Some("\x0d"), //13
("M", AlacModifiers::CtrlShift) => Some("\x0d"), //13
("n", AlacModifiers::Ctrl) => Some("\x0e"), //14
("N", AlacModifiers::CtrlShift) => Some("\x0e"), //14
("o", AlacModifiers::Ctrl) => Some("\x0f"), //15
("O", AlacModifiers::CtrlShift) => Some("\x0f"), //15
("p", AlacModifiers::Ctrl) => Some("\x10"), //16
("P", AlacModifiers::CtrlShift) => Some("\x10"), //16
("q", AlacModifiers::Ctrl) => Some("\x11"), //17
("Q", AlacModifiers::CtrlShift) => Some("\x11"), //17
("r", AlacModifiers::Ctrl) => Some("\x12"), //18
("R", AlacModifiers::CtrlShift) => Some("\x12"), //18
("s", AlacModifiers::Ctrl) => Some("\x13"), //19
("S", AlacModifiers::CtrlShift) => Some("\x13"), //19
("t", AlacModifiers::Ctrl) => Some("\x14"), //20
("T", AlacModifiers::CtrlShift) => Some("\x14"), //20
("u", AlacModifiers::Ctrl) => Some("\x15"), //21
("U", AlacModifiers::CtrlShift) => Some("\x15"), //21
("v", AlacModifiers::Ctrl) => Some("\x16"), //22
("V", AlacModifiers::CtrlShift) => Some("\x16"), //22
("w", AlacModifiers::Ctrl) => Some("\x17"), //23
("W", AlacModifiers::CtrlShift) => Some("\x17"), //23
("x", AlacModifiers::Ctrl) => Some("\x18"), //24
("X", AlacModifiers::CtrlShift) => Some("\x18"), //24
("y", AlacModifiers::Ctrl) => Some("\x19"), //25
("Y", AlacModifiers::CtrlShift) => Some("\x19"), //25
("z", AlacModifiers::Ctrl) => Some("\x1a"), //26
("Z", AlacModifiers::CtrlShift) => Some("\x1a"), //26
("@", AlacModifiers::Ctrl) => Some("\x00"), //0
("[", AlacModifiers::Ctrl) => Some("\x1b"), //27
("\\", AlacModifiers::Ctrl) => Some("\x1c"), //28
("]", AlacModifiers::Ctrl) => Some("\x1d"), //29
("^", AlacModifiers::Ctrl) => Some("\x1e"), //30
("_", AlacModifiers::Ctrl) => Some("\x1f"), //31
("?", AlacModifiers::Ctrl) => Some("\x7f"), //127
_ => None,
};
if manual_esc_str.is_some() {
return manual_esc_str;
if let Some(esc_str) = manual_esc_str {
return Some(Cow::Borrowed(esc_str));
}
// Automated bindings applying modifiers
@ -235,8 +213,8 @@ pub fn to_esc_str(keystroke: &Keystroke, mode: &TermMode, alt_is_meta: bool) ->
"home" => Some(format!("\x1b[1;{}H", modifier_code)),
_ => None,
};
if modified_esc_str.is_some() {
return modified_esc_str;
if let Some(esc_str) = modified_esc_str {
return Some(Cow::Owned(esc_str));
}
}
@ -250,7 +228,7 @@ pub fn to_esc_str(keystroke: &Keystroke, mode: &TermMode, alt_is_meta: bool) ->
} else {
&keystroke.key
};
return Some(format!("\x1b{}", key));
return Some(Cow::Owned(format!("\x1b{}", key)));
}
}
@ -306,33 +284,27 @@ mod test {
let alt_screen = TermMode::ALT_SCREEN;
assert_eq!(
to_esc_str(&shift_pageup, &alt_screen, false),
Some("\x1b[5;2~".to_string())
Some("\x1b[5;2~".into())
);
assert_eq!(
to_esc_str(&shift_pagedown, &alt_screen, false),
Some("\x1b[6;2~".to_string())
Some("\x1b[6;2~".into())
);
assert_eq!(
to_esc_str(&shift_home, &alt_screen, false),
Some("\x1b[1;2H".to_string())
Some("\x1b[1;2H".into())
);
assert_eq!(
to_esc_str(&shift_end, &alt_screen, false),
Some("\x1b[1;2F".to_string())
Some("\x1b[1;2F".into())
);
let pageup = Keystroke::parse("pageup").unwrap();
let pagedown = Keystroke::parse("pagedown").unwrap();
let any = TermMode::ANY;
assert_eq!(
to_esc_str(&pageup, &any, false),
Some("\x1b[5~".to_string())
);
assert_eq!(
to_esc_str(&pagedown, &any, false),
Some("\x1b[6~".to_string())
);
assert_eq!(to_esc_str(&pageup, &any, false), Some("\x1b[5~".into()));
assert_eq!(to_esc_str(&pagedown, &any, false), Some("\x1b[6~".into()));
}
#[test]
@ -361,27 +333,18 @@ mod test {
let left = Keystroke::parse("left").unwrap();
let right = Keystroke::parse("right").unwrap();
assert_eq!(to_esc_str(&up, &none, false), Some("\x1b[A".to_string()));
assert_eq!(to_esc_str(&down, &none, false), Some("\x1b[B".to_string()));
assert_eq!(to_esc_str(&right, &none, false), Some("\x1b[C".to_string()));
assert_eq!(to_esc_str(&left, &none, false), Some("\x1b[D".to_string()));
assert_eq!(to_esc_str(&up, &none, false), Some("\x1b[A".into()));
assert_eq!(to_esc_str(&down, &none, false), Some("\x1b[B".into()));
assert_eq!(to_esc_str(&right, &none, false), Some("\x1b[C".into()));
assert_eq!(to_esc_str(&left, &none, false), Some("\x1b[D".into()));
assert_eq!(
to_esc_str(&up, &app_cursor, false),
Some("\x1bOA".to_string())
);
assert_eq!(
to_esc_str(&down, &app_cursor, false),
Some("\x1bOB".to_string())
);
assert_eq!(to_esc_str(&up, &app_cursor, false), Some("\x1bOA".into()));
assert_eq!(to_esc_str(&down, &app_cursor, false), Some("\x1bOB".into()));
assert_eq!(
to_esc_str(&right, &app_cursor, false),
Some("\x1bOC".to_string())
);
assert_eq!(
to_esc_str(&left, &app_cursor, false),
Some("\x1bOD".to_string())
Some("\x1bOC".into())
);
assert_eq!(to_esc_str(&left, &app_cursor, false), Some("\x1bOD".into()));
}
#[test]

View file

@ -724,12 +724,13 @@ impl Terminal {
// The terminal only supports pasting strings, not images.
Some(text) => format(text),
_ => format(""),
},
}
.into_bytes(),
)
}
AlacTermEvent::PtyWrite(out) => self.write_to_pty(out),
AlacTermEvent::PtyWrite(out) => self.write_to_pty(out.into_bytes()),
AlacTermEvent::TextAreaSizeRequest(format) => {
self.write_to_pty(format(self.last_content.terminal_bounds.into()))
self.write_to_pty(format(self.last_content.terminal_bounds.into()).into_bytes())
}
AlacTermEvent::CursorBlinkingChange => {
let terminal = self.term.lock();
@ -761,7 +762,7 @@ impl Terminal {
// followed by a color request sequence.
let color = self.term.lock().colors()[index]
.unwrap_or_else(|| to_alac_rgb(get_color_at_index(index, cx.theme().as_ref())));
self.write_to_pty(format(color));
self.write_to_pty(format(color).into_bytes());
}
AlacTermEvent::ChildExit(error_code) => {
self.register_task_finished(Some(error_code), cx);
@ -1227,11 +1228,11 @@ impl Terminal {
}
///Write the Input payload to the tty.
fn write_to_pty(&self, input: impl Into<Vec<u8>>) {
fn write_to_pty(&self, input: impl Into<Cow<'static, [u8]>>) {
self.pty_tx.notify(input.into());
}
pub fn input(&mut self, input: impl Into<Vec<u8>>) {
pub fn input(&mut self, input: impl Into<Cow<'static, [u8]>>) {
self.events
.push_back(InternalEvent::Scroll(AlacScroll::Bottom));
self.events.push_back(InternalEvent::SetSelection(None));
@ -1345,7 +1346,10 @@ impl Terminal {
// Keep default terminal behavior
let esc = to_esc_str(keystroke, &self.last_content.mode, alt_is_meta);
if let Some(esc) = esc {
self.input(esc);
match esc {
Cow::Borrowed(string) => self.input(string.as_bytes()),
Cow::Owned(string) => self.input(string.into_bytes()),
};
true
} else {
false
@ -1378,7 +1382,7 @@ impl Terminal {
text.replace("\r\n", "\r").replace('\n', "\r")
};
self.input(paste_text);
self.input(paste_text.into_bytes());
}
pub fn sync(&mut self, window: &mut Window, cx: &mut Context<Self>) {
@ -1487,13 +1491,13 @@ impl Terminal {
pub fn focus_in(&self) {
if self.last_content.mode.contains(TermMode::FOCUS_IN_OUT) {
self.write_to_pty("\x1b[I".to_string());
self.write_to_pty("\x1b[I".as_bytes());
}
}
pub fn focus_out(&mut self) {
if self.last_content.mode.contains(TermMode::FOCUS_IN_OUT) {
self.write_to_pty("\x1b[O".to_string());
self.write_to_pty("\x1b[O".as_bytes());
}
}
@ -1660,7 +1664,7 @@ impl Terminal {
MouseButton::Middle => {
if let Some(item) = _cx.read_from_primary() {
let text = item.text().unwrap_or_default().to_string();
self.input(text);
self.input(text.into_bytes());
}
}
_ => {}
@ -1832,7 +1836,7 @@ impl Terminal {
.map(|name| name.to_string_lossy().to_string())
.unwrap_or_default();
let argv = fpi.argv.clone();
let argv = fpi.argv.as_slice();
let process_name = format!(
"{}{}",
fpi.name,