-
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
Narrow emoji >=U+10000 make WriteCharsLegacy sad ("wrong character insertion when scrolling to bash history") #6555
Comments
Ho boy, is the thermometer supposed to be wide, and we're treating it as narrow? This problem repros in conhost as well as Terminal, so it's not necessarily a conpty miscommunication. |
I think it's the other way around - it's supposed to be narrow but we're treating it as wide. This could perhaps be because conhost uses different width calculations to WT. My understanding was that this was by design, for backwards compatibility reasons (see issue #4604). But that might result in the conhost cursor being in a different position to whether WT expects it to be. Perhaps we need a way to tell conhost to use the standard width calculations when in a conpty session (assuming that is the problem). |
I think this is more likely a width disagreement between bash and conhost, actually, coupled with a somewhat “recent” regression where BS can move halfway into a double-width cell. |
Yeah, but that's to be expected if conhost doesn't use a standard width measurement. You can get the same result with the So unless conpty is triggering different behaviour, conhost's view of character widths is assumedly going to be dependent on whatever font is used by default, which is not necessarily in sync with bash or the Windows Terminal renderer. |
Here's another example of the problem that doesn't involve bash. Try executing these two statements:
In both cases WT renders the first X in the second column, because it thinks both the |
Huh, we did work to make sure conpty and WT treat ambiguous width glyphs as narrow always. cf #2066 for more info on that choice (which I believe is the correct one). Perhaps we regressed that and they disagree once more? Hmm |
(Conpty was actually circumstantial: the ambiguous width lookup fell through to the VT renderer, which threw up its hands and said “friend you don’t have a font, so it’s narrow.”) |
Ah shit.
We're calling |
I was just going to say I thought it might have something to do with surrogate pairs. The fix I was proposing in #4604 didn't help in this case (although it does fix |
how did we ever expect this to work 😦 |
I'm going to make this the master issue for "narrow emoji that are also surrogate pairs make life very sad" |
🎉This issue was addressed in #14640, which has now been successfully released as Handy links: |
Notes from #6555 (comment)
We're calling
IsGlyphFullWidth
once for each half of the surrogate pair. You can well imagine how nicely that works out.Environment
Steps to reproduce
echo 🔥🌡
the utf-16 equivalent (just to see the exact characters)
Expected behavior
switch from
echo 🔥🌡
to
THIS PROBLEM CANNOT BE REPRODUCED ON OTHER TERMINAL EMULATORS
Actual behavior
character 'e' inserted at the beginning
The text was updated successfully, but these errors were encountered: