Compare commits
401 Commits
dev/miniks
...
v1.7.1091.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3b11bf827 | ||
|
|
45cde9edab | ||
|
|
3ac05363b1 | ||
|
|
14a7e45280 | ||
|
|
6aa3d70091 | ||
|
|
0284a917a6 | ||
|
|
f67db399c1 | ||
|
|
cddeb0898f | ||
|
|
bea3e7f696 | ||
|
|
fadd1852d3 | ||
|
|
15028f399e | ||
|
|
c00ae340db | ||
|
|
0c31c43cc4 | ||
|
|
806181db86 | ||
|
|
96930431c8 | ||
|
|
17f9dbf7bb | ||
|
|
aae9b83c42 | ||
|
|
e40b5e8ec1 | ||
|
|
842b162c85 | ||
|
|
a114d1b324 | ||
|
|
976a3c7d60 | ||
|
|
dd1c3df54d | ||
|
|
f8e8572c23 | ||
|
|
7b6625d7d9 | ||
|
|
a8aa295757 | ||
|
|
979ef5d981 | ||
|
|
0e68d0c09a | ||
|
|
823d28a8c6 | ||
|
|
aee33691bb | ||
|
|
3ca5374fe2 | ||
|
|
9e49ff2a05 | ||
|
|
3ffefeb39f | ||
|
|
80463833c1 | ||
|
|
396a698468 | ||
|
|
27bcdb03a2 | ||
|
|
a6af9a51ca | ||
|
|
1481475d2d | ||
|
|
2f81f5361c | ||
|
|
2d53cb2f4d | ||
|
|
42c01b83ea | ||
|
|
03b373f254 | ||
|
|
c7dc350504 | ||
|
|
7f1bdaf962 | ||
|
|
fb4dab0143 | ||
|
|
77f181febd | ||
|
|
89c9e6db84 | ||
|
|
f5f330a019 | ||
|
|
ec89b85462 | ||
|
|
e295cc4ae2 | ||
|
|
e103ca59e4 | ||
|
|
28c7890cbc | ||
|
|
4dee531aee | ||
|
|
c951a70208 | ||
|
|
35e1168bfa | ||
|
|
ef4f2ca03e | ||
|
|
f87596f8f7 | ||
|
|
17c6f8e9ff | ||
|
|
81d773d2bf | ||
|
|
8ad4d1f19a | ||
|
|
99ffaa8a1a | ||
|
|
c9dea60bbe | ||
|
|
a158cc81ae | ||
|
|
049e37e514 | ||
|
|
eb0fb3e822 | ||
|
|
dfeb855d18 | ||
|
|
ba8bd006f4 | ||
|
|
177430272c | ||
|
|
69318d3ba1 | ||
|
|
e6aa902224 | ||
|
|
d12a71cdf9 | ||
|
|
bb0e1d3979 | ||
|
|
2c22b68e15 | ||
|
|
654c0cc286 | ||
|
|
c07553cb57 | ||
|
|
491cb21722 | ||
|
|
90699da23b | ||
|
|
eb349935a0 | ||
|
|
4c53c595e7 | ||
|
|
72cbe59078 | ||
|
|
847749f19e | ||
|
|
52d1533c4f | ||
|
|
ac3e4bfe56 | ||
|
|
12eb69f665 | ||
|
|
00d1dc99e4 | ||
|
|
557edc629d | ||
|
|
7d37ba22e7 | ||
|
|
525be22bd8 | ||
|
|
ca226d62e2 | ||
|
|
c1f844307c | ||
|
|
5ffb945b66 | ||
|
|
604eaf9bdd | ||
|
|
13e058d9f1 | ||
|
|
2f28d24fe0 | ||
|
|
49667c263f | ||
|
|
3822d5b662 | ||
|
|
7fac0c3571 | ||
|
|
7e11aeca0a | ||
|
|
38da2ff185 | ||
|
|
c3e0a8dce5 | ||
|
|
16d00a68fe | ||
|
|
4440256eba | ||
|
|
8f73145d9d | ||
|
|
42511265e5 | ||
|
|
ed19301ad3 | ||
|
|
3b247812ce | ||
|
|
03ebe514e9 | ||
|
|
8b2cdfd1f8 | ||
|
|
47f4b4197d | ||
|
|
6af49a5246 | ||
|
|
5fdad873d3 | ||
|
|
cad795470f | ||
|
|
a90289548f | ||
|
|
9047bbbafb | ||
|
|
3b7b200b59 | ||
|
|
3230b18020 | ||
|
|
a3c8beaba0 | ||
|
|
b009d06bc3 | ||
|
|
2c603ef953 | ||
|
|
5f8e3d1676 | ||
|
|
1962767aec | ||
|
|
47881a802f | ||
|
|
207f15498f | ||
|
|
4cce933f89 | ||
|
|
9cb8db8e9a | ||
|
|
230fad533e | ||
|
|
40e328984d | ||
|
|
ed4e829adc | ||
|
|
7c42ed4cc3 | ||
|
|
0811c572ae | ||
|
|
619710852c | ||
|
|
779354d368 | ||
|
|
45bee078f0 | ||
|
|
42f7403bf5 | ||
|
|
a5931fbead | ||
|
|
6b7149d9e6 | ||
|
|
3b9e6124e0 | ||
|
|
92b23700d3 | ||
|
|
9fb4fb2741 | ||
|
|
9d71fa817d | ||
|
|
40ebe5ab54 | ||
|
|
20152d9756 | ||
|
|
e207236713 | ||
|
|
597a3325ea | ||
|
|
636f436465 | ||
|
|
e7d32625be | ||
|
|
37cbcc3e2b | ||
|
|
b502e0e530 | ||
|
|
d29d72e1e0 | ||
|
|
96e0232603 | ||
|
|
054d7dbb1c | ||
|
|
ae8347f336 | ||
|
|
3f1262e4c2 | ||
|
|
b50df20cfe | ||
|
|
7b6958405e | ||
|
|
65269c8311 | ||
|
|
3e5d6e71a2 | ||
|
|
dff8f15efa | ||
|
|
2b27d4ce91 | ||
|
|
172d9a7f64 | ||
|
|
02fd7a0c15 | ||
|
|
acf36d0e4f | ||
|
|
d45cc4c2e1 | ||
|
|
9700598ecb | ||
|
|
124cbd9e47 | ||
|
|
b208a83666 | ||
|
|
8b855ca88c | ||
|
|
b6f5f2a323 | ||
|
|
9c4950cb32 | ||
|
|
3b53c6956c | ||
|
|
98d0613124 | ||
|
|
e7592ec3d4 | ||
|
|
b7a7aa0bc3 | ||
|
|
0fa286c011 | ||
|
|
12b12d5b07 | ||
|
|
f196285824 | ||
|
|
9fed14a95e | ||
|
|
c33a97955f | ||
|
|
a7d7362b95 | ||
|
|
9293867a06 | ||
|
|
2919d96c21 | ||
|
|
6c4878c8d5 | ||
|
|
90e7c28069 | ||
|
|
de49cf1d0d | ||
|
|
2b4b8dd1bd | ||
|
|
fa0cd8c7ed | ||
|
|
3c044f20cf | ||
|
|
9aea904229 | ||
|
|
f7b5ff322a | ||
|
|
9905bd5f09 | ||
|
|
e0f585251a | ||
|
|
9b1bb134bf | ||
|
|
e851c61777 | ||
|
|
f8ccf64252 | ||
|
|
5f590a5efa | ||
|
|
bf783842f2 | ||
|
|
612e3a0a3e | ||
|
|
20bfccefb7 | ||
|
|
9b636edad2 | ||
|
|
cb2cd7e219 | ||
|
|
aaf2395266 | ||
|
|
20fc57ee0f | ||
|
|
058cbd11e7 | ||
|
|
7235996b4d | ||
|
|
bc70a97fd7 | ||
|
|
e557a867ee | ||
|
|
49d008537f | ||
|
|
8bef5eefd5 | ||
|
|
039c80d443 | ||
|
|
c4c3c3116b | ||
|
|
7d503a4352 | ||
|
|
cceb0eaa68 | ||
|
|
713027b5e3 | ||
|
|
fcca88ab25 | ||
|
|
6b2ae625a5 | ||
|
|
a8b4044630 | ||
|
|
f087d03eb2 | ||
|
|
990e06b445 | ||
|
|
08646e5ca3 | ||
|
|
68e0af41a8 | ||
|
|
9b07cb8c71 | ||
|
|
5220738d8e | ||
|
|
0b0161d537 | ||
|
|
683f4e28d3 | ||
|
|
fc7b052461 | ||
|
|
8276b549e8 | ||
|
|
01a04906f3 | ||
|
|
96b9ba99b2 | ||
|
|
d37df8ab05 | ||
|
|
4f46129cb4 | ||
|
|
2485a638cb | ||
|
|
33470ad08e | ||
|
|
c5366cea75 | ||
|
|
477c04ab94 | ||
|
|
b8e6b8e27c | ||
|
|
e798258ae0 | ||
|
|
539a5dc0af | ||
|
|
551cc9a98b | ||
|
|
22d43a431c | ||
|
|
857a893660 | ||
|
|
7241fa29c6 | ||
|
|
fb3d772615 | ||
|
|
b140299e50 | ||
|
|
e943785e1a | ||
|
|
da6705c086 | ||
|
|
a1f42e87a8 | ||
|
|
cae0f9a718 | ||
|
|
61ccf44f22 | ||
|
|
ff5b2b84d2 | ||
|
|
1965fb5e73 | ||
|
|
d02812d699 | ||
|
|
3e2b94334d | ||
|
|
b80a4e45cc | ||
|
|
1d10235c8e | ||
|
|
2f9f103282 | ||
|
|
219ee0c654 | ||
|
|
8f60cfae41 | ||
|
|
ba8f38507e | ||
|
|
04309a2a49 | ||
|
|
eb2be374fd | ||
|
|
4111be389d | ||
|
|
f751cad2cf | ||
|
|
540cc33d1f | ||
|
|
6952f1acda | ||
|
|
c2e84d1a90 | ||
|
|
89d82ff546 | ||
|
|
e1a8657370 | ||
|
|
0bf9dcb63e | ||
|
|
1d08288406 | ||
|
|
0b88694c07 | ||
|
|
ddfb6adb98 | ||
|
|
05c0d4c0e4 | ||
|
|
87492c4a26 | ||
|
|
d944d9f181 | ||
|
|
88039532cd | ||
|
|
956a045a85 | ||
|
|
3ccd831a3b | ||
|
|
2a2f6b32a2 | ||
|
|
104a4e48bd | ||
|
|
8d26f45278 | ||
|
|
3995196072 | ||
|
|
f072eaf9d8 | ||
|
|
3181b6a517 | ||
|
|
60f1b0b285 | ||
|
|
d3bcd85900 | ||
|
|
f8edcf57bd | ||
|
|
3a5042a774 | ||
|
|
1acc649510 | ||
|
|
62131720aa | ||
|
|
4060a18937 | ||
|
|
2a79ba2fd3 | ||
|
|
90316be322 | ||
|
|
91aafe8da5 | ||
|
|
ef98d300eb | ||
|
|
9cffe27731 | ||
|
|
b1e1c7cdf4 | ||
|
|
b7bebc765e | ||
|
|
f5a016c3d0 | ||
|
|
d09fdd61cb | ||
|
|
274f5a74f5 | ||
|
|
d497dfd113 | ||
|
|
67dfbd21a6 | ||
|
|
14fe993516 | ||
|
|
a77b49406c | ||
|
|
fd37e1dc9f | ||
|
|
a52a1d3b8d | ||
|
|
7db05b1383 | ||
|
|
f8ffc439e5 | ||
|
|
1e42bc8e4f | ||
|
|
1fbcf34ba8 | ||
|
|
16e8a84cfb | ||
|
|
c41e078e85 | ||
|
|
435e45726e | ||
|
|
2a340802dc | ||
|
|
9a070490d4 | ||
|
|
6b503ba887 | ||
|
|
77a204b765 | ||
|
|
a8f3f584a0 | ||
|
|
eb26d5e83a | ||
|
|
ee1c1011f7 | ||
|
|
6115f8db82 | ||
|
|
d28a4da596 | ||
|
|
d4b635589c | ||
|
|
e3fcfccc52 | ||
|
|
e80108118d | ||
|
|
0437fe9d8e | ||
|
|
1f54efff2f | ||
|
|
7dece459ac | ||
|
|
d5bfd237e5 | ||
|
|
c0b1fe0525 | ||
|
|
499877978e | ||
|
|
3a57378f15 | ||
|
|
5a942bcb6f | ||
|
|
64aa911aee | ||
|
|
048f8d505e | ||
|
|
3a5c33b005 | ||
|
|
0c0830b2f2 | ||
|
|
e9a7b24296 | ||
|
|
624d07f283 | ||
|
|
c90ecf7263 | ||
|
|
79855b452b | ||
|
|
3f75788d29 | ||
|
|
1aff3bc216 | ||
|
|
015675d87c | ||
|
|
bdbd1bd307 | ||
|
|
5de4f98d7e | ||
|
|
6639df9edc | ||
|
|
930e24c6b3 | ||
|
|
341bb4f91e | ||
|
|
c0c23291b8 | ||
|
|
d5d2b7727f | ||
|
|
c173f20244 | ||
|
|
4eeaddc583 | ||
|
|
26ca73b823 | ||
|
|
e6aeb8a017 | ||
|
|
042cbea767 | ||
|
|
c2db1e95db | ||
|
|
990628a78b | ||
|
|
5b2fd70940 | ||
|
|
d1e58bd71e | ||
|
|
2ea4742f07 | ||
|
|
4daed9d946 | ||
|
|
2bf5d18c84 | ||
|
|
8e3f27f8fb | ||
|
|
1c97d20c13 | ||
|
|
ce4fd2970a | ||
|
|
242833f8b2 | ||
|
|
e21f9f5ac6 | ||
|
|
6d44e0d651 | ||
|
|
5a1c931f77 | ||
|
|
60437b890e | ||
|
|
fc9a46dbbd | ||
|
|
1fa3177f77 | ||
|
|
3f7f6ac34c | ||
|
|
d51d8dc768 | ||
|
|
1df3182865 | ||
|
|
b603929214 | ||
|
|
7e8600147e | ||
|
|
5a518e5e58 | ||
|
|
b3aab8c158 | ||
|
|
87004994f7 | ||
|
|
c095a678a5 | ||
|
|
84bda067c5 | ||
|
|
4a95d94c55 | ||
|
|
6928c5a885 | ||
|
|
7a75e508d6 | ||
|
|
16b8ea14d6 | ||
|
|
4f39e8e752 | ||
|
|
293ad2757b | ||
|
|
403b793179 | ||
|
|
ae550e0969 | ||
|
|
ccf9f03ed3 | ||
|
|
895ac06dbd | ||
|
|
00f5fbaf3d | ||
|
|
4099aacacb | ||
|
|
1ad7a25cb2 | ||
|
|
c1d27774b4 | ||
|
|
8eaaa8a2b7 | ||
|
|
90452664ff | ||
|
|
df7c3ccc3b | ||
|
|
d1b8d60e16 | ||
|
|
a13a7c3948 |
12
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
blank_issues_enabled: true
|
||||
|
||||
contact_links:
|
||||
- name: Microsoft Security Response Center 🔐
|
||||
url: https://msrc.microsoft.com/create-report
|
||||
about: Please report security vulnerabilities here.
|
||||
- name: Windows Terminal Documentation issue 📄
|
||||
url: https://github.com/MicrosoftDocs/terminal/issues/new
|
||||
about: Report issues with the documentation for the Windows Terminal (in docs.microsoft.com/windows/terminal)
|
||||
- name: Console Documentation issue 📄
|
||||
url: https://github.com/MicrosoftDocs/console-docs/issues/new
|
||||
about: Report issues with the documentation for the Console (in docs.microsoft.com/windows/console)
|
||||
60
.github/actions/spell-check/dictionary/apis.txt
vendored
@@ -1,60 +0,0 @@
|
||||
ACCEPTFILES
|
||||
ACCESSDENIED
|
||||
alignof
|
||||
bitfield
|
||||
bitfields
|
||||
COLORPROPERTY
|
||||
CLASSNOTAVAILABLE
|
||||
environstrings
|
||||
EXPCMDFLAGS
|
||||
EXPCMDSTATE
|
||||
fullkbd
|
||||
futex
|
||||
Hashtable
|
||||
href
|
||||
IAsync
|
||||
IBind
|
||||
IBox
|
||||
IClass
|
||||
IComparable
|
||||
ICustom
|
||||
IDialog
|
||||
IDirect
|
||||
IExplorer
|
||||
IMap
|
||||
IObject
|
||||
IStorage
|
||||
llabs
|
||||
LCID
|
||||
lround
|
||||
LSHIFT
|
||||
NCHITTEST
|
||||
NCLBUTTONDBLCLK
|
||||
NCRBUTTONDBLCLK
|
||||
NOAGGREGATION
|
||||
NOREDIRECTIONBITMAP
|
||||
oaidl
|
||||
ocidl
|
||||
otms
|
||||
OUTLINETEXTMETRICW
|
||||
PAGESCROLL
|
||||
RETURNCMD
|
||||
rfind
|
||||
roundf
|
||||
RSHIFT
|
||||
rx
|
||||
serializer
|
||||
SIZENS
|
||||
GETDESKWALLPAPER
|
||||
UPDATEINIFILE
|
||||
spsc
|
||||
STDCPP
|
||||
strchr
|
||||
syscall
|
||||
tmp
|
||||
tx
|
||||
userenv
|
||||
wcstoui
|
||||
XDocument
|
||||
XElement
|
||||
XParse
|
||||
@@ -9,17 +9,19 @@ By default the command suggestion will generate a file named based on your commi
|
||||
|
||||
If the listed items are:
|
||||
* ... **misspelled**, then please *correct* them instead of using the command.
|
||||
* ... *names*, please add them to `.github/actions/spell-check/dictionary/names.txt`.
|
||||
* ... APIs, you can add them to a file in `.github/actions/spell-check/dictionary/`.
|
||||
* ... just things you're using, please add them to an appropriate file in `.github/actions/spell-check/expect/`.
|
||||
* ... tokens you only need in one place and shouldn't *generally be used*, you can add an item in an appropriate file in `.github/actions/spell-check/patterns/`.
|
||||
* ... *names*, please add them to `.github/actions/spelling/dictionary/names.txt`.
|
||||
* ... APIs, you can add them to a file in `.github/actions/spelling/dictionary/`.
|
||||
* ... just things you're using, please add them to an appropriate file in `.github/actions/spelling/expect/`.
|
||||
* ... tokens you only need in one place and shouldn't *generally be used*, you can add an item in an appropriate file in `.github/actions/spelling/patterns/`.
|
||||
|
||||
See the `README.md` in each directory for more information.
|
||||
|
||||
:microscope: You can test your commits **without** *appending* to a PR by creating a new branch with that extra change and pushing it to your fork. The [:check-spelling](https://github.com/marketplace/actions/check-spelling) action will run in response to your **push** -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. :wink:
|
||||
:microscope: You can test your commits **without** *appending* to a PR by creating a new branch with that extra change and pushing it to your fork. The [check-spelling](https://github.com/marketplace/actions/check-spelling) action will run in response to your **push** -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. :wink:
|
||||
|
||||
:clamp: If you see a bunch of garbage and it relates to a binary-ish string, please add a file path to the `.github/actions/spelling/excludes.txt` file instead of just accepting the garbage.
|
||||
|
||||
File paths are Perl 5 Regular Expressions - you can [test](
|
||||
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
|
||||
|
||||
`^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](https://github.com/microsoft/terminal/blob/main/README.md) (on whichever branch you're using).
|
||||
</details>
|
||||
|
||||
#### :warning: Reviewers
|
||||
At present, the action that triggered this message will not show its :x: in this PR unless the branch is within this repository.
|
||||
Thus, you **should** make sure that this comment has been addressed before encouraging the merge bot to merge this PR.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Dictionaries are lists of words to accept unconditionally
|
||||
|
||||
While check spelling will complain about a whitelisted word
|
||||
While check spelling will complain about an expected word
|
||||
which is no longer present, you can include things here even if
|
||||
they are not otherwise present in the repository.
|
||||
|
||||
125
.github/actions/spelling/dictionary/apis.txt
vendored
Normal file
@@ -0,0 +1,125 @@
|
||||
ACCEPTFILES
|
||||
ACCESSDENIED
|
||||
alignof
|
||||
bitfield
|
||||
bitfields
|
||||
CLASSNOTAVAILABLE
|
||||
cmdletbinding
|
||||
COLORPROPERTY
|
||||
COMDLG
|
||||
CXICON
|
||||
CYICON
|
||||
D2DERR_SHADER_COMPILE_FAILED
|
||||
dataobject
|
||||
DERR
|
||||
environstrings
|
||||
EXPCMDFLAGS
|
||||
EXPCMDSTATE
|
||||
dlldata
|
||||
DONTADDTORECENT
|
||||
environstrings
|
||||
EXPCMDFLAGS
|
||||
EXPCMDSTATE
|
||||
FILTERSPEC
|
||||
FORCEFILESYSTEM
|
||||
FORCEMINIMIZE
|
||||
frac
|
||||
fullkbd
|
||||
futex
|
||||
GETDESKWALLPAPER
|
||||
GETHIGHCONTRAST
|
||||
Hashtable
|
||||
HIGHCONTRASTON
|
||||
HIGHCONTRASTW
|
||||
hotkeys
|
||||
href
|
||||
IActivation
|
||||
IApp
|
||||
IAppearance
|
||||
IAsync
|
||||
IBind
|
||||
IBox
|
||||
IClass
|
||||
IComparable
|
||||
IConnection
|
||||
ICustom
|
||||
IDialog
|
||||
IDirect
|
||||
IExplorer
|
||||
IFile
|
||||
IInheritable
|
||||
IMap
|
||||
IObject
|
||||
IPackage
|
||||
IPeasant
|
||||
IStorage
|
||||
IStringable
|
||||
ITab
|
||||
ITaskbar
|
||||
IVirtual
|
||||
LCID
|
||||
llabs
|
||||
llu
|
||||
localtime
|
||||
lround
|
||||
LSHIFT
|
||||
MULTIPLEUSE
|
||||
msappx
|
||||
MULTIPLEUSE
|
||||
NCHITTEST
|
||||
NCLBUTTONDBLCLK
|
||||
NCRBUTTONDBLCLK
|
||||
NOAGGREGATION
|
||||
NOASYNC
|
||||
NOCHANGEDIR
|
||||
NOPROGRESS
|
||||
NOREDIRECTIONBITMAP
|
||||
ntprivapi
|
||||
oaidl
|
||||
ocidl
|
||||
otms
|
||||
OUTLINETEXTMETRICW
|
||||
overridable
|
||||
PAGESCROLL
|
||||
PICKFOLDERS
|
||||
pmr
|
||||
REGCLS
|
||||
REGCLS
|
||||
RETURNCMD
|
||||
rfind
|
||||
roundf
|
||||
RSHIFT
|
||||
rx
|
||||
schandle
|
||||
semver
|
||||
serializer
|
||||
shobjidl
|
||||
SIZENS
|
||||
smoothstep
|
||||
GETDESKWALLPAPER
|
||||
SHELLEXECUTEINFOW
|
||||
snprintf
|
||||
spsc
|
||||
sregex
|
||||
STDCPP
|
||||
strchr
|
||||
Subheader
|
||||
Subpage
|
||||
UPDATEINIFILE
|
||||
syscall
|
||||
TBPF
|
||||
THEMECHANGED
|
||||
tmp
|
||||
tolower
|
||||
TTask
|
||||
TVal
|
||||
tx
|
||||
UPDATEINIFILE
|
||||
userenv
|
||||
wcsstr
|
||||
wcstoui
|
||||
wpc
|
||||
wsregex
|
||||
XDocument
|
||||
XElement
|
||||
XParse
|
||||
@@ -116574,6 +116574,8 @@ Dowmetal
|
||||
Down
|
||||
down
|
||||
Downall
|
||||
downside
|
||||
downsides
|
||||
down-and-out
|
||||
down-and-outer
|
||||
down-at-heel
|
||||
@@ -152433,6 +152435,7 @@ ft-lb
|
||||
ftncmd
|
||||
ftnerr
|
||||
FTP
|
||||
ftp
|
||||
ft-pdl
|
||||
FTPI
|
||||
FTS
|
||||
@@ -157078,6 +157081,7 @@ geek
|
||||
geekier
|
||||
geekiest
|
||||
geeks
|
||||
geeksforgeeks
|
||||
geeky
|
||||
geelbec
|
||||
geelbeck
|
||||
@@ -183439,6 +183443,8 @@ hostlership
|
||||
hostlerwife
|
||||
hostless
|
||||
hostly
|
||||
hostname
|
||||
hostnames
|
||||
hostry
|
||||
hosts
|
||||
hostship
|
||||
@@ -236346,6 +236352,7 @@ Maxama
|
||||
Maxantia
|
||||
Maxatawny
|
||||
Maxbass
|
||||
maxed
|
||||
Maxentia
|
||||
Maxey
|
||||
Maxfield
|
||||
@@ -313155,6 +313162,7 @@ post-Mishnical
|
||||
postmistress
|
||||
postmistresses
|
||||
postmistress-ship
|
||||
postmodern
|
||||
postmortal
|
||||
post-mortem
|
||||
postmortem
|
||||
@@ -327067,6 +327075,7 @@ ptychopterygial
|
||||
ptychopterygium
|
||||
Ptychosperma
|
||||
p-type
|
||||
ptys
|
||||
ptysmagogue
|
||||
ptyxis
|
||||
PU
|
||||
@@ -341767,6 +341776,7 @@ reimplanted
|
||||
reimplanting
|
||||
reimplants
|
||||
reimplement
|
||||
reimplementation
|
||||
reimplemented
|
||||
reimplied
|
||||
reimply
|
||||
@@ -354223,6 +354233,7 @@ run-through
|
||||
runtier
|
||||
runtiest
|
||||
runtime
|
||||
runtimes
|
||||
runtiness
|
||||
runtish
|
||||
runtishly
|
||||
@@ -418869,6 +418880,7 @@ time-shrouded
|
||||
time-space
|
||||
time-spirit
|
||||
timestamp
|
||||
timestamped
|
||||
timestamps
|
||||
timet
|
||||
time-table
|
||||
@@ -420365,6 +420377,7 @@ tokening
|
||||
tokenism
|
||||
tokenisms
|
||||
tokenize
|
||||
tokenizes
|
||||
tokenless
|
||||
token-money
|
||||
tokens
|
||||
@@ -432740,6 +432753,7 @@ uintjie
|
||||
UIP
|
||||
Uird
|
||||
Uirina
|
||||
UIs
|
||||
Uis
|
||||
UIT
|
||||
uit
|
||||
@@ -459678,6 +459692,7 @@ versines
|
||||
versing
|
||||
version
|
||||
versional
|
||||
versioned
|
||||
versioner
|
||||
versionist
|
||||
versionize
|
||||
@@ -1,5 +1,6 @@
|
||||
Consolas
|
||||
emoji
|
||||
emojis
|
||||
Extralight
|
||||
Gabriola
|
||||
Iosevka
|
||||
@@ -1,17 +1,26 @@
|
||||
ACLs
|
||||
ADMINS
|
||||
altform
|
||||
altforms
|
||||
appendwttlogging
|
||||
backplating
|
||||
bitmaps
|
||||
BOMs
|
||||
CPLs
|
||||
CPRs
|
||||
DACL
|
||||
DACLs
|
||||
diffs
|
||||
disposables
|
||||
dotnetfeed
|
||||
DTDs
|
||||
DWINRT
|
||||
enablewttlogging
|
||||
LKG
|
||||
mfcribbon
|
||||
microsoft
|
||||
microsoftonline
|
||||
muxc
|
||||
netcore
|
||||
osgvsowi
|
||||
pgc
|
||||
@@ -30,6 +39,7 @@ systemroot
|
||||
taskkill
|
||||
tasklist
|
||||
tdbuildteamid
|
||||
VCRT
|
||||
vcruntime
|
||||
visualstudio
|
||||
VSTHRD
|
||||
@@ -38,3 +48,4 @@ wslpath
|
||||
wtl
|
||||
wtt
|
||||
wttlog
|
||||
Xamarin
|
||||
@@ -8,19 +8,24 @@ dhowett
|
||||
Diviness
|
||||
dsafa
|
||||
duhowett
|
||||
ekg
|
||||
ethanschoonover
|
||||
Firefox
|
||||
Gatta
|
||||
glsl
|
||||
Grie
|
||||
Griese
|
||||
Hernan
|
||||
Howett
|
||||
Illhardt
|
||||
iquilezles
|
||||
jantari
|
||||
jerrysh
|
||||
Kaiyu
|
||||
kimwalisch
|
||||
KMehrain
|
||||
KODELIFE
|
||||
Kodelife
|
||||
Kourosh
|
||||
kowalczyk
|
||||
leonmsft
|
||||
@@ -29,16 +34,23 @@ lukesampson
|
||||
Manandhar
|
||||
mbadolato
|
||||
Mehrain
|
||||
menger
|
||||
mgravell
|
||||
michaelniksa
|
||||
michkap
|
||||
migrie
|
||||
mikegr
|
||||
mikemaccana
|
||||
miloush
|
||||
miniksa
|
||||
niksa
|
||||
nvaccess
|
||||
nvda
|
||||
oising
|
||||
oldnewthing
|
||||
opengl
|
||||
osgwiki
|
||||
pabhojwa
|
||||
paulcam
|
||||
pauldotknopf
|
||||
PGP
|
||||
@@ -46,17 +58,19 @@ Pham
|
||||
Rincewind
|
||||
rprichard
|
||||
Schoonover
|
||||
shadertoy
|
||||
Somuah
|
||||
sonph
|
||||
sonpham
|
||||
stakx
|
||||
thereses
|
||||
Walisch
|
||||
Wirt
|
||||
Wojciech
|
||||
zadjii
|
||||
Zamor
|
||||
Zamora
|
||||
zamora
|
||||
Zamora
|
||||
Zoey
|
||||
zorio
|
||||
Zverovich
|
||||
@@ -35,7 +35,7 @@ SUMS$
|
||||
\.pbxproj$
|
||||
\.pdf$
|
||||
\.pem$
|
||||
\.png$
|
||||
(?:(?i)\.png$)
|
||||
\.psd$
|
||||
\.runsettings$
|
||||
\.sig$
|
||||
@@ -45,6 +45,7 @@ SUMS$
|
||||
\.tar$
|
||||
\.tgz$
|
||||
\.ttf$
|
||||
\.vsdx$
|
||||
\.woff
|
||||
\.xcf$
|
||||
\.xls
|
||||
@@ -58,6 +59,8 @@ SUMS$
|
||||
^src/interactivity/onecore/BgfxEngine\.
|
||||
^src/renderer/wddmcon/WddmConRenderer\.
|
||||
^src/terminal/parser/ft_fuzzer/VTCommandFuzzer\.cpp$
|
||||
^src/types/ut_types/UtilsTests.cpp$
|
||||
^src/tools/U8U16Test/(?:fr|ru|zh)\.txt$
|
||||
^\.github/actions/spell-check/
|
||||
^\.github/actions/spelling/
|
||||
^\.gitignore$
|
||||
^doc/reference/master-sequence-list.csv$
|
||||
@@ -1,8 +1,10 @@
|
||||
AAAAAABBBBBBCCC
|
||||
AAAAABBBBBBBCCC
|
||||
AAAAABBBBBBCCC
|
||||
AAAAABCCCCCCCCC
|
||||
AAAAADCCCCCCCCC
|
||||
ABANDONFONT
|
||||
abcd
|
||||
ABCDEFGHIJKLMNO
|
||||
ABCG
|
||||
abf
|
||||
@@ -20,12 +22,13 @@ activatable
|
||||
ACTIVEBORDER
|
||||
ACTIVECAPTION
|
||||
ADDALIAS
|
||||
ADDB
|
||||
ADDREF
|
||||
addressof
|
||||
ADDSTRING
|
||||
ADDTOOL
|
||||
AEnd
|
||||
aef
|
||||
AEnd
|
||||
AFew
|
||||
AFill
|
||||
AFX
|
||||
@@ -33,7 +36,6 @@ AHelper
|
||||
ahz
|
||||
AImpl
|
||||
AInplace
|
||||
akb
|
||||
ALIGNRIGHT
|
||||
alloc
|
||||
allocing
|
||||
@@ -62,7 +64,6 @@ apiset
|
||||
apos
|
||||
APPBARDATA
|
||||
appconsult
|
||||
appdata
|
||||
APPICON
|
||||
appium
|
||||
applet
|
||||
@@ -109,10 +110,9 @@ aumid
|
||||
Authenticode
|
||||
AUTOBUDDY
|
||||
AUTOCHECKBOX
|
||||
Autogenerated
|
||||
autogenerated
|
||||
autohide
|
||||
AUTOHSCROLL
|
||||
autologin
|
||||
automagically
|
||||
autopositioning
|
||||
AUTORADIOBUTTON
|
||||
@@ -133,6 +133,7 @@ backstory
|
||||
Batang
|
||||
baz
|
||||
Bazz
|
||||
BBBBBCCC
|
||||
BBBBCCCCC
|
||||
BBDM
|
||||
bbwe
|
||||
@@ -171,7 +172,7 @@ bmp
|
||||
BOLDFONT
|
||||
BOOLIFY
|
||||
bools
|
||||
Bopomofo
|
||||
boostorg
|
||||
Borland
|
||||
BOTTOMLEFT
|
||||
BOTTOMRIGHT
|
||||
@@ -251,7 +252,7 @@ charset
|
||||
CHARSETINFO
|
||||
chcp
|
||||
checkbox
|
||||
Checkboxes
|
||||
checkboxes
|
||||
chh
|
||||
Childitem
|
||||
chk
|
||||
@@ -295,6 +296,7 @@ CNTRL
|
||||
codebase
|
||||
Codeflow
|
||||
codepage
|
||||
codepath
|
||||
codepoint
|
||||
codeproject
|
||||
COINIT
|
||||
@@ -353,12 +355,12 @@ conprops
|
||||
conpropsp
|
||||
conpty
|
||||
conptylib
|
||||
consecteturadipiscingelit
|
||||
conserv
|
||||
consoleapi
|
||||
CONSOLECONTROL
|
||||
CONSOLEENDTASK
|
||||
consolegit
|
||||
consolehost
|
||||
CONSOLEIME
|
||||
consoleinternal
|
||||
Consoleroot
|
||||
@@ -386,14 +388,13 @@ CORESYSTEM
|
||||
cotaskmem
|
||||
countof
|
||||
cout
|
||||
CParams
|
||||
CPG
|
||||
cpinfo
|
||||
CPINFOEX
|
||||
cplinfo
|
||||
cplusplus
|
||||
cpp
|
||||
cppcorecheck
|
||||
CPPCORECHECK
|
||||
cppcorecheckrules
|
||||
cpprest
|
||||
cpprestsdk
|
||||
@@ -416,7 +417,7 @@ csbi
|
||||
csbiex
|
||||
csharp
|
||||
CSHORT
|
||||
cso
|
||||
CSIDL
|
||||
csproj
|
||||
Csr
|
||||
csrmsg
|
||||
@@ -429,7 +430,7 @@ cstdlib
|
||||
cstr
|
||||
cstring
|
||||
cstyle
|
||||
CSV
|
||||
csv
|
||||
CSwitch
|
||||
CText
|
||||
ctime
|
||||
@@ -505,27 +506,28 @@ DCOLORVALUE
|
||||
dcommon
|
||||
DCompile
|
||||
dcompiler
|
||||
DComposition
|
||||
dde
|
||||
DDESHARE
|
||||
DDevice
|
||||
DEADCHAR
|
||||
dealloc
|
||||
debian
|
||||
Debian
|
||||
debolden
|
||||
debounce
|
||||
debugbreak
|
||||
DECALN
|
||||
DECANM
|
||||
DECAUPSS
|
||||
DECAWM
|
||||
DECCKM
|
||||
DECCOLM
|
||||
DECDHL
|
||||
DECDWL
|
||||
DECEKBD
|
||||
decf
|
||||
DECID
|
||||
DECKPAM
|
||||
DECKPM
|
||||
DECKPNM
|
||||
DECLL
|
||||
DECLRMM
|
||||
decls
|
||||
declspec
|
||||
@@ -552,12 +554,12 @@ DECSEL
|
||||
DECSET
|
||||
DECSLPP
|
||||
DECSLRM
|
||||
DECSMBV
|
||||
DECSMKR
|
||||
DECSR
|
||||
decstandar
|
||||
DECSTBM
|
||||
DECSTR
|
||||
DECSWL
|
||||
DECTCEM
|
||||
Dedupe
|
||||
deduplicated
|
||||
@@ -601,6 +603,7 @@ devops
|
||||
Dext
|
||||
df
|
||||
DFactory
|
||||
DFF
|
||||
DFMT
|
||||
dh
|
||||
dhandler
|
||||
@@ -627,7 +630,6 @@ DLLVERSIONINFO
|
||||
DLOAD
|
||||
DLOOK
|
||||
dmp
|
||||
dnceng
|
||||
DOCTYPE
|
||||
docx
|
||||
DONTCARE
|
||||
@@ -645,6 +647,7 @@ dpiy
|
||||
DRAWFRAME
|
||||
DRAWITEM
|
||||
DRAWITEMSTRUCT
|
||||
drcs
|
||||
dropdown
|
||||
DROPDOWNLIST
|
||||
DROPFILES
|
||||
@@ -679,6 +682,7 @@ ECH
|
||||
echokey
|
||||
ecount
|
||||
ECpp
|
||||
Edgium
|
||||
EDITKEYS
|
||||
EDITTEXT
|
||||
EDITUPDATE
|
||||
@@ -689,7 +693,7 @@ EHsc
|
||||
EJO
|
||||
EK
|
||||
ELEMENTNOTAVAILABLE
|
||||
Elems
|
||||
elems
|
||||
elif
|
||||
elseif
|
||||
emacs
|
||||
@@ -715,7 +719,6 @@ EPres
|
||||
ERASEBKGND
|
||||
errno
|
||||
errorlevel
|
||||
esa
|
||||
ETB
|
||||
etcoreapp
|
||||
ETW
|
||||
@@ -767,10 +770,11 @@ FFrom
|
||||
FGCOLOR
|
||||
fgetc
|
||||
fgetwc
|
||||
FGHIJ
|
||||
fgidx
|
||||
FILEDESCRIPTION
|
||||
fileno
|
||||
FILEPATH
|
||||
filepath
|
||||
FILESUBTYPE
|
||||
FILESYSPATH
|
||||
filesystem
|
||||
@@ -840,6 +844,7 @@ fuzzwrapper
|
||||
fwdecl
|
||||
fwe
|
||||
fwlink
|
||||
GAUSSIAN
|
||||
gb
|
||||
gci
|
||||
gcx
|
||||
@@ -847,7 +852,6 @@ gcy
|
||||
gdi
|
||||
gdip
|
||||
gdirenderer
|
||||
GENERATEPROJECTPRIFILE
|
||||
geopol
|
||||
GETALIAS
|
||||
GETALIASES
|
||||
@@ -885,6 +889,7 @@ GETLBTEXT
|
||||
getline
|
||||
GETMINMAXINFO
|
||||
GETMOUSEINFO
|
||||
GETMOUSEVANISH
|
||||
GETNUMBEROFFONTS
|
||||
GETNUMBEROFINPUTEVENTS
|
||||
GETOBJECT
|
||||
@@ -905,6 +910,9 @@ GFEh
|
||||
Gfun
|
||||
gfx
|
||||
gh
|
||||
GHIJK
|
||||
GHIJKL
|
||||
GHIJKLM
|
||||
gitfilters
|
||||
github
|
||||
gitlab
|
||||
@@ -917,6 +925,7 @@ Goldmine
|
||||
gonce
|
||||
Google
|
||||
goutput
|
||||
GPUs
|
||||
Gravell's
|
||||
grayscale
|
||||
GREENSCROLL
|
||||
@@ -931,7 +940,6 @@ GTP
|
||||
guc
|
||||
gui
|
||||
guidatom
|
||||
guidgenerator
|
||||
GValue
|
||||
GWL
|
||||
GWLP
|
||||
@@ -963,7 +971,6 @@ hfont
|
||||
hglobal
|
||||
hh
|
||||
hhh
|
||||
hhhh
|
||||
hhook
|
||||
hhx
|
||||
HIBYTE
|
||||
@@ -990,7 +997,7 @@ hmod
|
||||
hmodule
|
||||
hmon
|
||||
HMONITOR
|
||||
Horiz
|
||||
horiz
|
||||
HORZ
|
||||
hostable
|
||||
hostlib
|
||||
@@ -1048,8 +1055,10 @@ IData
|
||||
IDCANCEL
|
||||
IDD
|
||||
IDesktop
|
||||
IDevice
|
||||
IDictionary
|
||||
IDISHWND
|
||||
IDispatch
|
||||
IDisposable
|
||||
idl
|
||||
idllib
|
||||
@@ -1072,7 +1081,9 @@ IFont
|
||||
ifstream
|
||||
IGNOREEND
|
||||
IHigh
|
||||
IHosted
|
||||
iid
|
||||
IInitialize
|
||||
IInput
|
||||
IInspectable
|
||||
IInteract
|
||||
@@ -1100,11 +1111,10 @@ INITMENU
|
||||
inkscape
|
||||
inl
|
||||
INLINEPREFIX
|
||||
Inlines
|
||||
inlines
|
||||
INotify
|
||||
inout
|
||||
INPATHROOT
|
||||
Inplace
|
||||
inplace
|
||||
inproc
|
||||
Inputkeyinfo
|
||||
INPUTPROCESSORPROFILE
|
||||
@@ -1167,6 +1177,7 @@ IValue
|
||||
IVector
|
||||
IWait
|
||||
iwch
|
||||
IWeb
|
||||
IWin
|
||||
IWindow
|
||||
IXaml
|
||||
@@ -1193,11 +1204,10 @@ kcud
|
||||
kcuf
|
||||
kcuu
|
||||
Kd
|
||||
keith
|
||||
kernelbase
|
||||
kernelbasestaging
|
||||
KEYBDINPUT
|
||||
keybinding
|
||||
keybound
|
||||
keychord
|
||||
keydown
|
||||
keyevent
|
||||
@@ -1215,6 +1225,7 @@ KILLFOCUS
|
||||
kinda
|
||||
KJ
|
||||
KLF
|
||||
KLMNO
|
||||
KLMNOPQRST
|
||||
KLMNOPQRSTQQQQQ
|
||||
KU
|
||||
@@ -1261,6 +1272,7 @@ lld
|
||||
llvm
|
||||
llx
|
||||
LMENU
|
||||
LMNOP
|
||||
lnk
|
||||
lnkd
|
||||
lnkfile
|
||||
@@ -1275,7 +1287,6 @@ Loewen
|
||||
LOGFONT
|
||||
LOGFONTW
|
||||
logissue
|
||||
Loremipsumdolorsitamet
|
||||
lowercased
|
||||
loword
|
||||
lparam
|
||||
@@ -1303,6 +1314,7 @@ LPFNADDPROPSHEETPAGE
|
||||
LPINT
|
||||
lpl
|
||||
LPMEASUREITEMSTRUCT
|
||||
LPMINMAXINFO
|
||||
lpmsg
|
||||
LPNEWCPLINFO
|
||||
LPNEWCPLINFOA
|
||||
@@ -1334,6 +1346,7 @@ lsproj
|
||||
lss
|
||||
lstatus
|
||||
lstrcmp
|
||||
lstrcmpi
|
||||
LTEXT
|
||||
LTLTLTLTL
|
||||
ltype
|
||||
@@ -1348,7 +1361,6 @@ mailto
|
||||
majorly
|
||||
makeappx
|
||||
MAKEINTRESOURCE
|
||||
MAKEINTRESOURCEA
|
||||
MAKEINTRESOURCEW
|
||||
MAKELANGID
|
||||
MAKELONG
|
||||
@@ -1401,6 +1413,8 @@ mindbogglingly
|
||||
mingw
|
||||
minimizeall
|
||||
minkernel
|
||||
MINMAXINFO
|
||||
mintty
|
||||
minwin
|
||||
minwindef
|
||||
Mip
|
||||
@@ -1410,6 +1424,8 @@ mmcc
|
||||
MMCPL
|
||||
mmsystem
|
||||
MNC
|
||||
MNOPQ
|
||||
MNOPQR
|
||||
MODALFRAME
|
||||
modelproj
|
||||
MODERNCORE
|
||||
@@ -1421,7 +1437,6 @@ monostate
|
||||
MOUSEACTIVATE
|
||||
MOUSEFIRST
|
||||
MOUSEHWHEEL
|
||||
mousemode
|
||||
MOUSEMOVE
|
||||
mousewheel
|
||||
MOVESTART
|
||||
@@ -1438,12 +1453,12 @@ MSGF
|
||||
MSGFILTER
|
||||
MSGFLG
|
||||
MSGMARKMODE
|
||||
MSGS
|
||||
MSGSCROLLMODE
|
||||
MSGSELECTMODE
|
||||
msiexec
|
||||
MSIL
|
||||
msix
|
||||
msixbundle
|
||||
msrc
|
||||
msvcrt
|
||||
MSVS
|
||||
@@ -1453,6 +1468,7 @@ mui
|
||||
Mul
|
||||
multiline
|
||||
munged
|
||||
munges
|
||||
mutex
|
||||
mutexes
|
||||
muxes
|
||||
@@ -1467,10 +1483,8 @@ nameof
|
||||
namespace
|
||||
namespaced
|
||||
namestream
|
||||
Namquiseratal
|
||||
nano
|
||||
natvis
|
||||
naws
|
||||
nbsp
|
||||
Nc
|
||||
NCCALCSIZE
|
||||
@@ -1510,16 +1524,19 @@ NOACTIVATE
|
||||
NOAPPLYNOW
|
||||
NOCLIP
|
||||
NOCOLOR
|
||||
NOCOMM
|
||||
NOCONTEXTHELP
|
||||
NOCOPYBITS
|
||||
nodiscard
|
||||
NODUP
|
||||
noexcept
|
||||
NOHELP
|
||||
noinline
|
||||
NOINTEGRALHEIGHT
|
||||
NOINTERFACE
|
||||
NOLINKINFO
|
||||
nologo
|
||||
NOMCX
|
||||
NOMINMAX
|
||||
NOMOVE
|
||||
NONALERT
|
||||
@@ -1531,6 +1548,7 @@ NONPREROTATED
|
||||
nonspace
|
||||
NOOWNERZORDER
|
||||
NOPAINT
|
||||
NOPQRST
|
||||
noprofile
|
||||
NOREDRAW
|
||||
NOREMOVE
|
||||
@@ -1552,7 +1570,6 @@ NOTNULL
|
||||
NOTOPMOST
|
||||
NOTRACK
|
||||
NOTSUPPORTED
|
||||
notypeopt
|
||||
nouicompat
|
||||
nounihan
|
||||
NOUPDATE
|
||||
@@ -1583,15 +1600,16 @@ NTVDM
|
||||
ntverp
|
||||
NTWIN
|
||||
nuget
|
||||
Nullametrutrummetus
|
||||
nullness
|
||||
nullonfailure
|
||||
nullopt
|
||||
nullptr
|
||||
NULs
|
||||
numlock
|
||||
numpad
|
||||
NUMSCROLL
|
||||
nupkg
|
||||
NVDA
|
||||
NVIDIA
|
||||
NVR
|
||||
Nx
|
||||
@@ -1600,6 +1618,7 @@ OACR
|
||||
oauth
|
||||
objbase
|
||||
ocf
|
||||
ocolor
|
||||
odl
|
||||
oem
|
||||
oemcp
|
||||
@@ -1621,13 +1640,13 @@ ONECOREWINDOWS
|
||||
onehalf
|
||||
ONLCR
|
||||
Oo
|
||||
openconsoleproxy
|
||||
openbash
|
||||
opencode
|
||||
opencon
|
||||
openconsole
|
||||
OPENIF
|
||||
OPENLINK
|
||||
openlogo
|
||||
openps
|
||||
opensource
|
||||
openvt
|
||||
@@ -1799,6 +1818,7 @@ pragma
|
||||
prc
|
||||
prealigned
|
||||
prebuilt
|
||||
precendence
|
||||
precomp
|
||||
prect
|
||||
prefast
|
||||
@@ -1820,6 +1840,8 @@ prioritization
|
||||
processenv
|
||||
processhost
|
||||
PROCESSINFOCLASS
|
||||
procs
|
||||
Progman
|
||||
proj
|
||||
PROPERTYID
|
||||
PROPERTYKEY
|
||||
@@ -1884,6 +1906,8 @@ pythonw
|
||||
qi
|
||||
QJ
|
||||
qo
|
||||
QOL
|
||||
QRSTU
|
||||
qsort
|
||||
queryable
|
||||
QUESTIONMARK
|
||||
@@ -1892,10 +1916,12 @@ QWER
|
||||
qzmp
|
||||
RAII
|
||||
RALT
|
||||
rasterbar
|
||||
rasterfont
|
||||
rasterization
|
||||
rawinput
|
||||
RAWPATH
|
||||
raytracers
|
||||
razzlerc
|
||||
rbar
|
||||
rbegin
|
||||
@@ -1951,7 +1977,8 @@ REGSTR
|
||||
reingest
|
||||
Relayout
|
||||
RELBINPATH
|
||||
Remoting
|
||||
remoting
|
||||
renamer
|
||||
renderengine
|
||||
rendersize
|
||||
reparent
|
||||
@@ -1961,13 +1988,12 @@ Replymessage
|
||||
repositorypath
|
||||
rescap
|
||||
Resequence
|
||||
Reserialize
|
||||
reserialize
|
||||
RESETCONTENT
|
||||
resheader
|
||||
resizable
|
||||
resmimetype
|
||||
restrictedcapabilities
|
||||
restrictederrorinfo
|
||||
resw
|
||||
resx
|
||||
retval
|
||||
@@ -1979,7 +2005,6 @@ rgba
|
||||
rgbi
|
||||
rgch
|
||||
rgci
|
||||
rgdx
|
||||
rgfae
|
||||
rgfte
|
||||
rgi
|
||||
@@ -1989,12 +2014,10 @@ rgpwsz
|
||||
rgrc
|
||||
rgs
|
||||
rgui
|
||||
rgus
|
||||
rgw
|
||||
rgwch
|
||||
rhs
|
||||
ri
|
||||
richturn
|
||||
RIGHTALIGN
|
||||
RIGHTBUTTON
|
||||
riid
|
||||
@@ -2031,6 +2054,7 @@ runuia
|
||||
runut
|
||||
rvalue
|
||||
RVERTICAL
|
||||
rxvt
|
||||
RWIN
|
||||
safearray
|
||||
SAFECAST
|
||||
@@ -2068,7 +2092,6 @@ SCROLLSCALE
|
||||
SCROLLSCREENBUFFER
|
||||
Scrollup
|
||||
Scrolluppage
|
||||
Scs
|
||||
scursor
|
||||
sddl
|
||||
sdeleted
|
||||
@@ -2125,7 +2148,7 @@ sfi
|
||||
SFINAE
|
||||
SFUI
|
||||
sgr
|
||||
SGRXY
|
||||
SHANDLE
|
||||
SHCo
|
||||
shcore
|
||||
shellapi
|
||||
@@ -2133,6 +2156,7 @@ shellex
|
||||
shellscalingapi
|
||||
SHFILEINFO
|
||||
SHGFI
|
||||
SHGFP
|
||||
SHIFTJIS
|
||||
Shl
|
||||
shlguid
|
||||
@@ -2212,6 +2236,7 @@ Statusline
|
||||
stdafx
|
||||
STDAPI
|
||||
stdcall
|
||||
stdcpp
|
||||
stderr
|
||||
stdexcept
|
||||
stdin
|
||||
@@ -2234,6 +2259,7 @@ strrev
|
||||
strsafe
|
||||
strtok
|
||||
structs
|
||||
STUVWX
|
||||
STX
|
||||
stylecop
|
||||
SUA
|
||||
@@ -2242,7 +2268,6 @@ subkey
|
||||
SUBLANG
|
||||
sublicensable
|
||||
submenu
|
||||
subnegotiation
|
||||
subresource
|
||||
subspan
|
||||
substr
|
||||
@@ -2253,7 +2278,6 @@ svg
|
||||
swapchain
|
||||
swapchainpanel
|
||||
swappable
|
||||
Switchto
|
||||
SWMR
|
||||
SWP
|
||||
swprintf
|
||||
@@ -2298,7 +2322,7 @@ TCI
|
||||
tcome
|
||||
tcommandline
|
||||
tcommands
|
||||
tcon
|
||||
TDelegated
|
||||
TDP
|
||||
TEAMPROJECT
|
||||
tearoff
|
||||
@@ -2308,8 +2332,8 @@ technet
|
||||
tellp
|
||||
telnet
|
||||
telnetd
|
||||
telnetpp
|
||||
templated
|
||||
teraflop
|
||||
terminalcore
|
||||
TERMINALSCROLLING
|
||||
terminfo
|
||||
@@ -2338,7 +2362,7 @@ texel
|
||||
TExpected
|
||||
textattribute
|
||||
TEXTATTRIBUTEID
|
||||
Textbox
|
||||
textbox
|
||||
textboxes
|
||||
textbuffer
|
||||
TEXTINCLUDE
|
||||
@@ -2362,6 +2386,7 @@ titlebar
|
||||
TITLEISLINKNAME
|
||||
TJson
|
||||
tl
|
||||
TLambda
|
||||
TLEN
|
||||
Tlg
|
||||
Tlgdata
|
||||
@@ -2433,6 +2458,7 @@ typename
|
||||
typeof
|
||||
typeparam
|
||||
TYUI
|
||||
UAC
|
||||
uap
|
||||
uapadmin
|
||||
UAX
|
||||
@@ -2443,7 +2469,7 @@ ucdxml
|
||||
uch
|
||||
UCHAR
|
||||
ucs
|
||||
UDKs
|
||||
udk
|
||||
UDM
|
||||
uer
|
||||
uget
|
||||
@@ -2531,10 +2557,12 @@ utr
|
||||
uuid
|
||||
uuidof
|
||||
uuidv
|
||||
UVWX
|
||||
UVWXY
|
||||
UWA
|
||||
uwp
|
||||
uxtheme
|
||||
Vals
|
||||
vals
|
||||
Vanara
|
||||
vararg
|
||||
vbproj
|
||||
@@ -2598,6 +2626,7 @@ VTRGBTo
|
||||
vtseq
|
||||
vtterm
|
||||
vttest
|
||||
VWX
|
||||
waaay
|
||||
waitable
|
||||
waivable
|
||||
@@ -2611,6 +2640,7 @@ wch
|
||||
wchar
|
||||
WCIA
|
||||
WCIW
|
||||
WClass
|
||||
wcout
|
||||
wcschr
|
||||
wcscmp
|
||||
@@ -2705,12 +2735,11 @@ wintelnet
|
||||
winternl
|
||||
winuser
|
||||
winuserp
|
||||
winver
|
||||
WINVER
|
||||
wistd
|
||||
wixproj
|
||||
wline
|
||||
wlinestream
|
||||
Wlk
|
||||
wmain
|
||||
WMSZ
|
||||
wnd
|
||||
@@ -2753,7 +2782,6 @@ WRunoff
|
||||
WScript
|
||||
wsl
|
||||
WSLENV
|
||||
wslhome
|
||||
wsmatch
|
||||
WSpace
|
||||
wss
|
||||
@@ -2767,6 +2795,7 @@ WTEXT
|
||||
WTo
|
||||
wtof
|
||||
wtoi
|
||||
WTs
|
||||
wtw
|
||||
wtypes
|
||||
Wubi
|
||||
@@ -2794,14 +2823,13 @@ XColors
|
||||
xcopy
|
||||
XCount
|
||||
xdy
|
||||
xe
|
||||
XEncoding
|
||||
xes
|
||||
Xes
|
||||
XES
|
||||
xff
|
||||
XFile
|
||||
xlang
|
||||
XFORM
|
||||
XManifest
|
||||
XMath
|
||||
XMFLOAT
|
||||
@@ -2820,12 +2848,15 @@ XSubstantial
|
||||
xtended
|
||||
xterm
|
||||
XTest
|
||||
XTPUSHSGR
|
||||
XTPOPSGR
|
||||
xunit
|
||||
xutr
|
||||
xvalue
|
||||
XVIRTUALSCREEN
|
||||
XWalk
|
||||
xy
|
||||
Xzn
|
||||
yact
|
||||
YAML
|
||||
YCast
|
||||
@@ -2841,6 +2872,7 @@ YVIRTUALSCREEN
|
||||
Yw
|
||||
YWalk
|
||||
yx
|
||||
YZ
|
||||
Zc
|
||||
ZCmd
|
||||
ZCtrl
|
||||
@@ -13,3 +13,6 @@ fixterms
|
||||
uk
|
||||
winui
|
||||
appshellintegration
|
||||
cppreference
|
||||
gfycat
|
||||
what3words
|
||||
@@ -4,7 +4,8 @@ https://www\.itscj\.ipsj\.or\.jp/iso-ir/[-0-9]+\.pdf
|
||||
https://www\.vt100\.net/docs/[-a-zA-Z0-9#_\/.]*
|
||||
https://www.w3.org/[-a-zA-Z0-9?&=\/_#]*
|
||||
https://(?:(?:www\.|)youtube\.com|youtu.be)/[-a-zA-Z0-9?&=]*
|
||||
https://[a-z-]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
|
||||
https://(?:[a-z-]+\.|)github(?:usercontent|)\.com/[-a-zA-Z0-9?%&=_\/.]*
|
||||
https://www.xfree86.org/[-a-zA-Z0-9?&=\/_#]*
|
||||
[Pp]ublicKeyToken="?[0-9a-fA-F]{16}"?
|
||||
(?:[{"]|UniqueIdentifier>)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}(?:[}"]|</UniqueIdentifier)
|
||||
(?:0[Xx]|\\x|U\+|#)[a-f0-9A-FGgRr]{2,}[Uu]?[Ll]{0,2}\b
|
||||
@@ -15,7 +16,7 @@ Scro\&ll
|
||||
:\\windows\\syste\b
|
||||
TestUtils::VerifyExpectedString\(tb, L"[^"]+"
|
||||
(?:hostSm|mach)\.ProcessString\(L"[^"]+"
|
||||
\b([A-Za-z])\1{3,}\b
|
||||
\b([A-Za-z])\g{-1}{3,}\b
|
||||
0x[0-9A-Za-z]+
|
||||
Base64::s_(?:En|De)code\(L"[^"]+"
|
||||
VERIFY_ARE_EQUAL\(L"[^"]+"
|
||||
2
.github/linters/.markdown-lint.yml
vendored
@@ -28,11 +28,13 @@ MD007:
|
||||
indent: 2 # Unordered list indentation
|
||||
MD013:
|
||||
line_length: 400 # Line length 80 is far to short
|
||||
MD024: false # Allow multiple headings with same content
|
||||
MD026:
|
||||
punctuation: ".,;:!。,;:" # List of not allowed
|
||||
MD029: false # Ordered list item prefix
|
||||
MD033: false # Allow inline HTML
|
||||
MD036: false # Emphasis used instead of a heading
|
||||
MD040: false # Allow ``` blocks in md files with no language specified
|
||||
|
||||
#################
|
||||
# Rules by tags #
|
||||
|
||||
51
.github/workflows/linter.yml
vendored
@@ -1,51 +0,0 @@
|
||||
---
|
||||
###########################
|
||||
###########################
|
||||
## Linter GitHub Actions ##
|
||||
###########################
|
||||
###########################
|
||||
name: Lint Code Base
|
||||
|
||||
#
|
||||
# Documentation:
|
||||
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||
#
|
||||
|
||||
#############################
|
||||
# Start the job on all push #
|
||||
#############################
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
|
||||
###############
|
||||
# Set the Job #
|
||||
###############
|
||||
jobs:
|
||||
build:
|
||||
# Name the Job
|
||||
name: Lint Code Base
|
||||
# Set the agent to run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
##################
|
||||
# Load all steps #
|
||||
##################
|
||||
steps:
|
||||
##########################
|
||||
# Checkout the code base #
|
||||
##########################
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
################################
|
||||
# Run Linter against code base #
|
||||
################################
|
||||
- name: Lint Code Base
|
||||
uses: github/super-linter@v3.10.0
|
||||
env:
|
||||
VALIDATE_ALL_CODEBASE: false
|
||||
DEFAULT_BRANCH: master
|
||||
MARKDOWN_CONFIG_FILE: .markdown-lint.yml
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
VALIDATE_EDITORCONFIG: false
|
||||
11
.github/workflows/spelling.yml
vendored
@@ -1,9 +1,7 @@
|
||||
name: Spell checking
|
||||
on:
|
||||
pull_request_target:
|
||||
push:
|
||||
schedule:
|
||||
# * is a special character in YAML so you have to quote this string
|
||||
- cron: '15 * * * *'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -12,9 +10,6 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v2.0.0
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
fetch-depth: 5
|
||||
- uses: check-spelling/check-spelling@0.0.16-alpha
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
bucket: .github/actions
|
||||
project: spell-check
|
||||
- uses: check-spelling/check-spelling@0.0.17-alpha
|
||||
|
||||
@@ -14,7 +14,7 @@ The point of doing all this work in public is to ensure that we are holding ours
|
||||
|
||||
The team triages new issues several times a week. During triage, the team uses labels to categorize, manage, and drive the project workflow.
|
||||
|
||||
We employ [a bot engine](https://github.com/microsoft/terminal/blob/master/doc/bot.md) to help us automate common processes within our workflow.
|
||||
We employ [a bot engine](https://github.com/microsoft/terminal/blob/main/doc/bot.md) to help us automate common processes within our workflow.
|
||||
|
||||
We drive the bot by tagging issues with specific labels which cause the bot engine to close issues, merge branches, etc. This bot engine helps us keep the repo clean by automating the process of notifying appropriate parties if/when information/follow-up is needed, and closing stale issues/PRs after reminders have remained unanswered for several days.
|
||||
|
||||
@@ -156,7 +156,7 @@ When you'd like the team to take a look, (even if the work is not yet fully-comp
|
||||
|
||||
### Merge
|
||||
|
||||
Once your code has been reviewed and approved by the requisite number of team members, it will be merged into the master branch. Once merged, your PR will be automatically closed.
|
||||
Once your code has been reviewed and approved by the requisite number of team members, it will be merged into the main branch. Once merged, your PR will be automatically closed.
|
||||
|
||||
---
|
||||
|
||||
|
||||
77
NOTICE.md
@@ -2,7 +2,7 @@
|
||||
Do Not Translate or Localize
|
||||
|
||||
This software incorporates material from third parties. Microsoft makes certain
|
||||
open source code available at http://3rdpartysource.microsoft.com, or you may
|
||||
open source code available at [http://3rdpartysource.microsoft.com](http://3rdpartysource.microsoft.com), or you may
|
||||
send a check or money order for US $5.00, including the product name, the open
|
||||
source component name, and version number, to:
|
||||
|
||||
@@ -20,7 +20,7 @@ General Public License.
|
||||
|
||||
## jsoncpp
|
||||
|
||||
**Source**: https://github.com/open-source-parsers/jsoncpp
|
||||
**Source**: [https://github.com/open-source-parsers/jsoncpp](https://github.com/open-source-parsers/jsoncpp)
|
||||
|
||||
### License
|
||||
|
||||
@@ -50,7 +50,7 @@ SOFTWARE.
|
||||
|
||||
## chromium/base/numerics
|
||||
|
||||
**Source**: https://github.com/chromium/chromium/tree/master/base/numerics
|
||||
**Source**: [https://github.com/chromium/chromium/tree/master/base/numerics](https://github.com/chromium/chromium/tree/master/base/numerics)
|
||||
|
||||
### License
|
||||
|
||||
@@ -86,7 +86,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
## kimwalisch/libpopcnt
|
||||
|
||||
**Source**: https://github.com/kimwalisch/libpopcnt
|
||||
**Source**: [https://github.com/kimwalisch/libpopcnt](https://github.com/kimwalisch/libpopcnt)
|
||||
|
||||
### License
|
||||
|
||||
@@ -122,7 +122,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
## dynamic_bitset
|
||||
|
||||
**Source**: https://github.com/pinam45/dynamic_bitset
|
||||
**Source**: [https://github.com/pinam45/dynamic_bitset](https://github.com/pinam45/dynamic_bitset)
|
||||
|
||||
### License
|
||||
|
||||
@@ -151,9 +151,9 @@ SOFTWARE.
|
||||
|
||||
```
|
||||
|
||||
## {fmt}
|
||||
## \{fmt\}
|
||||
|
||||
**Source**: https://github.com/fmtlib/fmt
|
||||
**Source**: [https://github.com/fmtlib/fmt](https://github.com/fmtlib/fmt)
|
||||
|
||||
### License
|
||||
|
||||
@@ -188,3 +188,66 @@ of this Software are embedded into a machine-executable object form of such
|
||||
source code, you may redistribute such embedded portions in such object form
|
||||
without including the above copyright and permission notices.
|
||||
```
|
||||
|
||||
## interval_tree
|
||||
|
||||
**Source**: [https://github.com/ekg/IntervalTree](https://github.com/ekg/IntervalTree)
|
||||
|
||||
### License
|
||||
|
||||
```
|
||||
Copyright (c) 2011 Erik Garrison
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
```
|
||||
|
||||
|
||||
## boost
|
||||
|
||||
**Source**: [https://github.com/boostorg/boost](https://github.com/boostorg/boost)
|
||||
|
||||
### License
|
||||
|
||||
```
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
```
|
||||
|
||||
20
NuGet.Config
@@ -1,24 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
|
||||
<!-- Add repositories here to the list of available repositories -->
|
||||
|
||||
<!-- Dependencies that we must carry because they're not on public nuget feeds right now. -->
|
||||
<clear />
|
||||
<!-- Dependencies that we can turn on to force override for testing purposes before uploading. -->
|
||||
<!--<add key="Static Package Dependencies" value="dep\packages" />-->
|
||||
|
||||
<!-- Use our own NuGet Feed -->
|
||||
<add key="TerminalDependencies" value="https://pkgs.dev.azure.com/ms/terminal/_packaging/TerminalDependencies/nuget/v3/index.json" />
|
||||
|
||||
<!-- Temporarily? use the feeds from our friends in MUX for Helix test stuff -->
|
||||
<add key="dotnetfeed" value="https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json" />
|
||||
<add key="dnceng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" />
|
||||
<add key="MUX-Dependencies" value="https://pkgs.dev.azure.com/ms/microsoft-ui-xaml/_packaging/MUX-Dependencies/nuget/v3/index.json" />
|
||||
|
||||
<!-- Internal NuGet feeds that may not be accessible outside Microsoft corporate network -->
|
||||
<!--<add key="TAEF - internal" value="https://microsoft.pkgs.visualstudio.com/DefaultCollection/_packaging/Taef/nuget/v3/index.json" />
|
||||
<add key="OpenConsole - Internal" value="https://microsoft.pkgs.visualstudio.com/_packaging/OpenConsole/nuget/v3/index.json" />-->
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
<config>
|
||||
<add key="repositorypath" value=".\packages" />
|
||||
</config>
|
||||
|
||||
498
OpenConsole.sln
17
README.md
@@ -6,8 +6,8 @@ This repository contains the source code for:
|
||||
* [Windows Terminal Preview](https://aka.ms/terminal-preview)
|
||||
* The Windows console host (`conhost.exe`)
|
||||
* Components shared between the two projects
|
||||
* [ColorTool](https://github.com/Microsoft/Terminal/tree/master/src/tools/ColorTool)
|
||||
* [Sample projects](https://github.com/Microsoft/Terminal/tree/master/samples)
|
||||
* [ColorTool](https://github.com/microsoft/terminal/tree/main/src/tools/ColorTool)
|
||||
* [Sample projects](https://github.com/microsoft/terminal/tree/main/samples)
|
||||
that show how to consume the Windows Console APIs
|
||||
|
||||
Related repositories include:
|
||||
@@ -79,6 +79,7 @@ page](https://chocolatey.org/packages/microsoft-windows-terminal) and follow the
|
||||
release by installing the `windows-terminal` package:
|
||||
|
||||
```powershell
|
||||
scoop bucket add extras
|
||||
scoop install windows-terminal
|
||||
```
|
||||
|
||||
@@ -104,7 +105,7 @@ here](/doc/terminal-v2-roadmap.md) and will be updated as the project proceeds.
|
||||
|
||||
Project|Build Status
|
||||
---|---
|
||||
Terminal|[](https://dev.azure.com/ms/Terminal/_build?definitionId=136)
|
||||
Terminal|[](https://dev.azure.com/ms/terminal/_build?definitionId=136)
|
||||
ColorTool|
|
||||
|
||||
---
|
||||
@@ -240,7 +241,7 @@ enhance Windows Terminal\!
|
||||
|
||||
***BEFORE you start work on a feature/fix***, please read & follow our
|
||||
[Contributor's
|
||||
Guide](https://github.com/microsoft/terminal/blob/master/CONTRIBUTING.md) to
|
||||
Guide](https://github.com/microsoft/terminal/blob/main/CONTRIBUTING.md) to
|
||||
help avoid any wasted or duplicate effort.
|
||||
|
||||
## Communicating with the Team
|
||||
@@ -339,10 +340,10 @@ Please review these brief docs below about our coding practices.
|
||||
This is a work in progress as we learn what we'll need to provide people in
|
||||
order to be effective contributors to our project.
|
||||
|
||||
* [Coding Style](https://github.com/Microsoft/Terminal/blob/master/doc/STYLE.md)
|
||||
* [Code Organization](https://github.com/Microsoft/Terminal/blob/master/doc/ORGANIZATION.md)
|
||||
* [Exceptions in our legacy codebase](https://github.com/Microsoft/Terminal/blob/master/doc/EXCEPTIONS.md)
|
||||
* [Helpful smart pointers and macros for interfacing with Windows in WIL](https://github.com/Microsoft/Terminal/blob/master/doc/WIL.md)
|
||||
* [Coding Style](https://github.com/microsoft/terminal/blob/main/doc/STYLE.md)
|
||||
* [Code Organization](https://github.com/microsoft/terminal/blob/main/doc/ORGANIZATION.md)
|
||||
* [Exceptions in our legacy codebase](https://github.com/microsoft/terminal/blob/main/doc/EXCEPTIONS.md)
|
||||
* [Helpful smart pointers and macros for interfacing with Windows in WIL](https://github.com/microsoft/terminal/blob/main/doc/WIL.md)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -14,4 +14,4 @@ Support for Windows Terminal is limited to the resources listed above.
|
||||
[gh-bug]: https://github.com/microsoft/terminal/issues/new?assignees=&labels=Issue-Bug&template=bug_report.md&title=
|
||||
[gh-feature]: https://github.com/microsoft/terminal/issues/new?assignees=&labels=Issue-Feature&template=Feature_Request.md&title=
|
||||
[docs]: https://docs.microsoft.com/windows/terminal
|
||||
[contributor]: https://github.com/microsoft/terminal/blob/master/CONTRIBUTING.md
|
||||
[contributor]: https://github.com/microsoft/terminal/blob/main/CONTRIBUTING.md
|
||||
|
||||
@@ -18,7 +18,7 @@ FOR %%A IN (TestHostApp.exe,te.exe,te.processhost.exe,conhost.exe,OpenConsole.ex
|
||||
|
||||
echo %TIME%
|
||||
|
||||
:: kill dhandler, which is a tool designed to handle unexpected windows appearing. But since our tests are
|
||||
:: kill dhandler, which is a tool designed to handle unexpected windows appearing. But since our tests are
|
||||
:: expected to show UI we don't want it running.
|
||||
taskkill -f -im dhandler.exe
|
||||
|
||||
@@ -28,7 +28,7 @@ echo %TIME%
|
||||
powershell -ExecutionPolicy Bypass .\InstallTestAppDependencies.ps1
|
||||
echo %TIME%
|
||||
|
||||
set testBinaryCandidates=TerminalApp.LocalTests.dll Conhost.UIA.Tests.dll
|
||||
set testBinaryCandidates=TerminalApp.LocalTests.dll SettingsModel.LocalTests.dll Conhost.UIA.Tests.dll
|
||||
set testBinaries=
|
||||
for %%B in (%testBinaryCandidates%) do (
|
||||
if exist %%B (
|
||||
@@ -103,4 +103,4 @@ copy /y *_subresults.json %HELIX_WORKITEM_UPLOAD_ROOT%
|
||||
|
||||
type testResults.xml
|
||||
|
||||
echo %TIME%
|
||||
echo %TIME%
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<SignConfigXML>
|
||||
<job platform="" configuration="" dest="__INPATHROOT__" jobname="EngFunSimpleSign" approvers="">
|
||||
<file src="__INPATHROOT__\Microsoft.Terminal*.nupkg" signType="NuGet" />
|
||||
</job>
|
||||
</SignConfigXML>
|
||||
@@ -1,5 +0,0 @@
|
||||
<SignConfigXML>
|
||||
<job platform="" configuration="" certSubject="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" jobname="EngFunSimpleSign" approvers="">
|
||||
<file src="__INPATHROOT__\Microsoft.WindowsTerminal*.msixbundle" signType="136020001" />
|
||||
</job>
|
||||
</SignConfigXML>
|
||||
@@ -2,7 +2,7 @@ trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- main
|
||||
- feature/*
|
||||
paths:
|
||||
exclude:
|
||||
@@ -13,7 +13,7 @@ trigger:
|
||||
pr:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- main
|
||||
- feature/*
|
||||
paths:
|
||||
exclude:
|
||||
|
||||
@@ -8,7 +8,9 @@ jobs:
|
||||
variables:
|
||||
BuildConfiguration: AuditMode
|
||||
BuildPlatform: ${{ parameters.platform }}
|
||||
pool: { vmImage: windows-2019 }
|
||||
pool: "windevbuildagents"
|
||||
# The public pool is also an option!
|
||||
# pool: { vmImage: windows-2019 }
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
|
||||
@@ -11,7 +11,9 @@ jobs:
|
||||
variables:
|
||||
BuildConfiguration: ${{ parameters.configuration }}
|
||||
BuildPlatform: ${{ parameters.platform }}
|
||||
pool: { vmImage: windows-2019 }
|
||||
pool: "windevbuildagents"
|
||||
# The public pool is also an option!
|
||||
# pool: { vmImage: windows-2019 }
|
||||
|
||||
steps:
|
||||
- template: build-console-steps.yml
|
||||
|
||||
@@ -41,9 +41,7 @@ steps:
|
||||
configuration: '$(BuildConfiguration)'
|
||||
msbuildArgs: "${{ parameters.additionalBuildArguments }}"
|
||||
clean: true
|
||||
# The build agents cannot currently support parallel build due to the
|
||||
# memory requirements of our PCH files.
|
||||
maximumCpuCount: false
|
||||
maximumCpuCount: true
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: 'Check MSIX for common regressions'
|
||||
|
||||
@@ -5,14 +5,14 @@ parameters:
|
||||
testSuite: ''
|
||||
# If a Pipeline runs this template more than once, this parameter should be unique per build flavor to differentiate the
|
||||
# the different test runs:
|
||||
helixType: 'test/devtest'
|
||||
helixType: 'test/devtest'
|
||||
artifactName: 'drop'
|
||||
maxParallel: 4
|
||||
rerunPassesRequiredToAvoidFailure: 5
|
||||
taefQuery: ''
|
||||
# if 'useBuildOutputFromBuildId' is set, we will default to using a build from this pipeline:
|
||||
useBuildOutputFromPipeline: $(System.DefinitionId)
|
||||
matrix:
|
||||
matrix:
|
||||
# Release_x86:
|
||||
# buildPlatform: 'x86'
|
||||
# buildConfiguration: 'release'
|
||||
@@ -39,13 +39,13 @@ jobs:
|
||||
taefPath: $(Build.SourcesDirectory)\build\Helix\packages\taef.redist.wlk.10.57.200731005-develop\build\Binaries\$(buildPlatform)
|
||||
helixCommonArgs: '/binaryLogger:$(Build.SourcesDirectory)/${{parameters.name}}.$(buildPlatform).$(buildConfiguration).binlog /p:HelixBuild=$(Build.BuildId).$(buildPlatform).$(buildConfiguration) /p:Platform=$(buildPlatform) /p:Configuration=$(buildConfiguration) /p:HelixType=${{parameters.helixType}} /p:TestSuite=${{parameters.testSuite}} /p:ProjFilesPath=$(Build.ArtifactStagingDirectory) /p:rerunPassesRequiredToAvoidFailure=${{parameters.rerunPassesRequiredToAvoidFailure}}'
|
||||
|
||||
|
||||
|
||||
steps:
|
||||
- task: CmdLine@1
|
||||
displayName: 'Display build machine environment variables'
|
||||
inputs:
|
||||
filename: 'set'
|
||||
|
||||
|
||||
- task: NuGetToolInstaller@0
|
||||
displayName: 'Use NuGet 5.2.0'
|
||||
inputs:
|
||||
@@ -59,23 +59,23 @@ jobs:
|
||||
nugetConfigPath: nuget.config
|
||||
restoreDirectory: packages
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
- task: DownloadBuildArtifacts@0
|
||||
condition:
|
||||
and(succeeded(),eq(variables['useBuildOutputFromBuildId'],''))
|
||||
inputs:
|
||||
artifactName: ${{ parameters.artifactName }}
|
||||
inputs:
|
||||
artifactName: ${{ parameters.artifactName }}
|
||||
downloadPath: '$(artifactsDir)'
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
- task: DownloadBuildArtifacts@0
|
||||
condition:
|
||||
and(succeeded(),ne(variables['useBuildOutputFromBuildId'],''))
|
||||
inputs:
|
||||
inputs:
|
||||
buildType: specific
|
||||
buildVersionToDownload: specific
|
||||
project: $(System.TeamProjectId)
|
||||
pipeline: ${{ parameters.useBuildOutputFromPipeline }}
|
||||
buildId: $(useBuildOutputFromBuildId)
|
||||
artifactName: ${{ parameters.artifactName }}
|
||||
artifactName: ${{ parameters.artifactName }}
|
||||
downloadPath: '$(artifactsDir)'
|
||||
|
||||
- task: CmdLine@1
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
targetType: filePath
|
||||
filePath: build\Helix\PrepareHelixPayload.ps1
|
||||
arguments: -Platform '$(buildPlatform)' -Configuration '$(buildConfiguration)' -ArtifactName '${{ parameters.artifactName }}'
|
||||
|
||||
|
||||
- task: CmdLine@1
|
||||
displayName: 'Display Helix payload contents'
|
||||
inputs:
|
||||
@@ -104,7 +104,16 @@ jobs:
|
||||
outputProjFileName: 'RunTestsInHelix-TerminalAppLocalTests.proj'
|
||||
testSuite: '${{ parameters.testSuite }}'
|
||||
taefQuery: ${{ parameters.taefQuery }}
|
||||
|
||||
|
||||
- template: helix-createprojfile-steps.yml
|
||||
parameters:
|
||||
condition: and(succeeded(),ne('${{ parameters.testSuite }}','NugetTestSuite'))
|
||||
testFilePath: '$(artifactsDir)\${{ parameters.artifactName }}\$(buildConfiguration)\$(buildPlatform)\Test\SettingsModel.LocalTests.dll'
|
||||
outputProjFileName: 'RunTestsInHelix-SettingsModelLocalTests.proj'
|
||||
testSuite: '${{ parameters.testSuite }}'
|
||||
taefQuery: ${{ parameters.taefQuery }}
|
||||
|
||||
|
||||
- template: helix-createprojfile-steps.yml
|
||||
parameters:
|
||||
condition: and(succeeded(),ne('${{ parameters.testSuite }}','NugetTestSuite'))
|
||||
@@ -118,7 +127,7 @@ jobs:
|
||||
inputs:
|
||||
PathtoPublish: $(Build.ArtifactStagingDirectory)
|
||||
artifactName: ${{ parameters.artifactName }}
|
||||
|
||||
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: 'Run tests in Helix (open queues)'
|
||||
env:
|
||||
|
||||
18
build/rules/Branding.targets
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<_WTBrandingPreprocessorToken Condition="'$(WindowsTerminalBranding)'=='Preview'">WT_BRANDING_PREVIEW</_WTBrandingPreprocessorToken>
|
||||
<_WTBrandingPreprocessorToken Condition="'$(WindowsTerminalBranding)'=='Release'">WT_BRANDING_RELEASE</_WTBrandingPreprocessorToken>
|
||||
<_WTBrandingPreprocessorToken Condition="'$(_WTBrandingPreprocessorToken)'==''">WT_BRANDING_DEV</_WTBrandingPreprocessorToken>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>$(_WTBrandingPreprocessorToken);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>$(_WTBrandingPreprocessorToken);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
</Project>
|
||||
@@ -21,7 +21,8 @@
|
||||
"/res/terminal/",
|
||||
"/doc/specs/",
|
||||
"/doc/cascadia/",
|
||||
"/doc/user-docs/"
|
||||
"/doc/user-docs/",
|
||||
"/src/tools/MonarchPeasantSample/",
|
||||
],
|
||||
"SuffixFilters": [
|
||||
".dbb",
|
||||
@@ -38,5 +39,5 @@
|
||||
".rec",
|
||||
".err",
|
||||
".xlsx"
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
<!-- This file is read by XES, which we use in our Release builds. -->
|
||||
<PropertyGroup Label="Version">
|
||||
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
|
||||
<XesBaseYearForStoreVersion>2020</XesBaseYearForStoreVersion>
|
||||
<XesBaseYearForStoreVersion>2021</XesBaseYearForStoreVersion>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>5</VersionMinor>
|
||||
<VersionMinor>7</VersionMinor>
|
||||
<VersionInfoProductName>Windows Terminal</VersionInfoProductName>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
`.../console/published/wincon.w` in the OS repo when you submit the PR.
|
||||
The branch won't build without it.
|
||||
* For now, you can update winconp.h with your consumable changes.
|
||||
* define registry name (ex `CONSOLE_REGISTRY_CURSORCOLOR`)
|
||||
* add the setting to `CONSOLE_STATE_INFO`
|
||||
* define the property key ID and the property key itself
|
||||
* Define registry name (ex `CONSOLE_REGISTRY_CURSORCOLOR`)
|
||||
* Add the setting to `CONSOLE_STATE_INFO`
|
||||
* Define the property key ID and the property key itself.
|
||||
- Yes, the large majority of the `DEFINE_PROPERTYKEY` defs are the same, it's only the last byte of the guid that changes
|
||||
|
||||
2. Add matching fields to Settings.hpp
|
||||
- add getters, setters, the whole drill.
|
||||
- Add getters, setters, the whole drill.
|
||||
|
||||
3. Add to the propsheet
|
||||
- We need to add it to *reading and writing* the registry from the propsheet, and *reading* the link from the propsheet. Yes, that's weird, but the propsheet is smart enough to re-use ShortcutSerialization::s_SetLinkValues, but not smart enough to do the same with RegistrySerialization.
|
||||
|
||||
14
doc/TAEF.md
@@ -48,3 +48,17 @@ Invoke-OpenConsoleTests
|
||||
```
|
||||
|
||||
`Invoke-OpenConsoleTests` supports a number of options, which you can enumerate by running `Invoke-OpenConsoleTests -?`.
|
||||
|
||||
|
||||
### Debugging Tests
|
||||
|
||||
If you want to debug a test, you can do so by using the TAEF /waitForDebugger flag, such as:
|
||||
|
||||
runut *Tests.dll /name:TextBufferTests::TestInsertCharacter /waitForDebugger
|
||||
|
||||
Replace the test name with the one you want to debug. Then, TAEF will begin executing the test and output something like this:
|
||||
|
||||
TAEF: Waiting for debugger - PID <some PID> @ IP <some IP address>
|
||||
|
||||
You can then attach to that PID in your debugger of choice. In Visual Studio, you can use Debug -> Attach To Process, or you could use WinDbg or whatever you want.
|
||||
Once the debugger attaches, the test will execute and your breakpoints will be hit.
|
||||
|
||||
@@ -9,13 +9,13 @@ The primary usages of WIL in our code so far are...
|
||||
|
||||
### Smart Pointers ###
|
||||
|
||||
Inside [wil\resource.h](https://github.com/microsoft/wil/blob/master/include/wil/resource.h) are smart pointer like classes for many Windows OS resources like file handles, socket handles, process handles, and so on. They're of the form `wil::unique_handle` and call the appropriate/matching OS function (like `CloseHandle()` in this case) when they go out of scope.
|
||||
Inside [wil/resource.h](https://github.com/microsoft/wil/blob/master/include/wil/resource.h) are smart pointer like classes for many Windows OS resources like file handles, socket handles, process handles, and so on. They're of the form `wil::unique_handle` and call the appropriate/matching OS function (like `CloseHandle()` in this case) when they go out of scope.
|
||||
|
||||
Another useful item is `wil::make_unique_nothrow()` which is analogous to `std::make_unique` (except without the exception which might help you integrate with existing exception-free code in the console.) This will return a `wistd::unique_ptr` (vs. a `std::unique_ptr`) which can be used in a similar manner.
|
||||
|
||||
### Result Handling ###
|
||||
|
||||
To manage the various types of result codes that come back from Windows APIs, the file [wil\result.h](https://github.com/microsoft/wil/blob/master/include/wil/result.h) provides a wealth of macros that can help.
|
||||
To manage the various types of result codes that come back from Windows APIs, the file [wil/result.h](https://github.com/microsoft/wil/blob/master/include/wil/result.h) provides a wealth of macros that can help.
|
||||
|
||||
As an example, the method `DuplicateHandle()` returns a `BOOL` value that is `FALSE` under failure and would like you to `GetLastError()` from the operating system to find out what the actual result code is. In this circumstance, you could use the macro `RETURN_IF_WIN32_BOOL_FALSE` to wrap the call to `DuplicateHandle()` which would automatically handle this pattern for you and return the `HRESULT` equivalent on failure.
|
||||
|
||||
|
||||
397
doc/cascadia/AddASetting.md
Normal file
@@ -0,0 +1,397 @@
|
||||
# Adding Settings to Windows Terminal
|
||||
|
||||
Adding a setting to Windows Terminal is fairly straightforward. This guide serves as a reference on how to add a setting.
|
||||
|
||||
## 1. Terminal Settings Model
|
||||
|
||||
The Terminal Settings Model (`Microsoft.Terminal.Settings.Model`) is responsible for (de)serializing and exposing settings.
|
||||
|
||||
### `GETSET_SETTING` macro
|
||||
|
||||
The `GETSET_SETTING` macro can be used to implement inheritance for your new setting and store the setting in the settings model. It takes three parameters:
|
||||
- `type`: the type that the setting will be stored as
|
||||
- `name`: the name of the variable for storage
|
||||
- `defaultValue`: the value to use if the user does not define the setting anywhere
|
||||
|
||||
### Adding a Profile setting
|
||||
|
||||
This tutorial will add `CloseOnExitMode CloseOnExit` as a profile setting.
|
||||
|
||||
1. In `Profile.h`, declare/define the setting:
|
||||
|
||||
```c++
|
||||
GETSET_SETTING(CloseOnExitMode, CloseOnExit, CloseOnExitMode::Graceful)
|
||||
```
|
||||
|
||||
2. In `Profile.idl`, expose the setting via WinRT:
|
||||
|
||||
```c++
|
||||
Boolean HasCloseOnExit();
|
||||
void ClearCloseOnExit();
|
||||
CloseOnExitMode CloseOnExit;
|
||||
```
|
||||
|
||||
3. In `Profile.cpp`, add (de)serialization and copy logic:
|
||||
|
||||
```c++
|
||||
// Top of file:
|
||||
// - Add the serialization key
|
||||
static constexpr std::string_view CloseOnExitKey{ "closeOnExit" };
|
||||
|
||||
// CopySettings() or Copy():
|
||||
// - The setting is exposed in the Settings UI
|
||||
profile->_CloseOnExit = source->_CloseOnExit;
|
||||
|
||||
// LayerJson():
|
||||
// - get the value from the JSON
|
||||
JsonUtils::GetValueForKey(json, CloseOnExitKey, _CloseOnExit);
|
||||
|
||||
// ToJson():
|
||||
// - write the value to the JSON
|
||||
JsonUtils::SetValueForKey(json, CloseOnExitKey, _CloseOnExit);
|
||||
```
|
||||
|
||||
- If the setting is not a primitive type, in `TerminalSettingsSerializationHelpers.h` add (de)serialization logic for the accepted values:
|
||||
|
||||
```c++
|
||||
// For enum values...
|
||||
JSON_ENUM_MAPPER(::winrt::Microsoft::Terminal::Settings::Model::CloseOnExitMode)
|
||||
{
|
||||
JSON_MAPPINGS(3) = {
|
||||
pair_type{ "always", ValueType::Always },
|
||||
pair_type{ "graceful", ValueType::Graceful },
|
||||
pair_type{ "never", ValueType::Never },
|
||||
};
|
||||
};
|
||||
|
||||
// For enum flag values...
|
||||
JSON_FLAG_MAPPER(::winrt::Microsoft::Terminal::TerminalControl::CopyFormat)
|
||||
{
|
||||
JSON_MAPPINGS(5) = {
|
||||
pair_type{ "none", AllClear },
|
||||
pair_type{ "html", ValueType::HTML },
|
||||
pair_type{ "rtf", ValueType::RTF },
|
||||
pair_type{ "all", AllSet },
|
||||
};
|
||||
};
|
||||
|
||||
// NOTE: This is also where you can add functionality for...
|
||||
// - overloaded type support (i.e. accept a bool and an enum)
|
||||
// - custom (de)serialization logic (i.e. coordinates)
|
||||
```
|
||||
|
||||
### Adding a Global setting
|
||||
|
||||
Follow the "adding a Profile setting" instructions above, but do it on the `GlobalAppSettings` files.
|
||||
|
||||
### Adding an Action
|
||||
|
||||
This tutorial will add the `openSettings` action.
|
||||
|
||||
1. In `KeyMapping.idl`, declare the action:
|
||||
|
||||
```c++
|
||||
// Add the action to ShortcutAction
|
||||
enum ShortcutAction
|
||||
{
|
||||
OpenSettings
|
||||
}
|
||||
```
|
||||
|
||||
2. In `ActionAndArgs.cpp`, add serialization logic:
|
||||
|
||||
```c++
|
||||
// Top of file:
|
||||
// - Add the serialization key
|
||||
static constexpr std::string_view OpenSettingsKey{ "openSettings" };
|
||||
|
||||
// ActionKeyNamesMap:
|
||||
// - map the new enum to the json key
|
||||
{ OpenSettingsKey, ShortcutAction::OpenSettings },
|
||||
```
|
||||
|
||||
3. If the action should automatically generate a name when it appears in the Command Palette...
|
||||
```c++
|
||||
// In ActionAndArgs.cpp GenerateName() --> GeneratedActionNames
|
||||
{ ShortcutAction::OpenSettings, RS_(L"OpenSettingsCommandKey") },
|
||||
|
||||
// In Resources.resw for Microsoft.Terminal.Settings.Model.Lib,
|
||||
// add the generated name
|
||||
// NOTE: Visual Studio presents the resw file as a table.
|
||||
// If you choose to edit the file with a text editor,
|
||||
// the code should look something like this...
|
||||
<data name="OpenSettingsCommandKey" xml:space="preserve">
|
||||
<value>Open settings file</value>
|
||||
</data>
|
||||
```
|
||||
|
||||
4. If the action supports arguments...
|
||||
- In `ActionArgs.idl`, declare the arguments
|
||||
```c++
|
||||
[default_interface] runtimeclass OpenSettingsArgs : IActionArgs
|
||||
{
|
||||
// this declares the "target" arg
|
||||
SettingsTarget Target { get; };
|
||||
};
|
||||
```
|
||||
- In `ActionArgs.h`, define the new runtime class
|
||||
```c++
|
||||
struct OpenSettingsArgs : public OpenSettingsArgsT<OpenSettingsArgs>
|
||||
{
|
||||
OpenSettingsArgs() = default;
|
||||
|
||||
// adds a getter/setter for your argument, and defines the json key
|
||||
GETSET_PROPERTY(SettingsTarget, Target, SettingsTarget::SettingsFile);
|
||||
static constexpr std::string_view TargetKey{ "target" };
|
||||
|
||||
public:
|
||||
hstring GenerateName() const;
|
||||
|
||||
bool Equals(const IActionArgs& other)
|
||||
{
|
||||
auto otherAsUs = other.try_as<OpenSettingsArgs>();
|
||||
if (otherAsUs)
|
||||
{
|
||||
return otherAsUs->_Target == _Target;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
static FromJsonResult FromJson(const Json::Value& json)
|
||||
{
|
||||
// LOAD BEARING: Not using make_self here _will_ break you in the future!
|
||||
auto args = winrt::make_self<OpenSettingsArgs>();
|
||||
JsonUtils::GetValueForKey(json, TargetKey, args->_Target);
|
||||
return { *args, {} };
|
||||
}
|
||||
|
||||
IActionArgs Copy() const
|
||||
{
|
||||
auto copy{ winrt::make_self<OpenSettingsArgs>() };
|
||||
copy->_Target = _Target;
|
||||
return *copy;
|
||||
}
|
||||
};
|
||||
```
|
||||
- In `ActionArgs.cpp`, define `GenerateName()`. This is used to automatically generate a name when it appears in the Command Palette.
|
||||
- In `ActionAndArgs.cpp`, add serialization logic:
|
||||
|
||||
```c++
|
||||
// ActionKeyNamesMap --> argParsers
|
||||
{ ShortcutAction::OpenSettings, OpenSettingsArgs::FromJson },
|
||||
```
|
||||
|
||||
### Adding an Action Argument
|
||||
|
||||
Follow step 3 from the "adding an Action" instructions above, but modify the relevant `ActionArgs` files.
|
||||
|
||||
## 2. Setting Functionality
|
||||
|
||||
Now that the Terminal Settings Model is updated, Windows Terminal can read and write to the settings file. This section covers how to add functionality to your newly created setting.
|
||||
|
||||
### App-level settings
|
||||
|
||||
App-level settings are settings that affect the frame of Windows Terminal. Generally, these tend to be global settings. The `TerminalApp` project is responsible for presenting the frame of Windows Terminal. A few files of interest include:
|
||||
- `TerminalPage`: XAML control responsible for the look and feel of Windows Terminal
|
||||
- `AppLogic`: WinRT class responsible for window-related issues (i.e. the titlebar, focus mode, etc...)
|
||||
|
||||
Both have access to a `CascadiaSettings` object, for you to read the loaded setting and update Windows Terminal appropriately.
|
||||
|
||||
### Terminal-level settings
|
||||
|
||||
Terminal-level settings are settings that affect a shell session. Generally, these tend to be profile settings. The `TerminalApp` project is responsible for packaging this settings from the Terminal Settings Model to the terminal instance. There are two kinds of settings here:
|
||||
- `IControlSettings`:
|
||||
- These are settings that affect the `TerminalControl` (a XAML control that hosts a shell session).
|
||||
- Examples include background image customization, interactivity behavior (i.e. selection), acrylic and font customization.
|
||||
- The `TerminalControl` project has access to these settings via a saved `IControlSettings` member.
|
||||
- `ICoreSettings`:
|
||||
- These are settings that affect the `TerminalCore` (a lower level object that interacts with the text buffer).
|
||||
- Examples include initial size, history size, and cursor customization.
|
||||
- The `TerminalCore` project has access to these settings via a saved `ICoreSettings` member.
|
||||
|
||||
`TerminalApp` packages these settings into a `TerminalSettings : IControlSettings, ICoreSettings` object upon creating a new terminal instance. To do so, you must submit the following changes:
|
||||
- Declare the setting in `IControlSettings.idl` or `ICoreSettings.idl` (whichever is relevant to your setting). If your setting is an enum setting, declare the enum here instead of in the `TerminalSettingsModel` project.
|
||||
- In `TerminalSettings.h`, declare/define the setting...
|
||||
```c++
|
||||
// The GETSET_PROPERTY macro declares/defines a getter setter for the setting.
|
||||
// Like GETSET_SETTING, it takes in a type, name, and defaultValue.
|
||||
GETSET_PROPERTY(bool, UseAcrylic, false);
|
||||
```
|
||||
- In `TerminalSettings.cpp`...
|
||||
- update `_ApplyProfileSettings` for profile settings
|
||||
- update `_ApplyGlobalSettings` for global settings
|
||||
- If additional processing is necessary, that would happen here. For example, `backgroundImageAlignment` is stored as a `ConvergedAlignment` in the Terminal Settings Model, but converted into XAML's separate horizontal and vertical alignment enums for packaging.
|
||||
|
||||
### Actions
|
||||
|
||||
Actions are packaged as an `ActionAndArgs` object, then handled in `TerminalApp`. To add functionality for actions...
|
||||
- In the `ShortcutActionDispatch` files, dispatch an event when the action occurs...
|
||||
```c++
|
||||
// ShortcutActionDispatch.idl
|
||||
event Windows.Foundation.TypedEventHandler<ShortcutActionDispatch, Microsoft.Terminal.Settings.Model.ActionEventArgs> OpenSettings;
|
||||
|
||||
// ShortcutActionDispatch.h
|
||||
TYPED_EVENT(OpenSettings, TerminalApp::ShortcutActionDispatch, Microsoft::Terminal::Settings::Model::ActionEventArgs);
|
||||
|
||||
// ShortcutActionDispatch.cpp --> DoAction()
|
||||
// - dispatch the appropriate event
|
||||
case ShortcutAction::OpenSettings:
|
||||
{
|
||||
_OpenSettingsHandlers(*this, eventArgs);
|
||||
break;
|
||||
}
|
||||
```
|
||||
- In `TerminalPage` files, handle the event...
|
||||
```c++
|
||||
// TerminalPage.h
|
||||
// - declare the handler
|
||||
void _HandleOpenSettings(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args);
|
||||
|
||||
// TerminalPage.cpp --> _RegisterActionCallbacks()
|
||||
// - register the handler
|
||||
_actionDispatch->OpenSettings({ this, &TerminalPage::_HandleOpenSettings });
|
||||
|
||||
// AppActionHandlers.cpp
|
||||
// - direct the function to the right place and call a helper function
|
||||
void TerminalPage::_HandleOpenSettings(const IInspectable& /*sender*/,
|
||||
const ActionEventArgs& args)
|
||||
{
|
||||
// NOTE: this if-statement can be omitted if the action does not support arguments
|
||||
if (const auto& realArgs = args.ActionArgs().try_as<OpenSettingsArgs>())
|
||||
{
|
||||
_LaunchSettings(realArgs.Target());
|
||||
args.Handled(true);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`AppActionHandlers` vary based on the action you want to perform. A few useful helper functions include:
|
||||
- `_GetFocusedTab()`: retrieves the focused tab
|
||||
- `_GetActiveControl()`: retrieves the active terminal control
|
||||
- `_GetTerminalTabImpl()`: tries to cast the given tab as a `TerminalTab` (a tab that hosts a terminal instance)
|
||||
|
||||
|
||||
## 3. Settings UI
|
||||
|
||||
### Exposing Enum Settings
|
||||
If the new setting supports enums, you need to expose a map of the enum and the respective value in the Terminal Settings Model's `EnumMappings`:
|
||||
|
||||
```c++
|
||||
// EnumMappings.idl
|
||||
static Windows.Foundation.Collections.IMap<String, Microsoft.Terminal.Settings.Model.CloseOnExitMode> CloseOnExitMode { get; };
|
||||
|
||||
// EnumMappings.h
|
||||
static winrt::Windows::Foundation::Collections::IMap<winrt::hstring, CloseOnExitMode> CloseOnExitMode();
|
||||
|
||||
// EnumMappings.cpp
|
||||
// - this macro leverages the json enum mapper in TerminalSettingsSerializationHelper to expose
|
||||
// the mapped values across project boundaries
|
||||
DEFINE_ENUM_MAP(Model::CloseOnExitMode, CloseOnExitMode);
|
||||
```
|
||||
|
||||
### Binding and Localizing the Enum Setting
|
||||
|
||||
Find the page in the Settings UI that the new setting fits best in. In this example, we are adding `LaunchMode`.
|
||||
1. In `Launch.idl`, expose the bindable setting...
|
||||
```c++
|
||||
// Expose the current value for the setting
|
||||
IInspectable CurrentLaunchMode;
|
||||
|
||||
// Expose the list of possible values
|
||||
Windows.Foundation.Collections.IObservableVector<Microsoft.Terminal.Settings.Editor.EnumEntry> LaunchModeList { get; };
|
||||
```
|
||||
|
||||
2. In `Launch.h`, declare the bindable enum setting...
|
||||
```c++
|
||||
// the GETSET_BINDABLE_ENUM_SETTING macro accepts...
|
||||
// - name: the name of the setting
|
||||
// - enumType: the type of the setting
|
||||
// - settingsModelName: how to retrieve the setting (use State() to get access to the settings model)
|
||||
// - settingNameInModel: the name of the setting in the terminal settings model
|
||||
GETSET_BINDABLE_ENUM_SETTING(LaunchMode, Model::LaunchMode, State().Settings().GlobalSettings, LaunchMode);
|
||||
```
|
||||
|
||||
3. In `Launch.cpp`, populate these functions...
|
||||
```c++
|
||||
// Constructor (after InitializeComponent())
|
||||
// the INITIALIZE_BINDABLE_ENUM_SETTING macro accepts...
|
||||
// - name: the name of the setting
|
||||
// - enumMappingsName: the name from the TerminalSettingsModel's EnumMappings
|
||||
// - enumType: the type for the enum
|
||||
// - resourceSectionAndType: prefix for the localization
|
||||
// - resourceProperty: postfix for the localization
|
||||
INITIALIZE_BINDABLE_ENUM_SETTING(LaunchMode, LaunchMode, LaunchMode, L"Globals_LaunchMode", L"Content");
|
||||
```
|
||||
|
||||
4. In `Resources.resw` for Microsoft.Terminal.Settings.Editor, add the localized text to expose each enum value. Use the following format: `<SettingGroup>_<SettingName><EnumValue>.Content`
|
||||
- `SettingGroup`:
|
||||
- `Globals` for global settings
|
||||
- `Profile` for profile settings
|
||||
- `SettingName`:
|
||||
- the Pascal-case format for the setting type (i.e. `LaunchMode` for `"launchMode"`)
|
||||
- `EnumValue`:
|
||||
- the json key for the setting value, but with the first letter capitalized (i.e. `Focus` for `"focus"`)
|
||||
- The resulting resw key should look something like this `Globals_LaunchModeFocus.Content`
|
||||
- This is the text that will be used in your control
|
||||
|
||||
### Updating the UI
|
||||
|
||||
When adding a setting to the UI, make sure you follow the [UWP design guidance](https://docs.microsoft.com/windows/uwp/design/).
|
||||
|
||||
#### Enum Settings
|
||||
|
||||
Now, create a XAML control in the relevant XAML file. Use the following tips and tricks to style everything appropriately:
|
||||
- Wrap the control in a `ContentPresenter` adhering to the `SettingContainerStyle` style
|
||||
- Bind `SelectedItem` to the relevant `Current<Setting>` (i.e. `CurrentLaunchMode`). Ensure it's a TwoWay binding
|
||||
- Bind `ItemsSource` to `<Setting>List` (i.e. `LaunchModeList`)
|
||||
- Set the ItemTemplate to the `Enum<ControlType>Template` (i.e. `EnumRadioButtonTemplate` for radio buttons)
|
||||
- Set the style to the appropriate one in `CommonResources.xaml`
|
||||
|
||||
```xml
|
||||
<!--Launch Mode-->
|
||||
<ContentPresenter Style="{StaticResource SettingContainerStyle}">
|
||||
<muxc:RadioButtons x:Uid="Globals_LaunchMode"
|
||||
SelectedItem="{x:Bind CurrentLaunchMode, Mode="TwoWay"}"
|
||||
ItemsSource="{x:Bind LaunchModeList}"
|
||||
ItemTemplate="{StaticResource EnumRadioButtonTemplate}"
|
||||
Style="{StaticResource RadioButtonsSettingStyle}"/>
|
||||
</ContentPresenter>
|
||||
```
|
||||
|
||||
To add any localized text, add a `x:Uid`, and access the relevant property via the Resources.resw file. For example, `Globals_LaunchMode.Header` sets the header for this control. You can also set the tooltip text like this:
|
||||
`Globals_DefaultProfile.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip`.
|
||||
|
||||
#### Non-Enum Settings
|
||||
|
||||
Continue to reference `CommonResources.xaml` for appropriate styling and wrap the control with a similar `ContentPresenter`. However, instead of binding to the `Current<Setting>` and `<Setting>List`, bind directly to the setting via the state. Binding a setting like `altGrAliasing` should look something like this:
|
||||
```xml
|
||||
<!--AltGr Aliasing-->
|
||||
<ContentPresenter Style="{StaticResource SettingContainerStyle}">
|
||||
<CheckBox x:Uid="Profile_AltGrAliasing"
|
||||
IsChecked="{x:Bind State.Profile.AltGrAliasing, Mode=TwoWay}"
|
||||
Style="{StaticResource CheckBoxSettingStyle}"/>
|
||||
</ContentPresenter>
|
||||
```
|
||||
|
||||
#### Profile Settings
|
||||
|
||||
If you are specifically adding a Profile setting, in addition to the steps above, you need to make the setting observable by modifying the `Profiles` files...
|
||||
```c++
|
||||
// Profiles.idl --> ProfileViewModel
|
||||
// - this declares the setting as observable using the type and the name of the setting
|
||||
OBSERVABLE_PROJECTED_SETTING(Microsoft.Terminal.Settings.Model.CloseOnExitMode, CloseOnExit);
|
||||
|
||||
// Profiles.h --> ProfileViewModel
|
||||
// - this defines the setting as observable off of the _profile object
|
||||
OBSERVABLE_PROJECTED_SETTING(_profile, CloseOnExit);
|
||||
|
||||
// Profiles.h --> ProfileViewModel
|
||||
// - if the setting cannot be inherited by another profile (aka missing the Clear() function), use the following macro instead:
|
||||
PERMANENT_OBSERVABLE_PROJECTED_SETTING(_profile, Guid);
|
||||
```
|
||||
|
||||
The `ProfilePageNavigationState` holds a `ProfileViewModel`, which wraps the `Profile` object from the Terminal Settings Model. The `ProfileViewModel` makes all of the profile settings observable.
|
||||
|
||||
### Actions
|
||||
|
||||
Actions are not yet supported in the Settings UI.
|
||||
@@ -8,19 +8,20 @@ return a JSON value coerced into the specified type.
|
||||
When reading into existing storage, it returns a boolean indicating whether that storage was modified.
|
||||
|
||||
If the JSON value cannot be converted to the specified type, an exception will be generated.
|
||||
For non-nullable type conversions (most POD types), `null` is considered to be an invalid type.
|
||||
|
||||
```c++
|
||||
std::string one;
|
||||
std::optional<std::string> two;
|
||||
|
||||
JsonUtils::GetValue(json, one);
|
||||
// one is populated or unchanged.
|
||||
// one is populated or an exception is thrown.
|
||||
|
||||
JsonUtils::GetValue(json, two);
|
||||
// two is populated, nullopt or unchanged
|
||||
// two is populated, nullopt or an exception is thrown
|
||||
|
||||
auto three = JsonUtils::GetValue<std::string>(json);
|
||||
// three is populated or zero-initialized
|
||||
// three is populated or an exception is thrown
|
||||
|
||||
auto four = JsonUtils::GetValue<std::optional<std::string>>(json);
|
||||
// four is populated or nullopt
|
||||
@@ -225,14 +226,14 @@ auto v = JsonUtils::GetValue<int>(json, conv);
|
||||
|
||||
-|json type invalid|json null|valid
|
||||
-|-|-|-
|
||||
`T`|❌ exception|🔵 unchanged|✔ converted
|
||||
`T`|❌ exception|❌ exception|✔ converted
|
||||
`std::optional<T>`|❌ exception|🟨 `nullopt`|✔ converted
|
||||
|
||||
### GetValue<T>() (returning)
|
||||
|
||||
-|json type invalid|json null|valid
|
||||
-|-|-|-
|
||||
`T`|❌ exception|🟨 `T{}` (zero value)|✔ converted
|
||||
`T`|❌ exception|❌ exception|✔ converted
|
||||
`std::optional<T>`|❌ exception|🟨 `nullopt`|✔ converted
|
||||
|
||||
### GetValueForKey(T&) (type-deducing)
|
||||
@@ -242,14 +243,14 @@ a "key not found" state. The remaining three cases are the same.
|
||||
|
||||
val type|key not found|_json type invalid_|_json null_|_valid_
|
||||
-|-|-|-|-
|
||||
`T`|🔵 unchanged|_❌ exception_|_🔵 unchanged_|_✔ converted_
|
||||
`std::optional<T>`|_🔵 unchanged_|_❌ exception_|_🟨 `nullopt`_|_✔ converted_
|
||||
`T`|🔵 unchanged|_❌ exception_|_❌ exception_|_✔ converted_
|
||||
`std::optional<T>`|🔵 unchanged|_❌ exception_|_🟨 `nullopt`_|_✔ converted_
|
||||
|
||||
### GetValueForKey<T>() (return value)
|
||||
|
||||
val type|key not found|_json type invalid_|_json null_|_valid_
|
||||
-|-|-|-|-
|
||||
`T`|🟨 `T{}` (zero value)|_❌ exception_|_🟨 `T{}` (zero value)_|_✔ converted_
|
||||
`T`|🟨 `T{}` (zero value)|_❌ exception_|_❌ exception_|_✔ converted_
|
||||
`std::optional<T>`|🟨 `nullopt`|_❌ exception_|_🟨 `nullopt`_|_✔ converted_
|
||||
|
||||
### Future Direction
|
||||
|
||||
@@ -86,7 +86,7 @@ project from our `TerminalAppLib` project:
|
||||
duplicate type definitions)-->
|
||||
|
||||
<Reference Include="Microsoft.Terminal.Settings">
|
||||
<HintPath>$(SolutionDir)$(Platform)\$(Configuration)\TerminalSettings\Microsoft.Terminal.Settings.winmd</HintPath>
|
||||
<HintPath>$(OpenConsoleCommonOutDir)\TerminalSettings\Microsoft.Terminal.Settings.winmd</HintPath>
|
||||
<IsWinMDFile>true</IsWinMDFile>
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
@@ -122,7 +122,7 @@ dir to your `AdditionalLibraryDirectories`, and adding the lib to your
|
||||
<ItemDefinitionGroup>
|
||||
<Link>
|
||||
<!-- Manually link with the TerminalAppLib.lib we've built. -->
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\$(Platform)\$(Configuration)\TerminalAppLib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(OpenConsoleCommonOutDir)\TerminalAppLib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
|
||||
<AdditionalDependencies>TerminalAppLib.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
@@ -260,9 +260,9 @@ this:
|
||||
echo OutDir=$(OutDir)
|
||||
(xcopy /Y "$(SolutionDir)src\cascadia\ut_app\TerminalApp.Unit.Tests.manifest" "$(OutDir)\TerminalApp.Unit.Tests.manifest*" )
|
||||
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalConnection\TerminalConnection.dll" "$(OutDir)\TerminalConnection.dll*" )
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalSettings\TerminalSettings.dll" "$(OutDir)\TerminalSettings.dll*" )
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalControl\TerminalControl.dll" "$(OutDir)\TerminalControl.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalConnection\TerminalConnection.dll" "$(OutDir)\TerminalConnection.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalSettings\TerminalSettings.dll" "$(OutDir)\TerminalSettings.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalControl\TerminalControl.dll" "$(OutDir)\TerminalControl.dll*" )
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
@@ -446,9 +446,9 @@ before. The complete `PostBuildEvent` now looks like this:
|
||||
|
||||
(xcopy /Y "$(SolutionDir)src\cascadia\ut_app\TerminalApp.Unit.Tests.AppxManifest.xml" "$(OutDir)\TerminalApp.Unit.Tests.AppxManifest.xml*" )
|
||||
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalConnection\TerminalConnection.dll" "$(OutDir)\TerminalConnection.dll*" )
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalSettings\TerminalSettings.dll" "$(OutDir)\TerminalSettings.dll*" )
|
||||
(xcopy /Y "$(SolutionDir)$(Platform)\$(Configuration)\TerminalControl\TerminalControl.dll" "$(OutDir)\TerminalControl.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalConnection\TerminalConnection.dll" "$(OutDir)\TerminalConnection.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalSettings\TerminalSettings.dll" "$(OutDir)\TerminalSettings.dll*" )
|
||||
(xcopy /Y "$(OpenConsoleCommonOutDir)\TerminalControl\TerminalControl.dll" "$(OutDir)\TerminalControl.dll*" )
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$id": "https://github.com/microsoft/terminal/blob/master/doc/cascadia/profiles.schema.json",
|
||||
"$id": "https://github.com/microsoft/terminal/blob/main/doc/cascadia/profiles.schema.json",
|
||||
"$schema": "https://json-schema.org/draft/2019-09/schema#",
|
||||
"title": "Microsoft's Windows Terminal Settings Profile Schema",
|
||||
"definitions": {
|
||||
@@ -27,11 +27,30 @@
|
||||
"type": "string"
|
||||
},
|
||||
"BellStyle": {
|
||||
"enum": [
|
||||
"none",
|
||||
"audible"
|
||||
],
|
||||
"type": "string"
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"audible",
|
||||
"visual"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"audible",
|
||||
"visual",
|
||||
"all",
|
||||
"none"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ProfileGuid": {
|
||||
"default": "{}",
|
||||
@@ -57,8 +76,11 @@
|
||||
"copy",
|
||||
"duplicateTab",
|
||||
"find",
|
||||
"findMatch",
|
||||
"moveFocus",
|
||||
"moveTab",
|
||||
"newTab",
|
||||
"newWindow",
|
||||
"nextTab",
|
||||
"openNewTabDropdown",
|
||||
"openSettings",
|
||||
@@ -66,12 +88,15 @@
|
||||
"paste",
|
||||
"prevTab",
|
||||
"renameTab",
|
||||
"openTabRenamer",
|
||||
"resetFontSize",
|
||||
"resizePane",
|
||||
"scrollDown",
|
||||
"scrollDownPage",
|
||||
"scrollUp",
|
||||
"scrollUpPage",
|
||||
"scrollToBottom",
|
||||
"scrollToTop",
|
||||
"sendInput",
|
||||
"setColorScheme",
|
||||
"setTabColor",
|
||||
@@ -82,13 +107,24 @@
|
||||
"toggleFocusMode",
|
||||
"toggleFullscreen",
|
||||
"togglePaneZoom",
|
||||
"toggleRetroEffect",
|
||||
"toggleReadOnlyMode",
|
||||
"toggleShaderEffects",
|
||||
"wt",
|
||||
"unbound"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"Direction": {
|
||||
"FocusDirection": {
|
||||
"enum": [
|
||||
"left",
|
||||
"right",
|
||||
"up",
|
||||
"down",
|
||||
"previous"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"ResizeDirection": {
|
||||
"enum": [
|
||||
"left",
|
||||
"right",
|
||||
@@ -97,6 +133,20 @@
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"MoveTabDirection": {
|
||||
"enum": [
|
||||
"forward",
|
||||
"backward"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"FindMatchDirection": {
|
||||
"enum": [
|
||||
"next",
|
||||
"prev"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"SplitState": {
|
||||
"enum": [
|
||||
"vertical",
|
||||
@@ -139,6 +189,13 @@
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"CommandPaletteLaunchMode": {
|
||||
"enum": [
|
||||
"action",
|
||||
"commandLine"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"NewTerminalArgs": {
|
||||
"properties": {
|
||||
"commandline": {
|
||||
@@ -160,6 +217,11 @@
|
||||
"index": {
|
||||
"type": "integer",
|
||||
"description": "The index of the profile in the new tab dropdown (starting at 0)"
|
||||
},
|
||||
"tabColor": {
|
||||
"$ref": "#/definitions/Color",
|
||||
"default": null,
|
||||
"description": "If provided, will set the tab's color to the given value"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
@@ -258,9 +320,9 @@
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "moveFocus" },
|
||||
"direction": {
|
||||
"$ref": "#/definitions/Direction",
|
||||
"$ref": "#/definitions/FocusDirection",
|
||||
"default": "left",
|
||||
"description": "The direction to move focus in, between panes"
|
||||
"description": "The direction to move focus in, between panes. Direction can be 'previous' to move to the most recently used pane."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -275,9 +337,9 @@
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "resizePane" },
|
||||
"direction": {
|
||||
"$ref": "#/definitions/Direction",
|
||||
"$ref": "#/definitions/ResizeDirection",
|
||||
"default": "left",
|
||||
"description": "The direction to move the pane separator in"
|
||||
"description": "The direction to move the pane separator in."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -292,10 +354,7 @@
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"action": {
|
||||
"type": "string",
|
||||
"pattern": "sendInput"
|
||||
},
|
||||
"action": { "type": "string", "pattern": "sendInput" },
|
||||
"input": {
|
||||
"type": "string",
|
||||
"default": "",
|
||||
@@ -322,6 +381,13 @@
|
||||
"splitMode": {
|
||||
"default": "duplicate",
|
||||
"description": "Control how the pane splits. Only accepts \"duplicate\" which will duplicate the focused pane's profile into a new pane."
|
||||
},
|
||||
"size": {
|
||||
"default": 0.5,
|
||||
"description": "Specify how large the new pane should be, as a fraction of the current pane's size. 1.0 would be 'all of the current pane', and 0.0 is 'None of the parent'. Accepts floating point values from 0-1 (default 0.5).",
|
||||
"maximum": 1,
|
||||
"minimum": 0,
|
||||
"type": "number"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -335,10 +401,7 @@
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"action": {
|
||||
"type": "string",
|
||||
"pattern": "openSettings"
|
||||
},
|
||||
"action": { "type": "string", "pattern": "openSettings" },
|
||||
"target": {
|
||||
"type": "string",
|
||||
"default": "settingsFile",
|
||||
@@ -413,9 +476,9 @@
|
||||
"index": {
|
||||
"oneOf": [
|
||||
{ "type": "integer" },
|
||||
{ "type": null }
|
||||
{ "type": "null" }
|
||||
],
|
||||
"default": "",
|
||||
"default": null,
|
||||
"description": "Close the tabs other than the one at this index. If no index is provided, use the focused tab's index."
|
||||
}
|
||||
}
|
||||
@@ -432,15 +495,108 @@
|
||||
"index": {
|
||||
"oneOf": [
|
||||
{ "type": "integer" },
|
||||
{ "type": null }
|
||||
{ "type": "null" }
|
||||
],
|
||||
"default": "",
|
||||
"default": null,
|
||||
"description": "Close the tabs following the tab at this index. If no index is provided, use the focused tab's index."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ScrollUpAction": {
|
||||
"description": "Arguments for a scrollUp action",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "scrollUp" },
|
||||
"rowsToScroll": {
|
||||
"type": ["integer", "null"],
|
||||
"default": null,
|
||||
"description": "Scroll up rowsToScroll lines. If no value is provided, use the system-level defaults."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ScrollDownAction": {
|
||||
"description": "Arguments for a scrollDown action",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "scrollDown" },
|
||||
"rowsToScroll": {
|
||||
"type": ["integer", "null"],
|
||||
"default": null,
|
||||
"description": "Scroll down rowsToScroll lines. If no value is provided, use the system-level defaults."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"MoveTabAction": {
|
||||
"description": "Arguments for moving a tab",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "moveTab" },
|
||||
"direction": {
|
||||
"$ref": "#/definitions/MoveTabDirection",
|
||||
"description": "The direction to move the tab"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [ "direction" ]
|
||||
},
|
||||
"CommandPaletteAction": {
|
||||
"description": "Arguments for a commandPalette action",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "commandPalette" },
|
||||
"launchMode": {
|
||||
"$ref": "#/definitions/CommandPaletteLaunchMode",
|
||||
"default": "action",
|
||||
"description": "Toggle command palette in either action or command line mode. If no value is provided, the palette will launch in action mode."
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"FindMatchAction": {
|
||||
"description": "Arguments corresponding to a Find Match Action",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type": "string", "pattern": "findMatch" },
|
||||
"direction": {
|
||||
"$ref": "#/definitions/FindMatchDirection",
|
||||
"default": "prev",
|
||||
"description": "The direction to search in. \"prev\" will search upwards in the buffer, and \"next\" will search downwards."
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"required": [ "direction" ]
|
||||
},
|
||||
"NewWindowAction": {
|
||||
"description": "Arguments corresponding to a New Window Action",
|
||||
"allOf": [
|
||||
{ "$ref": "#/definitions/ShortcutAction" },
|
||||
{ "$ref": "#/definitions/NewTerminalArgs" },
|
||||
{
|
||||
"properties": {
|
||||
"action": { "type":"string", "pattern": "newWindow" }
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Keybinding": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
@@ -462,6 +618,11 @@
|
||||
{ "$ref": "#/definitions/WtAction" },
|
||||
{ "$ref": "#/definitions/CloseOtherTabsAction" },
|
||||
{ "$ref": "#/definitions/CloseTabsAfterAction" },
|
||||
{ "$ref": "#/definitions/ScrollUpAction" },
|
||||
{ "$ref": "#/definitions/ScrollDownAction" },
|
||||
{ "$ref": "#/definitions/MoveTabAction" },
|
||||
{ "$ref": "#/definitions/FindMatchAction" },
|
||||
{ "$ref": "#/definitions/NewWindowAction" },
|
||||
{ "type": "null" }
|
||||
]
|
||||
},
|
||||
@@ -509,11 +670,26 @@
|
||||
"description": "When set to true, tabs are always displayed. When set to false and \"showTabsInTitlebar\" is set to false, tabs only appear after opening a new tab.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"centerOnLaunch": {
|
||||
"default": false,
|
||||
"description": "When set to `true`, the terminal window will auto-center itself on the display it opens on. The terminal will use the \"initialPosition\" to determine which display to open on.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"inputServiceWarning": {
|
||||
"default": true,
|
||||
"description": "Warning if 'Touch Keyboard and Handwriting Panel Service' is disabled.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"copyOnSelect": {
|
||||
"default": false,
|
||||
"description": "When set to true, a selection is immediately copied to your clipboard upon creation. When set to false, the selection persists and awaits further action.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"focusFollowMouse": {
|
||||
"default": false,
|
||||
"description": "When set to true, the terminal will focus the pane on mouse hover.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"copyFormatting": {
|
||||
"default": true,
|
||||
"description": "When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied.",
|
||||
@@ -538,6 +714,10 @@
|
||||
"description": "Sets the default profile. Opens by clicking the \"+\" icon or typing the key binding assigned to \"newTab\".",
|
||||
"type": "string"
|
||||
},
|
||||
"startupActions": {
|
||||
"description": "Sets the list of actions to apply if no command line is provided. Uses the same format as command line arguments",
|
||||
"type": "string"
|
||||
},
|
||||
"disabledProfileSources": {
|
||||
"description": "Disables all the dynamic profile generators in this list, preventing them from adding their profiles to the list of profiles on startup.",
|
||||
"items": {
|
||||
@@ -590,7 +770,7 @@
|
||||
},
|
||||
"rowsToScroll": {
|
||||
"default": "system",
|
||||
"description": "This parameter once allowed you to override the systemwide \"choose how many lines to scroll at one time\" setting. It no longer does so.",
|
||||
"description": "This parameter once allowed you to override the systemwide \"choose how many lines to scroll at one time\" setting. It no longer does so. However, you can customize the number of lines to scroll in \"scrollUp\" and \"scrollDown\" bindings.",
|
||||
"maximum": 999,
|
||||
"minimum": 0,
|
||||
"type": [ "integer", "string" ],
|
||||
@@ -650,8 +830,48 @@
|
||||
},
|
||||
"useTabSwitcher": {
|
||||
"default": true,
|
||||
"description": "When set to \"true\", the \"nextTab\" and \"prevTab\" commands will use the tab switcher UI.",
|
||||
"type": "boolean"
|
||||
"description": "Deprecated. Please use \"tabSwitcherMode\" instead.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"enum": [
|
||||
"mru",
|
||||
"inOrder",
|
||||
"disabled"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"deprecated": true
|
||||
},
|
||||
"tabSwitcherMode": {
|
||||
"default": "inOrder",
|
||||
"description": "When set to \"true\" or \"mru\", the \"nextTab\" and \"prevTab\" commands will use the tab switcher UI, with most-recently-used ordering. When set to \"inOrder\", these actions will switch tabs in their current ordering. Set to \"false\" to disable the tab switcher.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"enum": [
|
||||
"mru",
|
||||
"inOrder",
|
||||
"disabled"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"windowingBehavior": {
|
||||
"default": "useNew",
|
||||
"description": "Controls how new terminal instances attach to existing windows. \"useNew\" will always create a new window. \"useExisting\" will create new tabs in the most recently used window on this virtual desktop, and \"useAnyExisting\" will create tabs in the most recent window on any desktop.",
|
||||
"enum": [
|
||||
"useNew",
|
||||
"useExisting",
|
||||
"useAnyExisting"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -688,7 +908,17 @@
|
||||
},
|
||||
"backgroundImage": {
|
||||
"description": "Sets the file location of the image to draw over the window background.",
|
||||
"type": ["string", "null"]
|
||||
"oneOf": [
|
||||
{
|
||||
"type": ["string", null]
|
||||
},
|
||||
{
|
||||
"enum": [
|
||||
"desktopWallpaper"
|
||||
]
|
||||
}
|
||||
],
|
||||
"type": [ "string", "null" ]
|
||||
},
|
||||
"backgroundImageAlignment": {
|
||||
"default": "center",
|
||||
@@ -726,7 +956,7 @@
|
||||
},
|
||||
"bellStyle": {
|
||||
"default": "audible",
|
||||
"description": "Controls what happens when the application emits a BEL character. When set to \"audible\", the Terminal will play a sound. When set to \"none\", nothing will happen.",
|
||||
"description": "Controls what happens when the application emits a BEL character. When set to \"all\", the Terminal will play a sound and flash the taskbar icon. An array of specific behaviors can also be used. Supported array values include `audible` and `visual`. When set to \"none\", nothing will happen.",
|
||||
"$ref": "#/definitions/BellStyle"
|
||||
},
|
||||
"closeOnExit": {
|
||||
@@ -771,9 +1001,10 @@
|
||||
},
|
||||
"cursorShape": {
|
||||
"default": "bar",
|
||||
"description": "Sets the shape of the cursor. Possible values:\n -\"bar\" ( ┃, default )\n -\"emptyBox\" ( ▯ )\n -\"filledBox\" ( █ )\n -\"underscore\" ( ▁ )\n -\"vintage\" ( ▃ )",
|
||||
"description": "Sets the shape of the cursor. Possible values:\n -\"bar\" ( ┃, default )\n -\"doubleUnderscore\" ( ‗ )\n -\"emptyBox\" ( ▯ )\n -\"filledBox\" ( █ )\n -\"underscore\" ( ▁ )\n -\"vintage\" ( ▃ )",
|
||||
"enum": [
|
||||
"bar",
|
||||
"doubleUnderscore",
|
||||
"emptyBox",
|
||||
"filledBox",
|
||||
"underscore",
|
||||
@@ -785,6 +1016,10 @@
|
||||
"description": "When set to true, enable retro terminal effects. This is an experimental feature, and its continued existence is not guaranteed.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"experimental.pixelShaderPath": {
|
||||
"description": "Use to set a path to a pixel shader to use with the Terminal. Overrides `experimental.retroTerminalEffect`. This is an experimental feature, and its continued existence is not guaranteed.",
|
||||
"type": "string"
|
||||
},
|
||||
"fontFace": {
|
||||
"default": "Cascadia Mono",
|
||||
"description": "Name of the font face used in the profile.",
|
||||
@@ -798,7 +1033,7 @@
|
||||
},
|
||||
"fontWeight": {
|
||||
"default": "normal",
|
||||
"description": "Sets the weight (lightness or heaviness of the strokes) for the given font. Possible values:\n -\"thin\"\n -\"extra-light\"\n -\"light\"\n -\"semi-light\"\n -\"normal\" (default)\n -\"medium\"\n -\"semi-bold\"\n -\"bold\"\n -\"extra-bold\"\n -\"black\"\n -\"extra-black\" or the corresponding numeric representation of OpenType font weight.",
|
||||
"description": "Sets the weight (lightness or heaviness of the strokes) for the given font. Possible values:\n -\"thin\"\n -\"extra-light\"\n -\"light\"\n -\"semi-light\"\n -\"normal\" (default)\n -\"medium\"\n -\"semi-bold\"\n -\"bold\"\n -\"extra-bold\"\n -\"black\"\n -\"extra-black\"\n or the corresponding numeric representation of OpenType font weight.",
|
||||
"oneOf": [
|
||||
{
|
||||
"enum": [
|
||||
@@ -902,6 +1137,11 @@
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"tabColor": {
|
||||
"$ref": "#/definitions/Color",
|
||||
"description": "Sets the color of the profile's tab. Using the tab color picker will override this color.",
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"tabTitle": {
|
||||
"description": "If set, will replace the name as the title to pass to the shell on startup. Some shells (like bash) may choose to ignore this initial value, while others (cmd, powershell) may use this value over the lifetime of the application.",
|
||||
"type": ["string", "null"]
|
||||
|
||||
@@ -19,7 +19,7 @@ When creating a new DLL, it was really helpful to reference an existing DLL's `.
|
||||
- [ ] Add a `<Reference>` to `TerminalAppLib.vcxproj` similar to this:
|
||||
```
|
||||
<Reference Include="Microsoft.Terminal.NewDLL">
|
||||
<HintPath>$(_BinRoot)TerminalNewDLL\Microsoft.Terminal.NewDLL.winmd</HintPath>
|
||||
<HintPath>$(OpenConsoleCommonOutDir)\TerminalNewDLL\Microsoft.Terminal.NewDLL.winmd</HintPath>
|
||||
<IsWinMDFile>true</IsWinMDFile>
|
||||
<Private>false</Private>
|
||||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||||
|
||||
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 98 KiB |
239
doc/reference/Build-SupportedSequenceIndex.ps1
Normal file
@@ -0,0 +1,239 @@
|
||||
#requires -version 6.1
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Scan source code and build a list of supported VT sequences.
|
||||
.DESCRIPTION
|
||||
Scan source code and build a list of supported VT sequences.
|
||||
TODO: add more details
|
||||
#>
|
||||
[cmdletbinding(DefaultParameterSetName="stdout")]
|
||||
param(
|
||||
[parameter(ParameterSetName="file", mandatory)]
|
||||
[string]$OutFile,
|
||||
[parameter(ParameterSetName="file")]
|
||||
[switch]$Force, # for overwriting $OutFile if it exists
|
||||
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[parameter(ParameterSetName="file")]
|
||||
[switch]$NoLogo, # no logo in summary
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[switch]$SummaryOnly, # no markdown generated
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[parameter(ParameterSetName="file")]
|
||||
[switch]$Quiet, # no summary or logo
|
||||
|
||||
[parameter(ParameterSetName="file")]
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[string]$SolutionRoot = "..\..",
|
||||
[parameter(ParameterSetName="file")]
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[string]$InterfacePath = $(join-path $solutionRoot "src\terminal\adapter\ITermDispatch.hpp"),
|
||||
[parameter(ParameterSetName="file")]
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[string]$ConsoleAdapterPath = $(join-path $solutionRoot "src\terminal\adapter\adaptDispatch.hpp"),
|
||||
[parameter(ParameterSetName="file")]
|
||||
[parameter(ParameterSetName="stdout")]
|
||||
[string]$TerminalAdapterPath = $(join-path $solutionRoot "src\cascadia\terminalcore\terminalDispatch.hpp")
|
||||
)
|
||||
|
||||
if ($PSCmdlet.ParameterSetName -eq "stdout") {
|
||||
Write-Verbose "Emitting markdown to STDOUT"
|
||||
}
|
||||
|
||||
<#
|
||||
GLOBALS
|
||||
#>
|
||||
|
||||
[semver]$myVer = "0.6-beta"
|
||||
$sequences = import-csv ".\master-sequence-list.csv"
|
||||
$base = @{}
|
||||
$conhost = @{}
|
||||
$terminal = @{}
|
||||
$prefix = "https://vt100.net/docs/vt510-rm/"
|
||||
$repo = "https://github.com/oising/terminal/tree/master"
|
||||
$conhostUrl = $ConsoleAdapterPath.TrimStart($SolutionRoot).replace("\", "/")
|
||||
$terminalUrl = $TerminalAdapterPath.TrimStart($SolutionRoot).replace("\", "/")
|
||||
|
||||
function Read-SourceFiles {
|
||||
# extract base interface
|
||||
$baseScanner = [regex]'(?x)virtual\s\w+\s(?<method>\w+)(?s)[^;]+;(?-s).*?(?<seq>(?<=\/\/\s).+)'
|
||||
|
||||
$baseScanner.Matches(($src = get-content -raw $interfacePath)) | foreach-object {
|
||||
$match = $_
|
||||
#$line = (($src[0..$_.Index] -join "") -split "`n").Length
|
||||
#$decl = $_.groups[0].value
|
||||
$_.groups["seq"].value.split(",") | ForEach-Object {
|
||||
$SCRIPT:base[$_.trim()] = $match.groups["method"].value
|
||||
}
|
||||
}
|
||||
|
||||
# match overrides of ITermDispatch
|
||||
$scanner = [regex]'(?x)\s+\w+\s(?<method>\w+)(?s)[^;]+override;'
|
||||
|
||||
$scanner.Matches(($src = Get-Content -raw $consoleAdapterPath)) | ForEach-Object {
|
||||
$line = (($src[0..$_.Index] -join "") -split "`n").Length
|
||||
$SCRIPT:conhost[$_.groups["method"].value] = $line
|
||||
}
|
||||
|
||||
$scanner.Matches(($src = Get-Content -raw $terminalAdapterPath)) | ForEach-Object {
|
||||
$line = (($src[0..$_.Index] -join "") -split "`n").Length
|
||||
#write-verbose $_.groups[0].value
|
||||
$SCRIPT:terminal[$_.groups["method"].value] = $line
|
||||
}
|
||||
}
|
||||
|
||||
function Get-SequenceIndexMarkdown {
|
||||
# "Sequence","Parent","Description","Origin","Heading","Subheading", "ImplementedBy", "ConsoleHost","Terminal"
|
||||
|
||||
$heading = $null
|
||||
$subheading = $null
|
||||
<#
|
||||
Emit markdown
|
||||
|
||||
TODO:
|
||||
- auto-generate TOC
|
||||
#>
|
||||
@"
|
||||
# VT Function Support
|
||||
|
||||
## Table of Contents
|
||||
|
||||
* [Code Extension Functions](#code-extension-functions)
|
||||
* [Control Coding](#control-coding)
|
||||
* [Character Coding](#character-coding)
|
||||
* [Graphic Character Sets](#graphic-character-sets)
|
||||
* [Terminal Management Functions](#terminal-management-functions)
|
||||
* [Identification, status, and Initialization](#identification-status-and-initialization)
|
||||
* [Emulations](#emulations)
|
||||
* [Set-Up](#set-up)
|
||||
* [Display Coordinate System and Addressing](#display-coordinate-system-and-addressing)
|
||||
* [Active Position and Cursor](#active-position-and-cursor)
|
||||
* [Margins and Scrolling](#margins-and-scrolling)
|
||||
* [Cursor Movement](#cursor-movement)
|
||||
* [Horizontal Tabulation](#horizontal-tabulation)
|
||||
* [Page Size and Arrangement](#page-size-and-arrangement)
|
||||
* [Page Movement](#page-movement)
|
||||
* [Status Display](#status-display)
|
||||
* [Right to Left](#right-to-left)
|
||||
* [Window Management](#window-management)
|
||||
* [Visual Attributes and Renditions](#visual-attributes-and-renditions)
|
||||
* [Line Renditions](#line-renditions)
|
||||
* [Character Renditions](#character-renditions)
|
||||
* [Audible Indicators](#audible-indicators)
|
||||
* [Mode States](#mode-states)
|
||||
* [ANSI](#ansi)
|
||||
* [DEC Private](#dec-private)
|
||||
* [Editing Functions](#editing-functions)
|
||||
* [OLTP Features](#OLTP-features)
|
||||
* [Rectangular Area Operations](#rectangular-area-operations)
|
||||
* [Data Integrity](#data-integrity)
|
||||
* [Macros](#macros)
|
||||
* [Saving and Restoring Terminal State](#saving-and-restoring-terminal-state)
|
||||
* [Cursor Save Buffer](#cursor-save-buffer)
|
||||
* [Terminal State Interrogation](#terminal-state-interrogation)
|
||||
* [Keyboard Processing Functions](#keyboard-processing-functions)
|
||||
* [Soft Key Mapping (UDK)](#soft-key-mapping-UDK)
|
||||
* [Soft Fonts (DRCS)](#soft-fonts-drcs)
|
||||
* [Printing](#printing)
|
||||
* [Terminal Communication and Synchronization](#terminal-communication-and-synchronization)
|
||||
* [Text Locator Extension](#text-locator-extension)
|
||||
* [Session Management Extension](#session-management-extension)
|
||||
* [Documented Exceptions](#documented-exceptions)
|
||||
|
||||
$($sequences | ForEach-Object {
|
||||
if ($method = $base[$_.sequence]) {
|
||||
$_.ImplementedBy = $method
|
||||
$_.ConsoleHost = $conhost[$method]
|
||||
$_.Terminal = $terminal[$method]
|
||||
}
|
||||
# "Sequence","Associated","Description","Origin","Heading","Subheading", "ImplementedBy", "ConsoleHost","Terminal"
|
||||
$c0 = "[$($_.Sequence)]($prefix$($_.sequence).html ""View page on vt100.net"")"
|
||||
$c1 = "$($_.description)"
|
||||
$c2 = "$($_.origin)"
|
||||
$c3 = $(if ($_.consolehost) {"[✓](${repo}/${conhostUrl}#L$($_.consolehost) ""View console host implementation"")"})
|
||||
$c4 = $(if ($_.terminal) {"[✓](${repo}/${terminalUrl}#L$($_.terminal)} ""View windows terminal implementation"")"})
|
||||
|
||||
$shouldRenderHeader = $false
|
||||
|
||||
if ($heading -ne $_.heading) {
|
||||
$heading = $_.heading
|
||||
@"
|
||||
|
||||
## $heading
|
||||
|
||||
"@
|
||||
$shouldRenderHeader = $true
|
||||
}
|
||||
|
||||
if ($subheading -ne $_.subheading) {
|
||||
$subheading = $_.subheading
|
||||
@"
|
||||
|
||||
### $subheading
|
||||
|
||||
"@
|
||||
$shouldRenderHeader = $true
|
||||
}
|
||||
|
||||
if ($shouldRenderHeader) {
|
||||
@"
|
||||
|
||||
|Symbol|Function|Origin 🖳|Console Host|Terminal|
|
||||
|:-|:--|:--:|:--:|:--:|
|
||||
"@
|
||||
}
|
||||
@"
|
||||
|
||||
|$c0|$c1|$c2|$c3|$c4|
|
||||
"@
|
||||
})
|
||||
|
||||
---
|
||||
Generated on $(get-date -DisplayHint DateTime)
|
||||
"@
|
||||
}
|
||||
|
||||
function Show-Summary {
|
||||
write-host "`n$(' '*7)Windows Terminal Sequencer v${myVer}"
|
||||
if (-not $NoLogo.IsPresent) {
|
||||
Get-Content .\windows-terminal-logo.ans | ForEach-Object { Write-Host $_ }
|
||||
}
|
||||
$summary = @"
|
||||
`e[1mSequence Support:`e[0m
|
||||
|
||||
`e[7m {0:000} `e[0m known in master-sequence-list.csv.
|
||||
`e[7m {1:000} `e[0m common members in ITermDispatch base, of which:
|
||||
`e[7m {2:000} `e[0m are implemented by ConsoleHost.
|
||||
`e[7m {3:000} `e[0m are implemented by Windows Terminal.
|
||||
|
||||
"@ -f $sequences.Count, $base.count, $conhost.count, $terminal.Count
|
||||
|
||||
write-host $summary
|
||||
}
|
||||
|
||||
<#
|
||||
Entry Point
|
||||
#>
|
||||
|
||||
Read-SourceFiles
|
||||
|
||||
if (-not $SummaryOnly.IsPresent) {
|
||||
|
||||
$markdown = Get-SequenceIndexMarkdown
|
||||
|
||||
if ($PSCmdlet.ParameterSetName -eq "file") {
|
||||
# send to file and overwrite
|
||||
$markdown | Out-File -FilePath $OutFile -Force:$Force.IsPresent -Encoding utf8NoBOM
|
||||
} else {
|
||||
# send to STDOUT
|
||||
$markdown
|
||||
}
|
||||
|
||||
if (-not $Quiet.IsPresent) {
|
||||
Show-Summary
|
||||
}
|
||||
} else {
|
||||
# summary only
|
||||
Show-Summary
|
||||
}
|
||||
224
doc/reference/master-sequence-list.csv
Normal file
@@ -0,0 +1,224 @@
|
||||
"Sequence","Parent","Description","Origin","Heading","Subheading","ImplementedBy","ConsoleHost","Terminal"
|
||||
"CAN","","Cancel","`VT100`","Code Extension Functions","Control Coding","","",""
|
||||
"SUB","","Substitute","`VT100`","Code Extension Functions","Control Coding","","",""
|
||||
"ESC","","Escape","`VT100`","Code Extension Functions","Control Coding","","",""
|
||||
"DCS","","Device Control String","`VT220`","Code Extension Functions","Control Coding","","",""
|
||||
"CSI","","Control Sequence Introducer","`VT100`","Code Extension Functions","Control Coding","","",""
|
||||
"ST","","String Terminator","`VT220`","Code Extension Functions","Control Coding","","",""
|
||||
"OSC","","Operating System Command","`DECterm`","Code Extension Functions","Control Coding","","",""
|
||||
"PM","","Privacy Message","``","Code Extension Functions","Control Coding","","",""
|
||||
"APC","","Application Program Command","`VT420`","Code Extension Functions","Control Coding","","",""
|
||||
"S7C1T","","Select 7-bit C1 Transmission","`VT220`","Code Extension Functions","Control Coding","","",""
|
||||
"S8C1T","","Select 8-bit C1 Transmission","`VT220`","Code Extension Functions","Control Coding","","",""
|
||||
"LS0","","Locking Shift Zero (SI)","`VT100`","Code Extension Functions","Character Coding","","",""
|
||||
"LS1","","Locking Shift One (SO)","`VT100`","Code Extension Functions","Character Coding","","",""
|
||||
"LS2","","Locking Shift Two","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"LS3","","Locking Shift Three","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"LS1R","","Locking Shift One Right","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"LS2R","","Locking Shift Two Right","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"LS3R","","Locking Shift Three Right","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"SS2","","Single Shift Two","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"SS3","","Single Shift Three","`VT220`","Code Extension Functions","Character Coding","","",""
|
||||
"SCS","","Select Character Set","`VT100`","Code Extension Functions","Graphic Character Sets","","",""
|
||||
"DECNRCM","","(National Replacement) Character Set Mode","`VT220`","Code Extension Functions","Graphic Character Sets","","",""
|
||||
"DECAUPSS","","Assign User-Preference Supplemental Set","`VT320`","Code Extension Functions","Graphic Character Sets","","",""
|
||||
"DECRQUPSS","","Request User-Preference Supplemental Set","`VT320`","Code Extension Functions","Graphic Character Sets","","",""
|
||||
"DA1","","Primary Device Attributes","`VT100`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DA2","","Secondary Device Attributes","`VT220`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DA3","","Tertiary Device Attributes","`VT420`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DSR","","Device Status Report","`VT100`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECID","","Identify Device","`VT100`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECTID","","Select Terminal ID","`VT510`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECSCL","","Select Conformance Level","`VT220`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECSR","","Secure Reset","`VT420`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECSRC","","Secure Reset Confirmation","`VT420`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECSTR","","Soft Terminal Reset","`VT220`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECSTUI","","Set Terminal Unit ID (Restricted)","`VT420`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"RIS","","Reset to Initial state","`VT100`","Terminal Management Functions","Identification, status, and Initialization","","",""
|
||||
"DECPCTERM","","Enter/Exit PC Term Mode from DEC VT mode","`VT420PC`","Terminal Management Functions","Emulations","","",""
|
||||
"DECTME","","Terminal Mode Emulation","`VT510`","Terminal Management Functions","Emulations","","",""
|
||||
"DECSSL","","Select Set-Up Language","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECCRTSM","","CRT Save Mode (not required)","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECOSCNM","","Overscan Mode","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECSRFR","","Select Refresh Rate","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECLTOD","","Load Time of Day","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECLBAN","","Load Banner Message","`VT510`","Terminal Management Functions","Set-Up","","",""
|
||||
"DECTCEM","","Text Cursor Enable Mode","`VT220`","Display Coordinate System and Addressing","Active Position and Cursor","","",""
|
||||
"DECSCUSR","","Set Cursor Style","`VT510`","Display Coordinate System and Addressing","Active Position and Cursor","","",""
|
||||
"DECSTBM","","Set Top and Bottom Margin","`VT100`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECSLRM","","Set Left and Right Margin","`VT420`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECLRMM","","Left Right Margin Mode","`VT420`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECOM","","Origin Mode","`VT100`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECSCLM","","Scrolling Mode","`VT100`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"IND","","Index","`VT100`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"RI","","Reverse Index","`VT100`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECFI","","Forward Index","`VT420`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECBI","","Back Index","`VT420`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"DECSSCLS","","Set Scroll Speed","`VT510`","Display Coordinate System and Addressing","Margins and Scrolling","","",""
|
||||
"BS","","Backspace","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"LF","","Line Feed","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"VT","","Vertical Tab","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"FF","","Form Feed","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CR","","Carriage Return","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"NEL","","Next Line","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"LNM","","Line Feed/New Line Mode","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CUU","","Cursor Up","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CUD","","Cursor Down","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CUF","","Cursor Forward","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CUB","","Cursor Backward","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CUP","","Cursor Position","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"HVP","","Horizontal/Vertical Position","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"DSR-CPR","","Device Status Report (Cursor Position Report)","`VT100`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"DSR-XCPR","","Device Status Report (Extended Cursor Position Report)","`VT340` `VT420`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CHA","","Cursor Horizontal Absolute","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CNL","","Cursor Next Line","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"CPL","","Cursor Previous Line","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"HPA","","Horizontal Position Absolute","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"HPR","","Horizontal Position Relative","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"VPA","","Vertical Line Position Absolute","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"VPR","","Vertical Position Relative","`VT510`","Display Coordinate System and Addressing","Cursor Movement","","",""
|
||||
"HT","","Horizontal Tab","`VT100`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"HTS","","Horizontal Tabulation Set","`VT100`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"TBC","","Tabulation Clear","`VT100`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"CBT","","Cursor Backward Tabulation","`VT510`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"CHT","","Cursor Horizontal Forward Tabulation","`VT510`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"DECST8C","","Set Tab at every 8 columns","`VT420PC`","Display Coordinate System and Addressing","Horizontal Tabulation","","",""
|
||||
"DECCOLM","","Column Mode","`VT100`","Display Coordinate System and Addressing","Page Size and Arrangement","","",""
|
||||
"DECNCSM","","No Clear Screen on column Mode","`VT510`","Display Coordinate System and Addressing","Page Size and Arrangement","","",""
|
||||
"DECSCPP","","Set Columns Per Page","`VT340` `VT420`","Display Coordinate System and Addressing","Page Size and Arrangement","","",""
|
||||
"DECSLPP","","Set Lines Per Page","`VT340` `VT420`","Display Coordinate System and Addressing","Page Size and Arrangement","","",""
|
||||
"NP","","Next Page","`VT340` `VT420`","Display Coordinate System and Addressing","Page Movement","","",""
|
||||
"PP","","Preceding Page","`VT340` `VT420`","Display Coordinate System and Addressing","Page Movement","","",""
|
||||
"PPA","","Page Position Absolute","`VT340` `VT420`","Display Coordinate System and Addressing","Page Movement","","",""
|
||||
"PPR","","Page Position Relative","`VT340` `VT420`","Display Coordinate System and Addressing","Page Movement","","",""
|
||||
"PPB","","Page Position Backward","`VT340` `VT420`","Display Coordinate System and Addressing","Page Movement","","",""
|
||||
"DECSASD","","Select Active Status Display","`VT340` `VT320`","Display Coordinate System and Addressing","Status Display","","",""
|
||||
"DECSSDT","","Select Status Display Type","`VT340` `VT320`","Display Coordinate System and Addressing","Status Display","","",""
|
||||
"DECRLM","","Right to Left Mode","`VT510`","Display Coordinate System and Addressing","Right to Left","","",""
|
||||
"DECRLCM","","Right to Left Copy Mode","`VT510`","Display Coordinate System and Addressing","Right to Left","","",""
|
||||
"DDD1","","`VT100` mode Hebrew","`VT510`","Display Coordinate System and Addressing","Right to Left","","",""
|
||||
"DDD2","","`VT100` mode Hebrew","`VT510`","Display Coordinate System and Addressing","Right to Left","","",""
|
||||
"DDD3","","`VT100` mode Hebrew","`VT510`","Display Coordinate System and Addressing","Right to Left","","",""
|
||||
"DECHCCM","","Horizontal Cursor Coupling Mode","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"DECVCCM","","Vertical Cursor Coupling Mode","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"DECPCCM","","Page Cursor Coupling Mode","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"DECRQDE","","Request Displayed Extent","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"DECSNLS","","Select Number of Lines per Screen (exception)","`VT420`","Window Management","Right to Left","","",""
|
||||
"DECARSM","","Auto Resize Mode","`DECterm` `VT420`","Window Management","Right to Left","","",""
|
||||
"SU","","Pan Down","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"SD","","Pan Up","`VT340` `VT420`","Window Management","Right to Left","","",""
|
||||
"DECSCNM","","Screen Mode","`VT100`","Visual Attributes and Renditions","Right to Left","","",""
|
||||
"DECSWL","","Single Width Line","`VT100`","Visual Attributes and Renditions","Line Renditions","","",""
|
||||
"DECDWL","","Double Width Line","`VT100`","Visual Attributes and Renditions","Line Renditions","","",""
|
||||
"DECDHLT","","Double Height Line Top","`VT100`","Visual Attributes and Renditions","Line Renditions","","",""
|
||||
"DECDHLB","","Double Height Line Bottom","`VT100`","Visual Attributes and Renditions","Line Renditions","","",""
|
||||
"SGR","","Select Graphic Rendition","`VT100`","Visual Attributes and Renditions","Character Renditions","","",""
|
||||
"BEL","","Warning Bell","`VT100`","Audible Indicators","Character Renditions","","",""
|
||||
"DECSKCV","","Set Keyclick Volume","`VT510`","Audible Indicators","Character Renditions","","",""
|
||||
"DECSWBV","","Set Warning Bell Volume","`VT510`","Audible Indicators","Character Renditions","","",""
|
||||
"DECSMBV","","Set Margin Bell Volume","`VT510`","Audible Indicators","Character Renditions","","",""
|
||||
"IRM","","Insert/Replacement Mode","`VT102`","Editing Functions","DEC Private","","",""
|
||||
"ICH","","Insert Character","`VT102`","Editing Functions","DEC Private","","",""
|
||||
"DCH","","Delete Character","`VT102`","Editing Functions","DEC Private","","",""
|
||||
"IL","","Insert Line","`VT100`","Editing Functions","DEC Private","","",""
|
||||
"DL","","Delete Line","`VT100`","Editing Functions","DEC Private","","",""
|
||||
"DECIC","","Insert Column","`VT420`","Editing Functions","DEC Private","","",""
|
||||
"DECDC","","Delete Column","`VT420`","Editing Functions","DEC Private","","",""
|
||||
"ECH","","Erase Character","`VT100`","Editing Functions","DEC Private","","",""
|
||||
"EL","","Erase in Line","`VT100`","Editing Functions","DEC Private","","",""
|
||||
"DECSEL","","Selective Erase in Line","`VT220`","Editing Functions","DEC Private","","",""
|
||||
"ED","","Erase in Display","`VT100`","Editing Functions","DEC Private","","",""
|
||||
"DECSED","","Selective Erase in Display","`VT220`","Editing Functions","DEC Private","","",""
|
||||
"DECSCA","","Select Character Attribute (selective erase)","`VT220`","Editing Functions","DEC Private","","",""
|
||||
"DECCRA","","Copy Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECFRA","","Fill Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECERA","","Erase Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECSERA","","Selective Erase Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECCARA","","Change Attribute in Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECRARA","","Reverse Attribute in Rectangular Area","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECSACE","","Select Attribute Change Extent Mode","`VT420`","OLTP Features","Rectangular Area Operations","","",""
|
||||
"DECRQCRA","","Request Checksum of Rectangular Area","`VT420`","OLTP Features","Data Integrity","","",""
|
||||
"DSR-DECCKSR","","Device Status Report (Memory Checksum)","`VT420`","OLTP Features","Data Integrity","","",""
|
||||
"DECDMAC","","Define Macro","`VT420`","OLTP Features","Macros","","",""
|
||||
"DECINVM","","Invoke Macro","`VT420`","OLTP Features","Macros","","",""
|
||||
"DSR-MSR","","Device Status Report (Macro Space Report)","`VT420`","OLTP Features","Macros","","",""
|
||||
"DECSC","","Save Cursor","`VT100`","Saving and Restoring Terminal State","Cursor Save Buffer","","",""
|
||||
"DECRC","","Restore Cursor","`VT100`","Saving and Restoring Terminal State","Cursor Save Buffer","","",""
|
||||
"DECRQM","","Request Mode","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECNKM","","Numeric Keypad Mode","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECRQSS","","Request Selection or Setting","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECRQPSR","","Request Presentation State Report","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECRSPS","","Restore Presentation State","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECRQTSR","","Request Terminal State Report","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECRSTS","","Restore Terminal State","`VT320`","Saving and Restoring Terminal State","Terminal State Interrogation","","",""
|
||||
"DECARM","","Autorepeat Mode","`VT100`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECBKM","","Backarrow Key Mode","`VT420`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECCKM","","Cursor Keys Mode","`VT100`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKBUM","","Keyboard Usage Mode","`VT320`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKPAM","","Keypad Application Mode","`VT100`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKPM","","Key Position Mode","`VT420`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKPNM","","Keypad Numeric Mode","`VT100`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECNKM","","Numeric Keypad Mode","`VT320`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DSR-KBD","","Device Status Report (keyboard status)","`VT220`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"KAM","","Keyboard Action Mode","`VT220`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECLFC","","Local Functions Control","`VT420`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECLFKC","","Local Function Key Control","`VT420`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECSMKR","","Select Modifier Key Reporting","`VT420`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECHEBM","","Hebrew Keyboard Map mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECHCEM","","Hebrew Encoding Mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECNAKB","","NA/Greek Selection","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECESKM","","Secondary Keyboard Language Mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECSLCK","","Set Lock Key Style","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKBD","","Keyboard Dialect Selection","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECNUMLK","","NumLock Mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECCAPSLK","","CapsLock Mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECKLHIM","","Keyboard LEDs Host Indicator Mode","`VT510`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECLL","","Load LEDs","`VT100`","Keyboard Processing Functions","Terminal State Interrogation","","",""
|
||||
"DECUDK","","User Defined Keys","`VT220`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DSR-UDK","","Device Status Report (UDK lock)","`VT220`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECPKA","","Program Key Action","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECPFK","","Program Function Key","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECPAK","","Program Alphanumeric Key","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECCKD","","Copy Key Default","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECRQPKFM","","Program Key Free Memory Inquiry","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECRQKT","","Inquire a Key Type","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECRQKD","","Inquire a Key Definition","`VT510`","Soft Key Mapping (UDK)","Terminal State Interrogation","","",""
|
||||
"DECDLD","","Downline Load","`VT220`","Soft Fonts (DRCS)","Terminal State Interrogation","","",""
|
||||
"DECPEX","","Print Extent Mode","`VT220`","Printing","Terminal State Interrogation","","",""
|
||||
"DECPFF","","Print Form Feed Mode","`VT220`","Printing","Terminal State Interrogation","","",""
|
||||
"DSR-PP","","Device Status Report (printer port)","`VT220`","Printing","Terminal State Interrogation","","",""
|
||||
"MC","","Media Copy","`VT220`","Printing","Terminal State Interrogation","","",""
|
||||
"DECSPRTT","","Select Printer Type","`VT510`","Printing","Terminal State Interrogation","","",""
|
||||
"DECSDPT","","Select Digital Printed Data Type","`VT510`","Printing","Terminal State Interrogation","","",""
|
||||
"DECSPPCS","","Select Proprinter Character Set","`VT510`","Printing","Terminal State Interrogation","","",""
|
||||
"BREAK","","BREAK","`VT100`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"XON","","XON","`VT100`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"XOFF","","XOFF","`VT100`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"ENQ","","Enquiry","`VT100`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"SRM","","Send Receive Mode","`VT220`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECXRLM","","Transmit Rate Limiting Mode","`VT420`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECMCM","","Modem Control Mode","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECAAM","","Auto Answerback Mode","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECLANS","","Load Answerback Message","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECCANSM","","Conceal Answerback Message Mode","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECNULM","","Ignore Null Mode","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECHPDXM","","Half Duplex Mode","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSFC","","Select Flow Control","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSDDT","","Select Disconnect Delay Time","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSTRL","","Set Transmit Rate Limit","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSCS","","Select Communication Speed","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSCP","","Select Communication Port","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECSPP","","Set Port Parameter","`VT510`","Terminal Communication and Synchronization","Terminal State Interrogation","","",""
|
||||
"DECEFR","","Enable Filter Rectangle","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECELR","","Enable Locator Reports","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECLKD","","Locator Key Definition","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECLRP","","Locator Report","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECRQLP","","Request Locator Position","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECSLE","","Select Locator Events","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DSR-LS","","Device Status Report (Locator Status)","`UWS`","Text Locator Extension","Terminal State Interrogation","","",""
|
||||
"DECES","","Enable Sessions","`VT340` `VT420`","Session Management Extension","Terminal State Interrogation","","",""
|
||||
"DECANM","","`ANSI`/`VT52` Mode","`VT100`","Documented Exceptions","Terminal State Interrogation","","",""
|
||||
"DECALN","","Screen Alignment","`VT100`","Documented Exceptions","Terminal State Interrogation","","",""
|
||||
"DECAWM","","Autowrap Mode","`VT100`","Documented Exceptions","Terminal State Interrogation","","",""
|
||||
"DECTST","","Invoke Confidence Test","`VT100`","Documented Exceptions","Terminal State Interrogation","","",""
|
||||
"CRM","","Control Representation Mode","`VT100`","Documented Exceptions","Terminal State Interrogation","","",""
|
||||
|
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 117 KiB |
15
doc/reference/windows-terminal-logo.ans
Normal file
@@ -0,0 +1,15 @@
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;191;191;191m[48;2;204;204;204m▀[0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[38;2;95;95;95m[48;2;102;102;102m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;204;204;204m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;153;153;153m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m[7m[38;2;102;102;102m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;77;77;77m[48;2;76;76;76m▀[0m[7m[38;2;76;76;76m [0m[38;2;76;76;76m[48;2;75;75;75m▀[0m[38;2;76;76;76m[48;2;75;75;75m▀[0m[7m[38;2;75;75;75m [0m[38;2;75;75;75m[48;2;74;74;74m▀[0m[38;2;75;75;75m[48;2;74;74;74m▀[0m[7m[38;2;74;74;74m [0m[38;2;74;74;74m[48;2;73;73;73m▀[0m[38;2;74;74;74m[48;2;73;73;73m▀[0m[7m[38;2;73;73;73m [0m[38;2;73;73;73m[48;2;72;72;72m▀[0m[38;2;73;73;73m[48;2;72;72;72m▀[0m[7m[38;2;72;72;72m [0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[7m[38;2;71;71;71m [0m[7m[38;2;71;71;71m [0m[38;2;71;71;71m[48;2;70;70;70m▀[0m[7m[38;2;70;70;70m [0m[7m[38;2;70;70;70m [0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[7m[38;2;69;69;69m [0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[7m[38;2;67;67;67m [0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[7m[38;2;66;66;66m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;76;76;76m[48;2;75;75;75m▀[0m[7m[38;2;75;75;75m [0m[38;2;75;75;75m[48;2;74;74;74m▀[0m[38;2;75;75;75m[48;2;74;74;74m▀[0m[38;2;74;74;74m[48;2;73;73;73m▀[0m[38;2;74;74;74m[48;2;71;71;71m▀[0m[38;2;73;73;73m[48;2;67;67;67m▀[0m[38;2;73;73;73m[48;2;70;70;70m▀[0m[38;2;73;73;73m[48;2;71;71;71m▀[0m[7m[38;2;72;72;72m [0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[7m[38;2;71;71;71m [0m[38;2;71;71;71m[48;2;70;70;70m▀[0m[38;2;71;71;71m[48;2;70;70;70m▀[0m[7m[38;2;70;70;70m [0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[7m[38;2;69;69;69m [0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[7m[38;2;66;66;66m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[7m[38;2;74;74;74m [0m[38;2;74;74;74m[48;2;73;73;73m▀[0m[38;2;74;74;74m[48;2;73;73;73m▀[0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[38;2;70;70;70m[48;2;97;97;97m▀[0m[38;2;138;138;138m[48;2;229;229;229m▀[0m[38;2;229;229;229m[48;2;228;228;228m▀[0m[38;2;203;203;203m[48;2;226;226;226m▀[0m[38;2;84;84;84m[48;2;200;200;200m▀[0m[38;2;70;70;70m[48;2;82;82;82m▀[0m[38;2;71;71;71m[48;2;69;69;69m▀[0m[7m[38;2;70;70;70m [0m[7m[38;2;70;70;70m [0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[7m[38;2;69;69;69m [0m[7m[38;2;69;69;69m [0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[7m[38;2;67;67;67m [0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[7m[38;2;66;66;66m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[7m[38;2;63;63;63m [0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[7m[38;2;62;62;62m [0m[7m[38;2;62;62;62m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[7m[38;2;73;73;73m [0m[38;2;73;73;73m[48;2;72;72;72m▀[0m[7m[38;2;71;71;71m [0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[38;2;94;94;94m[48;2;62;62;62m▀[0m[38;2;227;227;227m[48;2;130;130;130m▀[0m[38;2;226;226;226m[48;2;224;224;224m▀[0m[38;2;224;224;224m[48;2;222;222;222m▀[0m[38;2;223;223;223m[48;2;221;221;221m▀[0m[38;2;197;197;197m[48;2;220;220;220m▀[0m[38;2;81;81;81m[48;2;195;195;195m▀[0m[38;2;68;68;68m[48;2;80;80;80m▀[0m[38;2;69;69;69m[48;2;67;67;67m▀[0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[7m[38;2;67;67;67m [0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[7m[38;2;66;66;66m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[7m[38;2;62;62;62m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[38;2;72;72;72m[48;2;71;71;71m▀[0m[7m[38;2;70;70;70m [0m[7m[38;2;69;69;69m [0m[38;2;64;64;64m[48;2;66;66;66m▀[0m[38;2;58;58;58m[48;2;62;62;62m▀[0m[38;2;127;127;127m[48;2;57;57;57m▀[0m[38;2;220;220;220m[48;2;125;125;125m▀[0m[38;2;219;219;219m[48;2;217;217;217m▀[0m[38;2;218;218;218m[48;2;216;216;216m▀[0m[38;2;217;217;217m[48;2;215;215;215m▀[0m[38;2;192;192;192m[48;2;214;214;214m▀[0m[38;2;79;79;79m[48;2;195;195;195m▀[0m[38;2;66;66;66m[48;2;83;83;83m▀[0m[38;2;67;67;67m[48;2;65;65;65m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[7m[38;2;66;66;66m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[7m[38;2;62;62;62m [0m[7m[38;2;62;62;62m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[7m[38;2;60;60;60m [0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[38;2;60;60;60m[48;2;59;59;59m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;71;71;71m[48;2;70;70;70m▀[0m[7m[38;2;70;70;70m [0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[38;2;68;68;68m[48;2;69;69;69m▀[0m[38;2;66;66;66m[48;2;67;67;67m▀[0m[38;2;62;62;62m[48;2;64;64;64m▀[0m[38;2;56;56;56m[48;2;60;60;60m▀[0m[38;2;123;123;123m[48;2;62;62;62m▀[0m[38;2;214;214;214m[48;2;161;161;161m▀[0m[38;2;213;213;213m[48;2;211;211;211m▀[0m[38;2;212;212;212m[48;2;210;210;210m▀[0m[38;2;211;211;211m[48;2;209;209;209m▀[0m[38;2;192;192;192m[48;2;208;208;208m▀[0m[38;2;74;74;74m[48;2;84;84;84m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[38;2;65;65;65m[48;2;64;64;64m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[7m[38;2;62;62;62m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[7m[38;2;60;60;60m [0m[7m[38;2;60;60;60m [0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[7m[38;2;59;59;59m [0m[7m[38;2;59;59;59m [0m[38;2;59;59;59m[48;2;58;58;58m▀[0m[7m[38;2;58;58;58m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;70;70;70m[48;2;69;69;69m▀[0m[7m[38;2;69;69;69m [0m[38;2;69;69;69m[48;2;68;68;68m▀[0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;67;67;67m[48;2;65;65;65m▀[0m[38;2;64;64;64m[48;2;72;72;72m▀[0m[38;2;69;69;69m[48;2;151;151;151m▀[0m[38;2;140;140;140m[48;2;160;160;160m▀[0m[38;2;139;139;139m[48;2;150;150;150m▀[0m[38;2;165;165;165m[48;2;137;137;137m▀[0m[38;2;208;208;208m[48;2;154;154;154m▀[0m[38;2;207;207;207m[48;2;116;116;116m▀[0m[38;2;132;132;132m[48;2;55;55;55m▀[0m[38;2;59;59;59m[48;2;60;60;60m▀[0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[7m[38;2;62;62;62m [0m[7m[38;2;62;62;62m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[7m[38;2;60;60;60m [0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[7m[38;2;59;59;59m [0m[38;2;59;59;59m[48;2;58;58;58m▀[0m[38;2;59;59;59m[48;2;58;58;58m▀[0m[7m[38;2;58;58;58m [0m[38;2;58;58;58m[48;2;57;57;57m▀[0m[38;2;58;58;58m[48;2;57;57;57m▀[0m[7m[38;2;57;57;57m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[7m[38;2;68;68;68m [0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;68;68;68m[48;2;67;67;67m▀[0m[38;2;67;67;67m[48;2;65;65;65m▀[0m[38;2;65;65;65m[48;2;69;69;69m▀[0m[38;2;72;72;72m[48;2;152;152;152m▀[0m[38;2;154;154;154m[48;2;168;168;168m▀[0m[38;2;168;168;168m[48;2;165;165;165m▀[0m[38;2;163;163;163m[48;2;162;162;162m▀[0m[38;2;156;156;156m[48;2;159;159;159m▀[0m[38;2;148;148;148m[48;2;97;97;97m▀[0m[38;2;93;93;93m[48;2;55;55;55m▀[0m[38;2;54;54;54m[48;2;58;58;58m▀[0m[38;2;58;58;58m[48;2;61;61;61m▀[0m[38;2;61;61;61m[48;2;62;62;62m▀[0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[38;2;63;63;63m[48;2;61;61;61m▀[0m[38;2;62;62;62m[48;2;108;108;108m▀[0m[38;2;62;62;62m[48;2;144;144;144m▀[0m[38;2;61;61;61m[48;2;143;143;143m▀[0m[38;2;61;61;61m[48;2;143;143;143m▀[0m[38;2;61;61;61m[48;2;141;141;141m▀[0m[38;2;60;60;60m[48;2;140;140;140m▀[0m[38;2;60;60;60m[48;2;140;140;140m▀[0m[38;2;60;60;60m[48;2;138;138;138m▀[0m[38;2;59;59;59m[48;2;138;138;138m▀[0m[38;2;59;59;59m[48;2;137;137;137m▀[0m[38;2;58;58;58m[48;2;136;136;136m▀[0m[38;2;58;58;58m[48;2;100;100;100m▀[0m[38;2;58;58;58m[48;2;56;56;56m▀[0m[38;2;58;58;58m[48;2;57;57;57m▀[0m[7m[38;2;57;57;57m [0m[38;2;57;57;57m[48;2;56;56;56m▀[0m[38;2;57;57;57m[48;2;56;56;56m▀[0m[7m[38;2;56;56;56m [0m[38;2;56;56;56m[48;2;55;55;55m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[38;2;67;67;67m[48;2;66;66;66m▀[0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[38;2;63;63;63m[48;2;62;62;62m▀[0m[38;2;83;83;83m[48;2;62;62;62m▀[0m[38;2;166;166;166m[48;2;145;145;145m▀[0m[38;2;164;164;164m[48;2;161;161;161m▀[0m[38;2;162;162;162m[48;2;158;158;158m▀[0m[38;2;160;160;160m[48;2;97;97;97m▀[0m[38;2;98;98;98m[48;2;53;53;53m▀[0m[38;2;54;54;54m[48;2;57;57;57m▀[0m[38;2;58;58;58m[48;2;60;60;60m▀[0m[7m[38;2;61;61;61m [0m[7m[38;2;62;62;62m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[38;2;61;61;61m[48;2;59;59;59m▀[0m[38;2;56;56;56m[48;2;53;53;53m▀[0m[7m[38;2;226;226;226m [0m[38;2;227;227;227m[48;2;224;224;224m▀[0m[38;2;225;225;225m[48;2;223;223;223m▀[0m[38;2;224;224;224m[48;2;221;221;221m▀[0m[38;2;222;222;222m[48;2;220;220;220m▀[0m[38;2;221;221;221m[48;2;218;218;218m▀[0m[38;2;219;219;219m[48;2;217;217;217m▀[0m[38;2;218;218;218m[48;2;215;215;215m▀[0m[38;2;216;216;216m[48;2;214;214;214m▀[0m[38;2;215;215;215m[48;2;212;212;212m▀[0m[38;2;213;213;213m[48;2;211;211;211m▀[0m[38;2;210;210;210m[48;2;209;209;209m▀[0m[38;2;53;53;53m[48;2;50;50;50m▀[0m[38;2;56;56;56m[48;2;55;55;55m▀[0m[7m[38;2;56;56;56m [0m[38;2;56;56;56m[48;2;55;55;55m▀[0m[7m[38;2;55;55;55m [0m[38;2;55;55;55m[48;2;54;54;54m▀[0m[38;2;55;55;55m[48;2;54;54;54m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;66;66;66m[48;2;65;65;65m▀[0m[7m[38;2;65;65;65m [0m[7m[38;2;64;64;64m [0m[7m[38;2;62;62;62m [0m[38;2;57;57;57m[48;2;59;59;59m▀[0m[38;2;60;60;60m[48;2;56;56;56m▀[0m[38;2;100;100;100m[48;2;53;53;53m▀[0m[38;2;85;85;85m[48;2;55;55;55m▀[0m[38;2;53;53;53m[48;2;57;57;57m▀[0m[38;2;57;57;57m[48;2;60;60;60m▀[0m[38;2;59;59;59m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;62;62;62m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[7m[38;2;58;58;58m [0m[38;2;52;52;52m[48;2;54;54;54m▀[0m[38;2;182;182;182m[48;2;46;46;46m▀[0m[38;2;222;222;222m[48;2;43;43;43m▀[0m[38;2;220;220;220m[48;2;41;41;41m▀[0m[38;2;219;219;219m[48;2;41;41;41m▀[0m[38;2;217;217;217m[48;2;41;41;41m▀[0m[38;2;216;216;216m[48;2;40;40;40m▀[0m[38;2;214;214;214m[48;2;40;40;40m▀[0m[38;2;212;212;212m[48;2;40;40;40m▀[0m[38;2;211;211;211m[48;2;40;40;40m▀[0m[38;2;209;209;209m[48;2;40;40;40m▀[0m[38;2;208;208;208m[48;2;40;40;40m▀[0m[38;2;169;169;169m[48;2;43;43;43m▀[0m[38;2;48;48;48m[48;2;50;50;50m▀[0m[7m[38;2;53;53;53m [0m[38;2;55;55;55m[48;2;54;54;54m▀[0m[38;2;55;55;55m[48;2;54;54;54m▀[0m[7m[38;2;54;54;54m [0m[38;2;54;54;54m[48;2;53;53;53m▀[0m[38;2;54;54;54m[48;2;53;53;53m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m[38;2;65;65;65m[48;2;59;59;59m▀[0m[7m[38;2;64;64;64m [0m[38;2;64;64;64m[48;2;63;63;63m▀[0m[7m[38;2;63;63;63m [0m[38;2;61;61;61m[48;2;63;63;63m▀[0m[38;2;60;60;60m[48;2;61;61;61m▀[0m[38;2;59;59;59m[48;2;61;61;61m▀[0m[38;2;59;59;59m[48;2;61;61;61m▀[0m[38;2;60;60;60m[48;2;61;61;61m▀[0m[7m[38;2;61;61;61m [0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[38;2;61;61;61m[48;2;60;60;60m▀[0m[7m[38;2;60;60;60m [0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[38;2;60;60;60m[48;2;59;59;59m▀[0m[38;2;58;58;58m[48;2;59;59;59m▀[0m[38;2;56;56;56m[48;2;57;57;57m▀[0m[38;2;53;53;53m[48;2;55;55;55m▀[0m[38;2;50;50;50m[48;2;54;54;54m▀[0m[38;2;50;50;50m[48;2;53;53;53m▀[0m[38;2;49;49;49m[48;2;53;53;53m▀[0m[38;2;49;49;49m[48;2;53;53;53m▀[0m[38;2;49;49;49m[48;2;52;52;52m▀[0m[38;2;48;48;48m[48;2;52;52;52m▀[0m[38;2;48;48;48m[48;2;52;52;52m▀[0m[38;2;47;47;47m[48;2;51;51;51m▀[0m[38;2;47;47;47m[48;2;51;51;51m▀[0m[38;2;48;48;48m[48;2;52;52;52m▀[0m[38;2;49;49;49m[48;2;52;52;52m▀[0m[38;2;51;51;51m[48;2;53;53;53m▀[0m[7m[38;2;53;53;53m [0m[38;2;54;54;54m[48;2;53;53;53m▀[0m[7m[38;2;53;53;53m [0m[38;2;53;53;53m[48;2;52;52;52m▀[0m[38;2;53;53;53m[48;2;52;52;52m▀[0m[38;2;52;52;52m[48;2;48;48;48m▀[0m [0m [0m [0m [0m [0m [0m [0m
|
||||
[0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m [0m
|
||||
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 345 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 29 KiB |
BIN
doc/specs/#1564 - Settings UI/add-new-profile.png
Normal file
|
After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 233 KiB |
146
doc/specs/#1564 - Settings UI/cascading-settings.md
Normal file
@@ -0,0 +1,146 @@
|
||||
---
|
||||
authors: Carlos Zamora (@carlos-zamora) and Kayla Cinnamon (@cinnamon-msft)
|
||||
created on: 2020-11-10
|
||||
last updated: 2020-11-19
|
||||
issue id: 1564
|
||||
---
|
||||
|
||||
# Cascading Settings
|
||||
|
||||
## Abstract
|
||||
|
||||
Windows Terminal's settings model adheres to a cascading settings architecture. This allows a settings object to be defined incrementally across multiple layers of declarations. The value for any global setting like `copyOnSelect`, for example, is set to your settings.json value if one is defined, otherwise defaults.json, and otherwise a system set value. Profiles in particular are more complicated in that they must also take into account the values in `profiles.defaults` and dynamic profile generators.
|
||||
|
||||
This spec explores how to represent this feature in the Settings UI.
|
||||
|
||||
## Inspiration
|
||||
|
||||
Cascading settings (and `profiles.defaults` by extension) provide some major benefits:
|
||||
1. opt-in behavior for settings values provided in-box (i.e. reset to default)
|
||||
2. easy way to apply a setting to all your profiles
|
||||
3. (possible future feature) simple way to base a profile off of another profile
|
||||
|
||||
The following terminal emulators approach this issue as follows.
|
||||
| Terminal Emulator(s) | Relevant Features/Approach |
|
||||
|--|--|
|
||||
| ConEmu, Cmder | "Clone" a separate profile |
|
||||
| Fluent Terminal | "Restore Defaults" button on each page |
|
||||
| iTerm2 | "Bulk Copy from Selected Profile..." and "Duplicate Profile" |
|
||||
|
||||
Other Settings UIs have approached this issue as follows:
|
||||
| Project | Relevant Approach |
|
||||
|--|--|
|
||||
| Visual Studio | Present a dropdown with your options. An extra "\<inherit\>" option is shown to inherit a value from another place. |
|
||||
|
||||
## Solution Design
|
||||
|
||||
The XAML implementation will consist of introducing a `ContentControl` for each setting. The `ContentControl` simply wraps the XAML control used for a setting, then adds the chosen UI approach below.
|
||||
|
||||
The `ContentControl` will take advantage of the following TerminalSettingsModel APIs for each setting:
|
||||
```c++
|
||||
// Note: String and "Name" are replaced for each setting
|
||||
bool HasName();
|
||||
void ClearName();
|
||||
String Name();
|
||||
void Name(String val);
|
||||
```
|
||||
|
||||
## UI/UX Design Proposals
|
||||
|
||||
The proposals below will be used in combination with each other.
|
||||
|
||||
### 1: Text under a setting control
|
||||
|
||||
This design renames the "Global" page under Profiles to "Base layer". Settings that override those in profile.defaults will get text under the control saying "Overrides Base layer.". Next to the titles of controls that override the base layer is a reset button with a tooltip that says "Reset".
|
||||
|
||||

|
||||
|
||||
### Add New --> Duplicate Profile
|
||||
|
||||
The Add new profile button in the navigation menu would take you to a new page. This page will have radio buttons listing your profiles along with a default settings option. The user can choose to either duplicate a profile or create a new one from the default settings. Once the user makes a selection, the settings UI will take them to their new profile page. The fields on that profile page will be filled according to which profile selection the user made.
|
||||
|
||||

|
||||
|
||||
### Reset Profile button
|
||||
|
||||
On the Advanced pivot of a profile's page, there will be a button at the bottom for resetting a profile called "Reset to default settings". This button will remove the user's custom settings inside this profile's object and reset it to defaults, prioritizing profile.defaults then defaults.json.
|
||||
|
||||
### "Apply to all profiles" button
|
||||
|
||||
A way we could apply settings to all profiles is by adding a "Copy settings to..." button to the Advanced page of each profile. This button will open a content dialog with a tree view listing every profile setting. The user can select which settings they would like to copy over to another profile. At the bottom of the content dialog will list the user's profiles with checkboxes, allowing them to pick which profiles they'd like to copy settings to.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Previously considered ideas
|
||||
|
||||
These ideas were considered however we will not be moving forward with them.
|
||||
|
||||
### 1: \<inherit\> option
|
||||
|
||||
Each setting is an Editable ComboBox (except for boolean and enumerable settings). For booleans, the items will be Enabled and Disabled in a regular ComboBox. Enumerable settings will have their options listed in a regular ComboBox. For integers, most commonly used numbers will be listed.
|
||||
|
||||

|
||||
|
||||
**Pros**
|
||||
|
||||
- Doesn't clutter the screen.
|
||||
|
||||
**Cons**
|
||||
|
||||
- Every setting is a dropdown.
|
||||
|
||||
**Pitfalls**
|
||||
|
||||
- How will color pickers work with this scenario?
|
||||
|
||||
**Other considerations**
|
||||
|
||||
Each dropdown has either "inherit" or "custom". If the user selects "custom", the original control will appear (i.e. a color picker for colors or a number picker for integers).
|
||||
|
||||
This option was not chosen because it added too much overhead for changing a setting. For example, if you wanted to enable acrylic, you'd have to click the dropdown, select custom, watch the checkbox appear, and then select the checkbox.
|
||||
|
||||
### 2: Lock Button
|
||||
|
||||
Every setting will have a lock button next to it. If the lock is locked, that means the setting is being inherited from Global, and the control is disabled. If the user wants to edit the setting, they can click the lock, which will changed it to the unlocked lock icon, and the control will become enabled.
|
||||
|
||||

|
||||
|
||||
**Pros**
|
||||
|
||||
- Least amount of clutter on the screen while still keeping the original controls
|
||||
|
||||
**Cons**
|
||||
|
||||
- The lock concept is slightly confusing. Some may assume locking the setting means that it *won't* be inherited from Global and that it's "locked" to the profile. This is the opposite case for its current design. However, flipping the logic of the locks wouldn't make sense with an unlocked lock and a disabled control.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### Accessibility
|
||||
|
||||
All of these additions to the settings UI will have to be accessibility tested.
|
||||
|
||||
### Security
|
||||
|
||||
These changes will not impact security.
|
||||
|
||||
### Reliability
|
||||
|
||||
These changes will not impact reliability.
|
||||
|
||||
### Compatibility
|
||||
|
||||
The partial parity with JSON route will give the settings UI a different compatibility from the JSON file itself. This is not necessarily a bad thing. The settings UI is intended to be a simplistic way for people to successfully edit their settings. If too many options are added to give it fully parity with JSON, it could compromise the simplistic benefit the settings UI provides.
|
||||
|
||||
### Performance, Power, and Efficiency
|
||||
|
||||
These changes will not impact performance, power, nor efficiency.
|
||||
|
||||
## Potential Issues
|
||||
|
||||
## Future considerations
|
||||
|
||||
When we add profile inheritance later, we can implement a layering page using a rearrangeable TreeView.
|
||||
|
||||
## Resources
|
||||
BIN
doc/specs/#1564 - Settings UI/copy-settings-1.png
Normal file
|
After Width: | Height: | Size: 364 KiB |
BIN
doc/specs/#1564 - Settings UI/copy-settings-2.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
BIN
doc/specs/#1564 - Settings UI/inheritance-dropdown.png
Normal file
|
After Width: | Height: | Size: 266 KiB |
BIN
doc/specs/#1564 - Settings UI/inheritance-locks.png
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
doc/specs/#1564 - Settings UI/inheritance-text.png
Normal file
|
After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 46 KiB |
@@ -293,7 +293,7 @@ And assuming the user has bound:
|
||||
|
||||
<!-- Footnotes -->
|
||||
[#2046]: https://github.com/microsoft/terminal/issues/2046
|
||||
[Command Palette, Addendum 1]: https://github.com/microsoft/terminal/blob/master/doc/specs/%232046%20-%20Unified%20keybindings%20and%20commands%2C%20and%20synthesized%20action%20names.md
|
||||
[Command Palette, Addendum 1]: https://github.com/microsoft/terminal/blob/main/doc/specs/%232046%20-%20Unified%20keybindings%20and%20commands%2C%20and%20synthesized%20action%20names.md
|
||||
|
||||
[#3337]: https://github.com/microsoft/terminal/issues/3337
|
||||
[#6899]: https://github.com/microsoft/terminal/issues/6899
|
||||
|
||||
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 26 KiB |
@@ -605,4 +605,4 @@ as well as 3 schemes: "Scheme 1", "Scheme 2", and "Scheme 3".
|
||||
|
||||
|
||||
<!-- Footnotes -->
|
||||
[Command Palette Spec]: https://github.com/microsoft/terminal/blob/master/doc/specs/%232046%20-%20Command%20Palette.md
|
||||
[Command Palette Spec]: https://github.com/microsoft/terminal/blob/main/doc/specs/%232046%20-%20Command%20Palette.md
|
||||
|
||||
302
doc/specs/#2871 - Pane Navigation/#2871 - Pane Navigation.md
Normal file
@@ -0,0 +1,302 @@
|
||||
---
|
||||
author: Mike Griese @zadjii-msft
|
||||
created on: 2020-11-23
|
||||
last updated: 2020-12-15
|
||||
issue id: #2871
|
||||
---
|
||||
|
||||
# Focus Pane Actions
|
||||
|
||||
## Abstract
|
||||
|
||||
Currently, the Terminal only allows users to navigate through panes
|
||||
_directionally_. However, we might also want to allow a user to navigate through
|
||||
panes in most recently used order ("MRU" order), or to navigate directly to a
|
||||
specific pane. This spec proposes some additional actions in order to enable
|
||||
these sorts of scenarios.
|
||||
|
||||
## Background
|
||||
|
||||
### Inspiration
|
||||
|
||||
`tmux` allows the user to navigate through panes using its `select-pane`
|
||||
command. The `select-pane` command works in the following way:
|
||||
|
||||
```
|
||||
select-pane [-DLlMmRU] [-T title] [-t target-pane]
|
||||
|
||||
Make pane target-pane the active pane in window target-window, or set its
|
||||
style (with -P). If one of -D, -L, -R, or -U is used, respectively the
|
||||
pane below, to the left, to the right, or above the target pane is used.
|
||||
-l is the same as using the last-pane command.
|
||||
|
||||
-m and -M are used to set and clear the marked pane. There is one marked
|
||||
pane at a time, setting a new marked pane clears the last. The marked pane
|
||||
is the default target for -s to join-pane, swap-pane and swap-window.
|
||||
```
|
||||
_from `man tmux`_.
|
||||
|
||||
The Terminal currently allows the user to navigate through panes with the
|
||||
`moveFocus` action, which only accepts a `direction` to move in.
|
||||
|
||||
Additionally, the Terminal allows movement between tabs with the `nextTab` and
|
||||
`prevTab` actions, who move between tabs either in-order or in MRU order.
|
||||
Furthermore, these actions may or may not display the "tab switcher" user
|
||||
interface, based on the value of `tabSwitcherMode`.
|
||||
|
||||
### User Stories
|
||||
|
||||
* **Scenario 1**: A user who wants to be able to split the window into 4 equal
|
||||
corners from the commandline. Currently this isn't possible, because the user
|
||||
cannot move focus during the startup actions - `split-pane` actions always end
|
||||
up splitting the current leaf in the tree of panes. (see [#5464])
|
||||
* **Scenario 2**: A user who wants to quickly navigate to the previous pane they
|
||||
had opened. (see [#2871])
|
||||
* **Scenario 3**: A user who wants to bind a keybinding like <kbd>alt+1</kbd>,
|
||||
<kbd>alt+2</kbd>, etc to immediately focus the first, second, etc. pane in a
|
||||
tab. (see [#5803])
|
||||
|
||||
### Future Considerations
|
||||
|
||||
There's been talk of updating the advanced tab switcher to also display panes,
|
||||
in addition to just tabs. This would allow users to navigate through the ATS
|
||||
directly to a pane, and see all the panes in a tab. Currently, `tabSwitcherMode`
|
||||
changes the behavior of `nextTab`, `prevTab` - should we just build the
|
||||
`paneSwitcherMode` directly into the action we end up designing?
|
||||
|
||||
## Solution Design
|
||||
|
||||
Does using the pane switcher with a theoretical `focusPane(target=id)` action
|
||||
even make sense? Certainly not! That's like `switchToTab(index=id)`, the user
|
||||
already knows which tab they want to go to, there's no reason to pop an
|
||||
ephemeral UI in front of them.
|
||||
|
||||
Similarly, it almost certainly doesn't make sense to display the pane switcher
|
||||
while moving focus directionally. Consider moving focus with a key bound to the
|
||||
arrow keys. Displaying another UI in front of them while moving focus with the
|
||||
arrow keys would be confusing.
|
||||
|
||||
Addressing Scenario 1 is relatively easy. So long as we add any of the proposed
|
||||
actions, including the existing `moveFocus` action as a subcommand that can be
|
||||
passed to `wt.exe`, then the user should be able to navigate through the panes
|
||||
they've created with the startup commandline, and build the tree of panes
|
||||
however they see fit.
|
||||
|
||||
Scenario 2 is more complicated, because MRU switching is always more
|
||||
complicated. Without a UI of some sort, there's no way to switch to another pane
|
||||
in the MRU order without also updating the MRU order as you go. So this would
|
||||
almost certainly necessitate a "pane switcher", like the tab switcher.
|
||||
|
||||
|
||||
### Proposal A: Add next, prev to moveFocus
|
||||
|
||||
* `moveFocus(direction="up|down|left|right|next|prev")`
|
||||
|
||||
* **Pros**:
|
||||
- Definitely gets the "MRU Pane Switching" scenario working
|
||||
* **Cons**:
|
||||
- Doesn't really address any of the other scenarios
|
||||
- How will it play with pane switching in the UI?
|
||||
- MRU switching without a dialog to track & display the MRU stack doesn't
|
||||
really work - this only allows to the user to navigate to the most recently
|
||||
used pane, or through all the panes in least-recently-used order. This is
|
||||
because switching to the MRU pane _will update the MRU pane_.
|
||||
|
||||
❌ This proposal is no longer being considered.
|
||||
|
||||
### Proposal B: focusNextPane, focusPrevPane with order, useSwitcher args
|
||||
|
||||
```json
|
||||
// Focus pane 1
|
||||
// - This is sensible, no arguments here
|
||||
{ "command": { "action": "focusPane", "id": 1 } },
|
||||
|
||||
// Focus the next MRU pane
|
||||
// - Without the switcher, this can only go one pane deep in the MRU stack
|
||||
// - presumably once there's a pane switcher, it would default to enabled?
|
||||
{ "command": { "action": "focusNextPane", "order": "mru" } },
|
||||
|
||||
// Focus the prev inOrder pane
|
||||
// - this seems straightforward
|
||||
{ "command": { "action": "focusPrevPane", "order": "inOrder" } },
|
||||
|
||||
// Focus the next pane, in mru order, explicitly disable the switcher
|
||||
// - The user opted in to only being able to MRU switch one deep. That's fine, that's what they want.
|
||||
{ "command": { "action": "focusNextPane", "order": "mru", "useSwitcher": false} },
|
||||
|
||||
// Focus the prev inOrder pane, explicitly with the switcher
|
||||
// - Maybe they disabled the switcher globally, but what it on for this action?
|
||||
{ "command": { "action": "focusPrevPane", "order": "inOrder", "useSwitcher": true } },
|
||||
```
|
||||
_From [discussion in the implementation
|
||||
PR](https://github.com/microsoft/terminal/pull/8183#issuecomment-729672645)_
|
||||
|
||||
Boiled down, that's three actions:
|
||||
* `focusPane(target=id)`
|
||||
* `focusNextPane(order="inOrder|mru", useSwitcher=true|false)`
|
||||
* `focusPrevPane(order="inOrder|mru", useSwitcher=true|false)`
|
||||
|
||||
* **Pros**:
|
||||
- Everything is explicit, including the option to use the pane switcher (when
|
||||
available)
|
||||
- Adds support for in-order pane switching
|
||||
- No "conditional parameters" - where providing one argument makes other
|
||||
arguments invalid or ambiguous.
|
||||
* **Cons**:
|
||||
- Doesn't really address any of the other scenarios
|
||||
- What does the "next most-recently-used tab" even mean? How is it different
|
||||
than "previous most-recently-used tab"? Semantically, these are the same
|
||||
thing!
|
||||
- No one's even asked for in-order pane switching. Is that a UX that even
|
||||
really makes sense?
|
||||
|
||||
❌ This proposal is no longer being considered.
|
||||
|
||||
> 👉 **NOTE**: At this point, we stopped considering navigating in both MRU
|
||||
> "directions", since both the next and prev MRU pane are the same thing. We're
|
||||
> now using "last" to mean "the previous MRU pane".
|
||||
|
||||
### Proposal C: One actions, combine the args
|
||||
|
||||
* `moveFocus(target=id|"up|down|left|right|last")`
|
||||
|
||||
* **Pros**:
|
||||
- Absolutely the least complicated action to author. There's only one
|
||||
parameter, `target`.
|
||||
- No "conditional parameters".
|
||||
* **Cons**:
|
||||
- How do we express this in the Settings UI? Mixed-type enums work fine for
|
||||
the font weight, where each enum value has a distinct integer value it maps
|
||||
to, but in this case, using `id` is entirely different from the other
|
||||
directional values
|
||||
|
||||
❌ This proposal is no longer being considered.
|
||||
|
||||
### Proposal D: Two actions
|
||||
|
||||
* `focusPane(target=id)`
|
||||
* `moveFocus(direction="up|down|left|right|last")`
|
||||
|
||||
* **Pros**:
|
||||
- Each action does explicitly one thing.
|
||||
* **Cons**:
|
||||
- two actions for _similar_ behavior
|
||||
- This now forks the "Direction" enum into "MoveFocusDirection" and
|
||||
"ResizeDirection" (because `resizePane(last)` doesn't make any sense).
|
||||
|
||||
This proposal doesn't really have any special consideration for the pane
|
||||
switcher UX. Neither of these actions would summon the pane switcher UX.
|
||||
|
||||
### Proposal E: Three actions
|
||||
|
||||
* `focusPane(target=id)`
|
||||
* `moveFocus(direction="up|down|left|right")`
|
||||
* `focusLastPane(usePaneSwitcher=false|true)`
|
||||
|
||||
In this design, neither `focusPane` nor `moveFocus` will summon the pane
|
||||
switcher UI (even once it's added). However, the `focusLastPane` one _could_,
|
||||
and subsequent keypresses could pop you through the MRU stack, while it's
|
||||
visible? The pane switcher could then display the panes for the tab in MRU
|
||||
order, and the user could just use the arrow keys to navigate the list if they
|
||||
so choose.
|
||||
|
||||
* **Pros**:
|
||||
- Each action does explicitly one thing.
|
||||
- Design accounts for future pane switcher UX
|
||||
* **Cons**:
|
||||
- Three separate actions for similar behavior
|
||||
|
||||
❌ This proposal is no longer being considered.
|
||||
|
||||
### Proposal F: It's literally just tmux
|
||||
|
||||
_Also known as the "one action to rule them all" proposal_
|
||||
|
||||
`focusPane(target=id, direction="up|down|left|right|last")`
|
||||
|
||||
Previously, this design was avoided, because what does `focusPane(target=4,
|
||||
direction=down)` do? Does it focus pane 4, or does it move focus down?
|
||||
|
||||
`tmux` solves this in one action by just doing both!
|
||||
|
||||
```
|
||||
Make pane target-pane the active pane ... If one of -D, -L, -R, or -U is used,
|
||||
respectively the pane below, to the left, to the right, or above the target pane
|
||||
is used.
|
||||
```
|
||||
_from `man tmux`_.
|
||||
|
||||
So `focusPane(target=1, direction=up)` will attempt to focus the pane above pane
|
||||
1. This action would not summon the pane switcher UX, even for
|
||||
`focusPane(direction=last)`
|
||||
|
||||
* **Pros**:
|
||||
- Fewest redundant actions
|
||||
* **Cons**:
|
||||
- Is this intuitive? That combining the params would do both, with `target`
|
||||
happening "first"?
|
||||
- Assumes that there will be a separate action added in the future for "Open
|
||||
the pane switcher (with some given ordering)"
|
||||
|
||||
|
||||
> 👉 **NOTE**: At this point, the author considered "Do we even want a separate
|
||||
> action to engage the tab switcher with panes expanded?" Perhaps panes being
|
||||
> visible in the tab switcher is just part fo the tab switcher's behavior. Maybe
|
||||
> there shouldn't be a separate "open the tab switcher with the panes expanded
|
||||
> to the pane I'm currently on, and the panes listed in MRU order" action.
|
||||
|
||||
❌ This proposal is no longer being considered.
|
||||
|
||||
## Conclusion
|
||||
|
||||
After much discussion as a team, we decided that **Proposal D** would be the
|
||||
best option. We felt that there wasn't a need to add any extra configuration to
|
||||
invoke the "pane switcher" as anything different than the "tab switcher". The
|
||||
"pane switcher" should really just exist as a part of the functionality of the
|
||||
advanced tab switcher, not as it's own thing.
|
||||
|
||||
Additionally, we concurred that the new "direction" value should be `prev`, not
|
||||
`last`, for consistency's sake.
|
||||
|
||||
## UI/UX Design
|
||||
|
||||
The only real UX being added with the agreed upon design is allowing the user to
|
||||
execute an action to move to the previously active pane within a single tab. No
|
||||
additional UX (including the pane switcher) is being prescribed in this spec at
|
||||
this time.
|
||||
|
||||
## Potential Issues
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>Compatibility</strong></td>
|
||||
<td>
|
||||
|
||||
We've only adding a single enum value to an existing enum. Since we're not
|
||||
changing the meaning of any of the existing values, we do not expect any
|
||||
compatibility issues there. Additionally, we're not changing the default value
|
||||
of the `direction` param of the `moveFocus` action, so there are no further
|
||||
compatibility concerns there. Furthermore, no additional parameters are being
|
||||
added to the `moveFocus` action that would potentially give it a different
|
||||
meaning.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
In the current design, there's no way to move through all the panes with a
|
||||
single keybinding. For example, if a user wanted to bind <kbd>Alt+]</kbd> to
|
||||
move to the "next" pane, and <kbd>Alt+[</kbd> to move to the "previous" one.
|
||||
These movements would necessarily need to be in-order traversals, since there's
|
||||
no way of doing multiple MRU steps.
|
||||
|
||||
Fortunately, no one's really asked for traversing the panes in-order, so we're
|
||||
not really worried about this. Otherwise, it would maybe make sense for `last`
|
||||
to be the "previous MRU pane", and reserve `next`/`prev` for in-order traversal.
|
||||
|
||||
|
||||
[#2871]: https://github.com/microsoft/terminal/issues/2871
|
||||
[#5464]: https://github.com/microsoft/terminal/issues/5464
|
||||
[#5803]: https://github.com/microsoft/terminal/issues/5803
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
---
|
||||
author: Pankaj Bhojwani, pabhojwa@microsoft.com
|
||||
created on: 2020-11-20
|
||||
last updated: 2021-2-5
|
||||
issue id: #8345
|
||||
---
|
||||
|
||||
# Appearance configuration objects for profiles
|
||||
|
||||
## Abstract
|
||||
|
||||
This spec outlines how we can support 'configuration objects' in our profiles, which
|
||||
will allow us to render differently depending on the state of the control. For example, a
|
||||
control can be rendered differently if it's focused as compared to when it's unfocused.
|
||||
|
||||
## Inspiration
|
||||
|
||||
Reference: [#3062](https://github.com/microsoft/terminal/issues/3062)
|
||||
|
||||
Users want there to be a more visible indicator than the one we have currently for which
|
||||
pane is focused and which panes are unfocused. This change would grant us that feature.
|
||||
|
||||
## Solution Design
|
||||
|
||||
The implementation design for appearance config objects centers around the recent change where inheritance was added to the
|
||||
`TerminalSettings` class in the Terminal Settings Model - i.e. different `TerminalSettings` objects can inherit from each other.
|
||||
The reason for this change was that we did not want a settings reload to erase any overrides `TermControl` may have made
|
||||
to the settings during runtime. By instead passing a child of the `TerminalSettings` object to the control, we can change
|
||||
the parent of the child during a settings reload without the overrides being erased (since those overrides live in the child).
|
||||
|
||||
The idea behind unfocused appearance configurations is similar. We will pass in another `TerminalSettings` object to the control,
|
||||
which is simply a child that already has some overrides in it. When the control gains or loses focus, it simply switches between
|
||||
the two settings objects appropriately.
|
||||
|
||||
### Allowed parameters
|
||||
|
||||
For now, these states are meant to be entirely appearance-based. So, not all parameters which can be
|
||||
defined in a `Profile` can be defined in this new object (for example, we do not want parameters which
|
||||
would cause a resize in this object.) Here is the list of parameters we will allow:
|
||||
|
||||
- Anything regarding colors: `colorScheme`, `foreground`, `background`, `cursorColor` etc
|
||||
- Anything regarding background image: `path`, `opacity`, `alignment`, `stretchMode`
|
||||
- `cursorShape`
|
||||
|
||||
We may wish to allow further parameters in these objects in the future (like `bellStyle`?). The addition
|
||||
of further parameters can be discussed in the future and is out of scope for this spec.
|
||||
|
||||
### Inheritance
|
||||
|
||||
The inheritance model can be thought of as an 'all-or-nothing' approach in the sense that the `unfocusedAppearance` object
|
||||
is considered as a *single* setting instead of an object with many settings. We have chosen this model because it is cleaner
|
||||
and easier to understand than the alternative, where each setting within an `unfocusedAppearance` object has a parent from which
|
||||
it obtains its value.
|
||||
|
||||
Note that when `TerminalApp` initializes a control, it creates a `TerminalSettings` object for that profile and passes the
|
||||
control a child of that object (so that the control can store overrides in the child, as described earlier). If an unfocused
|
||||
config is defined in the profile (or in globals/profile defaults), then `TerminalApp` will create a *child of that child*,
|
||||
put the relevant overrides in it, and pass that into the control as well. Thus, the inheritance of any undefined parameters
|
||||
in the unfocused config will be as follows:
|
||||
|
||||
1. The unfocused config specified in the profile (or in globals/profile defaults)
|
||||
2. Overrides made by the terminal control
|
||||
3. The parent profile
|
||||
|
||||
## UI/UX Design
|
||||
|
||||
Users will be able to add a new setting to their profiles that will look like this:
|
||||
|
||||
```
|
||||
"unfocusedAppearance":
|
||||
{
|
||||
"colorScheme": "Campbell",
|
||||
"cursorColor": "#888",
|
||||
"cursorShape": "emptyBox",
|
||||
"foreground": "#C0C0C0",
|
||||
"background": "#000000"
|
||||
}
|
||||
```
|
||||
|
||||
When certain appearance settings are changed via OSC sequences (such as the background color), only the focused/regular
|
||||
appearance will change and the unfocused one will remain unchanged. However, since the unfocused settings object inherits
|
||||
from the regular one, it will still apply the change (provided it does not define its own value for that setting).
|
||||
|
||||
## Capabilities
|
||||
|
||||
### Accessibility
|
||||
|
||||
Does not affect accessibility.
|
||||
|
||||
### Security
|
||||
|
||||
Does not affect security.
|
||||
|
||||
### Reliability
|
||||
|
||||
This is another location in the settings where parsing/loading the settings may fail. However, this is the case
|
||||
for any new setting we add so I would say that this is a reasonable cost for this feature.
|
||||
|
||||
### Compatibility
|
||||
|
||||
Should not affect compatibility.
|
||||
|
||||
### Performance, Power, and Efficiency
|
||||
|
||||
Rapidly switching between many panes, causing several successive appearance changes in a short period of time, could
|
||||
potentially impact performance. However, regular/reasonable pane switching should not have a noticeable effect.
|
||||
|
||||
## Potential Issues
|
||||
|
||||
Inactive tabs will be 'rendered' in the background with the `UnfocusedRenderingParams` object, we need to make
|
||||
sure that switching to an inactive tab (and so causing the renderer to update with the 'normal' parameters)
|
||||
does not cause the window to flash/show a jarring indicator that the rendering values changed.
|
||||
|
||||
## Future considerations
|
||||
|
||||
We will need to decide how this will look in the settings UI.
|
||||
|
||||
We may wish to add more states in the future (like 'elevated'). When that happens, we will need to deal with how
|
||||
these appearance objects can scale/layer over each other. We had a lot of discussion about this and could not find
|
||||
a suitable solution to the problem of multiple states being valid at the same time (like unfocused and elevated).
|
||||
This, along with the fact that it is uncertain if there even will be more states we would want to add led us to
|
||||
the conclusion that we should only support the unfocused state for now, and come back to this issue later. If there
|
||||
are no more states other than unfocused and elevated, we could allow combining them (like having an 'unfocused elevated' state).
|
||||
If there are more states, we could do the implementation as an extension rather than inherently supporting it.
|
||||
|
||||
## Resources
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 46 KiB |
@@ -0,0 +1,562 @@
|
||||
---
|
||||
author: Mike Griese @zadjii-msft
|
||||
created on: 2020-10-30
|
||||
last updated: 2020-02-05
|
||||
issue id: #4472
|
||||
---
|
||||
|
||||
# Windows Terminal Session Management
|
||||
|
||||
## Abstract
|
||||
This document is intended to serve as an addition to the [Process Model 2.0
|
||||
Spec]. That document provides a big-picture overview of changes to the entirety
|
||||
of the Windows Terminal process architecture, including both the split of
|
||||
window/content processes, as well as the introduction of monarch/peasant
|
||||
processes. The focus of that document was to identify solutions to a set of
|
||||
scenarios that were closely intertwined, and establish these solutions would
|
||||
work together, without preventing any one scenario from working. What that
|
||||
document did not do was prescribe specific solutions to the given scenarios.
|
||||
|
||||
This document offers a deeper dive on a subset of the issues in [#5000], to
|
||||
describe specifics for managing multiple windows with the Windows Terminal. This
|
||||
includes features such as:
|
||||
|
||||
* Run `wt` in the current window ([#4472])
|
||||
* Single Instance Mode ([#2227])
|
||||
|
||||
## Solution Design
|
||||
|
||||
### Monarch and Peasant Processes
|
||||
|
||||
This document assumes the reader is already familiar with the "Monarch and
|
||||
Peasant" architecture as detailed in the [Windows Terminal Process Model 2.0
|
||||
Spec]. As a quick summary:
|
||||
|
||||
* Every Windows Terminal window is a "Peasant" process.
|
||||
* One of the Windows Terminal window processes is also the "Monarch" process.
|
||||
The Monarch is picked randomly from the Terminal windows, and there is only
|
||||
ever one Monarch process at a time.
|
||||
* Peasants can communicate with the monarch when certain state changes (such as
|
||||
their window being activated), and the monarch can send commands to any of the
|
||||
peasants.
|
||||
|
||||
This architecture will be used to enable each of the following scenarios.
|
||||
|
||||
### Scenario: Open new tabs in most recently used window
|
||||
|
||||
A common feature of many browsers is that when a web URL is clicked somewhere,
|
||||
the web page is opened as a new tab in the most recently used window of the
|
||||
browser. This functionality is often referred to as "glomming", as the new tab
|
||||
"gloms" onto the existing window.
|
||||
|
||||
Currently, the terminal does not support such a feature - every `wt` invocation
|
||||
creates a new window. With the monarch/peasant architecture, it'll now be
|
||||
possible to enable such a scenario.
|
||||
|
||||
As each window is activated, it will call a method on the `Monarch` object
|
||||
(hosted by the monarch process) which will indicate that "I am peasant N, and
|
||||
I've been focused". The monarch will use those method calls to update its own
|
||||
internal stack of the most recently used windows.
|
||||
|
||||
Whenever a new `wt.exe` process is launched, that process will _first_ ask the
|
||||
monarch if it should run the commandline in an existing window, or create its
|
||||
own window.
|
||||
|
||||

|
||||
|
||||
If glomming is enabled, the monarch will dispatch the commandline to the
|
||||
appropriate window for them to handle instead. To the user, it'll seem as if the
|
||||
tab just opened in the most recent window.
|
||||
|
||||
Users should certainly be able to specify if they want new instances to glom
|
||||
onto the MRU window or not. You could imagine that currently, we default to the
|
||||
hypothetical value `"windowingBehavior": "useNew"`, meaning that each new wt gets
|
||||
its own new window.
|
||||
|
||||
If glomming is disabled, then the Monarch will call back to the peasant and tell
|
||||
it to run the provided commandline. The monarch will use the return value of
|
||||
`ExecuteCommandline` to indicate that the calling process should create a window
|
||||
and become a peasant process, and run the commandline itself.
|
||||
|
||||
#### Glomming within the same virtual desktop
|
||||
|
||||
When links are opened in the new Edge browser, they will only glom onto an
|
||||
existing window if that window is open in the current virtual desktop. This
|
||||
seems like a good idea of a feature for the Terminal to follow as well.
|
||||
|
||||
There must be some way for an application to determine which virtual desktop it
|
||||
is open on. We could use that information to have the monarch track the last
|
||||
active window _per-desktop_, and only glom when there's one on the current
|
||||
desktop.
|
||||
|
||||
We could make the `windowingBehavior` property accept a variety of
|
||||
configurations:
|
||||
|
||||
- `"useExisting"`: always glom to the most recent window, regardless of desktop.
|
||||
- `"useExistingOnSameDesktop"`: Only glom if there's an existing window on this
|
||||
virtual desktop, otherwise create a new window. This will be the new default
|
||||
value.
|
||||
- `"useNew"`: Never glom, always create a new window. This is technically the
|
||||
current behavior of the Terminal.
|
||||
|
||||
### Handling the current working directory
|
||||
|
||||
Consider the following scenario: the user runs `wt -d .` in the address bar of
|
||||
explorer, and the monarch determines that this new tab should be created in an
|
||||
existing window. For clarity during this example, we will label the existing
|
||||
window WT[1], and the second `wt.exe` process WT[2].
|
||||
|
||||
An example of this scenario is given in the following diagram:
|
||||
|
||||

|
||||
|
||||
In this scenario, we want the new tab to be spawned in the current working
|
||||
directory of WT[2], not WT[1]. So when WT[1] is about to run the commands that
|
||||
were passed to WT[2], WT[1] will need to:
|
||||
|
||||
* First, stash its own CWD
|
||||
* Change to the CWD of WT[2]
|
||||
* Run the commands from WT[2]
|
||||
* Then return to its original CWD.
|
||||
|
||||
So, as a part of the interface that a peasant uses to communicate the startup
|
||||
commandline to the monarch, we should also include the current working
|
||||
directory.
|
||||
|
||||
### Scenario: Run `wt` in the current window
|
||||
|
||||
One often requested scenario is the ability to run a `wt.exe` commandline in the
|
||||
current window, as opposed to always creating a new window. Presume we have the
|
||||
ability to communicate between different window processes. The logical extension
|
||||
of this scenario would be "run a `wt` commandline in _any_ given WT window".
|
||||
|
||||
Each window process will have its own unique ID assigned to it by the monarch.
|
||||
This ID will be a positive number. Windows can also have names assigned to them.
|
||||
These names are strings that the user specifies. A window will always have an
|
||||
ID, but not necessarily a name. Running a command in a given window with ID N
|
||||
should be as easy as something like:
|
||||
|
||||
```sh
|
||||
wt.exe --window N new-tab ; split-pane
|
||||
```
|
||||
|
||||
(or for shorthand, `wt -w N new-tab ; split-pane`).
|
||||
|
||||
More formally, we will add the following parameter to the top-level `wt`
|
||||
command:
|
||||
|
||||
#### `--window,-w <window-id>`
|
||||
Run these commands in the given Windows Terminal session. This enables opening
|
||||
new tabs, splits, etc. in already running Windows Terminal windows.
|
||||
* If `window-id` is `0`, run the given commands in _the current window_.
|
||||
* If `window-id` is a negative number, or the reserved name `new`, run the
|
||||
commands in a _new_ Terminal window.
|
||||
* If `window-id` is the ID or name of an existing window, then run the
|
||||
commandline in that window.
|
||||
* If `window-id` is _not_ the ID or name of an existing window, create a new
|
||||
window. That window will be assigned the ID or name provided in the
|
||||
commandline. The provided subcommands will be run in that new window.
|
||||
* If `window-id` is omitted, then obey the value of `windowingBehavior` when
|
||||
determining which window to run the command in.
|
||||
|
||||
_Whenever_ `wt.exe` is started, it must _always_ pass the provided commandline
|
||||
first to the monarch process for handling. This is important for glomming
|
||||
scenarios (as noted above). The monarch will parse the commandline, determine
|
||||
which window the commandline is destined for, then call `ExecuteCommandline` on
|
||||
that peasant, who will then run the command.
|
||||
|
||||
#### Running commands in the current window:`wt --window 0`
|
||||
|
||||
If `wt -w 0 <commands>` is run _outside_ a WT instance, it could attempt to glom
|
||||
onto _the most recent WT window_ instead. This seems more logical than something
|
||||
like `wt --window last` or some other special value indicating "run this in the
|
||||
MRU window".<sup>[[2]](#footnote-2)</sup>
|
||||
|
||||
That might be a simple, but **wrong**, implementation for "the current window".
|
||||
If the peasants always raise an event when their window is focused, and the
|
||||
monarch keeps track of the MRU order for peasants, then one could naively assume
|
||||
that the execution of `wt -w 0 <commands>` would always return the window the
|
||||
user was typing in, the current one. However, if someone were to do something
|
||||
like `sleep 10 ; wt -w 0 <commands>`, then the user could easily focus another
|
||||
WT window during the sleep, which would cause the MRU window to not be the same
|
||||
as the window executing the command.
|
||||
|
||||
To solve this issue, we'll other than
|
||||
attempting to use the `WT_SESSION` environment variable. If a `wt.exe` process
|
||||
is spawned and that's in its environment variables, it could try and ask the
|
||||
monarch for the peasant who's hosting the session corresponding to that GUID.
|
||||
This is more of a theoretical solution than anything else.
|
||||
|
||||
In the past we've been reluctant to rely too heavily on `WT_SESSION`. However,
|
||||
an environment variable does seem to be the only reliable way to be confident
|
||||
where the window was created from. We could introduce another environment
|
||||
variable instead - `WT_WINDOW_ID`. That would allow us to shortcut the session
|
||||
ID lookup. However, I worry about exposing the window ID as an environment
|
||||
variable. If we do that, users will inevitably use that instead of the `wt -0`
|
||||
alias, which should take care of the work for them. Additionally, `WT_WINDOW_ID`
|
||||
wouldn't update in the child processes as tabs are torn out of windows to create
|
||||
new windows.
|
||||
|
||||
Both solutions are prone to the user changing the value of the variable to some
|
||||
garbage value. If they do that, this lookup will most certainly not work as
|
||||
expected. Using the session ID (a GUID) instead of the window ID (an int) makes
|
||||
it less likely that they guess the ID of an existing instance.
|
||||
|
||||
#### Running commands in a new window:`wt --window -1` / `wt --window new`
|
||||
|
||||
If the user passes a negative number, or the reserved name `new` to the
|
||||
`--window` parameter, then we will always create a new window for that
|
||||
commandline, regardless of the value of `windowingBehavior`. This will allow
|
||||
users to do something like `wt -w -1 new-tab` to _always_ create a new window.
|
||||
|
||||
#### `--window` in subcommands
|
||||
|
||||
The `--window` parameter is a setting to `wt.exe` itself, not to one of its
|
||||
subcommands (like `new-tab` or `split-pane`). This means that all of the
|
||||
subcommands in a particular `wt` commandline will all be handled by the same
|
||||
session. For example, let us consider a user who wants to open a new tab in
|
||||
window 2, and split a new pane in window 3, all at once. The user _cannot_ do
|
||||
something like:
|
||||
|
||||
```cmd
|
||||
wt -w 2 new-tab ; -w 3 split-pane
|
||||
```
|
||||
|
||||
Instead, the user will need to separate the commands (by whatever their shell's
|
||||
own command delimiter is) and run two different `wt.exe` instances:
|
||||
|
||||
```cmd
|
||||
wt -w 2 new-tab & wt -w 3 split-pane
|
||||
```
|
||||
|
||||
This is done to make the parsing of the subcommands easier, and for the internal
|
||||
passing of arguments simpler. If the `--window` parameter were a part of each
|
||||
subcommand, then each individual subcommand's parser would need to be
|
||||
enlightened about that parameter, and then it would need to be possible for any
|
||||
single part of the commandline to call out to another process. It would be
|
||||
especially tricky then to coordinate the work being done across process here.
|
||||
The source process would need some sort of way to wait for the other process to
|
||||
notify the source that a particular subcommand completed, before allowing the
|
||||
source to dispatch the next part of the commandline.
|
||||
|
||||
Overall, this is seen as unnecessarily complex, and dispatching whole sets of
|
||||
commands as a simpler solution.
|
||||
|
||||
### Naming Windows
|
||||
|
||||
It's not user-friendly to rely on automatically generated, invisible numbers to
|
||||
identify windows. There's not a great way of identifying which window is which.
|
||||
The user would need to track the IDs in their head manually. Instead, we'll
|
||||
allow the user to provide a string name for the window. This name can be used to
|
||||
address a window in addition to the ID.
|
||||
|
||||
Names can be provided on the commandline, in the original commandline. For
|
||||
example, `wt -w foo nt` would name the new window "foo". Names can also be set
|
||||
with a new action, `NameWindow`<sup>[[3]](#footnote-3)</sup>. `name-window`
|
||||
could also be used as a subcommand. For example, `wt -w 4 name-window bar` would
|
||||
name window 4 "bar".
|
||||
|
||||
To keep identities mentally distinct, we will disallow names that are integers
|
||||
(positive or negative). This will prevent users from renaming a window to `2`,
|
||||
then having `wt -w 2` be ambiguous as to which window it refers to.
|
||||
|
||||
Names must also be unique. If a user attempts to set the name of the window to
|
||||
an already-used name, we'll need to ignore the name change. We could also
|
||||
display a "toast" or some other type of low-impact message to the user. That
|
||||
message would have some text like: "Unable to rename window. Another window with
|
||||
that name already exists".
|
||||
|
||||
The Terminal will reserve the name `new`. It will also reserve any names
|
||||
starting with the character `_`. The user will not be allowed to set the window
|
||||
name to any of these reserved names. Reserving `_*` allows us to add other
|
||||
keywords in the future, without introducing a breaking change.
|
||||
|
||||
## UI/UX Design
|
||||
|
||||
### `windowingBehavior` details
|
||||
|
||||
The following list gives greater breakdown of the values of `windowingBehavior`,
|
||||
and how they operate:
|
||||
|
||||
* `"windowingBehavior": "useExisting", "useExistingOnSameDesktop"`:
|
||||
**Browser-like glomming**
|
||||
- New instances open in the current window by default.
|
||||
- `newWindow` opens a new window.
|
||||
- Tabs can be torn out to create new windows.
|
||||
- `wt -w -1` opens a new window.
|
||||
* `"windowingBehavior": "useNew"`: No auto-glomming. This is **the current
|
||||
behavior** of the Terminal.
|
||||
- New instances open in new windows by default
|
||||
- `newWindow` opens a new window
|
||||
- Tabs can be torn out to create new windows.
|
||||
- `wt -w -1` opens a new window.
|
||||
|
||||
We'll be changing the default behavior from `useNew` to
|
||||
`useExistingOnSameDesktop`. This will be more consistent with other tabbed
|
||||
applications.
|
||||
|
||||
## Concerns
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>Accessibility</strong></td>
|
||||
<td>
|
||||
|
||||
There is no expected accessibility impact from this feature. Each window will
|
||||
handle UIA access as it normally does.
|
||||
|
||||
In the future, we could consider exposing the window IDs and/or names via UIA.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Security</strong></td>
|
||||
<td>
|
||||
|
||||
Many security concerns have already be covered in greater detail in the parent
|
||||
spec, [Process Model 2.0 Spec].
|
||||
|
||||
When attempting to instantiate the Monarch, COM will only return the object from
|
||||
a server running at the same elevation level. We don't need to worry about
|
||||
unelevated peasants connecting to the elevated Monarch, or vice-versa.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Reliability</strong></td>
|
||||
<td>
|
||||
|
||||
We will need to be careful when working with objects hosted by another process.
|
||||
Any work we do with it MUST be in a try/catch, because at _any_ time, the other
|
||||
process could be killed. At any point, a window process could be killed. Both
|
||||
the monarch and peasant code will need to be redundant to such a scenario, and
|
||||
if the other process is killed, make sure to display an appropriate error and
|
||||
either recover or exit gracefully.
|
||||
|
||||
In any and all these situations, we will want to try and be as verbose as
|
||||
possible in the logging. This will make tracking which process had the error
|
||||
occur easier.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Compatibility</strong></td>
|
||||
<td>
|
||||
|
||||
We will be changing the default behavior of the Terminal to auto-glom to the
|
||||
most-recently used window on the same desktop in the course of this work, which
|
||||
will be a breaking UX change. This is behavior that can be reverted with the
|
||||
`"windowingBehavior": "useNew"` setting.
|
||||
|
||||
We acknowledge that this is a pretty massive change to the default experience of
|
||||
the Terminal. We're planning on doing some polling of users to determine which
|
||||
behavior they want by default. Additionally, we'll be staging the rollout of
|
||||
this feature, using the Preview builds of the Terminal. The release notes that
|
||||
first include it will call extra attention to this feature. We'll ask that users
|
||||
provide their feedback in a dedicated thread, so we have time to collect
|
||||
opinions from users before rolling the change out to all users.
|
||||
|
||||
We may choose to only change the default to `useExistingOnSameDesktop` once tab
|
||||
tear out is available, so users who are particularly unhappy about this change
|
||||
can still tear out the tab (if they can't be bothered to change the setting).
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Performance, Power, and Efficiency</strong></td>
|
||||
<td>
|
||||
|
||||
There's no dramatic change expected here. There may be a minor delay in the
|
||||
spawning of new terminal instances, due to requiring cross-process hops for the
|
||||
communication between monarch and peasant processes.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Potential Issues
|
||||
|
||||
### Mixed Elevation Levels
|
||||
|
||||
As of December 2020, we're no longer pursuing a "mixed-elevation" scenario for
|
||||
the Terminal. This makes many of the cross-elevation scenarios simpler. Elevated
|
||||
and unelevated `wt` instances will always remain separate. The different
|
||||
elevation levels will maintain separate lists of window IDs. If the user is
|
||||
running both an elevated and unelevated window, then there will be two monarchs.
|
||||
One elevated, and the other unelevated.
|
||||
|
||||
There will also be some edge cases when handling the commandline that will need
|
||||
special care. Say the user wanted to open a new tab in the elevated window, from
|
||||
and unelevated `explorer.exe`. That would be a commandline like:
|
||||
|
||||
```sh
|
||||
wt -w 0 new-tab -d . --elevated
|
||||
```
|
||||
|
||||
Typically we first determine which window the commandline is intended for, then
|
||||
dispatch it to that window. In this case, the `-w 0` will cause us to pass the
|
||||
commandline to the current unelevated window. Then, that window will try to open
|
||||
an elevated tab, fail, and create a new `wt.exe` process. This second `wt.exe`
|
||||
process will lose the `-w 0` context. It won't inform the elevated monarch that
|
||||
this commandline should be run in the active session.
|
||||
|
||||
We will need to make sure that special care is taken when creating elevated
|
||||
instances that we maintain the `--window` parameter passed to the Terminal.
|
||||
|
||||
### `wt` Startup Commandline Options
|
||||
|
||||
There are a few commandline options which can be provided to `wt.exe` which
|
||||
don't make sense to pass to another session. These options include (but are not
|
||||
limited to):
|
||||
|
||||
* `--initialSize r,c`
|
||||
* `--initialPosition x,y`
|
||||
* `--fullscreen`, `--maximized`, etc.
|
||||
|
||||
When we're passing a commandline to another instance to handle, these arguments
|
||||
will be ignored. they only apply to the initial creation of a window.
|
||||
`--initialSize 32, 120` doesn't make sense if the window already has a size.
|
||||
|
||||
On startup of a new window, we currently assume that the first command is always
|
||||
`new-tab`. When passing commandlines to existing windows, we won't need to make
|
||||
that assumption anymore. There will already be existing tabs.
|
||||
|
||||
### Monarch MRU Window Tracking
|
||||
|
||||
As stated above, the monarch is responsible for tracking the MRU window stack.
|
||||
However, when the monarch is closed, this state will be lost. The new monarch
|
||||
will be elected, but it will be unable to ask the old monarch for the MRU
|
||||
order of the windows.
|
||||
|
||||
We had previously considered an _acceptable_ UX when this would occur. We would
|
||||
randomize the order (with the new monarch becoming the MRU window). If someone
|
||||
noticed this bug and complained, then we had a theoretical solution prepared.
|
||||
The peasants could inform not only the monarch, but _all other peasants_ when
|
||||
they become activated. This would mean all peasants are simultaneously tracking
|
||||
the MRU stack. This would mean that any given peasant would be prepared always
|
||||
to become the monarch.
|
||||
|
||||
A simpler solution though would be to not track the MRU stack in the Monarch at
|
||||
all. Instead, each peasant could just track internally when they were last
|
||||
activated. The Monarch wouldn't track any state itself. It would be distributed
|
||||
across all the peasants. The Monarch could then iterate over the list of
|
||||
peasants and find the one with the newest `LastActivated` timestamp.
|
||||
|
||||
Now, when a Monarch dies, the new Peasant doesn't have to come up with the stack
|
||||
itself. All the other Peasants keep their state. The new Monarch can query them
|
||||
and get the same answer the old Monarch would have.
|
||||
|
||||
We could further optimize this by having the Monarch also track the stack. Then,
|
||||
the monarch could query the MRU window quickly. The `LastActivated` timestamps
|
||||
would only be used by a new Monarch when it is elected, to reconstruct the MRU
|
||||
stack.
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
This is a list of actionable tasks generated as described by this spec:
|
||||
|
||||
* [ ] Add support for `wt.exe` processes to be Monarchs and Peasants, and
|
||||
communicate that state between themselves. This task does not otherwise add
|
||||
any user-facing features, merely an architectural update.
|
||||
* [ ] Add support for the `windowingBehavior` setting as a boolean. Opening new
|
||||
WT windows will conditionally glom to existing windows.
|
||||
* [ ] Add support for per-desktop `windowingBehavior`, by adding the support for
|
||||
the enum values `"useExisting"`, `"useExistingOnSameDesktop"` and `"useNew"`.
|
||||
* [ ] Add support for `wt.exe` to pass commandlines intended for another window
|
||||
to the monarch, then to the intended window, with the `--window,-w
|
||||
window-id` commandline parameter.
|
||||
* [ ] Add support for targeting and naming windows via the `-w` parameter on the
|
||||
commandline
|
||||
* [ ] Add a `NameWindow` action, subcommand that allows the user to set the name
|
||||
for the window.
|
||||
* [ ] Add an action that will cause all windows to briefly display a overlay
|
||||
with the current window ID and name. This would be something like the
|
||||
"identify" feature of the Windows "Display" settings.
|
||||
|
||||
## Future considerations
|
||||
|
||||
* What if the user wanted to pipe a command to a pane in an existing window?
|
||||
```sh
|
||||
man ping > wt -w 0 split-pane cat
|
||||
```
|
||||
Is there some way for WT to pass its stdin/out handles to the child process
|
||||
it's creating? This is _not_ related to the current spec at hand, just
|
||||
something the author considered while writing the spec. This likely belongs
|
||||
over in [#492], or in its own spec.
|
||||
- Or I suppose, with less confusion, someone could run `wt -w 0 split-pane --
|
||||
man ping > cat`. That's certainly more sensible, and wouldn't require any
|
||||
extra work.
|
||||
* "Single Instance Mode" is a scenario in which there is only ever one single WT
|
||||
window. A user might want this functionality to only ever allow a single
|
||||
terminal window to be open on their desktop. This is especially frequently
|
||||
requested in combination with "quake mode", as discussed in [#653]. When Single
|
||||
Instance Mode is active, and the user runs a new `wt.exe` commandline, it will
|
||||
always end up running in the existing window, if there is one.
|
||||
|
||||
An earlier version of this spec proposed a new value of `glomToLastWindow`.
|
||||
(`glomToLastWindow` was later renamed `windowingBehavior`). The `always` value
|
||||
would disable tab tear out<sup>[[1]](#footnote-1)</sup>. It would additionally
|
||||
disable the `newWindow` action, and prevent `wt -w new` from opening a new
|
||||
window.
|
||||
|
||||
In discussion, it was concluded that this setting didn't make sense. Why did the
|
||||
`glomToLastWindow` setting change the behavior of tear out? Single Instance Mode
|
||||
is most frequently requested in regards to quake mode. We're leaving the
|
||||
implementation of true single instance mode to that spec.
|
||||
* It was suggested in review that we could auto-generate names for windows, from
|
||||
some list of words. Prior art could be the URLS for gfycat.com or
|
||||
what3words.com, which use three random words. I believe `docker` also assigns
|
||||
names from a random selection of `adjective`+`name`. This is an interesting
|
||||
idea, and something that could be pursued in the future.
|
||||
- This would be a massive pain to localize though, hence why this is left as
|
||||
a future consideration.
|
||||
* We will _need_ to provide a commandline tool to list windows and their IDs &
|
||||
names. We're thinking a list of windows, their IDs, names, PIDs, and the title
|
||||
of the window.
|
||||
|
||||
Currently we're stuck with `wt.exe` which is a GUI application, and cannot
|
||||
print to the console. Our need is now fairly high for the ability to print
|
||||
info to the console. To remedy this, we'll need to ship another helper exe as
|
||||
a commandline tool for working with the terminal. The design for this is left
|
||||
for the future.
|
||||
|
||||
## Footnotes
|
||||
|
||||
<a name="footnote-1"><a>[1]: While tear-out is a separate track of work from
|
||||
session management in general, this setting could be implemented along with this
|
||||
set of features, and later used to control tear out as well.
|
||||
|
||||
<a name="footnote-2"><a>[2]: Since we're reserving the keyword `new` to mean "a
|
||||
new window", then we could also reserve `last` or `current` as an alias for "the
|
||||
current window".
|
||||
|
||||
<a name="footnote-3"><a>[3]: We currently have two actions for renaming _tabs_
|
||||
in the Terminal: `renameTab(name)`, and `openTabRenamer()`. We will likely
|
||||
similarly need `nameWindow(name)` and `openWindowNamer()`. `openWindowNamer`
|
||||
could display a dialog to allow the user to rename the current window at
|
||||
runtime.
|
||||
|
||||
|
||||
## Resources
|
||||
|
||||
* [Tab Tear-out in the community toolkit] - this document proved invaluable to
|
||||
the background of tearing a tab out of an application to create a new window.
|
||||
|
||||
<!-- Footnotes -->
|
||||
|
||||
[#5000]: https://github.com/microsoft/terminal/issues/5000
|
||||
[#1256]: https://github.com/microsoft/terminal/issues/1256
|
||||
[#4472]: https://github.com/microsoft/terminal/issues/4472
|
||||
[#2227]: https://github.com/microsoft/terminal/issues/2227
|
||||
[#653]: https://github.com/microsoft/terminal/issues/653
|
||||
[#1032]: https://github.com/microsoft/terminal/issues/1032
|
||||
[#632]: https://github.com/microsoft/terminal/issues/632
|
||||
[#492]: https://github.com/microsoft/terminal/issues/492
|
||||
[#4000]: https://github.com/microsoft/terminal/issues/4000
|
||||
[#7972]: https://github.com/microsoft/terminal/pull/7972
|
||||
[#961]: https://github.com/microsoft/terminal/issues/961
|
||||
[`30b8335`]: https://github.com/microsoft/terminal/commit/30b833547928d6dcbf88d49df0dbd5b3f6a7c879
|
||||
[Tab Tear-out in the community toolkit]: https://github.com/windows-toolkit/Sample-TabView-TearOff
|
||||
[Quake mode scenarios]: https://github.com/microsoft/terminal/issues/653#issuecomment-661370107
|
||||
[`ISwapChainPanelNative2::SetSwapChainHandle`]: https://docs.microsoft.com/en-us/windows/win32/api/windows.ui.xaml.media.dxinterop/nf-windows-ui-xaml-media-dxinterop-iswapchainpanelnative2-setswapchainhandle
|
||||
[Process Model 2.0 Spec]: https://github.com/microsoft/terminal/blob/main/doc/specs/%235000%20-%20Process%20Model%202.0/%235000%20-%20Process%20Model%202.0.md
|
||||
1186
doc/specs/#5000 - Process Model 2.0/#5000 - Process Model 2.0.md
Normal file
BIN
doc/specs/#5000 - Process Model 2.0/auto-glom-wt-exe.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 54 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/figure-001.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/figure-002.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/figure-003.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/mixed-elevation.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/single-instance-mode-cwd.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
doc/specs/#5000 - Process Model 2.0/tear-out-tab.png
Normal file
|
After Width: | Height: | Size: 46 KiB |