diff --git a/src/mux/domain.rs b/src/mux/domain.rs index 633005332..90dd56d0d 100644 --- a/src/mux/domain.rs +++ b/src/mux/domain.rs @@ -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(); diff --git a/src/ssh.rs b/src/ssh.rs index d347fd890..79bd83233 100644 --- a/src/ssh.rs +++ b/src/ssh.rs @@ -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(); diff --git a/term/src/terminal.rs b/term/src/terminal.rs index 1d43a7b0b..4a92db7dd 100644 --- a/term/src/terminal.rs +++ b/term/src/terminal.rs @@ -53,6 +53,8 @@ impl Terminal { pixel_width: usize, pixel_height: usize, config: Arc, + 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(), } diff --git a/term/src/terminalstate.rs b/term/src/terminalstate.rs index 53287758d..1629d3080 100644 --- a/term/src/terminalstate.rs +++ b/term/src/terminalstate.rs @@ -229,6 +229,9 @@ pub struct TerminalState { clipboard: Option>, current_dir: Option, + + 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, + 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(); } diff --git a/term/src/test/mod.rs b/term/src/test/mod.rs index 4bbe1bf82..0fcc27118 100644 --- a/term/src/test/mod.rs +++ b/term/src/test/mod.rs @@ -93,6 +93,8 @@ impl TestTerm { height * 16, width * 8, Arc::new(TestTermConfig { scrollback }), + "WezTerm", + "O_o", ); let clip: Arc = Arc::new(LocalClip::new()); term.set_clipboard(&clip); diff --git a/termwiz/src/escape/csi.rs b/termwiz/src/escape/csi.rs index 3b7bfac57..ed2f54c6f 100644 --- a/termwiz/src/escape/csi.rs +++ b/termwiz/src/escape/csi.rs @@ -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 { + 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 { if params == [] { Ok(Device::RequestSecondaryDeviceAttributes)