terminal: Tmux redraws incorrectly when scrolling
Windows Terminal version
1.15.2875.0
Windows build number
10.0.22621.900
Other Software
tmux 3.3a
Steps to reproduce
I’ve been having this problem since I started using Terminal many month ago. It happens at random, and I’ve never really been able to reproduce it on demand.
- Use tmux for while (often days)
- Scroll up
- See that the scrolling mechanic is messed up
For a while today, I was able to reproduce it this way (but then it stopped reproducing, so I doubt these step will work for anyone)
- Start Terminal in WSL with Fedoraremix
- Maximize window (doubt this is important)
tmux
docker run -it --rm alpine
find /usr
- Scroll up
Expected Behavior
Scrolling to always work correctly, like so:
Actual Behavior
You see the numbers in the upper right messed up, and the actual buffer on screen looks all wrong.
Many more details about the redrawing are incorrect, but this is the simplest to explain
The solution is to close Windows Terminal, and restart it again. Luckily, I’m in tmux so that’s pretty straight forward. But anything less than restarting the tab does not work. Often creating a new tab usaully works and I don’t have to close the entire Windows Terminal window
reset
does not work- Closing tmux and attaching does not work
May be related to #8000 or #6987, but it seemed different enough it might not be.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 15 (5 by maintainers)
Right on. Thanks for following up. Glad this got sorted out!
The problem is that
tmux
introduces another level on indirection, which can make it difficult to reproduce the issue. There are three thing you need to do to trigger the problem:SetConsoleMode
API.LF
,VT
, orFF
control characters in a way that relies on them moving down without changing the column position.Just running
tmux
should satisfy condition 1. And I’m fairly certainwslsys
should trigger condition 2. But condition 3 is entirely dependent on howtmux
redraws the screen.In the
typescript
log that you sent before, I could clearly see it was using anLF
from column 96 when it tried to clear the line indicator, and that’s where things went wrong. But when I try to reproduce that on my system,tmux
redrew the screen in a completely different way. It only ever used anLF
in column 1, so it wasn’t affected by theDISABLE_NEWLINE_AUTO_RETURN
mode being wrong.So if you want to confirm that this is the same problem as #14690, I’d suggest you eliminate
tmux
from the equation, and try and reproduce my test case from #14690, but see if you can trigger the mode change withdocker
rather thanwslsys
.printf "\e[?1049h"
printf "\e[10CX\b\fY\n"
docker
however you normally wouldprintf "\e[10CX\b\fY\n"
If
docker
is triggering the mode change then the output in step 4 should be different from step 2.This looks to me like it could be a variation of #14690.
When you pan up in the scrollback buffer, this is what tmux does:
/usr/bin/comm
.CUF
.LF
.The problem is that step 5 doesn’t just move down a line, but also moves the cursor back to the first column. So instead of erasing the old line indicator, it’s erasing the start of the line.
And I suspect the reason the
LF
is behaving incorrectly, is because theDISABLE_NEWLINE_AUTO_RETURN
mode has been changed by something. I don’t see wslsys used here, so docker maybe?Assuming that is the correct interpretation, this should be fixed by PR #14735.