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:
parent
0395639ab4
commit
132529cfd5
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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(),
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user