Skip to content

Commit

Permalink
conpty: adjust screensize probing
Browse files Browse the repository at this point in the history
We need a delay, and to be able to swallow a couple of
excess xtversion responses in order to read the pixel
dimension response.
  • Loading branch information
wez committed Jul 16, 2023
1 parent e2c9c60 commit 822a766
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
27 changes: 20 additions & 7 deletions termwiz/src/caps/probed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand All @@ -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 } => {
Expand Down
5 changes: 3 additions & 2 deletions wezterm/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()?;

Expand Down

0 comments on commit 822a766

Please sign in to comment.