From 822a7667618e3db12ae0bdd6036c8c42a02aefe4 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Sun, 16 Jul 2023 08:46:45 -0700 Subject: [PATCH] conpty: adjust screensize probing We need a delay, and to be able to swallow a couple of excess xtversion responses in order to read the pixel dimension response. --- termwiz/src/caps/probed.rs | 27 ++++++++++++++++++++------- wezterm/src/main.rs | 5 +++-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/termwiz/src/caps/probed.rs b/termwiz/src/caps/probed.rs index db48dd07e49..ae12ed07dca 100644 --- a/termwiz/src/caps/probed.rs +++ b/termwiz/src/caps/probed.rs @@ -147,14 +147,19 @@ impl<'a> ProbeCapabilities<'a> { // terminal and see what it says if is_tmux { write!(self.write, "{TMUX_BEGIN}{query_pixels}{TMUX_END}")?; + } + + if is_tmux || cfg!(windows) { self.write.flush()?; - // I really wanted to avoid a delay here, but tmux will re-order the - // response to dev_attributes before it sends the response for the - // passthru of query_pixels if we don't delay. The delay is potentially - // imperfect for things like a laggy ssh connection. The consequence - // of the timing being wrong is that we won't be able to reason about - // the pixel dimensions, which is "OK", but that was kinda the whole - // point of probing this way vs. termios. + // I really wanted to avoid a delay here, but tmux and conpty will + // both re-order the response to dev_attributes before sending the + // response for the passthru of query_pixels if we don't delay. + // The delay is potentially imperfect for things like a laggy ssh + // connection. The consequence of the timing being wrong is that + // we won't be able to reason about the pixel dimensions, which is + // "OK", but that was kinda the whole point of probing this way + // vs. termios. + std::thread::sleep(std::time::Duration::from_millis(100)); } @@ -177,6 +182,14 @@ impl<'a> ProbeCapabilities<'a> { parser.parse(&byte, |action| { // print!("{action:?}\r\n"); match action { + // ConPTY appears to trigger 1 or more xtversion queries + // to wezterm in response to this probe, so we need to + // prepared to accept and discard data of that shape + // here, so that we keep going until we get our reports + Action::DeviceControl(_) => {} + Action::Esc(Esc::Code(EscCode::StringTerminator)) => {} + + // and now look for the actual responses we're expecting Action::CSI(csi) => match csi { CSI::Window(win) => match *win { Window::ResizeWindowCells { width, height } => { diff --git a/wezterm/src/main.rs b/wezterm/src/main.rs index 829ead203e9..1aa9177356f 100644 --- a/wezterm/src/main.rs +++ b/wezterm/src/main.rs @@ -336,8 +336,9 @@ impl ImgCatCommand { // explicitly after we've drawn things. // We can only do this reasonably sanely if we aren't setting // the absolute position. - let needs_force_cursor_move = - !self.no_move_cursor && !self.position.is_some() && (is_tmux || is_conpty); + let needs_force_cursor_move = !self.no_move_cursor && !self.position.is_some() && (is_tmux || is_conpty) + // We can only use forced movement if we know the pixel geometry + && (term_size.xpixel != 0 && term_size.ypixel != 0); term.set_cooked_mode()?;