-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
scroll-out in secondary console buffer pollutes main scrollback buffer #17874
Comments
We've found some similar issues:
If any of the above are duplicates, please consider closing this issue out and adding additional context in the original issue.
|
No matter whether or how we fix it (pages perhaps? but that only works for WT), |
Now sure what "only works for WT" means. Do you mean it would be fixed for the windows-terminal but not for OpenConsole/conhost? If yes, then as I noted above, OpenConsole/conhost don't have this issue. It only happens in windows-terminal.
Maybe, but that's work that someone will have to do, and with more code paths which have to be maintained and tested, and while code which uses (similar *nix code which uses alt-screen does exist in I believe the |
FWIW the
I wrote it as a comment targeted to the other maintainers. We received an implementation for VT pages a while ago (#16615). It allows you to have multiple "pages" (= similar to console buffers, but more limited) at the same time, instead of just the two usual ones (main and alt buffer). That would allow us to improve our
To be fair, that's also true for us. But I understand that we should bear the burden here.
Similarly, it would be nice if
Such existing applications should be translated to VT to the absolute best of our abilities of course. It's not their fault that Windows changed its focus from the old console APIs over to VT sequences over the last decade. However... ...our abilities to do that translation are limited. There are multiple problems:
But most importantly:
In any case, we'll always try to do our absolute best, and perhaps we can improve the symptoms of your issue. But I don't believe it's fair to expect us to make two completely conflicting technologies fit perfectly. |
Yeah, I totally understand the main issue and that's console buffer has many features which don't have an equivalent in the unix terminal world, or not enough terminals support enough features to implement many of those in the VT world, so that it can be expected to work fully inside some 3rd part terminal emulator. That being said, I'd guess one goal of the windows terminal is to provide an environment in which windows console application can behave as if they run in conhost, so I'd think that console screen buffer would need to work somehow, including many/most/all of its features which don't have an equivalent in the VT world. That may or may not extend to arbitrary conpty clients, but obviously prefably it does extend. Specifically though, "less" for windows uses the console buffer like alt screen. I.e. it doesn't use a custom size (it does set size, but copies it from the main buffer), and it doesn't do read-back (that I know of, but I think it doesn't), and VT alt-screen also doesn't spill scrolled-out content into the main buffer scrollback, so at least at this specific use case, I don't think it requires features which "normal" alt-screen doesn't have. I.e. I'd think that it could be exposed as normal alt-screen to conpty clients and it would work as expected. Admittedly I don't know most of the specifics about implementation details with the windows terminal, but I'm now getting the impression that it's a pure VT (conpty) app, probably like other 3rd party windows VT terminals (wezterm, alacritty, etc) and which operates mainly or exclussively using VT sequences? I understand the issues this approach poses, but also think there's a non-negligible need to support existing console apps which might not get updated to use the VT interface. Maybe conhost/OpenConsole can identify that a console app uses some features which translate to VT sequences which are not commonly supported by 3rd party terminals, and issue a warning (once-ish per app) that 3rd party terminals might not be compatible with this application (while the windows terminal would support it via extended sequences which emulate the console buffer fully, etc). It's not my place to suggest solutions here and I'm unaware of the constraints you work with, but I do think that at least the windows terminal should be a good environment for legacy console apps, even if they use features which translate to VT sequences which are not universally supported. Isn't that right? |
Does this await resolution? |
I fully agree with this, which is why I made the following plan: https://github.com/microsoft/terminal/blob/main/doc/specs/%2313000%20-%20In-process%20ConPTY.md
Yep, currently Windows Terminal operates exclusively via VT sequences. The above plan would change this: Windows Terminal would then be a native console server (like good old conhost), while we would still only use pure VT for windows applications run under WSL, as well as SSH and some other tools. I think that approach has the best trade-off of being relatively easy to implement (by us and others), it's performant and robust. The only downside is that it'll take a while to get there. |
Can't say I entirely or even mostly grok it, but out of curiosity, would that mean that the windows terminal would be a good env for "legacy" console apps, but those same apps would run less good in 3rd party terminal emulators, because those work exclussively via VT sequences, and then some APIs can't be translated well enough (like is the case now with the windows terminal)? And specifically about this issue, does that mean that it won't be fixed until this transition is complete? Because:
I'd imagine that console buffer would be implemented/exposed using alt-screen, and as such, the issue shouldn't exist, because content which scrolls out of the alt-screen doesn't normally pollute the main scrollback buffer in any *nix terminal, right? IOW, I'd think that this specific issue, depending on implementation details, does not actually need this planned architechture change? |
No, because over SSH these apps will be broken in Windows Terminal just as before, just like they're broken in conhost right now. Further "no", because the linked proposal can be implemented by any other terminal - it's not a proposal specific to Windows Terminal. And lastly, if we were to introduce a new sequence for translating console screen buffers instead, it would still take years for any other terminal adopt it. Given other precedent, what's most likely is that no other terminal will ever adopt it. Just to clarify: Implementing the linked spec document above doesn't take a year. It takes maybe 1 month or so. It's just that I also need to work on a lot of other issues as well.
Unfortunately, yes. As I outlined above, "pages" VT sequences aren't supported by other terminals and also don't perfectly map console buffers, so even if we were to use them, someone would likely soon find another bug with them. Custom VT sequences would similarly not be supported by other terminals. Lastly, implementing a solution with VT sequences now will take just as long to implement as implementing the linked proposal above, because Windows Terminal currently doesn't support more than 2 text buffers (outside of VT pages), etc.
I don't want to do any such translations at the moment because they're "risky". Any edge cases around console buffer switching would need to be fixed by me. Since Windows has had supported for the xterm alt buffer for almost a decade now, I think it's instead on these still fully maintained applications to switch over to using the alt buffer. I would understand it, if this issue was a major one (like a crash), but it's really more of a really annoying edge case, wouldn't you agree? Basically, I just don't want to invest 50% of the time now to get a quick hack in that solves 10% of the problem, when I can also just wait 100% of the time and fix the problem 100%. |
We're guessing, but my guess would be the same as yours.
I agree. I don't think solving it with custom or uncommon sequences is great.
Well, I was guessing that console buffers are already getting translated to alt-screen, and if that were the case then I thought the issue shouldn't exist already currently, but judging by this statement, that's not the case. May I ask what happens currently, implementation-wise (but high level), which causes text which scrolls out of a (non-main) screen buffer to reach the terminal's scrollback?
I do agree, but for me it's annoying enough to get back to conhost or openconsole, because I do use "less" a lot, and I do value my scrollback history, but if everytime I use "less" it adds pages of junk to my scrollback, then it will be too annoying. (or I might implement alt-screen in "less" when VT is supported, because I already contribute to "less", but that's orthogonal to the issue here IMO) In fact, I already did just that for a long while (using OpenConsole rather than windows terminal), and tried to get back to the terminal recently, and noticed some console buffer issues. Believe it or not, my main issue with OpenConsole is that shift-mouse-select is unsupported (when quick-edit is disabled, e.g. because the application wants to capture mouse events). Other than that OpenConsole is quite great for me (though I do value the nice features of Windows Terminal too, but for me they're more nice to have than essential, maybe except scrollback search which is very useful). Shall I open a feature request to support shift-mouse-select in OpenConsole to override disabled-quickedit?
Completely agreed, though many times unavoidable in practice, because such is life. But if you do get the chance to avoid yet another hack, without great cost, I agree you should.
Not doing too bad so far, if I may say so. |
I suspect #17949 is a dupe of this.? |
Yeah exactly. As I said, I objectively don't think we should try to map it to the alt-screen as it's somewhat risky to subtly break things. I'd much prefer working on the in-process ConPTY spec linked above (= make Windows Terminal a proper console server), as I consider that a perfect solution.
Since Windows Terminal is currently a pure VT terminal (like on UNIX), it doesn't have "console screen buffers". As a consequence, if you use When you scroll in less it assumes that it's in the alternate screen buffer without scrollback. It then writes more text than fits on the screen when scroll down. But Windows Terminal is not in the alternate screen buffer and so the scrolled off text ends up in the scrollback accidentally.
Please do!
It's not strictly related. 🙂 Let's continue talking about your issue over there. |
Thanks. This indeed explains why this issue happens.
Unfortunately, the case where shift-mouse-select is required for override is exactly when ENABLE_MOUSE_INPUT is set (where the app also disables quick-edit, because otherwise some mouse events don't reach the app), but in windows terminal shift-mouse-select seem to work also in this specific case - which is what I hoped would be possible to do with OpenConsole as well. But this is off topic for this issue. I'll open a feature request (not sure when) and let's see there. Thanks for the info. |
Other than maybe performance issues, and assuming this is not too hard to do, and that I roughly get the kinds of translations which happen under the hood, would these translations of "scroll in non-main console buffer due to newline at the bottom line, or print when cursor is in bottom-right" work? (or maybe simply "scroll is about to happen" or "scroll just happened", which are maybe simpler to identify and possibly cover more use cases. those would require minor trivial modifications of the suggested procedures below) Few suggesitons when such scroll is identified. Do this Instead of printing the char which causes scroll to the VT terminal:
(some of these "print line N" might require clearing the line before print, to remove traces of line N-1 which was in its place previously, or some other solution) Am I roughly in the ballpark of how these VT translations work and what they're capable of? Should that work if someone implemented it? |
Doesn't |
It does, but output which utilizes VT features is not used normally. By default the console API is used ( However, while I initially observed the issue with "less", and it would be nice to get conhost behavior of "less" work correctly also at the Terminal, the goal of this issue was to improve the behavior of the terminal with application which use conhost, and specifically to not pollute the main scrollback buffer when a non-main console screen buffer scrolls content out of view. Initially you said that it might require missing/uncommon features which most terminals don't support, and we agree it won't be a great solution, but now I suggested a translation which I think should work in all terminals, and which is hopefully not too hard to implement (identify the trigger, translate it accordingly).
Implementation wise, I clearly don't know the details, but I would have guessed that it wouldn't matter (much), because if the non-main screen buffer is about to get scrolled, does it matter whether the trigger was I get that apps which use mixed Console/VT API may be harder to translate, but let's start with Console API, and hopefully VT input would still mostly work like it does with conhost? |
But you do! mind pointing me to the file[s] where this translation to VT happens? I don't mind giving it a look, maybe I can grasp something (for curiosity). |
I also mentioned before that the reason for needing the missing features is because such a translation is excessively difficult. I'll not implement such a translation within the current ConPTY architecture for the aforementioned reasons.
The correct approach is the previously mentioned in-process ConPTY. It'll be easier to implement, easier to maintain, and be more correct. The relevant VT translation functions are here: Lines 32 to 47 in 4386bf0
You can find the implementation in VtIo.cpp and their usage throughout the project. |
Thanks for the lively discussion here! We're not going to be investing in fixing this with VT, but with the new ConPTY architecture. Feel free to continue discussing, but I'm going to close this issue as it's not currently actionable for us. |
If it makes it any better, I'm planning to work on the new architecture early next year. This will fix the issue for Windows Terminal under most circumstances. I'll also work on bringing this to other terminals. |
Windows Terminal version
1.22.240823002-preview
Windows build number
10.0.19045.4780
Other Software
No response
Steps to reproduce
CreateConsoleScreenBuffer
and then activates it usingSetConsoleActiveScreenBuffer
.Test program which: prints 100 lines to the main buffer, then creates and activates a new screen buffer, then writes 40 lines to the new buffer, then activates the original buffer and exits:
scrollbuf.c
Expected Behavior
The original scrollback buffer is restored without traces of content which was printed to the new/secondary console buffer.
Actual Behavior
Lines which were printed to the new (secondary) buffer buf were scrolled out of view become part of the scrollback of the main buffer.
With the test program above (which prints 40 lines to the secondary buffer), if the terminal height is less than 40, for instance 30 lines, then the first 10 lines printed to the secondary buffer will be added to the scrollback of the main buffer.
After the program exits, one needs to scroll up (e.g. using the mouse wheel) to ovserve the lines from the secondary buffer.
Additional notes:
OpenConsole.exe
and also no issue in the native win10 conhost (i.e. the main scrollback buffer is unaffected by overflow at the secondary buffer).EDIT:
The issue manifests when using
less.exe
for windows in Windows terminal, e.g.less some-file.c
and then scrolling down using the down-arrow, then afterless
exits then the scrollback buffer has content which was scrolled out-of-view in less (but no issue in OpenConsole or conhost).The text was updated successfully, but these errors were encountered: