mirror of
https://github.com/microsoft/terminal.git
synced 2026-02-04 05:35:20 +00:00
Font / Emoji rendering (spacing issue) #21368
Closed
opened 2026-01-31 07:42:37 +00:00 by claunia
·
27 comments
No Branch/Tag Specified
main
automated/loc-update
feature/llm
dev/cazamor/sui/search
dev/pabhoj/actions_editor_search
dev/lhecker/11509-kitty-keyboard-protocol
dev/lhecker/11509-kitty-keyboard-protocol-wip
dev/pabhoj/actions_editor_visual
dev/cazamor/selfhost/2026-01-29
dev/duhowett/no-blank-issues-you-lost-privileges-for-that-fam
dev/lhecker/benchcat-fix
dev/lhecker/dcs-perf
dev/duhowett/eoy-25/allow-set-foreground
release-1.24
release-1.23
dev/cazamor/bot/deprecate-area-atlasengine
dev/pabhoj/actions_editor_followups
dev/cazamor/selfhost/2026-01-20
dev/cazamor/selfhost/2026-01-12
dev/cazamor/spec/auto-save
dev/duhowett/eoy-25/underline-colors-in-atlas-bug-redux
dev/duhowett/fhl-2024/asciicast-recorder
dev/duhowett/eoy-25/underline-colors-in-atlas-bug
dev/duhowett/hax/serial-port-support
dev/duhowett/connection-utf8
dev/lhecker/fused-event
dev/lhecker/18928-wip
dev/duhowett/fhl-2024/clang
dev/cazamor/uia-leak
dev/duhowett/win7-wpf-termcontrol-squash
release-1.22
dev/cazamor/selfhost/11-18-v3
dev/cazamor/selfhost/11-18
dev/duhowett/fhl-2025/bitmap-fonts
dev/duhowett/server-2025-vms
dev/duhowett/cant-believe-gotta-do-this-shit
dev/lhecker/1410-large-scrollback
dev/lhecker/dark-mode
dev/cazamor/sui/invert-cursor-color
dev/duhowett/fhl-2025/wt-command-palette-cmdpal-integration
dev/duhowett/fhl-2025/wt-json-relative-icons
dev/lhecker/fucking-service-locator
dev/duhowett/unicode-17
dev/duhowett/multi-blern
dev/lhecker/wellp2-alt
dev/duhowett/wellp2
dev/lhecker/1860-horizontal-scrollbar
dev/lhecker/fix-window-count
dev/cazamor/sui/tab-color-old
dev/duhowett/hax/conhost-icon
dev/duhowett/hax/sui-color-chip-border
dev/duhowett/hax/terminalsettings-as-a-lib-/with-types-merged-into-tsm
dev/pabhoj/page_control_input_cleanup
dev/duhowett/padding-in-atlas-rebase-20250729
dev/lhecker/attach-thread-input
dev/duhowett/portable-shader-members
msbuildcache-reenable
dev/cazamor/selfhost/1.24-2025-06-10
dev/cazamor/upgrade-settings-containers
dev/cazamor/sui/ext-page/powershell-stub
dev/cazamor/selfhost/1.24-2025-05-15
dev/pabhoj/sui_action_overhaul
dev/cazamor/selfhost/1.24-2025-05-06
dev/cazamor/selfhost/1.24-2025-04-29
dev/cazamor/sui/ext-page/lazy-load-objects
dev/cazamor/sui/ext-page/badge
dev/cazamor/selfhost/1.24
dev/lhecker/sdk-26100
dev/duhowett/testing
dev/jadelaga/VS-Pty.Net-1.22
dev/duhowett/fhl-2025/what-if-no-content-ids
dev/cazamor/a11y/vt-seq-prototype
dev/lhecker/18584-part2
dev/lhecker/get-lang-id
dev/duhowett/hax/clogs
release-1.21
dev/pabhoj/featurellm_fix_paste
dev/lhecker/grapheme-backup
dev/jadelaga/VS-Pty.netFixes
dev/lhecker/atlas-engine-compute-shader
dev/migrie/s/ai-providers
dev/lhecker/animated-cursor-wip
dev/pabhoj/featurellm_timeout
dev/lhecker/dark-mode-alt
dev/duhowett/osc-strided-table
dev/lhecker/bugbash
dev/pabhoj/featurellm_improve_parsing
dev/duhowett/coast-to-coast
dev/lhecker/curly-improvements
dev/duhowett/net8
dev/duhowett/onebranch-custom-pool
dev/lhecker/renderer-overhaul-2nd-attempt
dev/lhecker/cleanup
dev/cazamor/sui/confirmation-announcements
dev/lhecker/theme-quality
dev/duhowett/hax/cmake
dev/lhecker/winconpty-cleanup
dev/duhowett/learn/rewrite-highlights
dev/migrie/b/no-nesting-when-searching
release-1.20
dev/lhecker/14165-conhost-font-size
dev/duhowett/sel-2-spans
dev/lhecker/7118-cursor-color
dev/lhecker/remove-glyph-width
dev/lhecker/igfw-scroll-region
dev/lhecker/17656-win32im-double-encoding
dev/duhowett/fhl-2024/merge-idls
dev/duhowett/feed-forward-variables
dev/lhecker/remove-chrome-math
dev/duhowett/copylink
dev/duhowett/applicableactions
gh-readonly-queue/main/pr-17566-de50310295b7d92ed3d51f07974a2a945776bf9d
dev/lhecker/atlas-engine-stride-copy
dev/migrie/b/bump-nuget-in-c
dev/migrie/f/992-redux-redux
dev/migrie/f/filter-weight-input-too
dev/migrie/f/disable-nesting
dev/migrie/f/local-snippets-cleaner
dev/migrie/s/1553-mouse-bindings
selfhost-1.22-bugbash-2024-06-04
selfhost/1.22-bugbash-2024-06-04
dev/lhecker/15689-tab-drag-crash-fix
dev/migrie/f/sxnui-font-size-change
dev/migrie/f/local-snippets-on-action-refactor
dev/migrie/f/just-local-snippets
dev/migrie/save-input-patches
dev/migrie/f/md-pane-official
dev/migrie/base-pane
dev/migrie/fhl/tasks-pane
release-1.19
dev/migrie/b/17130-clear-marks-2
dev/migrie/b/17075-its-me-the-killer
dev/duhowett/i-figured-out-why-sometimes-the-publish-build-failed
dev/duhowett/nuget-publication-with-aad-app-id
selfhost-1.20
dev/duhowett/graph
dev/migrie/b/15803-activate-dont-copypasta
dev/duhowett/is-pgo-broken-because-of-sui-being-slower
dev/migrie/b/remove-terminaltab
dev/migrie/fhl/md-pane
dev/migrie/fhl/local-tasks-2024
dev/migrie/fhl/2024-inline-notebook
dev/duhowett/interface-projects
dev/duhowett/dead-loc
release-1.18
dev/migrie/fhl/2024-spring-merge-base
dev/duhowett/hax/l9
inbox
dev/migrie/14073-on-main
dev/duhowett/hax/conhost_dump_replay
user/lhecker/atlas-engine-srgb
dev/migrie/fhl/sxnui-tooltips-3
dev/migrie/7718-notifications-experiments
dev/migrie/fhl/7718-notifications
dev/migrie/fhl/7718-notifications-reboot
dev/lhecker/remove-gsl
dev/lhecker/16575-TerminateProcess
dev/lhecker/window-thread-climate-control
dev/lhecker/client-context-input-output-mode
dev/lhecker/ring-buffer-input-buffer
release-1.17
dev/lhecker/propsheet-fontdlg-refactor
dev/lhecker/renderer-overhaul
dev/pabhoj/test
dev/duhowett/chop
dev/lhecker/til-ulong-cleanup
dev/lhecker/til-env-cleanup
dev/migrie/f/16005-a11y-pane
dev/cazamor/a11y/fastpass
dev/migrie/b/15487-push-cwd
dev/migrie/b/15536-or-15219-idk
dev/duhowett/move-timers-down-into-core-interactivity-etc
dev/migrie/b/15812-broadcast-paste-two
dev/migrie/fhl-fall-2023/11162-quake-III-arena
dev/migrie/fhl-fall-2023/1620-automatic-tab-progress
dev/migrie/fhl-fall-2023/9992-quake-II
dev/migrie/fhl-fall-2023/9992-default-quake-settings
dev/migrie/fhl-fall-2023/9992-window-name-settings
dev/migrie/fhl-fall-2023/oceans
dev/lhecker/ColorScheme-improvements
dev/migrie/search-v2-v3
dev/migrie/pr-15717/its-dangerous-to-go-alone
dev/migrie/f/4768-taskbar-icons
dev/duhowett/padding-in-atlas
dev/migrie/f/3121-tooltips
dev/duhowett/sticky-control
dev/duhowett/fix-tracing-2
dev/migrie/b/add-support-for-vsc-marks
dev/migrie/f/1860-this-is-literally-what-less-is-for
dev/migrie/s/5916-draft
dev/lhecker/tracy
dev/migrie/s/north-star
dev/cazamor/tag-youre-it
dev/migrie/f/12336-let-it-mellow
dev/migrie/f/now-with-more-compat-settings
dev/migrie/f/compatibility-sui
dev/duhowett/hax/wpf-atlas
dev/duhowett/fgb
dev/migrie/b/15487-relative-paths-are-hard
dev/lhecker/colrv1
loc-update
dev/migrie/fhl/dyndep-csharp
dev/migrie/fhl/dyndep
dev/migrie/fhl-clickable-send-input
dev/migrie/f/cwd-hijinks-5506-15173
dev/lhecker/openconsole-async-start
1.17
dev/migrie/bump-scratch
dev/migrie/f/3726-restartConnection
dev/migrie/b/cxn-restarting-attempt-1-backport
dev/migrie/b/9053-part-3-the-actual-doing-of-the-thing
dev/migrie/b/13388-focus-logger
dev/migrie/b/9053-part-4-i-guess-defterm
dev/migrie/oop/3/of-the-silmarils
of-the-darkening-of-valinor
dev/migrie/fhl/notebook-proto-000
dev/migrie/f/narrator-buddy
dev/migrie/mux-2.8.2-march-2023
dev/migrie/f/roast-mutton
dev/migrie/f/12861-preview-input
dev/lhecker/clang-tidy
dev/migrie/f/3121-wE-dOnT-hAvE-dEv-DaYs
dev/duhowett/compiler-compliance
dev/duhowett/i-have-a-burning-hatred-for-ntstatus-of-later-so-why-not-fix-it
dev/duhowett/shorthand-namespaces
dev/duhowett/rename-all-dlls
dev/duhowett/errordialog
dev/lhecker/gsl-narrow
dev/migrie/b/11522-dumb-idea
release-1.16
dev/miniksa/env
dev/duhowett/hax/embed-everything
dev/migrie/b/13388-attempt-003
dev/migrie/b/14512-test-research
dev/migrie/b/13388-attempt-002
dev/migrie/b/14464-copyOnSelect-moving-text
dev/migrie/s/thema-schema-for-1.16
dev/migrie/s/theme-pair-schema
dev/migrie/b/13388-experiments-1
dev/cazamor/spec/a11y-vt-seq
dev/migrie/b/14557-empty-folder-dropdown
dev/cazamor/spec/a11y-vt-seq-v2
release-1.15
dev/migrie/f/process-model-v3-test-0
dev/lhecker/vsconfig
dev/migrie/s/5000-presentation
dev/lhecker/5907-startup-perf
dev/lhecker/winrt-file-api-benchmark
dev/duhowett/128-bit-compiler
dev/duhowett/hax/arm64-native-build
dev/migrie/fhl/more-shell-integration
dev/migrie/b/13388-experiments-0
dev/lhecker/til-to-ulong-improvements
dev/migrie/s/markdown-notebooks
dev/cazamor/a11y/nav-by-page
dev/cazamor/a11y/system-menu-support
dev/duhowett/no-private-registry-keys
dev/cazamor/wpf/uia-expose-enable-events
dev/cazamor/wpf/uia-events
extendAISpec
dev/migrie/fhl/clickSendInput
dev/migrie/fhl/save-command
dev/migrie/b/theme.profile
dev/migrie/b/13943-a-test-for-this
dev/migrie/oop/2/endgame
dev/duhowett/hax/merge_idl
dev/migrie/oop/2/infinity-war
dev/migrie/spellbot-cve
dev/cazamor/a11y-sev3/new-profile-announcement
dev/migrie/fhl/upside-down-mode
release-1.14
dev/migrie/f/9458-startupInfoToTerminal
dev/migrie/fhl/5916-triggers
dev/migrie/b/13523-context-menu
dev/migrie/b/6523-endpaint-outside-lock
dev/migrie/b/12413-OnUnhandledException
dev/lhecker/render-snapshot
dev/cazamor/1.15/scroll-to-point
dev/migrie/mux-2.8-aug-2022
dev/lhecker/lock-console-guard
dev/migrie/f/1504-final
dev/pabhoj/sui_follow_ups
dev/migrie/f/til-winrt.h
dev/cazamor/color-picker-redesign
dev/migrie/fhl/vscode-autocomplete-prototype
dev/migrie/f/1504-prototype
dev/migrie/oop/2/loki
dev/migrie/oop/2/wandavision
dev/migrie/b/8698-YOURE-OUT-OF-ORDER
fabricbot-configuration-migration
dev/migrie/b/12788-did-it-work
dev/migrie/b/localtests-ci-2022
dev/cazamor/1.14/replace-compareInBounds
dev/pabhoj/preview_string
dev/cazamor/ks/switchSelectionEndpoint
dev/migrie/oop/2/COM-ISwapChainProvider-attempt-1
dev/migrie/b/dxd-marker
release-1.13
dev/migrie/b/13066-for-defterm
dev/cazamor/revert-dwm
dev/migrie/b/13066-sw_flash_repeatedly
dev/migrie/b/no-cloaky-cloak
dev/migrie/f/apples-to-oranges
dev/migrie/f/no-custom-caption-btns
dev/migrie/f/10509-mica-and-transparent-titlebars
dev/migrie/b/12911-wpf-focus-fg
dev/migrie/titebar-colors
dev/lhecker/4015-cursor
dev/migrie/fhl/rgb-rainbow-window-frame
dev/migrie/fhl/scroll-marks-prototype
release-1.12
dev/miniksa/compliance
dev/migrie/f/default-icons
dev/migrie/fhl/10175-web-search-for-text
dev/migrie/fhl/menu-complete-prototype
dev/migrie/b/2988-merged-prototypes
dev/migrie/b/2988-niksa-msgs-prototype
dev/migrie/fhl/9583-colorSelection
dev/migrie/b/10609-sui-leak
dev/migrie/b/32-attempt-3
dev/migrie/release-1.12-rejuv-attempt-2
dev/migrie/demo-for-presentation
dev/migrie/b/32-but-im-here-for-12567
dev/duhowett/conpty_first_frame_blug
dev/migrie/b/11092-unfocused-acrylic-settings
dev/migrie/localtests-in-ci
dev/migrie/b/12356-attempt-2
dev/migrie/b/12353-with-null
dev/migrie/b/12387-trim-spaces
dev/migrie/b/5033-bad-start
dev/lhecker/12351-broken-locales
dev/migrie/b/8663-input-to-oem-crash
dev/migrie/b/11743-win10-opacity-is-hard
dev/migrie/f/ctrl-click-elevate
dev/migrie/b/12196-shim-localization
dev/lhecker/issue-4015-til-rect
dev/cazamor/eim/mvvm
dev/migrie/f/--elevate
dev/migrie/b/11668-i-think
dev/migrie/b/11994-wsl-mangline
dev/migrie/eim/3475-action-xmacros
dev/migrie/eim/incremental-build-000
dev/cazamor/a11y/fake-uia-data
dev/migrie/f/non-terminal-content-elevation-warning
dev/migrie/f/632-on-warning-dialog
dev/lhecker/rgba
dev/migrie/b/8480-keybindings-in-tabs
release-1.11
dev/migrie/b/11561-dead-ends
dev/migrie/oct-21-roadmap-update
dev/migrie/fhl/adaptive-card-extension
dev/cazamor/test/11440
dev/migrie/f/warning-dlg-automation
dev/migrie/b/1.12-crash-on-exit
dev/migrie/b/11146-next-tab-in-cmdpal
release-1.10
dev/migrie/5ff9a24-and-75e2b5f
dev/duhowtt/hax/cpal-jumplist-async
dev/lelian/actionid/1
dev/migrie/f/just-elevated-state
dev/lhecker/terminal-settings-cleanup
dev/migrie/gh-10824
dev/pabhoj/cursor_light
dev/migrie/oop/wandavision
dev/migrie/oop/endgame
dev/migrie/oop/infinity-war
dev/lhecker/app-state-actually-hidden
dev/migrie/b/6160-dynamic-default-warning
dev/mgirie/b/more-nchhittest-ideas
dev/migrie/b/9320-interfacial-separation
cinnamon/fhl/find-contextmenu
dev/lhecker/wsl-distro-generator-cleanup
dev/migrie/b/10875-but-more-clever
dev/migrie/b/broken-globalsummon-overloading
dev/duhowett/hax/rle-row
dev/migrie/fhl-2021/cmdpal-select-list
dev/migrie/fhl-2021/differential-pixel-shading
dev/duhowett/hax/no-writable-glyphat
dev/migrie/fhl-2021/more-shader-variables
dev/migrie/titlebar-shenannigans
dev/miniksa/win10_font_matching
dev/lhecker/conhost-oom
dev/migrie/b/10332-less-snappy-scrolling
dev/migrie/b/7422-1px-top-border
release-1.9
dev/cazamor/move-scratch
release-1.8
dev/miniksa/manifest_2
release-1.6
release-1.7
dev/migrie/oop/the-whole-thing
dev/migrie/oop/connection-factory
dev/migrie/f/quake-dropdown-2
dev/miniksa/rle2
dev/migrie/f/quake-toCurrent-experiments-2
dev/migrie/f/quake-toCurrent-experiments
dev/migrie/f/quake-dropdown
dev/cazamor/actions-page/template
dev/duhowett/hax/cursor_stamp_foreground_background
dev/migrie/f/1860-hey-might-was-well-hack-during-a-hackathon
dev/migrie/oop-terminal.control-split-control
dev/duhowett/hax/build-with-wholearchive
dev/cazamor/spec/tsm-actions-temp
dev/migrie/oop-tear-apart-control
dev/migrie/oop-scratch-3
dev/cazamor/sui/bugfix-reload-crash
dev/migrie/f/xmacro
dev/cazamor/sui/proto/profile-nav-view
dev/migrie/f/name-windows
dev/migrie/dol/messing-with-shaders-take-1
release-1.5
dev/cazamor/sui/inheritance-hyperlinks-test
dev/migrie/r/commandline-lib-002
dev/migrie/f/com.fabrikam.toaster
dev/cazamor/adaptive-cards-prototype
dev/migrie/f/commandline-lib
dev/miniksa/zipzoom2
dev/migrie/f/remote-commandlines
dev/migrie/f/632-elevated-profiles
dev/migrie/oop-broker-000
dev/migrie/fix-pr-7015
dev/duhowett/clang
dev/miniksa/input_tests_2
dev/miniksa/input2
dev/migrie/oop-rpc-000
release-1.4
dev/migrie/oop-mixed-elevation-1
dev/migrie/oop-window-content-1
cinnamon/open-json
dev/miniksa/input_tests
dev/duhowett/hax/tsm-graphviz
dev/miniksa/input
dev/duhowett/hax/caption_buttons
release-1.3
dev/cazamor/a11y/expand-line-under-viewport
dev/cazamor/acc/ch/word-nav-perf
dev/cazamor/spec/settings-ui-architecture-draft
dev/duhowett/hax/tap_upgrade
dev/migrie/f/pane-exit-animation
release-1.2
dev/migrie/move-lib-up-and-dll-down
release-1.1
dev/migrie/f/branch-2-backup
dev/migrie/f/settings-getters-only
dev/duhowett/hax/command_palette_search
dev/migrie/f/6856-let-terminalpage-expandcommands
dev/migrie/f/theming-2020
dev/migrie/oop-scratch-4
dev/duhowett/hax/punchout
dev/migrie/s/action-ids
dev/migrie/f/lets-just-generate-these
dev/migrie/oop-scratch-2
dev/miniksa/dcomp
dev/miniksa/gotta_go_fast_spsc
dev/miniksa/gotta_go_fast
dev/miniksa/perf_skip_checks
dev/miniksa/perf_buffer_dig
dev/migrie/s/1203-cursorTextColor
dev/migrie/f/fix-intellisense-i-guess-backup
release-1.0
dev/migrie/f/execute-commandlines
dev/migrie/f/2046-Command-Palette-v2
dev/migrie/b/6421-passthrough-alt
dev/migrie/b/moving-focus-is-hard
dev/miniksa/set
dev/migrie/f/1203-phase-1
dev/migrie/f/get-localtests-in-ci
dev/cazamor/drag-panes
dev/cazamor/tile-background
release-0.11
dev/duhowett/dev/duhowett/hax/appstate_remember
dev/duhowett/load_condrv
dev/duhowett/hax/wpf_win_8_hax
dev/migrie/b/3088-weird-exact-wrap-resize
release-0.10
dev/migrie/b/4591-custom-scaling-bug
dev/duhowett/hax/attr_smuggling
dev/migrie/b/5161-mingw-vim-fix
dev/miniksa/dx_bitmap
dev/migrie/b/1503-try-messing-with-cooked-read
dev/duhowett/eyebeam
dev/migrie/b/5113-experiments
dev/duhowett/hax-selection-exclusive
dev/migrie/f/more-vt-renderer-tracing
dev/miniksa/bitmap
dev/duhowett/wprp
dev/miniksa/bitmap-mad-with-power
dev/migrie/f/resize-quirk
dev/migrie/f/reflow-buffer-on-resize-002
wpf-renderer-revert
dev/miniksa/draw
release-0.9
dev/miniksa/tabs-color-fix
dev/miniksa/4309
dev/migrie/f/just-wrapping
dev/migrie/b/3490-try-another-resize-algo
release-0.8
dev/migrie/b/3490-a-simpler-resize
dev/migrie/b/3490-resize-down
dev/miniksa/4254
dev/migrie/f/conpty-wrapped-lines-2
dev/migrie/b/be-better-at-hiding
dev/migrie/f/3327-xaml-theming-proto
dev/miniksa/gardening2
release-0.7
dev/duhowett/conpty-flags
dev/migrie/f/603-vintage-opacity
dev/migrie/PR#3181-comments
dev/duhowett/font-64
release-0.5
dev/migrie/b/663-paste-lf-always
dev/migrie/b/2011-reordered-fallthrough-strings
dev/migrie/b/411-init-tab-stops
dev/migrie/b/json-patching-is-hard
dev/migrie/b/2455-try-getting-tests-working
dev/migrie/b/1223-change-256-table
dev/migrie/f/2171-openterm.cmd
dev/migrie/f/drag-panes
dev/migrie/f/2046-command-palette
release-0.3
dev/miniksa/manager
dev/migrie/f/non-terminal-panes
dev/migrie/f/passthrough-2019
dev/miniksa/shared_pch
dev/migrie/f/1897-less-duplicated-work
release-0.2
dev/cazamor/mcs/viewport-selection
dev/duhowett/version_hack
v1.24.10212.0
v1.23.20211.0
v1.24.3504.0
v1.23.13503.0
v1.24.2812.0
v1.23.12811.0
v1.24.2682.0
v1.23.12681.0
v1.24.2372.0
v1.23.12371.0
v1.23.12102.0
v1.22.12111.0
v1.23.11752.0
v1.22.11751.0
v1.22.11141.0
v1.23.11132.0
v1.23.10732.0
v1.22.10731.0
v1.21.10351.0
v1.22.10352.0
v1.23.10353.0
v1.22.3232.0
v1.21.3231.0
v1.22.2912.0
v1.21.2911.0
v1.22.2702.0
v1.21.2701.0
v1.22.2362.0
v1.21.2361.0
v1.21.1772.0
v1.20.11781.0
v1.21.1382.0
v1.20.11381.0
v1.21.1272.0
v1.20.11271.0
v1.20.11215.0
v1.19.11213.0
v1.20.10822.0
v1.19.10821.0
v1.20.10572.0
v1.19.10573.0
v1.20.10303.0
v1.19.10302.0
v1.18.10301.0
v1.20.10293.0
v1.19.10292.0
v1.18.10291.0
v1.18.3181.0
v1.19.3172.0
v1.19.2831.0
v1.18.2822.0
v1.19.2682.0
v1.18.2681.0
v1.18.1462.0
v1.17.11461.0
v1.18.1421.0
v1.17.11391.0
v1.17.11043.0
v1.16.10261.0
v1.17.1023
v1.16.10231.0
v1.15.3465.0
v1.16.3463.0
v1.15.2712.0
v1.15.2874.0
v1.16.2641.0
v1.16.2523.0
v1.15.2524.0
v1.15.2282.0
v1.14.2281.0
v1.14.1962.0
v1.15.2002.0
v1.15.2001.0
v1.15.1862.0
v1.14.1861.0
v1.14.1451.0
v1.14.1432.0
v1.13.11431.0
v1.13.10983.0
v1.12.10982.0
v1.13.10733.0
v1.12.10732.0
v1.13.10395.0
v1.12.10393.0
v1.13.10336.0
v1.12.10334.0
v1.12.3472.0
v1.11.3471.0
v1.12.2931.0
v1.12.2922.0
v1.11.2921.0
v1.11.2731.0
v1.10.2714.0
v1.11.2421.0
v1.10.2383.0
v1.10.1933.0
v1.9.1942.0
v1.9.1523.0
v1.8.1521.0
v1.9.1445.0
v1.8.1444.0
v1.8.1092.0
v1.7.1091.0
v1.8.1032.0
v1.7.1033.0
v1.7.572.0
v1.6.10571.0
v1.5.10411.0
v1.6.10412.0
v1.6.10272.0
v1.5.10271.0
v1.5.3242.0
v1.4.3243.0
v1.5.3142.0
v1.4.3141.0
v1.4.2652.0
v1.3.2651.0
v1.3.2382.0
v1.2.2381.0
v1.1.2233.0
v1.2.2234.0
v1.1.2021.0
v1.2.2022.0
v1.1.1812.0
v1.0.1811.0
v1.1.1671.0
v1.0.1401.0
v0.11.1333.0
v0.11.1251.0
v0.11.1191.0
v0.11.1111.0
v0.11.1121.0
v0.10.781.0
v0.10.761.0
v0.9.433.0
v0.8.10261.0
v0.8.10091.0
v0.7.3451.0
v0.7.3382.0
v0.7.3291.0
v0.7.3252.0
v0.6.3181.0
v0.6.2951.0
v0.6.2911.0
v0.5.2762.0
v0.5.2761.0
v0.5.2681.0
v0.5.2661.0
v0.3.2321.0
v0.4.2342.0
v0.4.2382.0
v0.3.2171.0
v0.3.2142.0
v0.2.1831.0
v0.2.1715.0
v0.2.1703.0
v0.1.1621.0
v0.1.1581.0
v0.1.1502.0
v0.1.1431.0
v0.1.1361.0
v0.1.1093.0
v0.1.1161.0
v0.1.1204.0
experiment-master
v0.1.1025.0
experiment-OutsideBuild
broken-tabstops
RS2-final
v0.1.1002.0
experiment-rel-windows-inbox
experiment-f-ServerApp
v0.1.1211.0
1904.29002
1810.02002
1708.14008
Labels
Clear labels
⛺ Reserved
A11yCO
A11yMAS
A11ySev1
A11ySev2
A11ySev3
A11yTTValidated
A11yUsable
A11yVoiceAccess
A11yWCAG
Area-Accessibility
Area-AtlasEngine
Area-AzureShell
Area-Build
Area-Build
Area-Chat
Area-CmdPal
Area-CodeHealth
Area-Commandline
Area-CookedRead
Area-DefApp
Area-Extensibility
Area-Fonts
Area-GroupPolicy
Area-i18n
Area-Input
Area-Interaction
Area-Interop
Area-Localization
Area-Output
Area-Performance
Area-Portable
Area-Quality
Area-Remoting
Area-Rendering
Area-Schema
Area-Server
Area-Settings
Area-SettingsUI
Area-ShellExtension
Area-ShellExtension
Area-ShellExtension
Area-Suggestions
Area-Suggestions
Area-TerminalConnection
Area-TerminalControl
Area-Theming
Area-UserInterface
Area-VT
Area-Windowing
Area-WPFControl
AutoMerge
Blocking-Ingestion
Culprit-Centennial
Culprit-WinUI
Disability-All
Disability-Blind
Disability-LowVision
Disability-Mobility
External-Blocked-WinUI3
Fixed
Gathering-Data
good first issue
HCL-E+D
HCL-WindowsTerminal
Help Wanted
Impact-Compatibility
Impact-Compliance
Impact-Correctness
Impact-Visual
In-PR
InclusionBacklog
InclusionBacklog-Windows TerminalWin32
InclusionCommitted-202206
Issue-Bug
Issue-Docs
Issue-Feature
Issue-Feature
Issue-Question
Issue-Samples
Issue-Scenario
Issue-Task
Needs-Attention
Needs-Author-Feedback
Needs-Bisect
Needs-Discussion
Needs-Repro
Needs-Tag-Fix
Needs-Tag-Fix
Needs-Triage
No-Recent-Activity
Priority-0
Priority-1
Priority-2
Priority-3
Product-Cmd.exe
Product-Colortool
Product-Colortool
Product-Colortool
Product-Conhost
Product-Conpty
Product-Meta
Product-Powershell
Product-Terminal
Product-WSL
pull-request
Resolution-Answered
Resolution-By-Design
Resolution-Duplicate
Resolution-External
Resolution-Fix-Available
Resolution-Fix-Committed
Resolution-No-Repro
Resolution-Won't-Fix
Severity-Blocking
Severity-Crash
Severity-DataLoss
spam
this-will-be-a-breaking-change
Tracking-External
WindowsTerminal_Win32
Work-Item
zAskModeBug
zInbox-Bug
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/terminal#21368
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Florian-Thake on GitHub (Mar 9, 2024).
Windows Terminal version
1.19.10573.0
Windows build number
10.0.19045.4046
Other Software
not required
Steps to reproduce
Open the Windows Terminal (I tried cmd.exe, PC, and Ubuntu 2204 LTS but I believe it does not matter what is used).
The Font is the default Cascadia Mono, I believe the size does not matter (occurs with the default 12 as well as 13).
Paste the Skull emoji ☠ into the command prompt. (Note that the cursor is now in the middle of the skull)
Type a letter, e.g., x
The x is not visible because it is behind the skull.
I don't know if other emojis are affected. I discovered this issue by accident since I use this string "🚀 🍀 ☠ 🔥" for some of my internal UTf-8 testing. From these 4 emojis only the skull is affected.
I believe after the auto update to 1.19.10573.0 this issue occurred. I don't know exactly which version was installed before but since it is maintained by the system it should be the prior released version.
If I remember correctly the skull ☠ was rendered too small in the old version. This is fixed now.
I also noticed that pasting of some emojis now produces a correct echo instead of question marks. Thank you for these fixes!
Maybe the new issue is caused by the bigger rendering? Is the saved size / space information which is used for calculate the start position of the next char still a too small one?
See the screenshot for see how it looks.
Expected Behavior
I can see
☠x
Actual Behavior
I only see
☠
because the x is behind the skull and not right of it.
(See screenshot in the 'steps to reproduce' section)
@github-actions[bot] commented on GitHub (Mar 9, 2024):
Hi I'm an AI powered bot that finds similar issues based off the issue title.
Please view the issues below to see if they solve your problem, and if the issue describes your problem please consider closing this one and thumbs upping the other issue to help us prioritize it. Thank you!
Closed similar issues:
@Florian-Thake commented on GitHub (Mar 9, 2024):
I checked the mentioned issues and I believe this new issue is not a duplicate of one of the mentioned.
@PhMajerus commented on GitHub (Mar 9, 2024):
I tested and noticed the skull is a pre-emoji symbol from the Miscellaneous Symbols block, which some symbols have been reused as emojis. I checked the full block and there are several others showing the same issue:

There probably is some special handling in a function calculating the width of a character that needs to be updated to return the correct double-width size for those.
Oh, and the
xis actually visible in front of the ☠ in your screenshot, you can see it if you look closely, but it just happens to align right between the nasal and right orbital holes, and over the bottom-right bone.@DHowett commented on GitHub (Mar 10, 2024):
In this case--and for all pre-emoji-standardization iconographic codepoints--a one-cell overlap is correct. This is the same treatment given by iTerm2 and Terminal.app on macOS (one of which I believe was the first terminal emulator to support emoji(?).)
Those characters are expected to occupy a single column in the backing buffer, have a standard emoji representation, and be displayed as though they occupy two columns. This is one of the weird quirks of being correct.
@PhMajerus commented on GitHub (Mar 10, 2024):
@DHowett
Interesting, I didn't know we would have to handle some double-width characters as using a single cell and compensate with a space to adjust. Thanks for the explanations.
We'll be facing the opposite issue with MouseText in Unicode 16.0.
They decided to add all the characters needed for the Apple II MouseText enhanced character set, but without duplicating the existing ones.
Unfortunately, one of those is the hourglass:⌛
U+231Bthat is also an emoji in most fonts and is currently handled as double-width in Terminal, while MouseText would require it to be single-width.Do you have some insight into that issue?
(Ignore the Run/Execute glyphs for now, it should be the running man but I didn't do that glyphs pair yet)
The original characters are the following:


I have a single column version of the glyph ready, but it is useless as long as it's handled as double-width.
@Florian-Thake commented on GitHub (Mar 10, 2024):
Thank you for your input to my issue.
I am not deep into the Unicode specification. So, please apologize if I may say something technical incorrect or I miss some important detail.
I cannot judge if your statement is correct in that way that it really must be rendered like it is now.
But regardless of that, what could be the purpose of it or the intended use case?
From my view point it does not make any sense to draw the next char on top of the last one but starting from the middle of it.
All of the icons I saw in the other comment don't have a useful aspect for it.
I mean, there are other Unicode chars which can be combined together to form something new.
But in this case it produce only garbage on the screen.
I did a quick check of the behavior of other applications.



I did not find any which is doing the same as Windows Terminal.
Notepad++
Visual Studio
MS Word
From my point of view the rendering of Windows Terminal is clearly wrong in this case. The affected Unicode signs are IMHO not meant to be and not designed to be overlapping with the next sign.
@DHowett commented on GitHub (Mar 10, 2024):
Sorry, I was writing my comment up on my phone and didn't put in the right amount of explanation! 😄
The critical difference here is that a terminal emulator (of any type) is expected to act in a consistent way for another application to interface with. A text editor does not have the same requirement, as the only correctness loop exists between the user and the editor.
So, terminals receive text from other applications and display that text on a screen. Those other applications can be microseconds away (on the same machine) or thousands of miles away (running on a remote server, connected over SSH). That immediately imposes a couple constraints on how that text gets displayed:
Now, an application can instruct a terminal to position the cursor somewhere with absolute or relative coordinates. The same application can display the "right" amount of text to fill up the screen. Consider this example of an application called "Midnight Commander". It has to be able to predict where every bit of text will be placed on the screen, or it will put the pseudographic characters (for the borders and stuff) in the wrong places.
Because of (2), that prediction has to be the same prediction the terminal emulator would have made. And because of (1), it will not be able to use the font to predict those things.
There's this handful of bad C APIs that every application these days seems to use:
wcwidthandwcswidth. They fall back on some built-in Unicode tables to tell an app how big a character is.U+2620is unfortunately only one cell wide.That leaves us with three options:
Of all the options, 1 is the most incorrect. This is what happens in Midnight Commander if we do that:
wezterm chooses treatment 2, as did we before the new rendering engine:
iTerm2 and Terminal.app choose treatment 3.
We elected to go with treatment 3 because it also improves the display of text from other languages, where there may be ascenders and descenders that poke out of the top or bottom of the cell. It's not more right, but it's definitely less wrong.
Hope that helps!
@PhMajerus - I've got no idea how Unicode expects this to work. Maybe by some manner of variation selector?
@PhMajerus commented on GitHub (Mar 10, 2024):
@Florian-Thake
I'm sure DHowett has a much better grasp on all of this than I do, and I don't know how the decision process went internally, but I can provide some context to justify their decision as I see it from the outside, and so he can spend more time on getting things done and just correct me if he sees something I got wrong.
I agree it's counter intuitive and seems wrong, but I don't think the Terminal is wrong in this case.
The problem is terminals are based on a grid of characters.
Other GUI apps "simply" render text using the font renderer, and find out the width of the text using the same font renderer. If an app needs to align things in a window or dialog box, it can request to use whatever the system UI font is and still calculate the width and height or any text string as it draws the UI.
History
Terminals and consoles on the other hand come from a day when text screens were a grid of character cells, OEMs could design their own character sets, but each character would take exactly one cell. The app didn't need to ask a renderer to calculate the width for a string of text to know how to align UI elements, it could calculate everything in term of columns and rows, a 10 characters string would always take 10 columns, regardless of the "font" (character set) and characters it contained.
Then Japan joined the party, and needed both more than 256 characters and wider characters, so we got MBCS (multibyte character set). Fortunately, since characters on PCs were basically half-square rectangles, they could fit their characters in two cells, making square ideograms, and encode those as two characters, extending the number of characters available by basically having a mix of 8-bit and 16-bit character values. Chinese and Korean used the same principle.
It was still easy to compute text width, because one byte would always take one cell, double-width characters would only be two-bytes characters (Note from their point of view, double-width is full-width, and normal-width is half-width).
Then Unicode came along and decided to unify all character sets. One of the original rule of Unicode was that it doesn't care about font or looks, only about characters intent.
They included normal-width and full-width characters, and some characters that were normal-width in some countries and full-width in others were mapped to the same Unicode character because they had the same intent. After all, some font were proportional instead of monospaced, so even latin letters would have different widths, surely any app would always ask the font renderer to calculate the width of specific text strings, not try to guess the width from the text alone.
That was the beginning of the mess to build a terminal or console emulator using Unicode, because a text-based app doesn't use a font renderer, it cannot query how wide some text string is, it knows from the text content how many columns it will use on screen… except now it doesn't anymore because it depends on whether the terminal is in western or CJK (asian) mode.
So some terminals would include an option to choose whether ambiguous-width characters are displayed as single or double cells.
At that point, fonts included some semigraphic characters from legacy code pages such as line drawing, box elements, cards suits, etc…, and these were normal-width characters because they came from original computers character sets.
Then Emojis arrived. Emojis were mostly used in Japan on their mobile phones, and were normal size characters for Japan … which means full-width, so double-width from our point of view.
That could have been all fine and good if Unicode just added the Emojis in their own blocks and everybody knew that these were always double-width, but remember that original rule that Unicode identifies characters by their intent/meaning, not their design in a specific font?
So Emojis that represented the same things as existing characters were not given new code points, instead they reused the existing characters, saying they can be normal-size semigraphic characters or double-width Emojis depending on the font and even context selected by the app, using the font renderer options.
Except that, again, text-mode apps do not use a font renderer, they send code points to display to a terminal emulator and have no idea of fonts and renderer options.
See my screenshot of Apple MouseText characters, they are facing exactly that issue: The hourglass:⌛ was already included as a semigraphic character taking a single cell, then reused as an Emoji. So now expectation depends on the app, and even text-based apps won't agree on whether it takes one or two cells in a terminal, because Apple probably considers the Emoji to be the definitive character, while Apple II emulators or technical documents using text to show screen contents consider the semigraphic to be the definitive character so it aligns properly with the other MouseText characters.
That could be no problem in a Web page or an app that can pick a font, or even specify which one to use, but a text-mode app only sends
U+231Bto the terminal and expect it to be right… except a modern shell script may expect the Emoji, while an Apple II emulator may expect the semigraphic.Unicode should probably have encoded them as two different characters but here we are, living with past decisions. It's easy to be wiser in retrospect once you know which issues each choice will bring over 30 years later.
The other solution could be to have an in-band command that a text-mode app can send to the terminal to select semigraphic or Emoji mode for the dual-purpose characters, but the terminal protocol is complex with lot of complex features coming from the last 60 years of its history, and just getting all those legacy features working is already a huge undertaking, just to ensure compatibility with existing text-based apps, before they can even start thinking about adding new features for new problems introduced by a new characters system for some fancy new character.
In the future we'll probably see both some option for a text-based app to tell the terminal to use semigraphics or Emojis, and to query the terminal for the cells-width or a specific text string (I believe DHowett is pushing for this already).
Current solution isn't that bad, probably the best with what we have today
In the meantime, handling these characters as using a single cell is actually a pretty good solution. This means text-mode apps that expect them to be Emojis can just add a space after the Emojis to make the terminal use two cells for it. The proper font will have a double-width glyph for that character that will extend from the first cell into the following space, and it will display as the app intended.
Another text-mode app that expects it to be a single-width semigraphic character can send that character to the terminal knowing that whatever happens, it will not break alignments. If the user picked a font that renders it as an Emoji, it will overlap the next character, but will not ruin the rest of the grid alignment, and the user will notice and can find out if that terminal has an option to switch between Emoji and semigraphic mode, or change to a font that contains semigraphic versions of those characters.
It's far from perfect, I agree, but decades of history with an evolving technology is never perfect, at most it is working in a predictable way.
Terminal emulation comes with decades of baggage and concepts that Unicode probably didn't consider hard enough. I'm actually amazed at how well it works considering all the history involved.
With the current existing features, the current solution seems like the better tradeoff, and if other terminals are behaving the same, the most important, which is compatibility and predictability, is achieved.
@DHowett commented on GitHub (Mar 10, 2024):
Wow, these comments were literally seconds apart! High five!
@PhMajerus commented on GitHub (Mar 10, 2024):
@DHowett 🫸🫷
@Florian-Thake commented on GitHub (Mar 11, 2024):
@PhMajerus
Wow, thank you very much for your deep and awesome insights to the history and current situation! 😎
@DHowett
To you also a big thank you for the deep explanations! 👍
In the following I response to the comments of both of you.
I understand that from the history point of view.
And, yeah, to stay backward compatible is always an issue and often a burden.
From the user point of view, I personally would expect this:
As a summarize of both of your explanations I would say:
To achieve this for the long term there can be 2 options.
Either the skull must be rendered into 1 cell or the size must be changed to 2 cells (important: also in
wcwidth)Both could be correct.
But the Terminal does not necessarily know which option is actually chosen or possible because the font rendering might be decoupled from the grid layout and other things, etc.
This leads me to 3 possible scenarios:
Are you agree from your side from the available options and scenarios?
Personally, I would prefer scenario 3 and pick the option to increase the used cells to 2.
Why?
Because from the look and feel these icons are looking a way more better when they use 2 cells.
This will break old apps which are using the old
wcwidth. But is it bad?I would say, for the long term this can be ok. Because we are talking about rendering of skull icons and something similar.
It is not so important to have backward compatibility forever in this particular cases.
If really needed there can be a user option to activate backward compatibility which will use item 2 from @DHowett comment.
So, I think there is the chance at least to choose the best fitting solution for the future.
For the meanwhile, personally I would prefer the old way, to render it in one cell.
This works IMHO for all use cases but the icon itself does not look so nice.
I don't think that insert extra spaces is a way to go. How can I know if I need to insert a space and where?
Then I must remove it again when send the string into a file or to somewhere else.
So, from the programming point of view, I am interested in an API for change the behavior.
Is there something existing already?
(Sorry, I am running out of time now. Maybe I will add something more or clarify at a later time.)
@Florian-Thake commented on GitHub (Mar 11, 2024):
I have some additions to my last comment:
@DHowett
Now, after I thought again about your comment, I come to my personal conclusion, that from your mentioned variants item 2 is the best fitting solution:
This will not break any grid and does not produce any overlapping. So, there is neither something broken nor it produces unreadable text / requires extra work.
The only drawback is, that the icon is smaller. Not nice, but better than overlapping text or a broken grid.
For your well done Midnight Commander examples that would also be the best solution.
For the long term it would be great if the size can be increased to 2 cells (I mean for rendering and the stored information in
wcwidth).I know this is difficult to achieve because it is not only a Windows Terminal thing but Unicode related. But that would be the most clean solution. Older terminal apps must then be rebuild with a new version of the underlying API or they stay broken.
But... what is better for this specific error category? To have unbroken legacy apps but have overlapping and unreadable text in modern apps, or a possible broken grid in legacy apps but everything working in modern apps?
In the long term the new apps will remain. Most of the existing apps can just be updated with an new version, which are using the updated API. Some older apps, which exist only in binary form, will disappear one day.
Are you aware of a Windows variant of
wcwidth?It seems to be it is a function from the posix standard and not available on Windows.
Is there a way to programmatically detect if my app is running in Windows Terminal and which version of it? (For C and C++)
3b) Is there an API for Windows Terminal for my app can interact with it?
I may have discovered a similar issue.
Is this also related to the history of terminals?
If I use the Thai sentence for nicely say hello: สวัสดี ครับ

In Windows Terminal are extra spaces added:
This is, I believe, because the Thai letters are sometimes combined from 2 Unicode signs but then forming only 1 letter.
It seems to be, that the second Unicode sign then still occupies one cell, but it must be 0 for look good.
(or is this related to the mentioned "asia mode" by @PhMajerus ?)
Is this an issue which can be addressed?
@lhecker commented on GitHub (Mar 12, 2024):
Surprisingly, this isn't true. Over the past decade terminal applications have come to expect Emojis to not be scaled down if they don't fit. We did downscale overly large glyphs before and it was heavily disliked by a lot of people.
That actually already exists: You simply need to use ☠️ (U+2620 U+FE0F) instead of ☠ (U+2620). That's the "variation selector" that Dustin mentioned. For "ambiguous" emojis like this (technically called "unqualified emoji"), its existence is the difference between whether the glyph is drawn colored (U+FE0F), black/white (U+FE0E), or whether the presentation is unspecified and left open to the text renderer. You can find the full list of such emojis here: https://unicode.org/emoji/charts/emoji-variants.html
However, Windows Terminal up until the current version 1.20 is not really Unicode aware at all, as it relies on something like

wcwidth(as mentioned before). The good news is that I'm going to address this in 1.21. Here's a preview for my combining marks support using Wikipedia's example Zalgo:It's not quite there yet (in particular the couple marks that are too far to the left at the start of the line), but it's significantly better than what we have now: It allocates at least 1 cell per character, making a complete mess of the Zalgo text.
In my opinion, kitty does an excellent job when it comes to Unicode in Terminals and I'm trying to replicate its behavior for Windows Terminal. If I succeed, your issue will be consistently gone as long as you ensure to use either minimally or fully qualified emojis. Unqualified emojis will always have these overlap issues, because it's what both terminal applications and its users have come to expect.
@PhMajerus commented on GitHub (Mar 12, 2024):
@lhecker Oh, you just solved my problem with the hourglass:⌛
U+231Bfor MouseText, it is on that list.So now I just need to find out how to handle the
U+FE0EVariation Selector-15 in Cascadia to provide the specific glyph for that black/white version.@j4james commented on GitHub (Mar 12, 2024):
@PhMajerus Note that the VS15 selector can change the rendering from an emoji presentation to a text presentation, but it can't change the width. You can make a narrow character wider with VS16, but you can't make a wide character narrower with VS15. And as far as I understand,
U+231Bis emoji presentation by default, so will always be wide.@Florian-Thake commented on GitHub (Mar 13, 2024):
@lhecker
Yes, sure, I dislike it also.
Ah, I didn't know that this exist. Thank you for providing these details.
Is there some rule which selector is possible for a sign? I wonder why not U+FE00 or U+FE01 is used instead?
The Unicode specification is more complex than I thought. With the current approach you always must check if a selector is present after the last sign of some defined range for not lose it by accident.
OK, so for this issue it means, it is working as designed / specified and can be closed?
Do you have some input for my item 4 of my last comment?
@lhecker commented on GitHub (Mar 13, 2024):
The emoji-variants.html I linked shows all Emojis that are affected by the selector.
Wikipedia has a nice list what the other VS are used for: https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block)
Yes, if we ignore bugs in our implementation, I'd say it's working as intended. I'll close the issue then. 🙂
Ah, I apologize! Your text contains 3 non-spacing marks (Unicode category "Mn"): ั, ี, and ั. As the "non-spacing" indicates, they're generally supposed to not take up any space. But Windows Terminal doesn't yet support Unicode beyond basic surrogate pairs. That's why it allocates 1 cell for each non-spacing mark. I'm hoping to fix this issue in version 1.21 that will release in a few months. It already works in my debug build:

@Florian-Thake commented on GitHub (Mar 13, 2024):
@lhecker
Thank you very much for your answers, time and effort 🙂
@mplattner commented on GitHub (Apr 18, 2024):
@lhecker, what might be related: Windows Terminal renders 🟥 and 🟩 correctly (as 2-char-width), but ⬜ is rendered as a traditional character (see screenshot), which causes mis-alignments, also as shown on the screenshot. Is it possible to change how ⬜ is displayed? I think it should be consistent to the other square-"emojis"? Thanks!
@lhecker commented on GitHub (Apr 19, 2024):
If you paste ⬜ into a cmd.exe prompt, does it still treat it as narrow? On my end this works.
PowerShell's support for emojis is not great at the moment. If you paste ⬜ into its prompt you'll immediately notice that it's treated as narrow and that the prompt will overall behave weirdly. If that table is generated by PowerShell, then this is the most likely cause for the issue.
@lhecker commented on GitHub (Apr 19, 2024):
Oh, right you were probably not asking just about the misalignment...
The ⬜ renders as a empty square, because that's how Cascadia Code has designed it. If you use another font, like Consolas it'll show up as an emoji. I'm not entirely sure why Cascadia contains this glyph and I'll try to ask around if it's intentional.
@mplattner commented on GitHub (Apr 19, 2024):
Thanks @lhecker. I just opened pwsh in Windows Terminal and pasted
🟥🟩, pressedENTER; then pasted⬜, pressedENTER; then pasted⬜followed by typinghi.As you can see on the screenshot below:
⬜is not rendered as the other emojis (I think it should be, as here in the browser), andhandi, while it should be after thei(I did not use arrow keys.) That's what you mean with "[...] prompt will overall behave weirdly" I guess.I'm using oh-my-posh (v19.19.0), Windows Terminal (v1.19.10821.0) and the font is:
JetBrainsMono Nerd Font, but the rendering/issue is the same with fontConsolas.@PhMajerus commented on GitHub (Apr 19, 2024):
This is because the black and white large squares predate emojis, they are part of the misc. symbols and arrows:

(command:
Array.from("🟥🟩⬛⬜").forEach(function(c){ echo(c+" "+c.codePointAt(0).toString(16).toUpperCase()); }))@mplattner commented on GitHub (Apr 19, 2024):
Thanks, that makes sense, but to my understanding it's up to the application how to display it, e.g., the browser and VS Code use the "modern" version of ⬜. Maybe Windows Terminal can be changed so that it uses the modern version as well. Possible side-effects might occur for apps that expect the "old-style" version to display some kind of terminal user-interface; however, rendering as-is is definitely a bug, see the cursor.
@PhMajerus commented on GitHub (Apr 19, 2024):
I believe that's a bug with PowerShell, I can reproduce it with PowerShell, but not with cmd.exe or my ActiveScript Shell in the same Terminal.
@lhecker commented on GitHub (Apr 19, 2024):
Actually, that's what I meant with the following:
PowerShell's support for modern Unicode is not great. They assume that ⬜ is 1 cell wide, but the Unicode spec clearly says it's 2 cells wide (
ea=W). This leads to a disagreement between the shell and the terminal and results in incorrect cursor positions, as @PhMajerus said.BTW this is also why I can't quite agree with you, @PhMajerus, either: Cascadia has designed both glyphs (⬛ and ⬜) to be 1 cell wide, but that doesn't match the East Asian property. I'm not sure why they're designated as wide by Unicode, but I suppose that's beside the point. And so while the 1-cell wide variant works just fine outside of terminals, it looks a little weird inside them. Additionally, as far as I can tell, it doesn't supply a colored version for the Emojis either (i.e. with U+FE0F). Segoe UI on the other hand ships both, a colored and a grayscale version of these glyphs.
I do see why Cascadia wants to ship these glyphs though (since it ships many other symbols/arrows as well), so I'm not sure what to do here...
@PhMajerus commented on GitHub (Apr 19, 2024):
@lhecker I didn't mean to imply that Cascadia was right. I just think they included it because it's part of the more "core" symbols, so that explains the discrepancy between the black and white squares and the color emoji-only squares.
I think support for emojis will improve over time, and these code points that existed as symbols and now have emojis versions as well will require some work on Cascadia's side. especially if it tries to support both symbol and emoji versions.
That's something that would be good to document and work with @aaronbell to consider early in Cascadia Next/Reboot.