1
1
mirror of https://github.com/wez/wezterm.git synced 2024-09-21 03:39:16 +03:00

support Terminal identification sequence

This reports the TERM_PROGRAM and TERM_PROGRAM_VERSION
separated by a space.

See discussion in https://github.com/mintty/mintty/issues/881
with a more concise description of the functionality here in
this VTE issue: https://gitlab.gnome.org/GNOME/vte/-/issues/235

```bash
$ printf '\033[>q'; cat
^[P>|WezTerm 20200503-171512-b13ef15f-4-g0395639a^[\
```
This commit is contained in:
Wez Furlong 2020-05-03 22:10:38 -07:00
parent 0395639ab4
commit 132529cfd5
6 changed files with 41 additions and 0 deletions

View File

@ -130,6 +130,8 @@ impl Domain for LocalDomain {
size.pixel_width as usize,
size.pixel_height as usize,
std::sync::Arc::new(crate::config::TermConfig {}),
"WezTerm",
crate::wezterm_version(),
);
let mux = Mux::get().unwrap();

View File

@ -261,6 +261,8 @@ impl Domain for RemoteSshDomain {
size.pixel_width as usize,
size.pixel_height as usize,
std::sync::Arc::new(crate::config::TermConfig {}),
"WezTerm",
crate::wezterm_version(),
);
let mux = Mux::get().unwrap();

View File

@ -53,6 +53,8 @@ impl Terminal {
pixel_width: usize,
pixel_height: usize,
config: Arc<dyn TerminalConfiguration>,
term_program: &str,
term_version: &str,
) -> Terminal {
Terminal {
state: TerminalState::new(
@ -61,6 +63,8 @@ impl Terminal {
pixel_height,
pixel_width,
config,
term_program,
term_version,
),
parser: Parser::new(),
}

View File

@ -229,6 +229,9 @@ pub struct TerminalState {
clipboard: Option<Arc<dyn Clipboard>>,
current_dir: Option<Url>,
term_program: String,
term_version: String,
}
fn encode_modifiers(mods: KeyModifiers) -> u8 {
@ -279,6 +282,8 @@ impl TerminalState {
pixel_width: usize,
pixel_height: usize,
config: Arc<dyn TerminalConfiguration>,
term_program: &str,
term_version: &str,
) -> TerminalState {
let screen = ScreenOrAlt::new(physical_rows, physical_cols, &config);
@ -309,6 +314,8 @@ impl TerminalState {
pixel_width,
clipboard: None,
current_dir: None,
term_program: term_program.to_string(),
term_version: term_version.to_string(),
}
}
@ -1042,6 +1049,13 @@ impl TerminalState {
Device::RequestSecondaryDeviceAttributes => {
host.writer().write(b"\x1b[>0;0;0c").ok();
}
Device::RequestTerminalNameAndVersion => {
host.writer().write(DCS).ok();
host.writer()
.write(format!(">|{} {}", self.term_program, self.term_version).as_bytes())
.ok();
host.writer().write(ST).ok();
}
Device::StatusReport => {
host.writer().write(b"\x1b[0n").ok();
}

View File

@ -93,6 +93,8 @@ impl TestTerm {
height * 16,
width * 8,
Arc::new(TestTermConfig { scrollback }),
"WezTerm",
"O_o",
);
let clip: Arc<dyn Clipboard> = Arc::new(LocalClip::new());
term.set_clipboard(&clip);

View File

@ -172,6 +172,9 @@ pub enum Device {
RequestPrimaryDeviceAttributes,
RequestSecondaryDeviceAttributes,
StatusReport,
/// https://github.com/mintty/mintty/issues/881
/// https://gitlab.gnome.org/GNOME/vte/-/issues/235
RequestTerminalNameAndVersion,
}
impl Display for Device {
@ -188,6 +191,7 @@ impl Display for Device {
Device::SoftReset => write!(f, "!p")?,
Device::RequestPrimaryDeviceAttributes => write!(f, "c")?,
Device::RequestSecondaryDeviceAttributes => write!(f, ">c")?,
Device::RequestTerminalNameAndVersion => write!(f, ">q")?,
Device::StatusReport => write!(f, "5n")?,
};
Ok(())
@ -1301,6 +1305,9 @@ impl<'a> CSIParser<'a> {
('r', &[b'?']) => self
.dec(params)
.map(|mode| CSI::Mode(Mode::RestoreDecPrivateMode(mode))),
('q', &[b'>']) => self
.req_terminal_name_and_version(params)
.map(|dev| CSI::Device(Box::new(dev))),
('s', &[b'?']) => self
.dec(params)
.map(|mode| CSI::Mode(Mode::SaveDecPrivateMode(mode))),
@ -1386,6 +1393,16 @@ impl<'a> CSIParser<'a> {
}
}
fn req_terminal_name_and_version(&mut self, params: &'a [i64]) -> Result<Device, ()> {
if params == [] {
Ok(Device::RequestTerminalNameAndVersion)
} else if params == [0] {
Ok(self.advance_by(1, params, Device::RequestTerminalNameAndVersion))
} else {
Err(())
}
}
fn req_secondary_device_attributes(&mut self, params: &'a [i64]) -> Result<Device, ()> {
if params == [] {
Ok(Device::RequestSecondaryDeviceAttributes)