mirror of
https://github.com/microsoft/terminal.git
synced 2026-02-04 05:35:20 +00:00
ConPTY Passthrough mode #1555
Closed
opened 2026-01-30 22:30:14 +00:00 by claunia
·
84 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#1555
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 @be5invis on GitHub (Jun 8, 2019).
Modern apps won’t read the hidden character grid and do everything in VT. So why not an API/console mode to tell Console Host to completely throw away that?
@DHowett-MSFT commented on GitHub (Jun 8, 2019):
@zadjii-msft was looking into this. The main issue, if I recall correctly, is that we need to trash the entire buffer when something enters or exits “passthrough” mode. It’s also only truly applicable when there is a connected pseudoconsole session.
@DHowett-MSFT commented on GitHub (Jun 8, 2019):
And the reason one console might enter and exit passthrough mode multiple times is that you may run
coolNewThing.exefrom CMD, and perhaps it might launch a further process that needs legacy support.Additional concerns: if you have a tree of four processes, each of which wants passthrough to be different, should the ones that are doing
ReadConsoleOutputbe able to read the buffers from the other legacy/non-passthrough ones?It’s complicated when you get into compatibility discussions. 😄
@zadjii-msft commented on GitHub (Jun 10, 2019):
Yea, I tried getting this working for like a day last year, but it's something I've wanted to work on for a while.
As Dustin mentioned, there'd be real weirdness moving between passthrough mode and non-passthrough mode. However, I think it might still be something good to investigate.
@zadjii-msft commented on GitHub (Jul 16, 2019):
From #1985:
@oising commented on GitHub (Jul 17, 2019):
We need a
SIGWINCHasynchronous signal for resizing somehow.@mintty commented on GitHub (Jul 19, 2019):
This is an essential feature for opening MS text-mode software (esp. WSL) to 3rd-party environments.
The current approach seems to tighly connect the Windows terminal implementation with ConPTY, however that limits applications unnecessarily and makes them highly dependent on Windows terminal progress (which may still take years, honestly).
It should be a combined mode: Whenever a console-API-based application is run, e.g. as started from a pure terminal-based application, the console API calls should be transformed into terminal escape sequences. Note as there are not so many features in the console API, this is a much easier approach than the reverse mapping, trying to squeeze terminal features through the conhost bottleneck.
@therealkenc commented on GitHub (Jul 20, 2019):
Just realized #2035 is this ask framed differently.
Not just progress. Behavior. This guy is writing a Tek4010 emulator. He is going to need a PTY if say his code were ever ported to native win32. And
conhostsure as heck doesn't know what to do with the bytestream coming down that PTY. Never will. And need not care.That too. Doesn't have to be a signal, mind, if there is some religious/philosophical reasons against. But if not it needs to be a separate (third rail)
HANDLEon which I canWaitForMultipleObjects(), because no one said there is aReadFile()byte coming, ever.@be5invis commented on GitHub (Jul 20, 2019):
@mintty
There are many absurd console API usages, like reading the screen. That's really a legacy that ... IBM PC has a video card while PDPs aren't.
One idea is that ConPTY can have a "sync" stuff to read back the screen from a console application if some console API applications want to something strange. Otherwise the console host could simply convert console API calls into VT sequence, and forward that to the terminal app.
@therealkenc commented on GitHub (Jul 21, 2019):
Great. Invent a new CSI sequence for that. Send the
PCHAR_INFO lpBufferback as I dunno a base64 gzip. The feature is not supported by Mintty. Yet. No biggie. Not even unusual. Any 6502/Z80 assembler programmer working 1981 was free to add their own crazy vendor-specific sequence to their company's terminal if they were bored enough on a weekend too.@mintty commented on GitHub (Jul 21, 2019):
I assume this concern is more about the other direction of such adaptation, i.e. how would you serve a Windows console program that wants to use that "absurd" feature? You could run a second, hidden console in parallel, to maintain backwards compatibility.
@DHowett-MSFT commented on GitHub (Jul 21, 2019):
The people who hate how ConPTY is implemented today will absolutely hate how it's implemented if we do that. 😁
@mintty commented on GitHub (Jul 21, 2019):
They wouldn't even notice in pure pass-through applications. It might be necessary to solve an otherwise unresolvable dilemma.
@therealkenc commented on GitHub (Jul 21, 2019):
This solution makes no sense because there is no window in
sshd.exenorsomeoldprogram.exe. Both those programs are text only applications that wouldn't know a Consolas Font from a hole in the ground.To the point of #2035, neither
sshd.exenorsomeoldprogram.exeare terminal emulators. Gnome Terminal is a terminal emulator. Andgnome-terminalis the only thing that can give the correct answer as to the contents its screen buffer; ie whatReadConsoleOutput()should return. Similarly, the only thing that knows the contents of (VS Code)xterm.js'sscreen buffer isxterm.js. ConPTY doesn't have a clue whatxterm.jsinternal screen buffer contains. At best it can only guess by scraping the data passing by.Yes. And as a practical matter I wouldn't expect the
ESC[?GIVEMEBUFFERASIBMfeature being added to vteterminal anytime soon. Unless someone can point out the killer app that callsReadConsoleOutput().I think we are closer than that. If
conhostwants to read-only scrape the data going by for the sole purpose of keeping a wild-ass-guess as what the actual terminal emulator's buffer looks like, sure, I can live with that.ReadConsoleOutput()is a red herring. Ifconhost(call it aurxvtdanalogy) wants to maintain a shadow buffer, it can knock itself out....So long as it is quiet about it. There is no reason for a pass-through "mode", which is how this issue was framed. There is never a reason for ConPTY to inject a VT sequence into a
WriteFile()on a PTY handle -- ever. Daniel over on the VS Code team can't possibly care; because he has his own terminal emulator. PTYs don't care about VT100 sequences. Never heard of them.[Then we need
SIGWINCH(or equivalent thereof). Which isn't related to VT100 sequences or screen buffers either.]@DHowett-MSFT commented on GitHub (Jul 21, 2019):
@therealkenc,
Like it or not, conhost is the API server that, regardless of whether it presents a window, makes all existing Win32 console applications work. It must continue to make those applications work, because organizations really
hatelove when Microsoft rolls through with a new standard and tells everybody to drop what they're doing and throw out thousands of lines of code.I think you're looking to turn this request, and this project, into something it's not. You may be attempting to turn
CreatePseudoConsoleinto something it's not, too. Things work the way they work because we need to maintain compatibility with the thirty years of applications written since the VGA text mode buffer became the "official" design inspiration for how consoles should work in DOS and Windows.ConPTY exists to--narrowly-stated--allow an application that understands a number of sequences as specified by an xterm-256color terminfo to host a windows console application; to wit: an application that would otherwise run in conhost should be able to run in a "terminal emulator" of sufficient compatibility. It's not intended to support a TEK4010 application (those are not windows console subsystem applications), and it's not likely to want to support a TEK4010 terminal emulator that is expecting to receive a bytestream from a TEK4010 application. That guy will probably end up doing what everybody ELSE who doesn't want to write a windows console subsystem application does: use pipes, because they don't have the same compatibility requirements (neé guarantees) as the windows pseudoconsole infrastructure.
Through that lens, a "passthrough" mode is required. A console application by default, and this cannot be changed for compatibility reasons, starts up in a mode where it just has full access to all of the stupid Win32 console APIs that no terminal emulator developer wants to countenance. Nobody should be able to read back the contents of a terminal buffer, local or remote, that they wrote to. Nobody should be able to write into the offscreen section of the buffer, because there's no guarantee anywhere else that it actually exists. But, they do. Developers use this. Applications expect this, because they were written as windows console subsystem applications. A passthrough mode--mode!--is the only way we can offer an application a way to say "I promise I won't use the old ways" while still being a windows console subsystem application. That's the first step we can make towards ConPTY being the dumb pipe you want it to be.
If you'd like to debate whether the Windows Console was the right choice, or was well-designed, I'm happy to have you do it--but not here.
Two asides.
SIGWINCH, follow #281.isatty(3)is a libc-provided fixture, you also haveopenpty(3). When somebody spawns a child application with a stdin/stdout hooked up to file descriptors they get back fromopenpty(3),isatty(3)suddenly returns 1. That application will, more often than not, decide that what that means is that it can send back VT100 escape sequences. That's what it means to most applications to be "on a tty." Sure, it's a terrible abstraction and a poor design and applications should be smarter than this, but they're not. The Windows Pseudoconsole fits right in, here, with the understanding that "I've allocated a PTY, which means I want VT".@therealkenc commented on GitHub (Jul 22, 2019):
I'm not intending to criticize the design or implementation -- at all. That was not the intent. I am trying (more slowly than intended) to find a solution to open-for-a-year issue WSL#3279. Of which Biswa96 has a very good start.
@zadjii-msft commented on GitHub (Jul 22, 2019):
woah this thread got pretty out of hand over the weekend.
The stars aligned Friday, and I actually got a chance to play around with implementing a passthrough mode for conpty. I'm pretty happy with how it works so far, so I think it needs a spec and some polish, and maybe we can ship it one day. Here's the approach I've been taking:
ENABLE_PASSTHROUGH_MODEto theSetConsoleModeflags.SetConsoleTextAttributeis a good example.GetConsoleProcessList).E_UNSUPPORTED_API(or a real error) indicating that API isn't supported in passthrough mode. Case in point:ReadConsoleOutput*,ScrollConsoleScreenBuffer,SetConsoleDisplayMode, etc.cmd.exelaunchedwsl.exe, andwslenabled passthrough, did some stuff, thenwslexited, andcmdrestored the console back to non-passthrough mode (as it needs to use the API). When passthrough mode is exited, conpty will redraw its screen, to re-sync the terminal to what conpty believes the buffer looks like.This provides a way where we can be sure that apps that weren't updated for running in a pty will still have access to the entire console API, but apps that want to live in the new world can say "I promise I know what I'm doing", and run even smoother in conpty. I believe there's going to be an incredibly small intersection of apps that want to use VT and also call things like
ReadConsoleOutput. Most apps are wither going to be console-like, using the API heavily, and might not be as likely to be updated for such a mode. However, for *nix-like apps that aren't going to be using the API so much and are primarily speak VT, this is an excellent option. This flag creates a clear distinction between the two when running in a pty.@mintty commented on GitHub (Jul 22, 2019):
This sounds like an excellent plan, and thanks for caring about mintty.
From the description of the [not done yet] item, I guess even the following use case might work: A terminal runs wsl.exe through a pipe, and in the WSL session the user invokes cmd.exe...
@mcpiroman commented on GitHub (Jul 22, 2019):
Indeed sounds good. My points:
It seems like we can change the meaning of passthrough mode from "I won't use any of Console API" to "I won't use any of bizzare Console API functions that aren't convertible to VT or otherwise easliy handleable like
GetConsoleProcessList". The list of such functions will go to docs.microsoft.com.Actually the passthrough mode could be assumed by default and ConPTY can be lazily enabled. So if user runs a command line program and the program starts writting text/vt (or use
saneAPI functions), conhost would then just pass them through and record changes, like @zadjii-msft described. But if it sudenly usesinsaneAPI function (e.g. it's shell and it launched a program that does so), then conhost would fallback to current behaviour with ConPTY, also like described above:This would make appropriate applications work with passthrough mode without any modifications.
wslor alike called directly, where they will always be in passthrough mode, then conhost wouldn't need to record the state. So if the terminal launcheswsland it says "I will ever use passthrough mode", then the terminal can say to system that he doesn't need ConPTY, becouse the app it launched will never use it. If on the other hand the terminal launchescmdwhich launcheswslit won't do that, becouse nowwslisn't the process that he [the terminal] launched, but some child process of it.Conhost would then just read from one pipe and pass that to other, which could be further optimised, but it would probably need to sit there to handle signal pipe.
@mintty commented on GitHub (Sep 1, 2019):
I'd like to ask about progress in this issue.
Recent "WSL 2" mode (currently under evaluation in the Windows Insider program) appears to be incompatible with previous workarounds to run WSL properly from terminal environments. This makes the need for conpty passthrough mode more urgent and it would be highly appreciable to have it available before the release of WSL 2 mode into the main Windows branch.
@DHowett-MSFT commented on GitHub (Sep 2, 2019):
@mintty WSL 2 doesn’t change anything about how WSL instances are hosted in consoles, so it’s very unlikely that passthrough mode would help. What specific issue are you seeing?
@mintty commented on GitHub (Sep 2, 2019):
Without conpty,
bash.exeorwsl.exedo not work well if connected directly to a pty or pipe. Previous wrappers likewinptyorwslbridgework around that by running their backend in a hidden virtual console from which they grab output, poke input, mediate signal handling etc. This does not seem to work with WSL 2.Conpty has the capability to replace this wrapping function, but it enforces its own terminal model which is not desirable in this scenario.
@DHowett-MSFT commented on GitHub (Sep 3, 2019):
That 100% should still work today. Those are powered by the
ReadConsoleOutputAPI, which we cannot break.WSL2 doesn't change anything about how WSL instances are hosted in consoles. Any change in behavior there is absolutely a bug that we should fix before 20H1, but this feature request isn't the appropriate place to discuss that.
Since nobody here can reproduce this particular failure, can you please file a detailed bug report on what you're seeing? What wrapper, what version of Windows, what is happening and what should be happening?
@mintty commented on GitHub (Sep 3, 2019):
The wrapper does not actually use
ReadConsoleOutput, so maybe it's proper to still discuss that here;it's https://github.com/rprichard/wslbridge/, called from a cygwin terminal.
Its connection to WSL seems to be based on
CreatePipe.@zadjii-msft commented on GitHub (Sep 3, 2019):
For the record, I prototyped passthrough mode about a month ago. I had quite a fair amount of success with it, and I felt pretty happy with the prototype. You can check out the prototype on this branch (fair warning - it's quite a bit out-of-date).
What are the next steps here?
To be 100% transparent, it's not being looked at for the 20H1 release.
Because passthrough mode is not going to be a timely solution to the WSL2 issue that @mintty mentions, we should fork a thread for that discussion, to debug and understand what's wrong.
@be5invis commented on GitHub (Sep 14, 2019):
I think we should ask the CONPTY consumer to implement this -- so CONHOST could completely get rid of the character matrix in the passthrough mode.
If the consumer doesn’t implement this then CONHOST should reject entering passthrough mode.
@DHowett-MSFT commented on GitHub (Sep 14, 2019):
There is no standard provision for a VT application to read back the buffer. Asking a terminal emulator to handle it is asking a lot of Terminal developers.
Consider that you wouldn’t be able to ssh to windows unless you were using a terminal emulator that supported readback.
@DHowett-MSFT commented on GitHub (Sep 14, 2019):
(@be5invis: you are basically asking us to create a new API that will force all terminal developers to support legacy windows console behaviors. That’s just not likely to happen, and nobody would be willing to support it.)
@be5invis commented on GitHub (Sep 14, 2019):
@DHowett-MSFT
Well the “new API” is one-shot: only when CONHOST switch back to traditional mode, this API would be called once to read what the current application renders.
A terminal developer can choose not to implement this — and CONHOST would disable passthrough mode in this case.
@mcpiroman commented on GitHub (Sep 14, 2019):
@be5invis @DHowett-MSFT
I understand it this way so that conhost starts in passthrough mode by default and doesn't record changes that passes through it. If app starts to use the insane, inconvertible-to-vt API functions, then conhost asks the terminal to get its current state (like buffer) and exits passthrough mode.
If a terminal doesn't support the
get current statefunction, then conhost has to record the changes that passes through it, so when it eventually exits passthrough mode it is in the same state as terminal.@mintty commented on GitHub (Sep 14, 2019):
@be5invis : Ah, now I understand the proposal. What, for comparison, about my previous proposal to run a hidden/dummy console in parallel, so you're always prepared for this case and don't need to disable passthrough?
@christianparpart commented on GitHub (Sep 15, 2019):
Hey ConPTY devs,
First, many thanks for this API, this is a huge step forward. I actually came here because I am developing my own terminal emulator, and mainly while being on my windows machine - until I realized that it was eating my VT sequences.
So I am very happy to read that there is indeed a strong motivation to implement a pass through mode.
What is actually needed for me to get my hands dirty early with this mode? As all this eating makes it basically impossible to debug my own code via ConPTY. I am not really a Win32-dev, so please go easy on me. ;)
Thanks you.
@davidhewitt commented on GitHub (Dec 3, 2019):
Thanks to everyone working on this! I've been hoping to see this for some time, so very excited to see progress!
I just wanted to weigh in that passthrough-by-default seems highly desirable to me.
If I'm reading right, passthrough will result in faster and better rendering (e.g. resolves #405) more or less universally. The only downside is that it would break compatibility with some console APIs (which cross-platform VT-based apps will not need).
So it seems to me that a good balance would be:
SetConsoleModeto explicitly enable passthrough mode. In this state, calling unsupported APIs will result in an unsupported error.SetConsoleModeto explicitly disable passthrough mode. They might want to do this on startup so they can safely use incompatible APIs without causing a mode switch & redraw during program operation.Also some interesting questions which just struck me:
@davidhewitt commented on GitHub (Dec 9, 2019):
A further thought: will the hosting terminal emulators be able to query if the pseudoconsole is in passthrough mode? This might be needed, for example when the window resizes:
@christianparpart commented on GitHub (Dec 9, 2019):
I think if the terminal emulators request a ConPTY and state whether or not
to to get pass through mode, then the terminal emulator already knows what
to do in such circumstances.
On Mon, 9 Dec 2019, 06:51 David Hewitt notifications@github.com wrote:
@davidhewitt commented on GitHub (Dec 9, 2019):
Sure; however it sounded to me like for the solution proposed here the commandline app would request passthrough mode, rather than the terminal emulator. So the terminal emulator would have no knowledge of whether passthrough mode is enabled.
@christianparpart commented on GitHub (Dec 9, 2019):
IMHO it doesn't make sense for the app (running inside a terminal emulator)
to request passthrough mode but the terminal emulator, the one to interpret
the VT sequences, must see the VT sequences as equivalent as possible to
what the app produced. ?The problem with ConPTY is, that it is going to
reimplement every single VT sequence out there, and it lags behind. Hence,
terminal emulator writers where reporting bugs (or missing features), and
the best way to work around that is to "just pass all VT sequences through
"as-is"", eliminating a whole range of issues within ConPTY, and thus,
giving the terminal emulator the chance to actually see what the apps
produce, and render that.
The app inside any terminal emulator, while it should know when it is going
to be resized, should not care about what terminal emulator of
man-in-the-middle (conpty) it is running in. Do you agree?
Am Mo., 9. Dez. 2019 um 08:51 Uhr schrieb David Hewitt <
notifications@github.com>:
@DHowett-MSFT commented on GitHub (Dec 9, 2019):
@christianparpart sometimes, there are no VT sequences coming out of an application. The Windows Console APIs are not implemented using VT sequences.
The application must request passthrough mode to tell the console that it will not use one of the APIs that cannot be translated into VT sequences.
The terminal cannot set passthrough mode because it cannot force legacy applications to become compatible with VT sequences.
This is why ConPTY exists.
@ExE-Boss commented on GitHub (Dec 9, 2019):
For a terminal, whether conhost is in ConPTY or passthrough mode should be irrelevant, because the terminal application will just receive VT sequences through the PTY pipe.
@davidhewitt commented on GitHub (Dec 9, 2019):
That's my point; it's not irrelevant in certain edge cases. For example when the window resizes: at the moment ConPTY reflows its buffer and sends the terminal emulator instructions to redraw everything. In passthrough mode this won't happen, so the terminal emulator will have to do reflow itself.
@davidhewitt commented on GitHub (Dec 9, 2019):
Idea: Perhaps an
OSCescape sequence could be sent by conhost to inform the terminal emulator that conhost is entering / exiting passthrough mode?@mintty commented on GitHub (Dec 9, 2019):
No, the use case is a terminal running a specific backend, particularly WSL, so it knows the client will use VT mode and passthrough is needed to give it full functionality.
The terminal would "normally" notify the pty about changed terminal size. The pty would then send a SIGWINCH signal to the client application. ConPTY should handle this signal forwarding somehow. Then the client application can redraw itself.
@davidhewitt commented on GitHub (Dec 9, 2019):
I disagree. Knowledge that passthrough is needed for full functionality would be better written once in the client app (e.g.
wsl.exe) than in every terminal emulator which wants to host WSL.Agreed (I think it might already send this signal?). But I'm not talking about SIGWINCH here. I'm talking about the terminal emulator's own text layout & redraw, such as wrapping overflowing lines. At the moment ConPTY does line wrapping on its internal buffer and sends VT output to the emulator on how to draw the wrapped text. In passthrough mode the emulator will get unwrapped text and need to wrap it itself.
@miniksa commented on GitHub (Aug 12, 2021):
I started on a prototype of a flavor of passthrough mode for Fix-Hack-Learn week approximately a week or two ago.
In this prototype... I did not have the clients elect in or out. If they used VT straight on Write/ReadConsole/File... it was just plain old VT straight through to Terminal. If they used the classic APIs... I did best-effort at quick-translating them without simulating the world.
It's an attempt to be a compromise of performance and compatibility. I basically wrote thin translation layers for each of the classic Console APIs into the nearest VT sequences possible and made up answers for those that didn't have translations. It works pretty OK for CMD.exe and WSL.exe at the end of the hack. Powershell less well because it has a readline thing I need to debug out of it. But it showed promise.
I had it configured as a thing that we could let a user specify from the top in their Terminal profile so we could have it experimental to refine it over time and learn what all the edge cases are through usage.
One big thing of note is that it doesn't have wrong-way support (readback from output buffer or write to input buffer), but @zadjii-msft had an idea for at least the readback one.
I hope to put this behind a feature key and an experimental Terminal profile setting and bring it into at least the Terminal Preview and Terminal Dev branches in the next few weeks so everyone can try it and get a better idea of what it can and cannot do. Then we should be more informed on whether my idea was good... whether we need a different approach... or at least how far away we are from implementing a passthrough.
@zadjii-msft commented on GitHub (Aug 12, 2021):
In short: even in passthrough mode, we maintain the buffer internally in ConPTY. We write write's out to the terminal immediately, but also queue them up to write to the internal buffer. We could process that queue on another thread or something. This would unblock the IO thread immediately, allowing for more writes, but if someone wants to read back the buffer, then we can just flush those queued writes, then reply back with the actual contents of the buffer.
@oising commented on GitHub (Aug 14, 2021):
Nice! So I might be able to reanimate my half-baked project to write a screen/tmux app in pure dotnet :) I had started writing it a couple of years ago before I fully understood conpty model.
@mintty commented on GitHub (Aug 15, 2021):
Please don't do that magic kind of stuff. A simple API call (like the one to enable ConPTY) should be sufficient in order to faciliate seamless feature usage for applications.
@zadjii-msft commented on GitHub (Aug 16, 2021):
We're actually hoping to make it more magic than that. Right now, the plan is to throw it behind the experimental setting in the Terminal, and have it apply automatically to whatever client application is connected. Hopefully, if we can get all the kinks worked out, we'll probably just get rid of the experimental setting entirely, and just have it enabled by default. Client apps won't ever need to even know that this is functionality that exists, it should just work.
@davidhewitt commented on GitHub (Aug 16, 2021):
That's really cool! I'd love to understand the steps required for alternative terminal implementations such as alacritty to try this out and give feedback once the initial implementation becomes available.
@DHowett commented on GitHub (Aug 16, 2021):
Terminal is a great place for us to test things that impact the console infrastructure before rolling them out to a place where they will impact the billions of daily conhost sessions. Putting something behind an experimental opt-in for Terminal isn't a statement, implicit or explicit, that it's always going to be
thereWT-exclusive (NOTE: edited for clarity) or that it's going to be quasi-proprietary.We aren't fighting progress by locking people into Windows Terminal. We're not that Microsoft.
@miniksa commented on GitHub (Aug 17, 2021):
This option is still on the table depending on the outcome of the experiment. It was Fix Hack Learn week. I still don't fully understand the ramifications of all the decisions I made in this hack, so we could very well decide to make it an opt-in toggle at the end of this road.
Agree. I'm using Terminal Experiments as a safe space to put a change that folks can opt into, receive in a convenient GitHub or Store delivered mechanism, and provide ample feedback before we lock a full plan and ingest into Windows. We have several orders of magnitude more freedom to add/remove and deliver in the Terminal package (especially the Dev branch) than we do in Windows. There is also no set timeline for this to happen, so we're not going to rush it.
I just decided to use this to have fun on the open hack week. I want to be open and clear with everyone about what it is so they can try it out and prove me fortunately correct or terribly wrong... then go from there.
@BrianInglis commented on GitHub (Aug 20, 2021):
Just as an FYI mintty is a port of putty to Cygwin using Windows API, which has added VT graphics and xterm extensions including Tek4010 and DEC ReGis sixel support and probably others.
@christianparpart commented on GitHub (Aug 20, 2021):
What does this FYI add to the topic of ConPTY passthrough? Putty (and forks) work as ssh(/telnet/other-lines) clients and do not handle local processes, unless something has changed since I last used these. As such application you have 100% control over the communication line and it's easy to add things to hat ConPTY does not support. This is incomparable.
@BrianInglis commented on GitHub (Aug 21, 2021):
The mintty port talks to the conhost via Cygwin pty and Cygwin console drivers, or WSL console interfaces using wslbridge-{cygwin-frontend,linux-backend}, and uses Windows text/graphics rendering APIs with charset conversion where required, so transparent passthru supporting alternative non-"ANSI"/xterm-compatible graphic terminal modes are desirable.
Screen/Tmux/SSH/X/Windows console (including cmd /c commands and batch/cmd and PowerShell scripts) and GUI apps may also be run (launched for Windows GUI and locally or remotely for X) from the console(s) in the mintty terminal window(s).
@christianparpart commented on GitHub (Aug 21, 2021):
Thanks, @BrianInglis :)
@csdvrx commented on GitHub (Sep 27, 2021):
mintty is no longer just a simple port of putty: in practice, these various additions make it better than xterm for most common day uses
@zadjii-msft commented on GitHub (Nov 4, 2022):
Note to self: Although this was experimentally added a while ago, I think Niksa's intention was to keep both this thread and #10001 open in parallel. There's a LONG way to go before
experimental.connection.passthroughModeis ready for daily driving, and I'm not sure if we've got a good mental framework for figuring out if that will be the satisfactory conclusion to this thread (#1173)@mintty commented on GitHub (Nov 4, 2022):
I have just submitted microsoft/WSL#9117 as I felt for the main use case of "passthrough mode", Windows Terminal is the wrong domain in the first place. There should be a decoupled WSL launcher, like wsl.exe but without any bundled Windows Terminal functionality, in order to support full VT-like connectivity.
@DHowett commented on GitHub (Nov 4, 2022):
This is also the repository for the Windows Console Subsystem, and given the breadth of applications that want to run on Windows and emit/receive plain VT it is entirely within our charter.
@palves commented on GitHub (Jun 21, 2023):
Hi! I got here because I've been working on running the GDB (GNU Debugger) testsuite on Windows. The GDB testsuite uses DejaGnu, which is based on Expect. My plan is to have DejaGnu ssh into the Windows machine, and run GDB there. This is something that has been working fine on Linux for decades. On Windows, with the new Virtual Console support, it sounds like exactly what we'd need to make it work on Windows as well, and be able to auto test GDB in an environment that behaves like a regular console environment. However, the fact that ConPTY is not passthrough makes it still unworkable, unfortunately. Let me explain a little.
For example, this is the output DejaGnu sees when connected to GDB on Linux (with TERM=dumb):
And this is what DejaGnu sees when connected to GDB on Windows (via Windows 10's built-in SSH)
The odd line redraw in the first "(gdb)" line, and the extra escape sequences after the second prompt make this totally unworkable, because the testsuite is built on matching GDB output, and it isn't expecting any redraws or escape sequences (unless GDB sent them, e.g., for color, in which case the test will match them).
I am hoping that a passthrough mode would make the Windows output more like Linux one.
Can someone let me know what is the current status of passthrough mode, and how would one enable it? Is there some undocumented flag I can make GDB pass to SetConsoleMode, perhaps?
@lhecker commented on GitHub (Jun 21, 2023):
Windows Terminal Preview has a hidden setting for this. If you open the settings.json file via the "Open JSON file" button in the settings tab, you can add this:
to any of your profiles including the "defaults". Afterwards you'll have to create a new instance/tab of that profile. If you use PowerShell you'll notice fairly quickly that it works, because output will be severely broken.
Passthrough mode is something that must be done at some point or another (the "rendering" that ConPTY does is effectively a hack and would require constant maintenance forever if we kept it), but right now it's not anywhere near useable yet. Its implementation is simply incomplete, and its current approach might not even be the right one. I personally hope that we could tackle that issue soon, but realistically (and frankly) speaking we're not staffed enough to do that in the near term. There's a significant interest in other features like session restore, Unicode, image support, "sudo", font fallback, tmux, and many many more and it's not quite clear what issue deserves attention the most. Put differently, while I'm personally interested in solving this, the reality is that this issue and any of those that would be fixed by it don't even show up in the first 2 pages sorted by 👍.
To summarize: I'm sure we'll get to it, but just not right now. Sorry for the ramblings... 🙁
@BrianInglis commented on GitHub (Jun 21, 2023):
You could consider Cygwin project
mintty/wslttyoriginally derived fromputtywith serial support converted to Cygwinptyinterfacing with WindowsConHost/ConPTY(or WSL overwslbridge/wslbridge2) running Cygwin and most Windows terminal shells.Its adaptations and many configuration settings plus support for Cygwin
screen/tmuxandsshmay allow you to do what you need.The current developer @mintty is responsive and helpful.
@DHowett commented on GitHub (Jun 21, 2023):
At the core of this issue is a misunderstanding--on the part of the Win32-OpenSSH folks--of what it means to request a tty.
Even on Linux (supersets and derivatives), spawning GDB or any other application with a controlling terminal runs the risk of that application deciding that it should emit control sequences. This often happens even when
TERMis set todumb. A bunch of applications just checkisatty(3)rather than consultingTERM!On Windows, the equivalent of spawning a controlling terminal is establishing a pseudoconsole/console hosting session.
sshdon Windows requests a console hosting session even where one would not be appropriate.sshdon Windows should not be allocating a pty to host things for whichsshdon Linux/BSD would not allocate a pty1 . That would get ConPTY and its rendering logic entirely out of the loop, and give you stdin/stdout from the spawned process directly and unmodified.such as when ssh is used in a pipeline or not itself connected to a tty/pty :) ↩︎
@palves commented on GitHub (Jun 21, 2023):
That is essentially what you get with "ssh -T", but it's not what I need -- I really need for GDB to be connected to a pty, not just a plain pipe, so that input works as if on a terminal, like cursor keys, and sending ctrl-c.
@DHowett commented on GitHub (Jun 21, 2023):
Interesting. That makes sense; thanks for explaining it :)
@palves commented on GitHub (Jun 21, 2023):
Ah, thanks. I read https://github.com/microsoft/terminal/pull/11264/files and saw that that is plumbed down to a PSEUDOCONSOLE_PASSTHROUGH_MODE flag passed to the Virtual Console creation. Since I need it with ssh, I guess sshd would have to have its own way to enable this.
So it is not possible to activate the passthrough mode from the command line application itself, like how you pass ENABLE_VIRTUAL_TERMINAL_PROCESSING to SetConsoleMode ? I.e., something like a ENABLE_VIRTUAL_TERMINAL_PASSTHROUGH flag GDB itself could enable in SetConsoleMode? Is that something that you envision would be possible if/when this work is eventually completed?
@BatmanAoD commented on GitHub (Jun 22, 2023):
Other terminals, such as Wezterm, also need a way to enable this option.
@mintty commented on GitHub (Jun 22, 2023):
Yes, and that makes me repeat that this is actually not a Microsoft Terminal issue but a feature needed for the WSL launcher, wsl.exe, which should have a decoupled mode to not capture any terminal interaction; see https://github.com/microsoft/WSL/issues/9117
@j4james commented on GitHub (Jun 22, 2023):
@mintty As has already been mentioned above, this is also the repository for the console subsystem, which underlies all console applications - that includes both Windows applications and WSL applications. And the whole point of conpty is to translate the Windows console APIs into VT sequences. WSL has got nothing to do with that. Windows Terminal has got nothing to do with that either, but it happens to share the same repository.
@BatmanAoD It's worth noting that any terminals that want to use this option would likely need to work on their VT support first. To translate Windows console APIs into equivalent VT sequences without a local buffer (which is a requirement for pass-through mode), we'll likely need VT features like rectangular area operations, which aren't that widely supported.
@mintty commented on GitHub (Jun 22, 2023):
Yes, but wsl.exe does, unfortunately, as it intercepts and filters terminal interaction. It shouldn't, in a passthrough mode, that's my point, not really caring about the underlying architecture.
@ferdinandyb commented on GitHub (Jul 6, 2023):
I've been browsing issues and wanted to point out, that sorted by 👍, the third issue is sixels where @j4james said, that
so it seems to me that there's at least one high profile issue that would be solved by this, and I wouldn't be surprised if there were more highly voted issues where this would be the solution (I'm guessing a lot of people are like me: not knowing much about terminal internals, just wanting a WSL terminal to feel like they are on a linux box).
@BrianInglis commented on GitHub (Jul 6, 2023):
xtermimplements almost all of the 700+ documented ECMA, VT, ANSI, and X control sequences, and is available under MIT/X permissive licences: so just "Use the Source Luke!"@jerch commented on GitHub (Jul 24, 2023):
I also think that the sixel-regenerating is a dead-end in the long run creating lots of maintenance burden (you'd basically need an "image recorder" with decoding and encodings clipping viewport areas, geez) while only solving this particular sixel issue. What about other image sequences later on? What about other sequences in general? They will still fail at the "not implemented here in ConPty" trap.
On a sidenote - recently had a similar image forth and back encoding/decoding need for state serialization within xtermjs, and did not vote for sixel, but QOI (reasonably fast in wasm with good enough compression - much better than any PNG handling offered by the browser engines).
This prolly got stressed several times already - to me it seems that ConPty "puts the cart before the horse" with its interim terminal emulation to stay compatible to the far less capable WIN-console API. Wouldn't it be better to do it the other way around and to abstract the console caps into rectangular VT sequences? Yes, support is quite lousy for those across TEs, but even with scroll margins only one can simulate many aspects. I also think that TE devs would happily implement better rect support, if there is a serious need for those.
@j4james commented on GitHub (Jul 24, 2023):
@jerch I've been pushing for this for a while, and I think it's probably the right long term solution, but the current conpty approach was most definitely the correct decision at the time, and it may well remain the most practical solution for a long time.
The Windows console API has a lot more functionality than your average VT terminal, and even with the most advanced VT capabilities there will likely be things we just can't reproduce. To be honest, the more time I spend looking at this, the less convinced I am that it's worth the effort.
@mintty commented on GitHub (Jul 25, 2023):
You mean like reading back the screen contents? An exotic feature rarely useful and certainly not relevant in the WSL domain.
That's why I had tried to drag this discussion over to a WSL issue. For the Windows Terminal application, it may be dispensible to provide terminal transparency as it's a terminal itself. For WSL however, there is serious need for transparent terminal access, both local and remote, so passthrough mode without any Windows console legacy burden is essential for the WSL launcher.
@christianparpart commented on GitHub (Jul 25, 2023):
@j4james hey, I am curious to know what Windows console API offers that doesn't exist as VT sequence or extension just yet. OTOH, I think if one can count the number of features that are available on the conhost side but not on the VT side, it might make sense to introduce VT sequence extensions for those few and still put conhost on top of VT. I do not want to mandate here anything, I am just curious to know what conhost is more advanced in. :)
On the "your average VT terminal" argument, I'd love to bring some of my main features of contour to Windows, which I can't until either ConPTY supports them, or a passthrough mode is available. currently my windows version of Contour will always be inferior than on other platforms, sadly. Not sure how to solve this without ConPTY passthrough in the future :)
@jerch commented on GitHub (Jul 25, 2023):
@christianparpart I think the buffer read caps are on the annoying side of things - as far as I remember console API allows complete buffer access (in the sense, that the console app "owns" the console and thus the buffer state). Thats almost impossible with non rect-based VT mechanics or at least will be limited to active cursor area only prolly on all TEs. I still think that most buffer access primitives could be mimicked in VT.
The hard unsolvable problem might be the exclusiveness, that console API kinda provides to apps with a quite strict process IO coupling/isolation - a thing that many ppl also wish for terminals in linux/macos, but it is just not possible there with the current TTY/PTY abstraction (though its not a matter of VT mechanics but POSIX terminal API).
@j4james commented on GitHub (Jul 25, 2023):
You can find a list of the console APIs here:
https://learn.microsoft.com/en-us/windows/console/console-functions
If you click through each of them, you should see a "Tip" section which explains which of them do or don't have a VT equivalent. If you think you can convert all of them into VT sequences, please do feel free to contribute PRs. A lot of the framework is already in place to do this.
We aren't even at the point where most conpty terminals are supporting the standard VT sequences we would need. The chances of everyone agreeing to a bunch of Windows-specific extensions on top of that doesn't seem very likely.
I think what some of you really want is just a pass through mode for WSL. If that's the case, you can assumedly build your terminal as a Linux GUI app running on WSL. But ConPTY is specially for Windows console application support. If you aren't interested in that, this isn't the issue for you.
@palves commented on GitHub (Jul 25, 2023):
There is a set of Windows console applications that want the feature (in my case, GDB (GNU Debugger) testing), which don't need anything from the console API that the supported subset of standard VT sequences doesn't already provide. IMO, there could be a console API that such applications could call to enable some restrictive/subset of the API, only. Call it "passthrough mode", or "no intermediate buffer mode" or some such, and when that mode is active, the problematic console APIs (like complete buffer access) would just fail with an error.
@zadjii-msft commented on GitHub (Jul 25, 2023):
FWIW that's my preferred approach to solving this. A console mode that a client app can enable to say "I solemnly swear I am up to good". Something like WSL would opt-in, because it knows it's only ever going to do VT.
That doesn't work as well for mixed applications that want to do both. But that would let legacy console apps rely on conpty's regeneration for their own needs, and modern apps just use VT and all the new features that come with it.
@j4james commented on GitHub (Jul 25, 2023):
If that's the way we want to go, that's fine, but it means the Windows shells don't gain any benefit from it. For example, you wouldn't be able to
TYPEa sixel file, orECHOa Contour-specific escape sequence and expect it to work. Personally I'd consider this a waste of time, but I can accept that's all some people might care about.@jerch commented on GitHub (Jul 25, 2023):
To avoid rewriting console API into wonky VT pendants, wouldn't the following work:
AttachConsolestill worksOfc there are details to overcome, like the question whether the console primitives can be made blocking or need true memory sharing & possible security implications.
@csdvrx commented on GitHub (Aug 1, 2023):
@jerch , am I right to say that we had a few standards already existing (sixel, kitty, ...) and now we've got one more?
I think it's just sad that the desire for technical perfections goes before practical concerns for something that'd work about everywhere, if leveraging the existing ecosystem.
So like @j4james, I think not being able to reach some baseline level of functionality is waste of time:
Actually, I'd consider that not just a waste of time, but a sad waste of time.
@jerch commented on GitHub (Aug 2, 2023):
Nope, that serialization format is for TE internal usage only, not intended for outside with an explicit sequence. QOI yields the best compression/performance ratio covering RGBA in 32bit. Since xtermjs is browser based, we cannot just store raw bytes somewhere on the disk for session restore, as other desktop TEs would do here.
@zadjii-msft commented on GitHub (Apr 5, 2024):
Nothing to share at this time. We'll make sure to update this thread when there is. In the meantime, might I recommend the Subscribe button?

That way you'll be notified of any updates to this thread, without needlessly pinging everyone on this thread ☺️