mirror of
https://github.com/microsoft/terminal.git
synced 2026-04-06 14:19:45 +00:00
Compare commits
118 Commits
dev/duhowe
...
dev/lhecke
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fc4bdbe7c | ||
|
|
a2bc5dce15 | ||
|
|
46c9c092da | ||
|
|
88422ffa25 | ||
|
|
2beecdca1f | ||
|
|
4aa1624cd2 | ||
|
|
c699a468c9 | ||
|
|
0576e5bc1e | ||
|
|
544452dad4 | ||
|
|
00f46e400a | ||
|
|
4eb06fee07 | ||
|
|
d2c3cfd164 | ||
|
|
5fdfd51209 | ||
|
|
7b50f12a78 | ||
|
|
6e5827add5 | ||
|
|
17a55da0f9 | ||
|
|
0cb3426281 | ||
|
|
1482fd4ecd | ||
|
|
837215b206 | ||
|
|
93d592bb41 | ||
|
|
760daa642e | ||
|
|
1f71568c2a | ||
|
|
f93347ed4b | ||
|
|
040f26175f | ||
|
|
0a91023df8 | ||
|
|
0a9cbd09d8 | ||
|
|
cd8c12586b | ||
|
|
ef960558b3 | ||
|
|
47d9a87a23 | ||
|
|
b07589e7a8 | ||
|
|
7d790c7c61 | ||
|
|
9ec8584f86 | ||
|
|
dbbc581154 | ||
|
|
1de142b4b1 | ||
|
|
d1a1f9836e | ||
|
|
e006f75f6c | ||
|
|
6dd9c468eb | ||
|
|
cbb4a0a01c | ||
|
|
eabebc4cb2 | ||
|
|
b3f41626b4 | ||
|
|
56cfb77c6d | ||
|
|
628e99f5d2 | ||
|
|
3b4ee83ed1 | ||
|
|
ce92b18507 | ||
|
|
fd1b1c35b4 | ||
|
|
5ff8b80358 | ||
|
|
0a7c2585a2 | ||
|
|
a40a4ea094 | ||
|
|
1cb3445834 | ||
|
|
516ade54cb | ||
|
|
056af83994 | ||
|
|
7b39d24913 | ||
|
|
249fe2aca1 | ||
|
|
408f3e2bfd | ||
|
|
e0dae59f38 | ||
|
|
60ac45c239 | ||
|
|
b439925acc | ||
|
|
131728b17d | ||
|
|
37e2bc0caa | ||
|
|
735ef2823e | ||
|
|
faf21acbc7 | ||
|
|
9b21b78fee | ||
|
|
4c018efd64 | ||
|
|
1ef497970f | ||
|
|
65219d40ce | ||
|
|
bf44b6c360 | ||
|
|
1511d2c2ad | ||
|
|
7fd9c5c789 | ||
|
|
9c1436775e | ||
|
|
4a40c4329a | ||
|
|
06c07ab50d | ||
|
|
0fd8dc575f | ||
|
|
9074e9d6a8 | ||
|
|
2478c643f4 | ||
|
|
0199ca33dd | ||
|
|
7c0d6d95db | ||
|
|
edfa3ea0f0 | ||
|
|
9ab2870bc3 | ||
|
|
ac865e6666 | ||
|
|
746cf1f148 | ||
|
|
2c452e0fd6 | ||
|
|
d4c1dad0fe | ||
|
|
9d0180a554 | ||
|
|
2fab9866b2 | ||
|
|
0bafab9a0f | ||
|
|
f6a415511a | ||
|
|
7d8455d4eb | ||
|
|
dd5f2ad755 | ||
|
|
9a0d784500 | ||
|
|
24450a3dd7 | ||
|
|
9007fc2894 | ||
|
|
07c7167535 | ||
|
|
dfb52331f8 | ||
|
|
5174c96d6d | ||
|
|
8149bd0dd0 | ||
|
|
8207f26bcc | ||
|
|
c0774dcda8 | ||
|
|
114c2b44d1 | ||
|
|
c7be9a2dbf | ||
|
|
450eec48de | ||
|
|
a8582978af | ||
|
|
50fe0f82ce | ||
|
|
9bafa52c65 | ||
|
|
39108a7a1b | ||
|
|
d730cfda9f | ||
|
|
2f43886ab5 | ||
|
|
295cd17b02 | ||
|
|
54ef019a46 | ||
|
|
21fa303a3d | ||
|
|
7851c96812 | ||
|
|
e02d46bdd2 | ||
|
|
75f7ae4bec | ||
|
|
6372baa0d3 | ||
|
|
cbc8eed476 | ||
|
|
d74440f0f1 | ||
|
|
65accfd5c3 | ||
|
|
6095d3c0cc | ||
|
|
0a2b660e64 |
2
.github/actions/spelling/allow/allow.txt
vendored
2
.github/actions/spelling/allow/allow.txt
vendored
@@ -27,6 +27,7 @@ gje
|
||||
godbolt
|
||||
hyperlinking
|
||||
hyperlinks
|
||||
Kbds
|
||||
kje
|
||||
libfuzzer
|
||||
liga
|
||||
@@ -43,6 +44,7 @@ mkmk
|
||||
mnt
|
||||
mru
|
||||
nje
|
||||
NTMTo
|
||||
notwrapped
|
||||
ogonek
|
||||
overlined
|
||||
|
||||
4
.github/actions/spelling/allow/apis.txt
vendored
4
.github/actions/spelling/allow/apis.txt
vendored
@@ -65,8 +65,8 @@ GETTEXTLENGTH
|
||||
Hashtable
|
||||
HIGHCONTRASTON
|
||||
HIGHCONTRASTW
|
||||
hinternet
|
||||
HIGHQUALITYSCALE
|
||||
hinternet
|
||||
HINTERNET
|
||||
hotkeys
|
||||
href
|
||||
@@ -155,6 +155,7 @@ NOTIFYBYPOS
|
||||
NOTIFYICON
|
||||
NOTIFYICONDATA
|
||||
ntprivapi
|
||||
NTSYSCALLAPI
|
||||
numr
|
||||
oaidl
|
||||
ocidl
|
||||
@@ -173,6 +174,7 @@ PALLOC
|
||||
PATINVERT
|
||||
PEXPLICIT
|
||||
PICKFOLDERS
|
||||
PINPUT
|
||||
pmr
|
||||
ptstr
|
||||
QUERYENDSESSION
|
||||
|
||||
1
.github/actions/spelling/excludes.txt
vendored
1
.github/actions/spelling/excludes.txt
vendored
@@ -128,3 +128,4 @@
|
||||
^XamlStyler\.json$
|
||||
ignore$
|
||||
Resources/(?!en)
|
||||
^\.vsconfig$
|
||||
|
||||
7
.github/actions/spelling/expect/alphabet.txt
vendored
7
.github/actions/spelling/expect/alphabet.txt
vendored
@@ -1,20 +1,15 @@
|
||||
AAAAA
|
||||
AAAAAAAAAAAAA
|
||||
AAAAAABBBBBBCCC
|
||||
AAAAABBBBBBCCC
|
||||
abcd
|
||||
abcd
|
||||
ABCDEFGHIJ
|
||||
abcdefghijk
|
||||
ABCDEFGHIJKLMNO
|
||||
abcdefghijklmnop
|
||||
ABCDEFGHIJKLMNOPQRS
|
||||
ABCDEFGHIJKLMNOPQRST
|
||||
ABCG
|
||||
ABE
|
||||
abf
|
||||
BBBBB
|
||||
BBBBBBBB
|
||||
BBBBBCCC
|
||||
BBBBCCCCC
|
||||
BBGGRR
|
||||
@@ -29,10 +24,8 @@ QQQQQQQQQQABCDEFGHIJKLMNOPQRSTQQQQQQQQQ
|
||||
QQQQQQQQQQABCDEFGHIJKLMNOPQRSTQQQQQQQQQQ
|
||||
QQQQQQQQQQABCDEFGHIJPQRST
|
||||
QQQQQQQQQQABCDEFGHIJPQRSTQQQQQQQQQQ
|
||||
qrstuvwxyz
|
||||
qwerty
|
||||
qwertyuiopasdfg
|
||||
YYYYYYYDDDDDDDDDDD
|
||||
ZAAZZ
|
||||
ZABBZ
|
||||
ZBAZZ
|
||||
|
||||
52
.github/actions/spelling/expect/expect.txt
vendored
52
.github/actions/spelling/expect/expect.txt
vendored
@@ -9,7 +9,6 @@ ABORTIFHUNG
|
||||
ACCESSTOKEN
|
||||
acidev
|
||||
ACIOSS
|
||||
ACover
|
||||
acp
|
||||
actctx
|
||||
ACTCTXW
|
||||
@@ -17,7 +16,6 @@ ADDALIAS
|
||||
ADDREF
|
||||
ADDSTRING
|
||||
ADDTOOL
|
||||
AFew
|
||||
AFill
|
||||
AFX
|
||||
AHelper
|
||||
@@ -39,6 +37,7 @@ ANSISYS
|
||||
ANSISYSRC
|
||||
ANSISYSSC
|
||||
answerback
|
||||
ANSWERBACKMESSAGE
|
||||
antialiasing
|
||||
ANull
|
||||
anycpu
|
||||
@@ -66,7 +65,6 @@ ARRAYSIZE
|
||||
ARROWKEYS
|
||||
asan
|
||||
ASBSET
|
||||
asdfghjkl
|
||||
ASetting
|
||||
ASingle
|
||||
ASYNCDONTCARE
|
||||
@@ -88,6 +86,7 @@ Autowrap
|
||||
AVerify
|
||||
awch
|
||||
azurecr
|
||||
AZZ
|
||||
backgrounded
|
||||
Backgrounder
|
||||
backgrounding
|
||||
@@ -125,6 +124,7 @@ BKCOLOR
|
||||
BKGND
|
||||
Bksp
|
||||
Blt
|
||||
blu
|
||||
BLUESCROLL
|
||||
bmi
|
||||
BODGY
|
||||
@@ -143,9 +143,8 @@ BTNFACE
|
||||
bufferout
|
||||
buffersize
|
||||
buflen
|
||||
buildtransitive
|
||||
buildsystems
|
||||
burriter
|
||||
buildtransitive
|
||||
BValue
|
||||
bytebuffer
|
||||
cac
|
||||
@@ -181,7 +180,6 @@ CFuzz
|
||||
cgscrn
|
||||
chafa
|
||||
changelists
|
||||
charinfo
|
||||
CHARSETINFO
|
||||
chh
|
||||
chshdng
|
||||
@@ -210,7 +208,6 @@ cmw
|
||||
CNL
|
||||
cnn
|
||||
Codeflow
|
||||
codenav
|
||||
codepages
|
||||
codepath
|
||||
coinit
|
||||
@@ -266,7 +263,6 @@ consolegit
|
||||
consolehost
|
||||
CONSOLEIME
|
||||
consoleinternal
|
||||
Consoleroot
|
||||
CONSOLESETFOREGROUND
|
||||
consoletaeftemplates
|
||||
consoleuwp
|
||||
@@ -362,6 +358,7 @@ DBGFONTS
|
||||
DBGOUTPUT
|
||||
dbh
|
||||
dblclk
|
||||
Dcd
|
||||
DColor
|
||||
DCOLORVALUE
|
||||
dcommon
|
||||
@@ -379,7 +376,7 @@ DECALN
|
||||
DECANM
|
||||
DECARM
|
||||
DECAUPSS
|
||||
DECAWM
|
||||
decawm
|
||||
DECBI
|
||||
DECBKM
|
||||
DECCARA
|
||||
@@ -387,7 +384,7 @@ DECCIR
|
||||
DECCKM
|
||||
DECCKSR
|
||||
DECCOLM
|
||||
DECCRA
|
||||
deccra
|
||||
DECCTR
|
||||
DECDC
|
||||
DECDHL
|
||||
@@ -399,7 +396,7 @@ DECEKBD
|
||||
DECERA
|
||||
DECFI
|
||||
DECFNK
|
||||
DECFRA
|
||||
decfra
|
||||
DECGCI
|
||||
DECGCR
|
||||
DECGNL
|
||||
@@ -421,6 +418,7 @@ DECPCCM
|
||||
DECPCTERM
|
||||
DECPS
|
||||
DECRARA
|
||||
decrc
|
||||
DECRC
|
||||
DECREQTPARM
|
||||
DECRLM
|
||||
@@ -436,6 +434,7 @@ DECRSPS
|
||||
decrst
|
||||
DECSACE
|
||||
DECSASD
|
||||
decsc
|
||||
DECSC
|
||||
DECSCA
|
||||
DECSCNM
|
||||
@@ -475,7 +474,6 @@ DEFPUSHBUTTON
|
||||
defterm
|
||||
DELAYLOAD
|
||||
DELETEONRELEASE
|
||||
Delt
|
||||
depersist
|
||||
deprioritized
|
||||
deserializers
|
||||
@@ -556,7 +554,6 @@ Efast
|
||||
efghijklmn
|
||||
EHsc
|
||||
EINS
|
||||
EJO
|
||||
ELEMENTNOTAVAILABLE
|
||||
EMPTYBOX
|
||||
enabledelayedexpansion
|
||||
@@ -626,7 +623,6 @@ FINDDOWN
|
||||
FINDREGEX
|
||||
FINDSTRINGEXACT
|
||||
FINDUP
|
||||
FIter
|
||||
FITZPATRICK
|
||||
FIXEDFILEINFO
|
||||
Flg
|
||||
@@ -723,12 +719,12 @@ GETWHEELSCROLLLINES
|
||||
Gfun
|
||||
gfx
|
||||
GGI
|
||||
GHgh
|
||||
GHIJK
|
||||
GHIJKL
|
||||
gitcheckin
|
||||
gitfilters
|
||||
gitlab
|
||||
gitmodules
|
||||
gle
|
||||
GLOBALFOCUS
|
||||
GLYPHENTRY
|
||||
@@ -917,6 +913,7 @@ Keymapping
|
||||
keyscan
|
||||
keystate
|
||||
keyups
|
||||
Kickstart
|
||||
KILLACTIVE
|
||||
KILLFOCUS
|
||||
kinda
|
||||
@@ -948,7 +945,6 @@ LCONTROL
|
||||
LCTRL
|
||||
lcx
|
||||
LEFTALIGN
|
||||
libpopcnt
|
||||
libsancov
|
||||
libtickit
|
||||
licate
|
||||
@@ -1023,7 +1019,6 @@ lstatus
|
||||
lstrcmp
|
||||
lstrcmpi
|
||||
LTEXT
|
||||
LTLTLTLTL
|
||||
ltsc
|
||||
LUID
|
||||
luma
|
||||
@@ -1046,7 +1041,6 @@ MAPBITMAP
|
||||
MAPVIRTUALKEY
|
||||
MAPVK
|
||||
MAXDIMENSTRING
|
||||
maxing
|
||||
MAXSHORT
|
||||
maxval
|
||||
maxversiontested
|
||||
@@ -1119,7 +1113,6 @@ msrc
|
||||
MSVCRTD
|
||||
MTSM
|
||||
Munged
|
||||
munges
|
||||
murmurhash
|
||||
muxes
|
||||
myapplet
|
||||
@@ -1221,7 +1214,6 @@ ntlpcapi
|
||||
ntm
|
||||
ntrtl
|
||||
ntstatus
|
||||
NTSYSCALLAPI
|
||||
nttree
|
||||
nturtl
|
||||
ntuser
|
||||
@@ -1237,6 +1229,7 @@ NUMSCROLL
|
||||
NUnit
|
||||
nupkg
|
||||
NVIDIA
|
||||
NVT
|
||||
OACR
|
||||
objbase
|
||||
ocolor
|
||||
@@ -1411,6 +1404,7 @@ processenv
|
||||
processhost
|
||||
PROCESSINFOCLASS
|
||||
PRODEXT
|
||||
Productize
|
||||
PROPERTYID
|
||||
PROPERTYKEY
|
||||
propertyval
|
||||
@@ -1504,7 +1498,6 @@ REGSTR
|
||||
RELBINPATH
|
||||
remoting
|
||||
renamer
|
||||
renderengine
|
||||
rendersize
|
||||
reparented
|
||||
reparenting
|
||||
@@ -1528,7 +1521,6 @@ rftp
|
||||
rgbi
|
||||
RGBQUAD
|
||||
rgbs
|
||||
rgci
|
||||
rgfae
|
||||
rgfte
|
||||
rgn
|
||||
@@ -1606,6 +1598,7 @@ SELECTALL
|
||||
SELECTEDFONT
|
||||
SELECTSTRING
|
||||
Selfhosters
|
||||
Serbo
|
||||
SERVERDLL
|
||||
SETACTIVE
|
||||
SETBUDDYINT
|
||||
@@ -1818,6 +1811,7 @@ TITLEISLINKNAME
|
||||
TJson
|
||||
TLambda
|
||||
TLDP
|
||||
tldr
|
||||
TLEN
|
||||
TMAE
|
||||
TMPF
|
||||
@@ -1833,8 +1827,6 @@ TOPDOWNDIB
|
||||
TOpt
|
||||
tosign
|
||||
touchpad
|
||||
Tpp
|
||||
Tpqrst
|
||||
tracelogging
|
||||
traceviewpp
|
||||
trackbar
|
||||
@@ -1844,7 +1836,6 @@ Trd
|
||||
TREX
|
||||
triaged
|
||||
triaging
|
||||
Tribool
|
||||
TRIMZEROHEADINGS
|
||||
trx
|
||||
tsa
|
||||
@@ -1938,7 +1929,6 @@ uxtheme
|
||||
Vanara
|
||||
vararg
|
||||
vclib
|
||||
vcprintf
|
||||
vcxitems
|
||||
vectorize
|
||||
VERCTRL
|
||||
@@ -1961,7 +1951,6 @@ VPACKMANIFESTDIRECTORY
|
||||
VPR
|
||||
VREDRAW
|
||||
vsc
|
||||
vsconfig
|
||||
vscprintf
|
||||
VSCROLL
|
||||
vsdevshell
|
||||
@@ -1982,7 +1971,6 @@ vtio
|
||||
vtmode
|
||||
vtpipeterm
|
||||
vtpt
|
||||
vtrenderer
|
||||
VTRGB
|
||||
VTRGBTo
|
||||
vtseq
|
||||
@@ -2071,14 +2059,12 @@ Winperf
|
||||
WInplace
|
||||
winres
|
||||
winrt
|
||||
wintelnet
|
||||
winternl
|
||||
winuser
|
||||
winuserp
|
||||
WINVER
|
||||
wistd
|
||||
wmain
|
||||
wmemory
|
||||
WMSZ
|
||||
wnd
|
||||
WNDALLOC
|
||||
@@ -2145,6 +2131,7 @@ XBUTTONDOWN
|
||||
XBUTTONUP
|
||||
XCast
|
||||
XCENTER
|
||||
xchar
|
||||
xcopy
|
||||
XCount
|
||||
xdy
|
||||
@@ -2172,16 +2159,15 @@ XTWINOPS
|
||||
xunit
|
||||
xutr
|
||||
XVIRTUALSCREEN
|
||||
XWalk
|
||||
yact
|
||||
YCast
|
||||
YCENTER
|
||||
YCount
|
||||
yizz
|
||||
YLimit
|
||||
YPan
|
||||
YSubstantial
|
||||
YVIRTUALSCREEN
|
||||
YWalk
|
||||
Zab
|
||||
zabcd
|
||||
Zabcdefghijklmn
|
||||
@@ -2189,6 +2175,6 @@ Zabcdefghijklmnopqrstuvwxyz
|
||||
ZCmd
|
||||
ZCtrl
|
||||
ZWJs
|
||||
zxcvbnm
|
||||
ZYXWVU
|
||||
ZYXWVUTd
|
||||
zzf
|
||||
|
||||
@@ -22,6 +22,7 @@ vcvars\w*
|
||||
ROY\sG\.\sBIV
|
||||
!(?:(?i)ESC)!\[
|
||||
!(?:(?i)CSI)!(?:\d+(?:;\d+|)m|[ABCDF])
|
||||
(?i)rgb:[a-z0-9]{2,4}/[a-z0-9]{2,4}/[a-z0-9]{2,4}
|
||||
|
||||
# SSE intrinsics like "_mm_subs_epu16"
|
||||
\b_mm(?:|256|512)_\w+\b
|
||||
|
||||
33
.github/workflows/similarIssues.yml
vendored
33
.github/workflows/similarIssues.yml
vendored
@@ -1,33 +0,0 @@
|
||||
name: GitGudSimilarIssues comments
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
getSimilarIssues:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
message: ${{ steps.getBody.outputs.message }}
|
||||
steps:
|
||||
- id: getBody
|
||||
uses: craigloewen-msft/GitGudSimilarIssues@main
|
||||
with:
|
||||
issueTitle: ${{ github.event.issue.title }}
|
||||
issueBody: ${{ github.event.issue.body }}
|
||||
repo: ${{ github.repository }}
|
||||
similaritytolerance: "0.8"
|
||||
add-comment:
|
||||
needs: getSimilarIssues
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
if: needs.getSimilarIssues.outputs.message != ''
|
||||
steps:
|
||||
- name: Add comment
|
||||
run: gh issue comment "$NUMBER" --repo "$REPO" --body "$BODY"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NUMBER: ${{ github.event.issue.number }}
|
||||
REPO: ${{ github.repository }}
|
||||
BODY: ${{ needs.getSimilarIssues.outputs.message }}
|
||||
62
.vsconfig
62
.vsconfig
@@ -1,35 +1,51 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"components": [
|
||||
"Microsoft.VisualStudio.Component.Roslyn.Compiler",
|
||||
"Microsoft.Component.MSBuild",
|
||||
"Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
|
||||
"Microsoft.VisualStudio.Component.SQL.LocalDB.Runtime",
|
||||
"Microsoft.VisualStudio.Component.SQL.CLR",
|
||||
"Microsoft.VisualStudio.Component.CoreEditor",
|
||||
"Microsoft.VisualStudio.Workload.CoreEditor",
|
||||
"Microsoft.VisualStudio.Workload.Universal",
|
||||
"Microsoft.VisualStudio.Workload.NativeDesktop",
|
||||
"Microsoft.VisualStudio.Workload.ManagedDesktop",
|
||||
"Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites",
|
||||
"Microsoft.Net.Component.4.8.SDK",
|
||||
"Microsoft.Net.Component.4.7.2.TargetingPack",
|
||||
"Microsoft.VisualStudio.Component.TextTemplating",
|
||||
"Microsoft.VisualStudio.Component.NuGet",
|
||||
"Microsoft.VisualStudio.Component.Roslyn.Compiler",
|
||||
"Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
|
||||
"Microsoft.Net.ComponentGroup.DevelopmentPrerequisites",
|
||||
"Microsoft.Component.MSBuild",
|
||||
"Microsoft.VisualStudio.Component.ManagedDesktop.Core",
|
||||
"Microsoft.Net.Component.4.TargetingPack",
|
||||
"Microsoft.Net.Component.4.5.TargetingPack",
|
||||
"Microsoft.NetCore.Component.Runtime.8.0",
|
||||
"Microsoft.NetCore.Component.SDK",
|
||||
"Microsoft.VisualStudio.Component.AppInsights.Tools",
|
||||
"Microsoft.Net.Component.4.8.TargetingPack",
|
||||
"Microsoft.VisualStudio.Component.DiagnosticTools",
|
||||
"Microsoft.VisualStudio.Component.Debugger.JustInTime",
|
||||
"Microsoft.VisualStudio.Component.Windows11SDK.22621",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.Support",
|
||||
"Microsoft.NetCore.Component.Runtime.6.0",
|
||||
"Microsoft.VisualStudio.Component.ClassDesigner",
|
||||
"Microsoft.VisualStudio.Component.GraphDocument",
|
||||
"Microsoft.VisualStudio.Component.CodeMap",
|
||||
"Microsoft.VisualStudio.Component.VC.CoreIde",
|
||||
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
|
||||
"Microsoft.VisualStudio.Component.Graphics",
|
||||
"Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
|
||||
"Microsoft.VisualStudio.Component.Windows11SDK.22621",
|
||||
"Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging",
|
||||
"Microsoft.VisualStudio.ComponentGroup.WindowsAppSDK.Cs",
|
||||
"Microsoft.ComponentGroup.Blend",
|
||||
"Microsoft.VisualStudio.ComponentGroup.ArchitectureTools.Native",
|
||||
"Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
|
||||
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
|
||||
"Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions.CMake",
|
||||
"Microsoft.VisualStudio.Component.Vcpkg",
|
||||
"Microsoft.Component.NetFX.Native",
|
||||
"Microsoft.VisualStudio.Component.Graphics",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.Xamarin",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.Support",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.ARM64EC",
|
||||
"Microsoft.VisualStudio.Component.UWP.VC.ARM64EC",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.ARM64",
|
||||
"Microsoft.VisualStudio.Component.VC.ASAN",
|
||||
"Microsoft.VisualStudio.Component.VC.v143.x86.x64",
|
||||
"Microsoft.VisualStudio.Component.VC.v143.ARM64",
|
||||
"Microsoft.VisualStudio.Component.UWP.VC.ARM64",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.ARM",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.VC",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.VC.v143",
|
||||
"Microsoft.VisualStudio.Component.UWP.VC.ARM64"
|
||||
]
|
||||
"Microsoft.VisualStudio.Workload.NativeDesktop",
|
||||
"Microsoft.VisualStudio.ComponentGroup.WindowsAppDevelopment.Prerequisites",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.NetCoreAndStandard",
|
||||
"Microsoft.VisualStudio.Workload.Universal"
|
||||
],
|
||||
"extensions": []
|
||||
}
|
||||
|
||||
34
.wt.json
Normal file
34
.wt.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"$version": "1.0.0",
|
||||
"snippets":
|
||||
[
|
||||
{
|
||||
"input": "bx\r",
|
||||
"name": "Build project",
|
||||
"description": "Build the project in the CWD"
|
||||
},
|
||||
{
|
||||
"input": "bz\r",
|
||||
"name": "Build solution, incremental",
|
||||
"description": "Just build changes to the solution"
|
||||
},
|
||||
{
|
||||
"input": "bcz\r",
|
||||
"name": "Clean & build solution",
|
||||
"icon": "\uE8e6",
|
||||
"description": "Start over. Go get your coffee. "
|
||||
},
|
||||
{
|
||||
"input": "nuget push -ApiKey az -source TerminalDependencies %userprofile%\\Downloads",
|
||||
"name": "Upload package to nuget feed",
|
||||
"icon": "\uE898",
|
||||
"description": "Go download a .nupkg, put it in ~/Downloads, and use this to push to our private feed."
|
||||
},
|
||||
{
|
||||
"input": "runut /name:**\u001b[D",
|
||||
"name": "Run a test",
|
||||
"icon": "",
|
||||
"description": "Enter the name of a test to run"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -41,6 +41,11 @@
|
||||
-->
|
||||
<MSBuildCacheIdenticalDuplicateOutputPatterns>$(MSBuildCacheIdenticalDuplicateOutputPatterns);bin\**</MSBuildCacheIdenticalDuplicateOutputPatterns>
|
||||
|
||||
<!--
|
||||
vcpkg is invoked for each and every vcxproj and each invocation uses the same base dir for logging, so allow these duplicate "outputs".
|
||||
-->
|
||||
<MSBuildCacheIdenticalDuplicateOutputPatterns>$(MSBuildCacheIdenticalDuplicateOutputPatterns);obj\*\vcpkg\**</MSBuildCacheIdenticalDuplicateOutputPatterns>
|
||||
|
||||
<!-- version of MSBuildCache is not part of the cache key -->
|
||||
<PackagesConfigFile>$(MSBuildThisFileDirectory)\dep\nuget\packages.config</PackagesConfigFile>
|
||||
<MSBuildCacheIgnoredInputPatterns>$(MSBuildCacheIgnoredInputPatterns);$(PackagesConfigFile)</MSBuildCacheIgnoredInputPatterns>
|
||||
|
||||
65
NOTICE.md
65
NOTICE.md
@@ -84,71 +84,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
```
|
||||
|
||||
## kimwalisch/libpopcnt
|
||||
|
||||
**Source**: [https://github.com/kimwalisch/libpopcnt](https://github.com/kimwalisch/libpopcnt)
|
||||
|
||||
### License
|
||||
|
||||
```
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2016 - 2019, Kim Walisch
|
||||
Copyright (c) 2016 - 2019, Wojciech Muła
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
```
|
||||
|
||||
## dynamic_bitset
|
||||
|
||||
**Source**: [https://github.com/pinam45/dynamic_bitset](https://github.com/pinam45/dynamic_bitset)
|
||||
|
||||
### License
|
||||
|
||||
```
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Maxime Pinard
|
||||
|
||||
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.
|
||||
```
|
||||
|
||||
## \{fmt\}
|
||||
|
||||
**Source**: [https://github.com/fmtlib/fmt](https://github.com/fmtlib/fmt)
|
||||
|
||||
@@ -131,7 +131,6 @@ EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InteractivityWin32", "src\interactivity\win32\lib\win32.LIB.vcxproj", "{06EC74CB-9A12-429C-B551-8532EC964726}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{1C959542-BAC2-4E55-9A6D-13251914CBB9} = {1C959542-BAC2-4E55-9A6D-13251914CBB9}
|
||||
{990F2657-8580-4828-943F-5DD657D11842} = {990F2657-8580-4828-943F-5DD657D11842}
|
||||
{AF0A096A-8B3A-4949-81EF-7DF8F0FEE91F} = {AF0A096A-8B3A-4949-81EF-7DF8F0FEE91F}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
@@ -140,14 +139,9 @@ EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InteractivityBase", "src\interactivity\base\lib\InteractivityBase.vcxproj", "{06EC74CB-9A12-429C-B551-8562EC964846}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Interactivity.Win32.Tests.Unit", "src\interactivity\win32\ut_interactivity_win32\Interactivity.Win32.UnitTests.vcxproj", "{D3B92829-26CB-411A-BDA2-7F5DA3D25DD4}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{990F2657-8580-4828-943F-5DD657D11842} = {990F2657-8580-4828-943F-5DD657D11842}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CloseTest", "src\tools\closetest\CloseTest.vcxproj", "{C7A6A5D9-60BE-4AEB-A5F6-AFE352F86CBB}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RendererVt", "src\renderer\vt\lib\vt.vcxproj", "{990F2657-8580-4828-943F-5DD657D11842}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VtPipeTerm", "src\tools\vtpipeterm\VtPipeTerm.vcxproj", "{814DBDDE-894E-4327-A6E1-740504850098}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{9CBD7DFA-1754-4A9D-93D7-857A9D17CB1B} = {9CBD7DFA-1754-4A9D-93D7-857A9D17CB1B}
|
||||
@@ -157,8 +151,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConEchoKey", "src\tools\ech
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Types", "src\types\lib\types.vcxproj", "{18D09A24-8240-42D6-8CB6-236EEE820263}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RendererVt.unittest", "src\renderer\vt\ut_lib\vt.unittest.vcxproj", "{990F2657-8580-4828-943F-5DD657D11843}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BufferOut", "src\buffer\out\lib\bufferout.vcxproj", "{0CF235BD-2DA0-407E-90EE-C467E8BBC714}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TerminalConnection", "src\cascadia\TerminalConnection\TerminalConnection.vcxproj", "{CA5CAD1A-C46D-4588-B1C0-40F31AE9100B}"
|
||||
@@ -1117,29 +1109,6 @@ Global
|
||||
{C7A6A5D9-60BE-4AEB-A5F6-AFE352F86CBB}.Release|x64.Build.0 = Release|x64
|
||||
{C7A6A5D9-60BE-4AEB-A5F6-AFE352F86CBB}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C7A6A5D9-60BE-4AEB-A5F6-AFE352F86CBB}.Release|x86.Build.0 = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.AuditMode|ARM64.ActiveCfg = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.AuditMode|x64.ActiveCfg = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.AuditMode|x86.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|x64.Build.0 = Debug|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Debug|x86.Build.0 = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Fuzzing|Any CPU.ActiveCfg = Fuzzing|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Fuzzing|ARM64.ActiveCfg = Fuzzing|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Fuzzing|x64.ActiveCfg = Fuzzing|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Fuzzing|x64.Build.0 = Fuzzing|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Fuzzing|x86.ActiveCfg = Fuzzing|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|x64.ActiveCfg = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|x64.Build.0 = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|x86.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11842}.Release|x86.Build.0 = Release|Win32
|
||||
{814DBDDE-894E-4327-A6E1-740504850098}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
|
||||
{814DBDDE-894E-4327-A6E1-740504850098}.AuditMode|ARM64.ActiveCfg = Release|ARM64
|
||||
{814DBDDE-894E-4327-A6E1-740504850098}.AuditMode|x64.ActiveCfg = Release|x64
|
||||
@@ -1210,28 +1179,6 @@ Global
|
||||
{18D09A24-8240-42D6-8CB6-236EEE820263}.Release|x64.Build.0 = Release|x64
|
||||
{18D09A24-8240-42D6-8CB6-236EEE820263}.Release|x86.ActiveCfg = Release|Win32
|
||||
{18D09A24-8240-42D6-8CB6-236EEE820263}.Release|x86.Build.0 = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.AuditMode|ARM64.ActiveCfg = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.AuditMode|x64.ActiveCfg = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.AuditMode|x86.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|x64.Build.0 = Debug|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Debug|x86.Build.0 = Debug|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Fuzzing|Any CPU.ActiveCfg = Fuzzing|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Fuzzing|ARM64.ActiveCfg = Fuzzing|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Fuzzing|x64.ActiveCfg = Fuzzing|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Fuzzing|x86.ActiveCfg = Fuzzing|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|x64.ActiveCfg = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|x64.Build.0 = Release|x64
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|x86.ActiveCfg = Release|Win32
|
||||
{990F2657-8580-4828-943F-5DD657D11843}.Release|x86.Build.0 = Release|Win32
|
||||
{0CF235BD-2DA0-407E-90EE-C467E8BBC714}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
|
||||
{0CF235BD-2DA0-407E-90EE-C467E8BBC714}.AuditMode|ARM64.ActiveCfg = AuditMode|ARM64
|
||||
{0CF235BD-2DA0-407E-90EE-C467E8BBC714}.AuditMode|ARM64.Build.0 = AuditMode|ARM64
|
||||
@@ -2444,11 +2391,9 @@ Global
|
||||
{06EC74CB-9A12-429C-B551-8562EC964846} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB}
|
||||
{D3B92829-26CB-411A-BDA2-7F5DA3D25DD4} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB}
|
||||
{C7A6A5D9-60BE-4AEB-A5F6-AFE352F86CBB} = {A10C4720-DCA4-4640-9749-67F4314F527C}
|
||||
{990F2657-8580-4828-943F-5DD657D11842} = {05500DEF-2294-41E3-AF9A-24E580B82836}
|
||||
{814DBDDE-894E-4327-A6E1-740504850098} = {A10C4720-DCA4-4640-9749-67F4314F527C}
|
||||
{814CBEEE-894E-4327-A6E1-740504850098} = {A10C4720-DCA4-4640-9749-67F4314F527C}
|
||||
{18D09A24-8240-42D6-8CB6-236EEE820263} = {89CDCC5C-9F53-4054-97A4-639D99F169CD}
|
||||
{990F2657-8580-4828-943F-5DD657D11843} = {05500DEF-2294-41E3-AF9A-24E580B82836}
|
||||
{0CF235BD-2DA0-407E-90EE-C467E8BBC714} = {1E4A062E-293B-4817-B20D-BF16B979E350}
|
||||
{CA5CAD1A-C46D-4588-B1C0-40F31AE9100B} = {59840756-302F-44DF-AA47-441A9D673202}
|
||||
{CA5CAD1A-ABCD-429C-B551-8562EC954746} = {9921CA0A-320C-4460-8623-3A3196E7F4CB}
|
||||
|
||||
11
README.md
11
README.md
@@ -1,5 +1,7 @@
|
||||

|
||||
|
||||
[](https://dev.azure.com/shine-oss/terminal/_build/latest?definitionId=1&branchName=main)
|
||||
|
||||
# Welcome to the Windows Terminal, Console and Command-Line repo
|
||||
|
||||
This repository contains the source code for:
|
||||
@@ -145,15 +147,6 @@ _Learn more about the [types of Windows Terminal distributions](https://learn.mi
|
||||
The plan for the Windows Terminal [is described here](/doc/roadmap-2023.md) and
|
||||
will be updated as the project proceeds.
|
||||
|
||||
## Project Build Status
|
||||
|
||||
Project|Build Status
|
||||
---|---
|
||||
Terminal|[](https://dev.azure.com/ms/terminal/_build?definitionId=136)
|
||||
ColorTool|
|
||||
|
||||
---
|
||||
|
||||
## Terminal & Console Overview
|
||||
|
||||
Please take a few minutes to review the overview below before diving into the
|
||||
|
||||
@@ -56,7 +56,15 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme der Com
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
Weitere Einzelheiten finden Sie auf der Seite der GitHub-Veröffentlichungen.
|
||||
– Wir haben umgeschrieben, wie Konsolenanwendungen im Terminal gehostet werden! Melden Sie alle auftretenden Fehler.
|
||||
- Terminal unterstützt jetzt Sixels!
|
||||
- Sie können jetzt ein angedocktes Fenster öffnen, das Ausschnitte von Befehlen enthält, die Sie gespeichert haben, um sie später zu verwenden.
|
||||
- Für Benutzer der Eingabeaufforderung der neuesten Version von Windows 11 wird möglicherweise ein „Kurzer Tipp“-Symbol angezeigt, das installierbare Software von WinGet
|
||||
vorschlägt
|
||||
- Ausgewählter Text wird jetzt viel sichtbarer (und anpassbarer!)
|
||||
- Eine Reihe von Zuverlässigkeitsfehlern, Komfortproblemen und Ärgernissen wurden behoben.
|
||||
|
||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,6 +56,13 @@ This is an open source project and we welcome community participation. To partic
|
||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__} App Release Note" -->Version __VERSION_NUMBER__
|
||||
|
||||
- We've rewritten how console applications are hosted inside Terminal! Please report any bugs you encounter.
|
||||
- Terminal now supports Sixels!
|
||||
- You can now open a docked panel containing snippets of commands you have saved to use later
|
||||
- Command Prompt users on the latest Windows 11 release may see a "quick tip" icon that suggests installable software from WinGet
|
||||
- Selected text will now be much more visible (and customizable!)
|
||||
- A number of reliabilty bugs, convenience issues and annoyances have been fixed.
|
||||
|
||||
Please see our GitHub releases page for additional details.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
|
||||
@@ -56,7 +56,14 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
||||
<ReleaseNotes>
|
||||
Versión __VERSION_NUMBER__
|
||||
|
||||
Para más información, consulte nuestra página de versiones de GitHub.
|
||||
- Hemos reescrito cómo se hospedan las aplicaciones de consola en Terminal. Informe de los errores que encuentre.
|
||||
- Terminal ahora admite sixeles.
|
||||
- Ahora puede abrir un panel acoplado que contenga fragmentos de comandos que haya guardado para usarlos más adelante
|
||||
- Los usuarios del símbolo del sistema de la versión más reciente de Windows 11 pueden ver un icono de "sugerencia rápida" que sugiere software instalable de WinGet
|
||||
- El texto seleccionado ahora será mucho más visible (y personalizable)
|
||||
- Se han corregido varios errores de fiabilidad, problemas de comodidad y molestias.
|
||||
|
||||
Consulte la página de versiones de GitHub para más información.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@ Il s’agit d’un projet open source et nous vous invitons à participer dans l
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
Consultez la page des versions de GitHub pour plus d’informations.
|
||||
- Nous avons réécrit la manière dont les applications de console sont hébergées dans Terminal ! Veuillez signaler tout bug que vous rencontrez.
|
||||
- Le terminal prend désormais en charge Sixels !
|
||||
- Vous pouvez désormais ouvrir un panneau ancré contenant des extraits de commandes que vous avez enregistrées pour les utiliser ultérieurement
|
||||
- Les utilisateurs de l'invite de commande sur la dernière version de Windows 11 peuvent voir une icône « astuce rapide » qui suggère un logiciel installable à partir de WinGet
|
||||
- Le texte sélectionné sera désormais beaucoup plus visible (et personnalisable !)
|
||||
- Un certain nombre de bugs de fiabilité, de problèmes de commodité et de désagréments ont été corrigés.
|
||||
|
||||
Veuillez consulter notre page de versions GitHub pour plus de détails.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,9 +54,16 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
Versione __VERSION_NUMBER__
|
||||
Versione __VERSION_NUMBER__
|
||||
|
||||
Per ulteriori dettagli, consulta la nostra pagina delle versioni di GitHub.
|
||||
- È stato riscritto il modo in cui le applicazioni della console vengono ospitate all'interno di Terminale. Segnala eventuali bug riscontrati.
|
||||
- Terminal supporta ora Sixel.
|
||||
- È ora possibile aprire un pannello ancorato contenente frammenti di comandi salvati per usarli in seguito
|
||||
- Gli utenti del prompt dei comandi nella versione più recente di Windows 11 potrebbero visualizzare un'icona di "suggerimento rapido" che consiglia il software installabile da WinGet
|
||||
- Il testo selezionato sarà ora molto più visibile, oltre che personalizzabile.
|
||||
- Sono stati risolti diversi bug di affidabilità, problemi di praticità e fastidi.
|
||||
|
||||
Per altri dettagli, vedi la pagina delle versioni di GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
バージョン __VERSION_NUMBER__
|
||||
|
||||
詳細については、GitHub リリースのページをご覧ください。
|
||||
- ターミナル内でのコンソール アプリケーションのホスト方法を書き換えました。発生したバグを報告してください。
|
||||
- ターミナルで Sixels がサポートされるようになりました。
|
||||
- 後で使用するために保存したコマンドのスニペットを含むドッキング パネルを開けるようになりました
|
||||
- 最新の Windows 11 リリースのコマンド プロンプト ユーザーには、WinGet からインストール可能なソフトウェアを提案する "クイック ヒント" アイコンが表示される場合があります
|
||||
- 選択したテキストが大幅に見やすくなりました (カスタマイズも可能です)
|
||||
- 信頼性に関するバグ、利便性の問題、不快な問題の多くが修正されました。
|
||||
|
||||
詳細については、GitHub リリース ページをご覧ください。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,6 +56,13 @@
|
||||
<ReleaseNotes>
|
||||
버전 __VERSION_NUMBER__
|
||||
|
||||
- 콘솔 애플리케이션이 터미널 내에서 호스팅되는 방법을 다시 작성했습니다! 발생한 버그를 보고하세요.
|
||||
- 터미널에서 이제 Sixels를 지원합니다!
|
||||
- 이제 나중에 사용하기 위해 저장한 명령 조각이 포함된 도킹된 패널을 열 수 있습니다.
|
||||
- 최신 Windows 11 릴리스의 명령 프롬프트 사용자는 WinGet에서 설치 가능한 소프트웨어를 제안하는 "빠른 팁" 아이콘을 볼 수 있습니다.
|
||||
- 이제 선택한 텍스트가 훨씬 더 잘 표시됩니다(사용자 지정도 가능!).
|
||||
- 여러 신뢰성 버그, 편의 문제 및 성가신 사항이 수정되었습니다.
|
||||
|
||||
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
|
||||
@@ -56,7 +56,14 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
||||
<ReleaseNotes>
|
||||
Versão __VERSION_NUMBER__
|
||||
|
||||
Consulte nossa página de lançamentos do GitHub para obter detalhes adicionais.
|
||||
- Reescrevemos a forma como os aplicativos de console são hospedados no Terminal! Certifique-se de reportar os bugs que você encontrar.
|
||||
- O terminal agora é compatível com o Sixels!
|
||||
- Agora você pode abrir um painel acoplado contendo snippets de comandos que você salvou para usar mais tarde
|
||||
- Os usuários do Prompt de Comando na versão mais recente do Windows 11 podem ver um ícone de "dica rápida", que sugere softwares instaláveis a partir do WinGet
|
||||
- O texto selecionado agora ficará muito mais visível (e personalizável!)
|
||||
- Vários bugs de confiabilidade, problemas de conveniência e incômodos foram resolvidos.
|
||||
|
||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Версия __VERSION_NUMBER__
|
||||
|
||||
Дополнительные сведения см. на странице «Выпуски GitHub».
|
||||
– Мы переписали, как консольные приложения размещаются внутри Терминала! Сообщайте о любых ошибках, с которыми вы столкнулись.
|
||||
– Терминал теперь поддерживает форматы Sixel!
|
||||
– Теперь вы можете открыть закрепленную панель, содержащую фрагменты команд, которые вы сохранили для использования в дальнейшем
|
||||
– Пользователи командной строки в новейшем выпуске Windows 11 могут увидеть значок "краткой подсказки", который предлагает устанавливаемые программы из WinGet
|
||||
– Выделенный текст теперь станет более видимым (и настраиваемым!)
|
||||
– Исправлено несколько ошибок надежности, проблем с удобством, а также устранены раздражающие моменты.
|
||||
|
||||
Дополнительные сведения см. на странице выпусков GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,7 +54,14 @@
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- 我们已改变主机应用程序在终端内的托管方式!请报告遇到的任何 bug。
|
||||
- 终端现在支持 Sixels!
|
||||
- 现在可以打开一个停靠面板,其中包含已保存供以后使用的命令片段
|
||||
- 最新 Windows 11 版本上的命令提示用户可能会看到“快速提示”图标,该图标建议从 WinGet 安装软件
|
||||
- 所选文本现在将具有更高的可见性(和可自定义性!)
|
||||
- 修复了许多可靠性 bug、便利性问题和令人烦恼的问题。
|
||||
|
||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
|
||||
如需詳細資訊,請參閱我們的 GitHub 版本頁面。
|
||||
- 我們已重寫主機應用程式在終端機內託管的方式!請報告您遇到的錯誤。
|
||||
- 終端機現在支援 Sixels!
|
||||
- 現在,您可以開啟包含已儲存命令程式碼片段的固定面板,以供稍後使用
|
||||
- 最新 Windows 11 版本中的 [命令提示] 使用者可能會看到「快速提示」圖示,建議可自 WinGet 安裝的軟體
|
||||
- 選取的文字現在會更明顯 (且可自訂!)
|
||||
- 已修正一些可靠性錯誤、便利性問題和令人困擾的問題。
|
||||
|
||||
如需更多詳細資訊,請參閱我們的 GitHub 發行頁面。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme an der
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
Weitere Einzelheiten finden Sie auf der Seite der GitHub-Veröffentlichungen.
|
||||
– Terminal speichert jetzt den Inhalt des Fensters, wenn Sie die Sitzungswiederherstellung verwenden.
|
||||
– Sie können jetzt mehrere Schriftarten gleichzeitig verwenden.
|
||||
– Kästchenzeichnende Zeichen werden jetzt pixelgenau gerendert.
|
||||
– Die Verwendung eines IME innerhalb des Terminals wurde erheblich verbessert.
|
||||
– Die Farbschemas in Ihrer JSON-Datei sind jetzt viel einfacher.
|
||||
– Eine Reihe von Fehlern im Zusammenhang mit der URL-Verarbeitung, Zeilen mit doppelter Breite, Zeilenumbruch und mehr wurden behoben.
|
||||
|
||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,6 +56,13 @@ This is an open source project and we welcome community participation. To partic
|
||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__} App Release Note" -->Version __VERSION_NUMBER__
|
||||
|
||||
- Terminal will now remember the contents of the window when you use session restoration.
|
||||
- You can now use multiple fonts at the same time.
|
||||
- Box-drawing characters are now rendered with pixel perfection.
|
||||
- The experience of using an IME inside Terminal has been significantly improved.
|
||||
- The color schemes inside your JSON file will now be much simpler.
|
||||
- A number of bugs around URL handling, double-width rows, line wrapping, and more have been fixed.
|
||||
|
||||
Please see our GitHub releases page for additional details.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
|
||||
@@ -56,7 +56,14 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
||||
<ReleaseNotes>
|
||||
Versión __VERSION_NUMBER__
|
||||
|
||||
Para más información, consulte nuestra página de versiones de GitHub.
|
||||
- Terminal recordará ahora el contenido de la ventana cuando use la restauración de la sesión.
|
||||
- Ahora puede usar varias fuentes al mismo tiempo.
|
||||
- Los caracteres que dibujan recuadros ahora se representan con precisión de píxel.
|
||||
- Se ha mejorado significativamente la experiencia de utilizar un IME dentro de Terminal.
|
||||
- Las combinaciones de colores dentro del archivo JSON ahora serán mucho más sencillas.
|
||||
- Se han corregido varios errores relacionados con el control de direcciones URL, las filas de ancho doble, el ajuste de líneas y mucho más.
|
||||
|
||||
Consulte la página de versiones de GitHub para más información.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@ Il s’agit d’un projet open source et nous encourageons la participation à l
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
Consultez la page des versions de GitHub pour plus d’informations.
|
||||
- Le terminal mémorisera désormais le contenu de la fenêtre lorsque vous utiliserez la restauration de session.
|
||||
- Vous pouvez désormais utiliser plusieurs polices en même temps.
|
||||
- Les personnages dessinés en boîte sont désormais rendus avec une perfection de pixel.
|
||||
- L'expérience d'utilisation d'un IME dans le Terminal a été considérablement améliorée.
|
||||
- Les schémas de couleurs à l'intérieur de votre fichier JSON seront désormais beaucoup plus simples.
|
||||
- Un certain nombre de bugs concernant la gestion des URL, les lignes à double largeur, le retour à la ligne, etc. ont été corrigés.
|
||||
|
||||
Veuillez consulter notre page de versions GitHub pour plus de détails.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,9 +54,16 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
Versione __VERSION_NUMBER__
|
||||
Versione __VERSION_NUMBER__
|
||||
|
||||
Per ulteriori dettagli, consulta la nostra pagina delle versioni di GitHub.
|
||||
- Il terminale ricorda ora il contenuto della finestra quando si usa il ripristino della sessione.
|
||||
- È ora possibile usare più tipi di carattere contemporaneamente.
|
||||
- I caratteri tracciati vengono ora sottoposti a rendering con pixel di perfezionamento.
|
||||
- L'esperienza di utilizzo di un IME all'interno di Terminale è stata notevolmente migliorata.
|
||||
- Le combinazioni di colori all'interno del file JSON saranno ora molto più semplici.
|
||||
- Sono stati corretti alcuni bug relativi alla gestione degli URL, alle righe a doppia larghezza, al ritorno a capo delle righe e altro ancora.
|
||||
|
||||
Per altri dettagli, vedi la pagina delle versioni di GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
バージョン __VERSION_NUMBER__
|
||||
|
||||
詳細については、GitHub リリースのページをご覧ください。
|
||||
- セッションの復元を使用すると、ターミナルがウィンドウの内容を記憶するようになりました。
|
||||
- 複数のフォントを同時に使用できるようになりました。
|
||||
- ボックス描画文字がピクセル単位の精度でレンダリングされるようになりました。
|
||||
- ターミナル内での IME の使用エクスペリエンスが大幅に改善されました。
|
||||
- JSON ファイル内の配色がはるかにシンプルになりました。
|
||||
- URL 処理、二重幅の行、行の折り返しなどに関するいくつかのバグが修正されました。
|
||||
|
||||
詳細については、GitHub リリース ページをご覧ください。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,6 +56,13 @@
|
||||
<ReleaseNotes>
|
||||
버전 __VERSION_NUMBER__
|
||||
|
||||
- 터미널은 이제 세션 복원을 사용할 때 창의 내용을 기억합니다.
|
||||
- 이제 여러 글꼴을 동시에 사용할 수 있습니다.
|
||||
- 상자 그리기 캐릭터가 이제 픽셀 완성도로 렌더링됩니다.
|
||||
- 터미널 내에서 IME를 사용하는 환경이 크게 개선되었습니다.
|
||||
- 이제 JSON 파일 내의 색 구성표가 훨씬 더 간단해집니다.
|
||||
- URL 처리, 이중 너비 행, 줄 바꿈 등과 관련된 여러 버그가 수정되었습니다.
|
||||
|
||||
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
|
||||
@@ -56,7 +56,14 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
||||
<ReleaseNotes>
|
||||
Versão __VERSION_NUMBER__
|
||||
|
||||
Consulte nossa página de lançamentos do GitHub para obter detalhes adicionais.
|
||||
- O terminal agora se lembra do conteúdo da janela quando você usa a restauração de sessão.
|
||||
- Agora você pode usar várias fontes ao mesmo tempo.
|
||||
- Os caracteres da caixa de desenho agora são renderizados com a perfeição de pixels.
|
||||
- A experiência de usar uma IME dentro do Terminal foi significativamente aprimorada.
|
||||
- Os esquemas de cores dentro do seu arquivo JSON agora estão muito mais simples.
|
||||
- Foram corrigidos vários bugs envolvendo o tratamento de URLs, linhas de largura dupla, quebra de linha automática e muito mais.
|
||||
|
||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
Рļєάśé ѕέę όüґ ĢίŧĦŭв řęļзąѕєš рαġè ƒőŗ äđδĭτíθņâℓ đέтαιľś. !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Версия __VERSION_NUMBER__
|
||||
|
||||
Дополнительные сведения см. на странице «Выпуски GitHub».
|
||||
– Терминал теперь будет запоминать содержимое окна при восстановлении сеанса.
|
||||
– Теперь вы можете использовать несколько шрифтов одновременно.
|
||||
– Символы псевдографики теперь отрисовываются с пиксельной точностью.
|
||||
– Значительно улучшена возможность использования IME внутри Терминала.
|
||||
– Цветовые схемы в JSON-файле теперь будут намного проще.
|
||||
– Исправлено несколько ошибок в обработке URL-адресов, строках двойной ширины, переносе строк и т. д.
|
||||
|
||||
Дополнительные сведения см. на странице выпусков GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,7 +54,14 @@
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- 现在,使用会话还原时,终端将记住窗口的内容。
|
||||
- 现在可以同时使用多种字体。
|
||||
- 现在以像素为单位呈现框绘图字符。
|
||||
- 在终端内使用输入法的体验已得到显著提升。
|
||||
- JSON 文件中的配色方案现在要简单得多。
|
||||
- 已修复有关 URL 处理、双倍行宽、换行等大量 bug。
|
||||
|
||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
|
||||
如需詳細資訊,請參閱我們的 GitHub 版本頁面。
|
||||
- 當您使用工作階段還原時,終端機現在會記住視窗的內容。
|
||||
- 現在您可以同時使用多個字型。
|
||||
- 製表格圖字元現在會以完美像素模式呈現。
|
||||
- 在終端機內使用 IME 的體驗已大幅改善。
|
||||
- JSON 檔案內的色彩配置現在將變得更簡單了。
|
||||
- 已修正一些 URL 處理、雙寬度列、換行等相關錯誤。
|
||||
|
||||
如需更多詳細資訊,請參閱我們的 GitHub 發行頁面。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="MUXCustomBuildTasks" version="1.0.48" targetFramework="native" />
|
||||
<package id="Microsoft.Taef" version="10.60.210621002" targetFramework="native" />
|
||||
<package id="Microsoft.Taef" version="10.93.240607003" targetFramework="native" />
|
||||
<package id="Microsoft.Internal.PGO-Helpers.Cpp" version="0.2.34" targetFramework="native" />
|
||||
<package id="Microsoft.Debugging.Tools.PdbStr" version="20220617.1556.0" targetFramework="native" />
|
||||
<package id="Microsoft.Debugging.Tools.SrcTool" version="20220617.1556.0" targetFramework="native" />
|
||||
|
||||
@@ -47,26 +47,46 @@ parameters:
|
||||
- arm64
|
||||
|
||||
stages:
|
||||
- ${{ if eq(parameters.auditMode, true) }}:
|
||||
- stage: Audit_x64
|
||||
displayName: Audit Mode
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: ./templates-v2/job-build-project.yml
|
||||
parameters:
|
||||
pool:
|
||||
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
|
||||
name: SHINE-INT-L
|
||||
${{ else }}:
|
||||
name: SHINE-OSS-L
|
||||
buildPlatforms: [x64]
|
||||
buildConfigurations: [AuditMode]
|
||||
buildEverything: true
|
||||
keepAllExpensiveBuildOutputs: false
|
||||
|
||||
- stage: CodeHealth
|
||||
displayName: Code Health
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: ./templates-v2/job-check-code-format.yml
|
||||
|
||||
- ${{ each platform in parameters.buildPlatforms }}:
|
||||
- stage: Build_${{ platform }}
|
||||
displayName: Build ${{ platform }}
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- job: Build
|
||||
pool:
|
||||
name: SHINE-OSS-L
|
||||
strategy:
|
||||
matrix:
|
||||
Release_Any CPU:
|
||||
FooBar: z
|
||||
Debug_x86:
|
||||
FooBar: y
|
||||
Release_x64:
|
||||
FooBar: x
|
||||
variables:
|
||||
JobOutputArtifactName: foo-1
|
||||
steps:
|
||||
- template: ./templates-v2/steps-set-artifact-name.yml
|
||||
- template: ./templates-v2/job-build-project.yml
|
||||
parameters:
|
||||
pool:
|
||||
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
|
||||
name: SHINE-INT-L
|
||||
${{ else }}:
|
||||
name: SHINE-OSS-L
|
||||
buildPlatforms:
|
||||
- ${{ platform }}
|
||||
buildConfigurations: [Release]
|
||||
buildEverything: true
|
||||
keepAllExpensiveBuildOutputs: false
|
||||
|
||||
- ${{ if eq(parameters.runTests, true) }}:
|
||||
- stage: Test_${{ platform }}
|
||||
@@ -75,11 +95,8 @@ stages:
|
||||
- Build_${{ platform }}
|
||||
condition: succeeded()
|
||||
jobs:
|
||||
- job: Foo
|
||||
pool:
|
||||
name: SHINE-OSS-L
|
||||
variables:
|
||||
deps: $[convertToJson(stageDependencies)]
|
||||
steps:
|
||||
- pwsh: |-
|
||||
Write-Host "$(deps)"
|
||||
- template: ./templates-v2/job-test-project.yml
|
||||
parameters:
|
||||
platform: ${{ platform }}
|
||||
# The tests might be run more than once; log one artifact per attempt.
|
||||
outputArtifactStem: -$(System.JobAttempt)
|
||||
|
||||
@@ -28,7 +28,7 @@ extends:
|
||||
official: true
|
||||
branding: Canary
|
||||
buildTerminal: true
|
||||
pgoBuildMode: Optimize
|
||||
pgoBuildMode: None # BODGY - OneBranch is on VS 17.10, which is known to be the worst
|
||||
codeSign: true
|
||||
signingIdentity:
|
||||
serviceName: $(SigningServiceName)
|
||||
|
||||
@@ -27,7 +27,7 @@ parameters:
|
||||
- name: pgoBuildMode
|
||||
displayName: "PGO Build Mode"
|
||||
type: string
|
||||
default: Optimize
|
||||
default: None # BODGY - OneBranch is on VS 17.10, which is known to be the worst
|
||||
values:
|
||||
- Optimize
|
||||
- Instrument
|
||||
|
||||
@@ -59,10 +59,7 @@ jobs:
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- template: steps-download-bin-dir-artifact.yml
|
||||
parameters:
|
||||
@@ -146,5 +143,3 @@ jobs:
|
||||
- publish: $(JobOutputDirectory)
|
||||
artifact: $(JobOutputArtifactName)
|
||||
displayName: Publish nupkg
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -159,10 +159,10 @@ jobs:
|
||||
.\build\scripts\Generate-ThirdPartyNotices.ps1 -MarkdownNoticePath .\NOTICE.md -OutputPath .\src\cascadia\CascadiaPackage\NOTICE.html
|
||||
displayName: Generate NOTICE.html from NOTICE.md
|
||||
|
||||
- template: .\steps-restore-nuget.yml
|
||||
|
||||
- template: .\steps-install-vcpkg.yml
|
||||
|
||||
- template: .\steps-restore-nuget.yml
|
||||
|
||||
- pwsh: |-
|
||||
.\build\scripts\Set-LatestVCToolsVersion.ps1
|
||||
displayName: Work around DD-1541167 (VCToolsVersion)
|
||||
@@ -338,5 +338,3 @@ jobs:
|
||||
- publish: $(Terminal.BinDir)
|
||||
artifact: $(JobOutputArtifactName)
|
||||
displayName: Publish All Outputs
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -69,10 +69,9 @@ jobs:
|
||||
fetchTags: false # Tags still result in depth > 1 fetch; we don't need them here
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- template: steps-download-bin-dir-artifact.yml
|
||||
parameters:
|
||||
buildPlatforms: ${{ parameters.buildPlatforms }}
|
||||
@@ -154,5 +153,3 @@ jobs:
|
||||
- publish: $(JobOutputDirectory)
|
||||
artifact: $(JobOutputArtifactName)
|
||||
displayName: Publish msixbundle
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -57,10 +57,7 @@ jobs:
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- template: steps-download-bin-dir-artifact.yml
|
||||
parameters:
|
||||
@@ -131,5 +128,3 @@ jobs:
|
||||
- publish: $(JobOutputDirectory)
|
||||
artifact: $(JobOutputArtifactName)
|
||||
displayName: Publish nupkg
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -26,7 +26,6 @@ jobs:
|
||||
pgoToolsPath: $(Build.SourcesDirectory)\build\PGO
|
||||
nuspecPath: $(pgoToolsPath)\NuSpecs
|
||||
nuspecFilename: PGO.nuspec
|
||||
JobOutputArtifactName: pgo-nupkg-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
@@ -66,11 +65,9 @@ jobs:
|
||||
msbuildArguments: '/t:CreatePGONuGet /p:PGOBuildMode=Instrument /p:PGDPathForAllArch=$(artifactsPath) /p:PGOOutputPath=$(Build.ArtifactStagingDirectory)'
|
||||
|
||||
- publish: $(Build.ArtifactStagingDirectory)
|
||||
artifact: $(JobOutputArtifactName)
|
||||
artifact: pgo-nupkg-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
|
||||
displayName: "Publish Pipeline Artifact"
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
- task: 333b11bd-d341-40d9-afcf-b32d5ce6f23b@2
|
||||
displayName: 'NuGet push'
|
||||
inputs:
|
||||
|
||||
@@ -22,8 +22,6 @@ jobs:
|
||||
pool: ${{ parameters.pool }}
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
displayName: Merge PGO Counts for ${{ parameters.buildConfiguration }}
|
||||
variables:
|
||||
JobOutputArtifactName: pgd-merged-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
|
||||
|
||||
steps:
|
||||
# The environment variable VCToolsInstallDir isn't defined on lab machines, so we need to retrieve it ourselves.
|
||||
@@ -40,7 +38,7 @@ jobs:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download PGO Databases for ${{ platform }}
|
||||
inputs:
|
||||
artifactName: $[stageDependencies.Build_${{parameters.platform}}.Build.outputs['${{parameters.buildConfiguration}}_${{parameters.platform}}.SetArtifactName.ArtifactName']]
|
||||
artifactName: build-${{ platform }}-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
|
||||
itemPattern: '**/*.pgd'
|
||||
downloadPath: '$(Build.SourcesDirectory)/pgd/${{ platform }}/${{ parameters.buildConfiguration }}'
|
||||
- task: DownloadPipelineArtifact@2
|
||||
@@ -73,7 +71,5 @@ jobs:
|
||||
targetFolder: '$(Build.ArtifactStagingDirectory)\out-pgd\${{ platform }}'
|
||||
|
||||
- publish: $(Build.ArtifactStagingDirectory)\out-pgd
|
||||
artifact: $(JobOutputArtifactName)
|
||||
artifact: pgd-merged-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
|
||||
displayName: "Publish merged PGDs"
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -44,10 +44,7 @@ jobs:
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download all PDBs from all prior build phases
|
||||
|
||||
@@ -43,10 +43,7 @@ jobs:
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download all PDBs from all prior build phases
|
||||
|
||||
@@ -12,7 +12,6 @@ jobs:
|
||||
BuildPlatform: ${{ parameters.buildPlatform }}
|
||||
OutputBuildPlatform: ${{ parameters.buildPlatform }}
|
||||
Terminal.BinDir: $(Build.SourcesDirectory)/bin/$(OutputBuildPlatform)/$(BuildConfiguration)
|
||||
JobOutputArtifactName: pgc-intermediates-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
|
||||
pool:
|
||||
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
|
||||
${{ if ne(parameters.buildPlatform, 'ARM64') }}:
|
||||
@@ -35,7 +34,7 @@ jobs:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts
|
||||
inputs:
|
||||
artifactName: $[stageDependencies.Build_${{parameters.buildPlatform}}.Build.outputs['${{parameters.buildConfiguration}}_${{parameters.buildPlatform}}.SetArtifactName.ArtifactName']]
|
||||
artifactName: build-${{ parameters.buildPlatform }}-$(BuildConfiguration)${{ parameters.artifactStem }}
|
||||
downloadPath: $(Terminal.BinDir)
|
||||
|
||||
# The tests expect Terminal to be an unpackaged distribution named terminal-0.0.1.0 (after the dev build version scheme)
|
||||
@@ -80,7 +79,5 @@ jobs:
|
||||
flattenFolders: true
|
||||
|
||||
- publish: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/pgc'
|
||||
artifact: $(JobOutputArtifactName)
|
||||
artifact: pgc-intermediates-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
|
||||
condition: always()
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -38,10 +38,7 @@ jobs:
|
||||
submodules: true
|
||||
persistCredentials: True
|
||||
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: steps-setup-versioning.yml
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download MSIX Bundle Artifact
|
||||
@@ -72,8 +69,6 @@ jobs:
|
||||
artifact: $(JobOutputArtifactName)
|
||||
displayName: 'Publish VPack Manifest to Drop'
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
- task: PkgESFCIBGit@12
|
||||
displayName: 'Submit VPack Manifest to Windows'
|
||||
inputs:
|
||||
|
||||
@@ -16,7 +16,6 @@ jobs:
|
||||
${{ else }}:
|
||||
OutputBuildPlatform: ${{ parameters.platform }}
|
||||
Terminal.BinDir: $(Build.SourcesDirectory)/bin/$(OutputBuildPlatform)/$(BuildConfiguration)
|
||||
JobOutputArtifactName: test-logs-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.outputArtifactStem }}
|
||||
pool:
|
||||
${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
|
||||
${{ if ne(parameters.platform, 'ARM64') }}:
|
||||
@@ -39,7 +38,7 @@ jobs:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts
|
||||
inputs:
|
||||
artifactName: $[stageDependencies.Build_${{parameters.platform}}.Build.outputs['${{parameters.configuration}}_${{parameters.platform}}.SetArtifactName.ArtifactName']]
|
||||
artifactName: build-${{ parameters.platform }}-$(BuildConfiguration)${{ parameters.inputArtifactStem }}
|
||||
downloadPath: $(Terminal.BinDir)
|
||||
|
||||
- task: PowerShell@2
|
||||
@@ -98,7 +97,5 @@ jobs:
|
||||
flattenFolders: true
|
||||
|
||||
- publish: '$(Build.ArtifactStagingDirectory)/$(BuildConfiguration)/$(BuildPlatform)/test-logs'
|
||||
artifact: $(JobOutputArtifactName)
|
||||
artifact: test-logs-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.outputArtifactStem }}
|
||||
condition: always()
|
||||
|
||||
- template: steps-set-artifact-name.yml
|
||||
|
||||
@@ -92,10 +92,7 @@ stages:
|
||||
generateSbom: ${{ parameters.generateSbom }}
|
||||
codeSign: ${{ parameters.codeSign }}
|
||||
beforeBuildSteps: # Right before we build, lay down the universal package and localizations
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: ./build/pipelines/templates-v2/steps-setup-versioning.yml@self
|
||||
|
||||
- task: UniversalPackages@0
|
||||
displayName: Download terminal-internal Universal Package
|
||||
@@ -119,10 +116,7 @@ stages:
|
||||
generateSbom: ${{ parameters.generateSbom }}
|
||||
codeSign: ${{ parameters.codeSign }}
|
||||
beforeBuildSteps:
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: ./build/pipelines/templates-v2/steps-setup-versioning.yml@self
|
||||
# WPF doesn't need the localizations or the universal package, but if it does... put them here.
|
||||
|
||||
- stage: Package
|
||||
|
||||
@@ -106,11 +106,6 @@ extends:
|
||||
- stage: Build
|
||||
displayName: Build
|
||||
dependsOn: []
|
||||
variables:
|
||||
# This was set by the parent build, but we need to override it to select a specific compiler version
|
||||
- template: ./build/pipelines/templates-v2/variables-onebranch-config.yml@self
|
||||
parameters:
|
||||
containerVersion: 1.0.02566.28
|
||||
jobs:
|
||||
- template: ./build/pipelines/templates-v2/job-build-project.yml@self
|
||||
parameters:
|
||||
@@ -135,10 +130,7 @@ extends:
|
||||
codeSign: ${{ parameters.codeSign }}
|
||||
signingIdentity: ${{ parameters.signingIdentity }}
|
||||
beforeBuildSteps: # Right before we build, lay down the universal package and localizations
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: ./build/pipelines/templates-v2/steps-setup-versioning.yml@self
|
||||
|
||||
- task: UniversalPackages@0
|
||||
displayName: Download terminal-internal Universal Package
|
||||
@@ -172,10 +164,7 @@ extends:
|
||||
codeSign: ${{ parameters.codeSign }}
|
||||
signingIdentity: ${{ parameters.signingIdentity }}
|
||||
beforeBuildSteps:
|
||||
- task: PkgESSetupBuild@12
|
||||
displayName: Package ES - Setup Build
|
||||
inputs:
|
||||
disableOutputRedirect: true
|
||||
- template: ./build/pipelines/templates-v2/steps-setup-versioning.yml@self
|
||||
# WPF doesn't need the localizations or the universal package, but if it does... put them here.
|
||||
|
||||
- stage: Package
|
||||
|
||||
@@ -14,7 +14,7 @@ steps:
|
||||
displayName: Download artifacts for ${{ platform }} ${{ configuration }}
|
||||
inputs:
|
||||
# Make sure to download the entire artifact, because it includes the SPDX SBOM
|
||||
artifactName: $[stageDependencies.Build_${{platform}}.Build.outputs['${{configuration}}_${{platform}}.SetArtifactName.ArtifactName']]
|
||||
artifactName: build-${{ platform }}-${{ configuration }}${{ parameters.artifactStem }}
|
||||
# Downloading to the source directory should ensure that the later SBOM generator can see the earlier SBOMs.
|
||||
${{ if eq(platform, 'x86') }}:
|
||||
downloadPath: '$(Build.SourcesDirectory)/bin/Win32/${{ configuration }}'
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
steps:
|
||||
- pwsh: |-
|
||||
echo "##vso[task.setVariable variable=ArtifactName;isOutput=true]$(JobOutputArtifactName)"
|
||||
name: SetArtifactName
|
||||
displayName: Set Artifact Name
|
||||
condition: always()
|
||||
6
build/pipelines/templates-v2/steps-setup-versioning.yml
Normal file
6
build/pipelines/templates-v2/steps-setup-versioning.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
steps:
|
||||
- pwsh: |-
|
||||
nuget install Microsoft.Windows.Terminal.Versioning -OutputDirectory _versioning
|
||||
$VersionRoot = (Get-Item _versioning\Microsoft.Windows.*).FullName
|
||||
& "$VersionRoot\build\Setup.ps1" -ProjectDirectory "$(Build.SourcesDirectory)" -Verbose
|
||||
displayName: Set up versioning via M.W.T.V
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT License. See LICENSE in the project root for license information. -->
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Native-Platform Condition="'$(Platform)' == 'Win32'">x86</Native-Platform>
|
||||
<Native-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</Native-Platform>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="$(WinGetPackageRoot)\lib\Microsoft.Management.Deployment.winmd">
|
||||
<IsWinMDFile>true</IsWinMDFile>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<Target Name="_FixWinGetWinmdPackaging" BeforeTargets="_ComputeAppxPackagePayload">
|
||||
<ItemGroup>
|
||||
<PackagingOutputs Include="$(WinGetPackageRoot)\lib\Microsoft.Management.Deployment.winmd">
|
||||
<OutputGroup>CustomOutputGroupForPackaging</OutputGroup>
|
||||
<ProjectName>$(ProjectName)</ProjectName>
|
||||
<TargetPath>Microsoft.Management.Deployment.winmd</TargetPath>
|
||||
</PackagingOutputs>
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
</Project>
|
||||
@@ -5,7 +5,7 @@
|
||||
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
|
||||
<XesBaseYearForStoreVersion>2024</XesBaseYearForStoreVersion>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>22</VersionMinor>
|
||||
<VersionMinor>23</VersionMinor>
|
||||
<VersionInfoProductName>Windows Terminal</VersionInfoProductName>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -104,6 +104,7 @@ GetConsoleKeyboardLayoutNameW(
|
||||
#define CONSOLE_REGISTRY_DEFAULTFOREGROUND L"DefaultForeground"
|
||||
#define CONSOLE_REGISTRY_DEFAULTBACKGROUND L"DefaultBackground"
|
||||
#define CONSOLE_REGISTRY_TERMINALSCROLLING L"TerminalScrolling"
|
||||
#define CONSOLE_REGISTRY_ANSWERBACKMESSAGE L"AnswerbackMessage"
|
||||
// end V2 console settings
|
||||
|
||||
/*
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
<packages>
|
||||
<!-- Native packages -->
|
||||
<package id="Microsoft.Internal.PGO-Helpers.Cpp" version="0.2.34" targetFramework="native" />
|
||||
<package id="Microsoft.Taef" version="10.60.210621002" targetFramework="native" />
|
||||
<package id="Microsoft.Taef" version="10.93.240607003" targetFramework="native" />
|
||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.230207.1" targetFramework="native" />
|
||||
<package id="Microsoft.Internal.Windows.Terminal.ThemeHelpers" version="0.7.230706001" targetFramework="native" />
|
||||
<package id="Microsoft.VisualStudio.Setup.Configuration.Native" version="2.3.2262" targetFramework="native" developmentDependency="true" />
|
||||
<package id="Microsoft.UI.Xaml" version="2.8.4" targetFramework="native" />
|
||||
<package id="Microsoft.Web.WebView2" version="1.0.1661.34" targetFramework="native" />
|
||||
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.240122.1" targetFramework="native" developmentDependency="true" />
|
||||
<package id="Microsoft.WindowsPackageManager.ComInterop" version="1.8.1911" targetFramework="native" developmentDependency="true" />
|
||||
|
||||
<!-- Managed packages -->
|
||||
<package id="Appium.WebDriver" version="3.0.0.2" targetFramework="net45" />
|
||||
@@ -19,7 +20,7 @@
|
||||
<package id="Selenium.WebDriver" version="3.5.0" targetFramework="net45" />
|
||||
|
||||
<!-- MSBuildCache -->
|
||||
<package id="Microsoft.MSBuildCache.AzurePipelines" version="0.1.273-preview" />
|
||||
<package id="Microsoft.MSBuildCache.Local" version="0.1.273-preview" />
|
||||
<package id="Microsoft.MSBuildCache.SharedCompilation" version="0.1.273-preview" />
|
||||
<package id="Microsoft.MSBuildCache.AzurePipelines" version="0.1.283-preview" />
|
||||
<package id="Microsoft.MSBuildCache.Local" version="0.1.283-preview" />
|
||||
<package id="Microsoft.MSBuildCache.SharedCompilation" version="0.1.283-preview" />
|
||||
</packages>
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "This will override the profile's `elevate` setting."
|
||||
},
|
||||
"reloadEnvironmentVariables": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "When set to true, a new environment block will be generated when creating a new session. Otherwise, the session will inherit the variables the Terminal was started with."
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
@@ -2850,7 +2855,7 @@
|
||||
}
|
||||
},
|
||||
"autoMarkPrompts": {
|
||||
"default": false,
|
||||
"default": true,
|
||||
"description": "When set to true, prompts will automatically be marked.",
|
||||
"type": "boolean"
|
||||
},
|
||||
@@ -3032,6 +3037,10 @@
|
||||
"description": "By default Windows treats Ctrl+Alt as an alias for AltGr. When altGrAliasing is set to false, this behavior will be disabled.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"answerbackMessage": {
|
||||
"description": "The response that is sent when an ENQ control character is received.",
|
||||
"type": "string"
|
||||
},
|
||||
"source": {
|
||||
"description": "Stores the name of the profile generator that originated this profile.",
|
||||
"type": [
|
||||
|
||||
840
doc/specs/#13000 - In-process ConPTY.md
Normal file
840
doc/specs/#13000 - In-process ConPTY.md
Normal file
@@ -0,0 +1,840 @@
|
||||
---
|
||||
author: Leonard Hecker @lhecker
|
||||
created on: 2024-06-07
|
||||
last updated: 2024-06-07
|
||||
issue id: 13000
|
||||
---
|
||||
|
||||
# In-process ConPTY
|
||||
|
||||
## tl;dr
|
||||
|
||||
**Why?**
|
||||
* Out-of-process leads to out-of-sync issues.
|
||||
* Not all Console APIs have a VT equivalent.
|
||||
* Time consuming maintenance work due to poor encapsulation inside conhost.
|
||||
|
||||
**How?**
|
||||
1. Remove `VtEngine` and translate Console API calls directly to VT.
|
||||
2. Move all Console API related code from the `Host` to the `Server` project.
|
||||
Narrow the `IApiRoutines` interface down to its essentials.
|
||||
Replace relevant singletons with instances.
|
||||
3. Make `Server` a standalone library with `IApiRoutines` as its primary callback interface.
|
||||
Integrate the library in Windows Terminal.
|
||||
4. (Long term goal:) Ship the `Server` library as part of Windows. Build conhost itself on top of it.
|
||||
|
||||
## Why?
|
||||
|
||||
**Before:**
|
||||
|
||||
```mermaid
|
||||
%%{ init: { "flowchart": { "curve": "monotoneX" } } }%%
|
||||
flowchart TD
|
||||
subgraph conhost
|
||||
direction LR
|
||||
|
||||
subgraph Server
|
||||
server_io[Console API calls]
|
||||
end
|
||||
|
||||
subgraph ConPTY
|
||||
VtIo
|
||||
VtEngine
|
||||
ConPTY_output[ConPTY Output]
|
||||
end
|
||||
|
||||
conhost_parser[VT parser]
|
||||
conhost_buffer[Text Buffer]
|
||||
conhost_renderer[Render Thread]
|
||||
conhost_atlas[Text Renderer]
|
||||
|
||||
server_io-->conhost_parser
|
||||
server_io--scroll, clear, etc.-->VtIo
|
||||
conhost_parser--resize, focus-->VtIo
|
||||
VtIo--scroll, clear, etc.-->VtEngine
|
||||
conhost_parser--unknown escape sequences-->VtEngine
|
||||
conhost_buffer--manual flushing-->VtEngine
|
||||
conhost_renderer-->VtEngine
|
||||
VtEngine-->ConPTY_output
|
||||
conhost_buffer--dirty rects-->conhost_renderer
|
||||
conhost_parser--dirty rects-->conhost_renderer
|
||||
conhost_parser--plain text-->conhost_buffer
|
||||
conhost_renderer-->conhost_atlas
|
||||
conhost_buffer--ReadBuffer-->server_io
|
||||
end
|
||||
|
||||
subgraph wt[Windows Terminal]
|
||||
direction LR
|
||||
|
||||
input[ConPTY Input]
|
||||
parser[VT parser]
|
||||
buffer[Text Buffer]
|
||||
renderer[Render Thread]
|
||||
atlas[Text Renderer]
|
||||
|
||||
input-->parser
|
||||
parser-->buffer
|
||||
buffer-->renderer
|
||||
renderer-->atlas
|
||||
parser-->renderer
|
||||
end
|
||||
|
||||
conhost--ConPTY's text pipe across processes-->wt
|
||||
```
|
||||
|
||||
**After:**
|
||||
|
||||
```mermaid
|
||||
%%{ init: { "flowchart": { "curve": "monotoneX" } } }%%
|
||||
flowchart LR
|
||||
subgraph ConPTY_lib["ConPTY (static library)"]
|
||||
server_io[Console API calls]
|
||||
ConPTY_Translation[VT Translation]
|
||||
|
||||
server_io<-->ConPTY_Translation
|
||||
end
|
||||
|
||||
subgraph ConPTY["ConPTY (dynamic library)"]
|
||||
ConPTY_impl[IApiRoutines impl]
|
||||
ConPTY_parser[VT parser]
|
||||
ConPTY_buffer[Text Buffer]
|
||||
ConPTY_output[ConPTY Output]
|
||||
|
||||
ConPTY_Translation<-->ConPTY_impl
|
||||
ConPTY_impl-->ConPTY_parser
|
||||
ConPTY_parser-->ConPTY_buffer
|
||||
ConPTY_buffer--ReadBuffer-->ConPTY_impl
|
||||
ConPTY_impl------>ConPTY_output
|
||||
end
|
||||
|
||||
subgraph conhost
|
||||
conhost_impl[IApiRoutines impl]
|
||||
conhost_parser[VT parser]
|
||||
conhost_buffer[Text Buffer]
|
||||
conhost_renderer[Render Thread]
|
||||
conhost_atlas[Text Renderer]
|
||||
|
||||
ConPTY_Translation<-->conhost_impl
|
||||
conhost_impl-->conhost_parser
|
||||
conhost_parser-->conhost_buffer
|
||||
conhost_buffer--->conhost_renderer
|
||||
conhost_buffer--ReadBuffer-->conhost_impl
|
||||
conhost_renderer-->conhost_atlas
|
||||
end
|
||||
|
||||
subgraph wt[Windows Terminal]
|
||||
impl[IApiRoutines impl]
|
||||
parser[VT parser]
|
||||
buffer[Text Buffer]
|
||||
renderer[Render Thread]
|
||||
atlas[Text Renderer]
|
||||
|
||||
ConPTY_Translation<-->impl
|
||||
impl-->parser
|
||||
parser-->buffer
|
||||
buffer--->renderer
|
||||
buffer--ReadBuffer-->impl
|
||||
renderer-->atlas
|
||||
end
|
||||
```
|
||||
|
||||
To extend on the [tl;dr](#tldr):
|
||||
* ConPTY runs outside the hosting terminal which leads to an unsolvable issue: The buffer contents between ConPTY and the terminal can go out of sync.
|
||||
* The terminal and ConPTY may implement escape sequences differently.
|
||||
* ...may implement text processing differently.
|
||||
* ...may implement text reflow (resize) differently.
|
||||
* Resizing the terminal and ConPTY is asynchronous and there may be concurrent text output.
|
||||
* ...and it may uncover text from the scrollback, which ConPTY doesn't know about.
|
||||
* Some Console API methods cannot be represented via escape sequences and so ConPTY cannot produce them either.
|
||||
The most basic example of this is the lack of LVB gridlines.
|
||||
* The above suggested new architecture represents a significant simplification with no loss in features.
|
||||
* ConPTY has fulfilled our needs a thousand times over, but as it's layered on top of conhost it has resulted in software decay.
|
||||
The layer boundary has blurred over the years resulting in debugging and maintenance difficulties.
|
||||
Lastly, its performance is insufficient and has been subject to much debate.
|
||||
It's on us now to pay our debt and clean up the architecture so that ConPTY, conhost, and Windows Terminal can be built on top of it.
|
||||
|
||||
Considerations:
|
||||
* A named `MUTEX` can theoretically solve parts of the out-of-sync issue, because it could be used to synchronize buffer reflow.
|
||||
However, this requires the lock to be acquired on every API call, on top of the regular console lock, which raises ABBA deadlock concerns.
|
||||
Making this setup not just hopefully but also provably robust, is likely to be very difficult.
|
||||
It also doesn't solve any of the other listed problems.
|
||||
|
||||
## Goal 1: Remove VtEngine
|
||||
|
||||
### Goal
|
||||
|
||||
```mermaid
|
||||
%%{ init: { "flowchart": { "curve": "monotoneX" } } }%%
|
||||
flowchart TD
|
||||
subgraph conhost
|
||||
direction LR
|
||||
|
||||
subgraph Server
|
||||
server_io[Console API calls]
|
||||
end
|
||||
|
||||
subgraph ConPTY
|
||||
VtIo
|
||||
VtEngine
|
||||
ConPTY_output[ConPTY Output]
|
||||
end
|
||||
|
||||
conhost_parser[VT parser]
|
||||
conhost_buffer[Text Buffer]
|
||||
conhost_renderer[Render Thread]
|
||||
conhost_atlas[Text Renderer]
|
||||
|
||||
server_io-->conhost_parser
|
||||
server_io--VT translation-->VtIo
|
||||
server_io-->VtIo
|
||||
conhost_parser-->VtIo
|
||||
VtIo-->VtEngine
|
||||
conhost_parser-->VtEngine
|
||||
conhost_buffer-->VtEngine
|
||||
conhost_renderer-->VtEngine
|
||||
VtIo-->ConPTY_output
|
||||
VtEngine-->ConPTY_output
|
||||
conhost_buffer--dirty rects-->conhost_renderer
|
||||
conhost_parser-->conhost_renderer
|
||||
conhost_parser--plain text-->conhost_buffer
|
||||
conhost_renderer-->conhost_atlas
|
||||
conhost_buffer--ReadBuffer-->server_io
|
||||
end
|
||||
|
||||
subgraph wt[Windows Terminal]
|
||||
direction LR
|
||||
|
||||
input[ConPTY Input]
|
||||
parser[VT parser]
|
||||
buffer[Text Buffer]
|
||||
renderer[Render Thread]
|
||||
atlas[Text Renderer]
|
||||
|
||||
input-->parser
|
||||
parser-->buffer
|
||||
buffer-->renderer
|
||||
renderer-->atlas
|
||||
parser-->renderer
|
||||
end
|
||||
|
||||
conhost--ConPTY's text pipe across processes-->wt
|
||||
|
||||
linkStyle 2,3,4,5,6,7,9,11 opacity:0.2
|
||||
style VtEngine opacity:0.2
|
||||
```
|
||||
|
||||
### Goals
|
||||
|
||||
* Remove VtEngine
|
||||
* Remove `--vtmode`
|
||||
* Remove `--resizeQuirk`
|
||||
* Add buffering to `VtIo` and hook it up to the output pipe
|
||||
* Implement direct VT translations for all relevant Console APIs
|
||||
|
||||
### Discussion
|
||||
|
||||
The idea is that we can translate Console API calls directly to VT at least as well as the current VtEngine setup can.
|
||||
For instance, a call to `SetConsoleCursorPosition` clearly translates directly to a `CUP` escape sequence.
|
||||
Effectively, instead of translating output asynchronously in the renderer thread, we'll do it synchronously right during the Console API call.
|
||||
|
||||
Apart from the Console APIs, the "cooked read" implementation, which handles our builtin "readline"-like text editor, will need to receive some larger changes as well.
|
||||
Its popups use `ReadConsoleOutput` and `WriteConsoleOutput` to backup and restore the affected rectangle.
|
||||
It also directly interfaces with the backing text buffer and its translation to VT relies on the existence of VtEngine.
|
||||
This results in all of the same issues that were previously outlined.
|
||||
In order to solve this, the popups need to be rewritten to use escape sequences so that they can be directly passed to the hosting terminal.
|
||||
They should also always be below the current prompt line so that we don't need to perform a potentially lossy backup/restore operation.
|
||||
|
||||
The `--vtmode xterm-ascii` switch exists for the telnet client as it only supports ASCII as per RFC854 section "THE NVT PRINTER AND KEYBOARD".
|
||||
However, telnet is the only user of this flag and it's trivial to do there (for instance by stripping high codepoints in `WriteOutputToClient` in `telnet/console.cpp`), so there's no reason for us to keep this logic in the new code.
|
||||
|
||||
This change will result in a significant reduction in complexity of our architecture.
|
||||
VT input from the shell or other clients will be given 1:1 to the hosting terminal, which will resolve our ordering and buffering issues.
|
||||
|
||||
## Goal 2: Move Console API implementations to Server
|
||||
|
||||
### Goal
|
||||
|
||||
```mermaid
|
||||
%%{ init: { "flowchart": { "curve": "monotoneX" } } }%%
|
||||
flowchart TD
|
||||
subgraph conhost
|
||||
direction LR
|
||||
|
||||
subgraph Server[Server w/ ConPTY]
|
||||
server_io[Console API calls]
|
||||
ConPTY_Translation[VT Translation]
|
||||
|
||||
server_io<-->ConPTY_Translation
|
||||
end
|
||||
|
||||
subgraph ConPTY
|
||||
VtIo
|
||||
ConPTY_output[ConPTY Output]
|
||||
|
||||
VtIo-->ConPTY_output
|
||||
end
|
||||
|
||||
conhost_impl[IApiRoutines impl]
|
||||
conhost_parser[VT parser]
|
||||
conhost_buffer[Text Buffer]
|
||||
conhost_renderer[Render Thread]
|
||||
conhost_atlas[Text Renderer]
|
||||
output_new[ConPTY Output]
|
||||
|
||||
ConPTY_Translation<-->conhost_impl
|
||||
conhost_impl-->conhost_parser
|
||||
conhost_impl----->output_new
|
||||
server_io---->VtIo
|
||||
server_io-->conhost_parser
|
||||
conhost_parser-->conhost_buffer
|
||||
conhost_parser-->conhost_renderer
|
||||
conhost_buffer-->conhost_renderer
|
||||
conhost_buffer--ReadBuffer-->conhost_impl
|
||||
conhost_buffer-->server_io
|
||||
conhost_renderer-->conhost_atlas
|
||||
end
|
||||
|
||||
subgraph wt[Windows Terminal]
|
||||
direction LR
|
||||
|
||||
input[ConPTY Input]
|
||||
parser[VT parser]
|
||||
buffer[Text Buffer]
|
||||
renderer[Render Thread]
|
||||
atlas[Text Renderer]
|
||||
|
||||
input-->parser
|
||||
parser-->buffer
|
||||
buffer-->renderer
|
||||
renderer-->atlas
|
||||
parser-->renderer
|
||||
end
|
||||
|
||||
conhost--ConPTY's text pipe across processes-->wt
|
||||
|
||||
linkStyle 1,5,6,11 opacity:0.2
|
||||
style ConPTY opacity:0.2
|
||||
style VtIo opacity:0.2
|
||||
style ConPTY_output opacity:0.2
|
||||
```
|
||||
|
||||
### Goals
|
||||
|
||||
* Move the API implementation from the `Host` to the `Server` project.
|
||||
* Narrow down the `IApiRoutines` interface to its essentials.
|
||||
* Replace affected singletons with regular class instances.
|
||||
|
||||
### Discussion
|
||||
|
||||
The basic idea is that instead of having 3 arrows going in and out of the Server component, we got exactly 1.
|
||||
This makes the console server and its VT translation a reusable component, which we need so that we can solve the out-of-sync issues by integrating it into Windows Terminal.
|
||||
To make the Server API convenient to use, the interface needs to be narrowed down to as few methods as possible. This interface is currently called `IApiRoutines`.
|
||||
|
||||
### API Design
|
||||
|
||||
Design goals:
|
||||
* Low overhead<br>
|
||||
The API should never be the reason why the terminal is slow.
|
||||
Among others, the design includes both UTF8 and UTF16 functions, as both encodings are common on Windows and the server component should not make assumptions which one the terminal prefers.
|
||||
* Easy to use<br>
|
||||
The Console API is unfortunately quite powerful.
|
||||
In order to make implementing the callback interface still reasonably easy, the API should have as few methods as are needed.
|
||||
If a complex Console API call can be expressed as a series of simpler ones, and if no other performance expectations exist, it should be expressed via the simpler ones.
|
||||
* Works even if only partially implemented<br>
|
||||
Example: `CreateConsoleScreenBuffer` is seldomly used, but its existence adds significant complexity to the callback API design and potential implementations.
|
||||
A terminal should either be able to return `E_NOTIMPL` and we provide a fallback, or we provide guidance for how reasonable fallbacks can be implemented (e.g. by using the xterm alt buffer in this example).
|
||||
|
||||
> [!IMPORTANT]
|
||||
> The following API design is a rough draft just to convey the general idea.
|
||||
> It does not represent a complete, finished design.
|
||||
> This document will be updated once work on the API begins and the actual API requirements become clearer.
|
||||
|
||||
```cs
|
||||
// The Console API is built around a freely addressable frame buffer. It allows you to
|
||||
// address any part of the buffer, even those outside of what's considered the "viewport":
|
||||
//
|
||||
// ┌──────────────────┐
|
||||
// │y=-3 │
|
||||
// │ │ ╮
|
||||
// │ │ │
|
||||
// ╭ ├──────────────────┤ ├── VT scrollback (partially addressed)
|
||||
// │ │y=0 │ │
|
||||
// │ │ │ ╮ ╯
|
||||
// │ │ │ │
|
||||
// Console Buffer ──┤ ├──────────────────┤ ├──── VT Viewport (top y = 1)
|
||||
// │ │y=3 │ │
|
||||
// │ │ │ ╯
|
||||
// │ │ │
|
||||
// ╰ └──────────────────┘
|
||||
//
|
||||
// The good news is that nothing prevents you from giving the Console Buffer the exact
|
||||
// same size as the VT Viewport and for modern terminals doing so is recommended.
|
||||
// That way, coordinates are viewport-relative and content below/above the viewport is never addressed:
|
||||
//
|
||||
// ┌──────────────────┐ ╮
|
||||
// │y=-3 │ │
|
||||
// │ │ ├── VT scrollback (unused)
|
||||
// │ │ │
|
||||
// ╭ ├──────────────────┤ ╮ ╯
|
||||
// │ │y=0 │ │
|
||||
// Console Buffer ──┤ │ │ ├──── VT Viewport
|
||||
// │ │ │ │
|
||||
// ╰ └──────────────────┘ ╯
|
||||
//
|
||||
// Coordinates are 0-indexed. Note that while INT32 coordinates are used by this API, coordinates below
|
||||
// 0 and above 65535 are generally invalid as the Console ABI currently uses unsigned 16-Bit integers.
|
||||
|
||||
struct CONSRV_POINT_I32 {
|
||||
INT32 x;
|
||||
INT32 y;
|
||||
};
|
||||
|
||||
struct CONSRV_POINT_F32 {
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
// These flags are also defined via Windows.h.
|
||||
#if 0
|
||||
// These flags are equivalent to the classic 4-bit indexed colors in VT via SGR.
|
||||
// However, the position of the blue and red bits are swapped.
|
||||
#define FOREGROUND_BLUE 0x0001 // Text color contains blue.
|
||||
#define FOREGROUND_GREEN 0x0002 // Text color contains green.
|
||||
#define FOREGROUND_RED 0x0004 // Text color contains red.
|
||||
#define FOREGROUND_INTENSITY 0x0008 // Text color is intensified.
|
||||
#define BACKGROUND_BLUE 0x0010 // Background color contains blue.
|
||||
#define BACKGROUND_GREEN 0x0020 // Background color contains green.
|
||||
#define BACKGROUND_RED 0x0040 // Background color contains red.
|
||||
#define BACKGROUND_INTENSITY 0x0080 // Background color is intensified.
|
||||
|
||||
// These two bits are used to represent wide glyphs.
|
||||
#define COMMON_LVB_LEADING_BYTE 0x0100 // Leading byte.
|
||||
#define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing byte.
|
||||
|
||||
// This bit is equivalent to the "CSI 7 m" reverse video escape sequence.
|
||||
#define COMMON_LVB_REVERSE_VIDEO 0x4000 // Reverse foreground and background attribute.
|
||||
|
||||
// NOTE: These flags have no equivalent in VT. COMMON_LVB_UNDERSCORE in particular is not the same as a
|
||||
// "CSI 4 m" underline in VT, despite the name. They're used to give a cell border (= grid) lines.
|
||||
#define COMMON_LVB_GRID_HORIZONTAL 0x0400 // Top horizontal.
|
||||
#define COMMON_LVB_GRID_LVERTICAL 0x0800 // Left vertical.
|
||||
#define COMMON_LVB_GRID_RVERTICAL 0x1000 // Right vertical.
|
||||
#define COMMON_LVB_UNDERSCORE 0x8000 // Underscore.
|
||||
#endif
|
||||
|
||||
// This struct is binary compatible to the CHAR_INFO struct from the Windows API and functionally equivalent.
|
||||
//
|
||||
// The following rules MUST be followed:
|
||||
// * Each instance represents 1 column in the terminal.
|
||||
// * Any cells that aren't representable with a single UCS-2 character, or are wider than 2 columns,
|
||||
// must be replaced with U+FFFD. Grapheme clusters, surrogate pairs, and similar, are not allowed.
|
||||
// Keep in mind that U+FFFD is a narrow character. It does not get the wide wide-glyph treatment below.
|
||||
// * Colors that cannot be represented via the `attributes` flags can be replaced with an approximation.
|
||||
// Alternatively, `FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED` can be used (no `BACKGROUND` bit set).
|
||||
// * If a wide glyph (2 columns wide) is encountered, the following applies:
|
||||
// * Create 2 consecutive CONSRV_CHAR_INFO instances (as per the first rule).
|
||||
// * Repeat the same `character` in both instances, even if it's U+FFFD.
|
||||
// * Assign the first instance an `attributes` flag of `COMMON_LVB_LEADING_BYTE`
|
||||
// and the second one `COMMON_LVB_TRAILING_BYTE`.
|
||||
// * BUT if the request for a CONSRV_CHAR_INFO only partially intersects a wide glyph, replace the character
|
||||
// (and only the character) with U+0020 whitespace. This also means that `COMMON_LVB_LEADING/TRAILING_BYTE`
|
||||
// should not be set, because the returned character isn't wide anymore. An example:
|
||||
// If you have a red "猫" on top of a blue background in the buffer and a single `CONSRV_CHAR_INFO` is requested
|
||||
// for the left half of the glyph, then you should set `character` to whitespace and `attributes` to
|
||||
// `FOREGROUND_RED | BACKGROUND_BLUE`. Debug builds of ConPTY will assert that you do this.
|
||||
//
|
||||
// For more documentation about the `attributes` flags, see the constants defined above.
|
||||
struct CONSRV_CHAR_INFO {
|
||||
wchar_t character;
|
||||
UINT16 attributes;
|
||||
};
|
||||
|
||||
struct CONSRV_UTF8_STRING {
|
||||
[size_is(length)] const char* data;
|
||||
DWORD length;
|
||||
};
|
||||
|
||||
struct CONSRV_UTF16_STRING {
|
||||
[size_is(length)] const wchar_t* data;
|
||||
DWORD length;
|
||||
};
|
||||
|
||||
// NOTE: At the time of writing the required fields are not fully known.
|
||||
// NOTE: boolean is 8 Bits large.
|
||||
struct CONSRV_INFO {
|
||||
// NOTE: msys2 relies on the HWND value to uniquely identify terminal sessions.
|
||||
// If we were to hand out the multiplexed terminal window HWND to msys2, it will break. Either we need to
|
||||
// create fake windows inside conhost (very bad & buggy) or break msys2 intentionally (also very bad).
|
||||
HWND window;
|
||||
CONSRV_UTF16_STRING originalWindowTitle;
|
||||
CONSRV_UTF16_STRING windowTitle;
|
||||
|
||||
CONSRV_POINT_I32 bufferSizeInCells;
|
||||
CONSRV_POINT_I32 cursorPositionInCells;
|
||||
CONSRV_POINT_I32 viewPositionInCells;
|
||||
CONSRV_POINT_I32 viewSizeInCells;
|
||||
CONSRV_POINT_F32 cellSizeInDIP;
|
||||
COLORREF colorTable[16];
|
||||
|
||||
CONSRV_POINT_I32 selectionStart;
|
||||
CONSRV_POINT_I32 selectionEnd;
|
||||
boolean selectionActive;
|
||||
boolean selectionRectangular;
|
||||
boolean selectionMouseDown;
|
||||
|
||||
float cursorHeight;
|
||||
boolean cursorHidden;
|
||||
};
|
||||
|
||||
// Any item that has changed relative to the current CONSRV_INFO will be set to a non-null pointer.
|
||||
// In other words, members that are null represent those that remain unchanged.
|
||||
//
|
||||
// If the request cannot be supported return E_INVALIDARG. For instance, you may choose to
|
||||
// do so if you receive a `bufferSizeInCells` change while the xterm alt buffer is active.
|
||||
//
|
||||
// NOTE: At the time of writing the required fields are not fully known.
|
||||
struct CONSRV_INFO_CHANGE {
|
||||
CONSRV_POINT_I32* bufferSizeInCells;
|
||||
CONSRV_POINT_I32* cursorPositionInCells;
|
||||
CONSRV_POINT_I32* viewPositionInCells;
|
||||
CONSRV_POINT_I32* viewSizeInCells;
|
||||
COLORREF* colorTable; // The referenced array is always 16 items large.
|
||||
|
||||
float* cursorHeight;
|
||||
boolean* cursorHidden;
|
||||
|
||||
CONSRV_UTF16_STRING* fontName;
|
||||
UINT32* fontFamily;
|
||||
UINT32* fontWeight;
|
||||
CONSRV_POINT_I32* fontSize;
|
||||
};
|
||||
|
||||
interface IConsoleServer : IUnknown {
|
||||
// TODO: This interface is incomplete. Among others, a way to launch new application into the server is missing.
|
||||
|
||||
// ConPTY manages stdin as a ring buffer for you. When the terminal has focus, you simply need to write your input.
|
||||
// Keyboard input MUST be written via `WriteInputRecords`. The other 2 functions DO NOT parse any VT sequences.
|
||||
// They're instead meant either for VT responses (DECRPM, etc.) and for dumping plain text (clipboard, etc.).
|
||||
void WriteInputRecords([in] DWORD count, [in, length_is(count)] const INPUT_RECORD* records);
|
||||
void WriteInputUTF8([in] CONSRV_UTF8_STRING text);
|
||||
void WriteInputUTF16([in] CONSRV_UTF16_STRING text);
|
||||
};
|
||||
|
||||
// First of all: You don't need to implement all functions and all structs perfectly for ConPTY to work decently well.
|
||||
// For instance, if you don't implement `CONSRV_INFO::cursorHeight` properly, barely anything will happen.
|
||||
interface IConsoleServerCallback : IUnknown {
|
||||
// The console server is single-threaded and no two calls will be made simultaneously. These two functions
|
||||
// simply allow you to synchronize the calls down below if your application is multi-threaded.
|
||||
//
|
||||
// Lock() will always be called before any of the functions below are called.
|
||||
// Lock() and Unlock() do not need to support recursive locking.
|
||||
// Any other calls between Lock() and Unlock() should be treated as an atomic operation.
|
||||
//
|
||||
// It is recommended to use a fair lock instead of OS primitives like SRWLOCK. These callback functions may be
|
||||
// much more often than your text renderer, etc., runs. An unfair lock will result in thread starvation.
|
||||
HRESULT Lock();
|
||||
HRESULT Unlock();
|
||||
|
||||
// If called, you're requested to create a new console alt buffer. The Console API supports having
|
||||
// multiple concurrent such buffers. They're not the same as the xterm alt buffer, however (CSI ? 1049 h):
|
||||
// They can be resized to be larger than the current viewport and switching between such buffers DOES NOT
|
||||
// clear them nor does it reset any other per-buffer state.
|
||||
//
|
||||
// If you have trouble adding support for multiple console alt buffers, consider using the xterm alt buffer
|
||||
// (CSI ? 1049 h) for the first buffer that gets created, and return E_OUTOFMEMORY for any further buffers.
|
||||
HRESULT CreateBuffer([out] void** buffer);
|
||||
|
||||
// ReleaseBuffer is called once the buffer isn't needed anymore. It's guaranteed to be called and it's guaranteed
|
||||
// to be called after ActivateBuffer() was used to switch to another buffer (or the main buffer).
|
||||
HRESULT ReleaseBuffer([in] void* buffer);
|
||||
|
||||
// This switches between different console alt buffers. Switching to a buffer should change the content that's
|
||||
// being shown, similar to the xterm alt buffer, however unlike it doing so DOES NOT reset any per-buffer state.
|
||||
// All it does is to basically swap out the underlying, active text buffer of the terminal.
|
||||
//
|
||||
// If `buffer` is NULL it's a request to switch back to the main buffer.
|
||||
//
|
||||
// `temporary` is a hint. If it's `true` it indicates that the previous buffer will soon be activated again.
|
||||
// In other words, on Unlock() the buffer was active during Lock() will be active again.
|
||||
// It's recommended that temporary switches are lightweight as they may occur relatively often.
|
||||
HRESULT ActivateBuffer([in] void* buffer, [in] boolean temporary);
|
||||
|
||||
//
|
||||
// Any functions past this point operate on the currently active buffer.
|
||||
//
|
||||
|
||||
// This function gets a snapshot of the terminal and buffer state.
|
||||
//
|
||||
// You must ensure that the returned pointer stays valid until the next GetInfo() or Unlock() call,
|
||||
// or until the currently active buffer is released.
|
||||
// You don't need to return a new instance on each call. ConPTY will only use the last returned pointer.
|
||||
// You don't need to keep the CONSRV_INFO struct constantly up to date, but you're allowed to do so.
|
||||
// For instance, it's valid to change the `.cursorPosition` when SetCursorPosition() is called.
|
||||
//
|
||||
// It's recommended that this function is lightweight as it may be called relatively often.
|
||||
const CONSRV_INFO* GetInfo();
|
||||
|
||||
// When this method is called you're asked to apply any non-null member of the given CONSRV_INFO_CHANGE struct
|
||||
// to the active buffer. For instance a non-null `.cursorPosition` is identical to calling `SetCursorPosition`,
|
||||
// a non-null `.bufferSize` is a request to resize the terminal, and so on.
|
||||
HRESULT SetInfo([in] const CONSRV_INFO_CHANGE* info);
|
||||
|
||||
// As explained in the CONSRV_POINT_I32 documentation, ConPTY coordinates may be outside of the VT viewport.
|
||||
// This function is necessary in order to support this. If you assign the console buffer the same size
|
||||
// as the VT viewport, `pos` can be translated to VT using
|
||||
// printf("\x1b[%d;%dC", pos.y + 1, pos.x + 1);
|
||||
HRESULT SetCursorPosition([in] CONSRV_POINT_I32 pos);
|
||||
|
||||
// The Console API supports 4 gridline attributes which cannot be translated to VT.
|
||||
// This function is necessary to represent those. If you don't plan to support the gridlines,
|
||||
// you can translate the attributes to VT with the following code or some equivalent:
|
||||
// static const uint8_t lut[] = { 30, 34, 32, 36, 31, 35, 33, 37, 90, 94, 92, 96, 91, 95, 93, 97 };
|
||||
// const auto fg = lut[attributes & 0xf];
|
||||
// const auto bg = lut[(attributes >> 4) & 0xf] + 10;
|
||||
// printf("\x1b[%d;%dm", fg, bg);
|
||||
//
|
||||
// `attributes` of exactly `FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED` are often used to indicate the
|
||||
// default colors in Windows Console applications, and so you may choose to translate attributes like that as:
|
||||
// printf("\x1b[39;49");
|
||||
//
|
||||
// You may also choose to support COMMON_LVB_REVERSE_VIDEO, which translates to:
|
||||
// printf("\x1b[7m");
|
||||
HRESULT SetCurrentAttributes([in] UINT16 attributes);
|
||||
|
||||
// Starting from column `pos.x` in row `pos.y`, this reads `count`-many characters and attributes.
|
||||
// `pos` and `count` will be clamped such that reads never extend outside of the `CONSRV_INFO::bufferSize`.
|
||||
//
|
||||
// However, it may still read cells that have never been written to (for instance below the current viewport!).
|
||||
// Such reads should not fail. Simply fill the `infos` array with whitespaces and a default attribute of your chosing,
|
||||
// but `FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED` is recommended (no other bits set).
|
||||
//
|
||||
// NOTE that this API should ignore any line renditions (DECDWL, DECDHL), margins (DECSLRM, ...), etc.
|
||||
// Reading outside of the "valid" range for a given row should behave exactly like reading below the viewport,
|
||||
// as described in the previous paragraph.
|
||||
HRESULT ReadBuffer([in] CONSRV_POINT_I32 pos, [in] INT32 count, [out, length_is(count)] CONSRV_CHAR_INFO* infos);
|
||||
|
||||
// These two functions are used to layout text for the internal "GNU Readline"-like implementation.
|
||||
// `text` is the string to operate on. As with any other method, input validation should be performed.
|
||||
// It's preferred to pretend as if invalid codepoints (in particular invalid surrogate pairs)
|
||||
// are U+FFFD, because this provides the user with some level of text editing capability.
|
||||
// The alternative is to have none at all when facing invalid strings which is strictly worse.
|
||||
// `maxClusters` is the maximum amount of "cursor movements" these functions should apply
|
||||
// (like when pressing the left/right arrow buttons).
|
||||
// `maxColumns` is the maximum amount of columns the functions may iterate over. When the text is "a猫" and
|
||||
// `maxColumns` is 2, then the result should be "a", because "猫" doesn't fit anymore.
|
||||
// `position` on input contains the current position of the cursor inside `text`, counted in characters from the
|
||||
// start of the `text`. On output it's supposed to contain the new cursor position.
|
||||
// `position` may be out of bounds and you should clamp it to a valid range first.
|
||||
// `columns` on output should contain the number of columns that have been iterated over.
|
||||
//
|
||||
// The idea is that a `maxClusters = 1` and `maxColumns = inf` can be used to implement left/right cursor movement,
|
||||
// while `maxClusters = inf` and `maxColumns = window width` can be used to layout text within the window.
|
||||
//
|
||||
// You don't need to handle escape characters. These functions will never be called with any present.
|
||||
// For robustness against bugs it's however recommended to handle them anyway, in whatever way you wish.
|
||||
// If you have no preference, it's recommended to treat them as zero-width characters.
|
||||
HRESULT MeasureTextForward([in] CONSRV_UTF16_STRING text, [in] DWORD maxClusters, [in] DWORD maxColumns, [in, out] DWORD* position, [out] DWORD* columns);
|
||||
HRESULT MeasureTextBackward([in] CONSRV_UTF16_STRING text, [in] DWORD maxClusters, [in] DWORD maxColumns, [in, out] DWORD* position, [out] DWORD* columns);
|
||||
|
||||
// UTF8 and UTF16 are both widely used text encodings on Windows and it's recommended that both
|
||||
// functions are reasonably fast. ConPTY will translate all non-Unicode text to UTF16 for you.
|
||||
// You must validate incoming text. It's recommended to replace invalid codepoints with U+FFFD.
|
||||
// You don't need to check for broken up codepoints at the start/end of the text, as ConPTY will handle that for you.
|
||||
HRESULT WriteUTF8([in] boolean raw, [in] CONSRV_UTF8_STRING text);
|
||||
HRESULT WriteUTF16([in] boolean raw, [in] CONSRV_UTF16_STRING text);
|
||||
};
|
||||
```
|
||||
|
||||
The list shows how each Console API function is implemented in terms of the above interface.
|
||||
* Aliases
|
||||
<br>Fully implemented inside the server component without API.
|
||||
* `AddConsoleAlias`
|
||||
* `GetConsoleAlias`
|
||||
* `GetConsoleAliases`
|
||||
* `GetConsoleAliasesLength`
|
||||
* `GetConsoleAliasExes`
|
||||
* `GetConsoleAliasExesLength`
|
||||
* History
|
||||
<br>Fully implemented inside the server component without API.
|
||||
* `ExpungeConsoleCommandHistory`
|
||||
* `GetConsoleCommandHistory`
|
||||
* `GetConsoleCommandHistoryLength`
|
||||
* `GetConsoleHistoryInfo`
|
||||
* `SetConsoleHistoryInfo`
|
||||
* `SetConsoleNumberOfCommands`
|
||||
* stdin
|
||||
<br>Fully implemented inside the server component without API.
|
||||
* `FlushConsoleInputBuffer`
|
||||
* `GetConsoleInput`
|
||||
* `GetConsoleInputCodePage`
|
||||
* `GetConsoleInputMode`
|
||||
* `GetNumberOfConsoleInputEvents`
|
||||
* `ReadConsole`
|
||||
* `SetConsoleInputCodePage`
|
||||
* `SetConsoleInputMode`
|
||||
* `WriteConsoleInput`
|
||||
* Unsupported since conhost v1
|
||||
* `GetConsoleDisplayMode`
|
||||
* `GetConsoleLangId`
|
||||
* `SetConsoleDisplayMode`
|
||||
* Buffer management
|
||||
* `GetConsoleScreenBufferInfoEx`:
|
||||
Gets information from server's internal `SCREEN_INFORMATION` class (which represents the `HANDLE`).
|
||||
* `SetConsoleScreenBufferInfoEx`:
|
||||
Sets information on server's internal `SCREEN_INFORMATION` class.
|
||||
* `CreateConsoleScreenBuffer`:
|
||||
`CreateBuffer`
|
||||
* `SetConsoleActiveScreenBuffer`:
|
||||
`ActivateBuffer` + `SetInfo`
|
||||
* `SetConsoleScreenBufferSize`:
|
||||
`SetInfo`
|
||||
* Cursor
|
||||
* `GetConsoleCursorInfo`:
|
||||
`GetInfo`
|
||||
* `SetConsoleCursorInfo`:
|
||||
`SetInfo`
|
||||
* `SetConsoleCursorPosition`:
|
||||
`GetInfo`
|
||||
* Fonts
|
||||
* `GetConsoleFontSize`:
|
||||
`GetInfo`
|
||||
* `GetCurrentConsoleFontEx`:
|
||||
`GetInfo`
|
||||
* `SetCurrentConsoleFontEx`:
|
||||
`SetInfo`
|
||||
* Window management
|
||||
* `GetConsoleOriginalTitle`:
|
||||
`GetInfo`
|
||||
* `GetConsoleSelectionInfo`:
|
||||
`GetInfo`
|
||||
* `GetConsoleTitle`:
|
||||
`GetInfo`
|
||||
* `GetConsoleWindow`:
|
||||
`GetInfo`
|
||||
* `GetLargestConsoleWindowSize`:
|
||||
`GetInfo`; The window frame size can be inferred from the difference between the `GetWindowRect(hwnd)` and the `viewSizeInCells * cellSizeInDIP`.
|
||||
The max. cell count can then be calculated by getting the `MonitorFromWindow(hwnd)` size, subtracting the frame size and calculating the cell count.
|
||||
* `GetNumberOfConsoleMouseButtons`:
|
||||
Implemented inside the server component via `GetSystemMetrics(SM_CMOUSEBUTTONS)`
|
||||
* `SetConsoleTitle`:
|
||||
`SetInfo`
|
||||
* `SetConsoleWindowInfo`:
|
||||
`SetInfo`
|
||||
* stdout (writing)
|
||||
* `FillConsoleOutputAttribute`:
|
||||
Set the new attributes with `SetCurrentAttributes`.
|
||||
For each line, get the existing contents with `ReadBuffer`, `SetCursorPosition` to the start, concatenate the cells and write them with `WriteUTF16`.
|
||||
* `FillConsoleOutputCharacter`:
|
||||
For each line, get the existing contents with `ReadBuffer`, `SetCursorPosition` to the start, concatenate the cells and write them with `WriteUTF16`.
|
||||
At the start of each line and every time the attributes change use `SetCurrentAttributes` to set them up.
|
||||
* `GetConsoleOutputCodePage`:
|
||||
Implemented inside the server component.
|
||||
* `GetConsoleOutputMode`:
|
||||
Implemented inside the server component.
|
||||
* `ScrollConsoleScreenBuffer`:
|
||||
**TODO**: It may be necessary to add a `ScrollBuffer` API to make vertical scrolling across the entire buffer width faster. This fast pass currently exists as well.
|
||||
Otherwise, this will be translated to: Read all lines in the source rectangle with `ReadBuffer`.
|
||||
Then refer to the `WriteConsoleOutput` implementation for writing it to the target.
|
||||
* `SetConsoleOutputCodePage`:
|
||||
Implemented inside the server component.
|
||||
* `SetConsoleOutputMode`:
|
||||
Implemented inside the server component.
|
||||
* `SetConsoleTextAttribute`:
|
||||
`SetCurrentAttributes`
|
||||
* `WriteConsole`:
|
||||
`WriteUTF8` if `CP_UTF8` is active and otherwise `WriteUTF16`.
|
||||
* `WriteConsoleOutput`:
|
||||
For each line, `SetCursorPosition` to the start, concatenate the cells and write them with `WriteUTF16`.
|
||||
At the start of each line and every time the attributes change use `SetCurrentAttributes` to set them up.
|
||||
* `WriteConsoleOutputAttribute`:
|
||||
Same as `FillConsoleOutputAttribute`, but with varying attributes.
|
||||
* `WriteConsoleOutputCharacter`:
|
||||
Same as `FillConsoleOutputCharacter`, but with varying characters.
|
||||
* stdout (reading)
|
||||
<br>Each of these will be translated to a series of `ReadBuffer` calls, one for each line.
|
||||
* `ReadConsoleOutput`
|
||||
* `ReadConsoleOutputAttribute`
|
||||
* `ReadConsoleOutputCharacter`
|
||||
|
||||
## Goal 3: Productize Server
|
||||
|
||||
### Goal
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph ConPTY_lib["ConPTY (static library)"]
|
||||
server_io[Console API calls]
|
||||
ConPTY_Translation[VT Translation]
|
||||
|
||||
server_io<-->ConPTY_Translation
|
||||
end
|
||||
|
||||
subgraph ConPTY["ConPTY (dynamic library)"]
|
||||
ConPTY_impl[IApiRoutines impl]
|
||||
ConPTY_parser[VT parser]
|
||||
ConPTY_buffer[Text Buffer]
|
||||
ConPTY_output[ConPTY Output]
|
||||
|
||||
ConPTY_Translation<-->ConPTY_impl
|
||||
ConPTY_impl-->ConPTY_parser
|
||||
ConPTY_parser-->ConPTY_buffer
|
||||
ConPTY_buffer--ReadBuffer-->ConPTY_impl
|
||||
ConPTY_impl------>ConPTY_output
|
||||
end
|
||||
|
||||
subgraph conhost
|
||||
subgraph conhost_Server[Server]
|
||||
conhost_server_io[Console API calls]
|
||||
conhost_ConPTY_Translation[VT Translation]
|
||||
|
||||
conhost_server_io<-->conhost_ConPTY_Translation
|
||||
end
|
||||
|
||||
conhost_impl[IApiRoutines impl]
|
||||
conhost_parser[VT parser]
|
||||
conhost_buffer[Text Buffer]
|
||||
conhost_renderer[Render Thread]
|
||||
conhost_atlas[Text Renderer]
|
||||
output_new[ConPTY Output]
|
||||
|
||||
conhost_ConPTY_Translation<-->conhost_impl
|
||||
conhost_impl-.remains for<br>back compat.....->output_new
|
||||
|
||||
ConPTY_Translation<-->conhost_impl
|
||||
conhost_impl-->conhost_parser
|
||||
conhost_parser-->conhost_buffer
|
||||
conhost_buffer--->conhost_renderer
|
||||
conhost_buffer--ReadBuffer-->conhost_impl
|
||||
conhost_renderer-->conhost_atlas
|
||||
end
|
||||
|
||||
subgraph wt[Windows Terminal]
|
||||
impl[IApiRoutines impl]
|
||||
parser[VT parser]
|
||||
buffer[Text Buffer]
|
||||
renderer[Render Thread]
|
||||
atlas[Text Renderer]
|
||||
|
||||
ConPTY_Translation<-->impl
|
||||
impl-->parser
|
||||
parser-->buffer
|
||||
buffer--->renderer
|
||||
buffer--ReadBuffer-->impl
|
||||
renderer-->atlas
|
||||
end
|
||||
|
||||
linkStyle 6,7 opacity:0.2
|
||||
style conhost_Server opacity:0.2
|
||||
style conhost_server_io opacity:0.2
|
||||
style conhost_ConPTY_Translation opacity:0.2
|
||||
```
|
||||
|
||||
After creating an _internal_ API in conhost, the next logical step is for us to extract the interface as a public one and consume it in Windows Terminal.
|
||||
At this point we should also see if we can find early adopters of the API in other projects.
|
||||
|
||||
## Stretch Goal 4: Ship Server in Windows
|
||||
|
||||
The console server on Windows has been an internal ABI for the longest time.
|
||||
As we have started shipping ConPTY bundled with conhost/OpenConsole to other projects, the internal ABI has become a public one.
|
||||
While we have no intention of ever breaking forward compatability of the console server with future Windows versions, it would be reassuring if the ABI long-term became internal once more.
|
||||
This will allow us complete freedom over its design, even in the decades to come, and allow us to fully shim any 3rd party applications on Windows if a ABI change were to ever happen.
|
||||
527
doc/theme_colors.html
Normal file
527
doc/theme_colors.html
Normal file
@@ -0,0 +1,527 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Theme Color Quality Tests</title>
|
||||
<script src="https://colorjs.io/dist/color.global.min.js"></script>
|
||||
<script src="https://cdn.plot.ly/plotly-2.34.0.min.js"></script>
|
||||
<style>
|
||||
html {
|
||||
background: #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
h2 > button {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#container {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
#container > div {
|
||||
width: 418px;
|
||||
}
|
||||
|
||||
.swatch {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(8, 50px);
|
||||
gap: 2px;
|
||||
border: 2px solid black;
|
||||
background: black;
|
||||
}
|
||||
|
||||
.swatch > div {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.swatch span {
|
||||
display: block;
|
||||
font-family: monospace;
|
||||
line-height: 2;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container"></div>
|
||||
<script>(() => {
|
||||
const themes = {
|
||||
// Find the optimal selection color (e.g. #92a4fd):
|
||||
//
|
||||
// theme = ["#000000", "#be2c21", "#3fae3a", "#be9a4a", "#204dbe", "#bb54be", "#00a7b2", "#bebebe", "#808080", "#ff3e30", "#58ea51", "#ffd166", "#2f6aff", "#fc74ff", "#00e1f0", "#ffffff"]
|
||||
// theme = theme.map(t => Color.to(t, "oklab"))
|
||||
//
|
||||
// optD = 0;
|
||||
// opt = null;
|
||||
//
|
||||
// for (let h = 264-10; h <= 264+10; h += 1) {
|
||||
// for (let c = 10; c <= 100; c += 1) {
|
||||
// for (let l = 40; l <= 90; l += 1) {
|
||||
// const col = Color.to(`color(--okhsl ${h} ${c}% ${l}%)`, "oklab");
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
"Prototype Bright": (() => {
|
||||
const bright_red = new Color(`color(--okhsl ${Color.to("#f00", "okhsl").h} 100% 60.15%)`);
|
||||
const bright_green = new Color(`color(--okhsl ${Color.to("#0f0", "okhsl").h} 92.5% 80%)`);
|
||||
const bright_blue = new Color(`color(--okhsl ${Color.to("#00f", "okhsl").h} 100% 51.2%)`);
|
||||
|
||||
const mixOpts = { space: "oklab", outputSpace: "okhsl" };
|
||||
const bright_yellow = new Color(`color(--okhsl ${bright_red.mix(bright_green, 0.5, mixOpts).h} 100% 84%)`);
|
||||
const bright_purple = new Color(`color(--okhsl ${bright_blue.mix(bright_red, 0.5, mixOpts).h} 100% 73%)`);
|
||||
const bright_cyan = new Color(`color(--okhsl ${bright_green.mix(bright_blue, 0.5, mixOpts).h} 100% 80%)`);
|
||||
|
||||
const bright = [
|
||||
new Color("oklch(60% 0 0)"),
|
||||
bright_red,
|
||||
bright_green,
|
||||
bright_yellow,
|
||||
bright_blue,
|
||||
bright_purple,
|
||||
bright_cyan,
|
||||
new Color("oklch(100% 0 0)"),
|
||||
];
|
||||
const dark = [
|
||||
new Color("oklch(0% 0 0)"),
|
||||
...bright.slice(1, 8).map(c => c.mix("#000", 0.2, { space: "oklab" })),
|
||||
];
|
||||
return dark.concat(...bright).map(c => c.to("sRGB").toString({
|
||||
format: "hex",
|
||||
collapse: false
|
||||
}))
|
||||
})(),
|
||||
// https://oklch.com/
|
||||
"Prototype Symmetric": [
|
||||
new Color("oklch(0% 0 0)"), // Black
|
||||
new Color("oklch(60% 0.098 30)"), // Red
|
||||
new Color("oklch(60% 0.098 150)"), // Green
|
||||
new Color("oklch(60% 0.098 90)"), // Yellow
|
||||
new Color("oklch(60% 0.098 270)"), // Blue
|
||||
new Color("oklch(60% 0.098 330)"), // Purple
|
||||
new Color("oklch(60% 0.098 210)"), // Cyan
|
||||
new Color("oklch(80% 0 0)"), // White
|
||||
|
||||
new Color("oklch(40% 0 0)"), // Bright Black
|
||||
new Color("oklch(80% 0.098 30)"), // Bright Red
|
||||
new Color("oklch(80% 0.098 150)"), // Bright Green
|
||||
new Color("oklch(80% 0.098 90)"), // Bright Yellow
|
||||
new Color("oklch(80% 0.098 270)"), // Bright Blue
|
||||
new Color("oklch(80% 0.098 330)"), // Bright Purple
|
||||
new Color("oklch(80% 0.098 210)"), // Bright Cyan
|
||||
new Color("oklch(100% 0 0)"), // Bright White
|
||||
].map(c => c.to("sRGB").toString({ format: "hex", collapse: false })),
|
||||
"Terminal.app": [
|
||||
"#000000",
|
||||
"#990000",
|
||||
"#00a600",
|
||||
"#999900",
|
||||
"#0000b2",
|
||||
"#b200b2",
|
||||
"#00a6b2",
|
||||
"#bfbfbf",
|
||||
"#666666",
|
||||
"#e50000",
|
||||
"#00d900",
|
||||
"#e5e500",
|
||||
"#0000ff",
|
||||
"#e500e5",
|
||||
"#00e5e5",
|
||||
"#e5e5e5",
|
||||
],
|
||||
"Windows NT": [
|
||||
"#000000",
|
||||
"#800000",
|
||||
"#008000",
|
||||
"#808000",
|
||||
"#000080",
|
||||
"#800080",
|
||||
"#008080",
|
||||
"#C0C0C0",
|
||||
"#808080",
|
||||
"#FF0000",
|
||||
"#00FF00",
|
||||
"#FFFF00",
|
||||
"#0000FF",
|
||||
"#FF00FF",
|
||||
"#00FFFF",
|
||||
"#FFFFFF",
|
||||
],
|
||||
"Windows XP": [
|
||||
"#000000",
|
||||
"#A80000",
|
||||
"#00A800",
|
||||
"#A85400",
|
||||
"#0000A8",
|
||||
"#A800A8",
|
||||
"#61D6D6",
|
||||
"#A8A8A8",
|
||||
"#545454",
|
||||
"#FF0000",
|
||||
"#00FF00",
|
||||
"#FFFF00",
|
||||
"#0000FF",
|
||||
"#FF00FF",
|
||||
"#00FFFF",
|
||||
"#FFFFFF",
|
||||
],
|
||||
"URXVT": [
|
||||
"#000000",
|
||||
"#BE0000",
|
||||
"#00BE00",
|
||||
"#BEBE00",
|
||||
"#0000BE",
|
||||
"#BE00BE",
|
||||
"#00BEBE",
|
||||
"#BEBEBE",
|
||||
"#424242",
|
||||
"#FF0000",
|
||||
"#00FF00",
|
||||
"#FFFF00",
|
||||
"#0000FF",
|
||||
"#FF00FF",
|
||||
"#00FFFF",
|
||||
"#FFFFFF",
|
||||
],
|
||||
"Campbell": [
|
||||
"#0C0C0C",
|
||||
"#C50F1F",
|
||||
"#13A10E",
|
||||
"#C19C00",
|
||||
"#0037DA",
|
||||
"#881798",
|
||||
"#3A96DD",
|
||||
"#CCCCCC",
|
||||
"#767676",
|
||||
"#E74856",
|
||||
"#16C60C",
|
||||
"#F9F1A5",
|
||||
"#3B78FF",
|
||||
"#B4009E",
|
||||
"#61D6D6",
|
||||
"#F2F2F2",
|
||||
],
|
||||
"Campbell Powershell": [
|
||||
"#0C0C0C",
|
||||
"#C50F1F",
|
||||
"#13A10E",
|
||||
"#C19C00",
|
||||
"#0037DA",
|
||||
"#881798",
|
||||
"#3A96DD",
|
||||
"#CCCCCC",
|
||||
"#767676",
|
||||
"#E74856",
|
||||
"#16C60C",
|
||||
"#F9F1A5",
|
||||
"#3B78FF",
|
||||
"#B4009E",
|
||||
"#61D6D6",
|
||||
"#F2F2F2",
|
||||
],
|
||||
"One Half Dark": [
|
||||
"#282C34",
|
||||
"#E06C75",
|
||||
"#98C379",
|
||||
"#E5C07B",
|
||||
"#61AFEF",
|
||||
"#C678DD",
|
||||
"#56B6C2",
|
||||
"#DCDFE4",
|
||||
"#5A6374",
|
||||
"#E06C75",
|
||||
"#98C379",
|
||||
"#E5C07B",
|
||||
"#61AFEF",
|
||||
"#C678DD",
|
||||
"#56B6C2",
|
||||
"#DCDFE4",
|
||||
],
|
||||
"One Half Light": [
|
||||
"#383A42",
|
||||
"#E45649",
|
||||
"#50A14F",
|
||||
"#C18301",
|
||||
"#0184BC",
|
||||
"#A626A4",
|
||||
"#0997B3",
|
||||
"#FAFAFA",
|
||||
"#4F525D",
|
||||
"#DF6C75",
|
||||
"#98C379",
|
||||
"#E4C07A",
|
||||
"#61AFEF",
|
||||
"#C577DD",
|
||||
"#56B5C1",
|
||||
"#FFFFFF",
|
||||
],
|
||||
"Solarized Dark": [
|
||||
"#002B36",
|
||||
"#DC322F",
|
||||
"#859900",
|
||||
"#B58900",
|
||||
"#268BD2",
|
||||
"#D33682",
|
||||
"#2AA198",
|
||||
"#EEE8D5",
|
||||
"#073642",
|
||||
"#CB4B16",
|
||||
"#586E75",
|
||||
"#657B83",
|
||||
"#839496",
|
||||
"#6C71C4",
|
||||
"#93A1A1",
|
||||
"#FDF6E3",
|
||||
],
|
||||
"Solarized Light": [
|
||||
"#002B36",
|
||||
"#DC322F",
|
||||
"#859900",
|
||||
"#B58900",
|
||||
"#268BD2",
|
||||
"#D33682",
|
||||
"#2AA198",
|
||||
"#EEE8D5",
|
||||
"#073642",
|
||||
"#CB4B16",
|
||||
"#586E75",
|
||||
"#657B83",
|
||||
"#839496",
|
||||
"#6C71C4",
|
||||
"#93A1A1",
|
||||
"#FDF6E3",
|
||||
],
|
||||
"Tango Dark": [
|
||||
"#000000",
|
||||
"#CC0000",
|
||||
"#4E9A06",
|
||||
"#C4A000",
|
||||
"#3465A4",
|
||||
"#75507B",
|
||||
"#06989A",
|
||||
"#D3D7CF",
|
||||
"#555753",
|
||||
"#EF2929",
|
||||
"#8AE234",
|
||||
"#FCE94F",
|
||||
"#729FCF",
|
||||
"#AD7FA8",
|
||||
"#34E2E2",
|
||||
"#EEEEEC",
|
||||
],
|
||||
"Tango Light": [
|
||||
"#000000",
|
||||
"#CC0000",
|
||||
"#4E9A06",
|
||||
"#C4A000",
|
||||
"#3465A4",
|
||||
"#75507B",
|
||||
"#06989A",
|
||||
"#D3D7CF",
|
||||
"#555753",
|
||||
"#EF2929",
|
||||
"#8AE234",
|
||||
"#FCE94F",
|
||||
"#729FCF",
|
||||
"#AD7FA8",
|
||||
"#34E2E2",
|
||||
"#EEEEEC",
|
||||
],
|
||||
"Dark+": [
|
||||
"#000000",
|
||||
"#cd3131",
|
||||
"#0dbc79",
|
||||
"#e5e510",
|
||||
"#2472c8",
|
||||
"#bc3fbc",
|
||||
"#11a8cd",
|
||||
"#e5e5e5",
|
||||
"#666666",
|
||||
"#f14c4c",
|
||||
"#23d18b",
|
||||
"#f5f543",
|
||||
"#3b8eea",
|
||||
"#d670d6",
|
||||
"#29b8db",
|
||||
"#e5e5e5",
|
||||
],
|
||||
"CGA": [
|
||||
"#000000",
|
||||
"#AA0000",
|
||||
"#00AA00",
|
||||
"#AA5500",
|
||||
"#0000AA",
|
||||
"#AA00AA",
|
||||
"#00AAAA",
|
||||
"#AAAAAA",
|
||||
"#555555",
|
||||
"#FF5555",
|
||||
"#55FF55",
|
||||
"#FFFF55",
|
||||
"#5555FF",
|
||||
"#FF55FF",
|
||||
"#55FFFF",
|
||||
"#FFFFFF",
|
||||
],
|
||||
"IBM 5153": [
|
||||
"#000000",
|
||||
"#AA0000",
|
||||
"#00AA00",
|
||||
"#C47E00",
|
||||
"#0000AA",
|
||||
"#AA00AA",
|
||||
"#00AAAA",
|
||||
"#AAAAAA",
|
||||
"#555555",
|
||||
"#FF5555",
|
||||
"#55FF55",
|
||||
"#FFFF55",
|
||||
"#5555FF",
|
||||
"#FF55FF",
|
||||
"#55FFFF",
|
||||
"#FFFFFF",
|
||||
],
|
||||
};
|
||||
|
||||
Object.entries(themes).forEach(([name, srgb]) => {
|
||||
const oklch = srgb.map(c => Color.to(c, "Oklch"));
|
||||
|
||||
const title = document.createElement("h2");
|
||||
title.innerText = name;
|
||||
|
||||
const download = document.createElement("button");
|
||||
download.type = "button";
|
||||
download.innerText = "Copy";
|
||||
download.onclick = () => {
|
||||
navigator.clipboard.writeText(JSON.stringify({
|
||||
name,
|
||||
background: srgb[0],
|
||||
foreground: srgb[7],
|
||||
cursorColor: "#ffffff",
|
||||
black: srgb[0],
|
||||
red: srgb[1],
|
||||
green: srgb[2],
|
||||
yellow: srgb[3],
|
||||
blue: srgb[4],
|
||||
purple: srgb[5],
|
||||
cyan: srgb[6],
|
||||
white: srgb[7],
|
||||
brightBlack: srgb[8],
|
||||
brightRed: srgb[9],
|
||||
brightGreen: srgb[10],
|
||||
brightYellow: srgb[11],
|
||||
brightBlue: srgb[12],
|
||||
brightPurple: srgb[13],
|
||||
brightCyan: srgb[14],
|
||||
brightWhite: srgb[15],
|
||||
}, null, 4));
|
||||
|
||||
download.innerText = "Copied!";
|
||||
download.disabled = true;
|
||||
|
||||
setTimeout(() => {
|
||||
download.innerText = "Copy";
|
||||
download.disabled = false;
|
||||
}, 1000);
|
||||
}
|
||||
title.appendChild(download);
|
||||
|
||||
const swatch = document.createElement("div");
|
||||
swatch.className = "swatch";
|
||||
|
||||
for (let i = 0; i < 16; ++i) {
|
||||
const span = document.createElement("span");
|
||||
span.innerText = oklch[i].l.toFixed(3);
|
||||
span.style.color = srgb[i];
|
||||
span.style.background = srgb[0];
|
||||
|
||||
const div = document.createElement("div");
|
||||
div.style.background = srgb[i];
|
||||
div.appendChild(span);
|
||||
|
||||
swatch.appendChild(div);
|
||||
}
|
||||
|
||||
const plot = document.createElement("div");
|
||||
Plotly.newPlot(plot, [{
|
||||
type: "scatterpolar",
|
||||
mode: "lines",
|
||||
hoverinfo: "skip",
|
||||
showlegend: false,
|
||||
theta: Array.from({ length: 360 }, (x, i) => i),
|
||||
// Pre-calculated max. chroma per hue for sRGB colors.
|
||||
r: [0.260, 0.258, 0.258, 0.257, 0.257, 0.257, 0.256, 0.256, 0.256, 0.255, 0.254, 0.253, 0.252, 0.251, 0.251, 0.251, 0.252, 0.252, 0.252, 0.252, 0.253, 0.253, 0.253, 0.254, 0.254, 0.255, 0.255, 0.255, 0.255, 0.255, 0.252, 0.246, 0.242, 0.237, 0.233, 0.229, 0.226, 0.221, 0.219, 0.214, 0.213, 0.209, 0.207, 0.204, 0.201, 0.200, 0.196, 0.196, 0.193, 0.190, 0.190, 0.187, 0.185, 0.185, 0.182, 0.182, 0.181, 0.179, 0.179, 0.177, 0.175, 0.176, 0.174, 0.173, 0.174, 0.172, 0.171, 0.172, 0.171, 0.170, 0.171, 0.170, 0.169, 0.170, 0.169, 0.168, 0.170, 0.169, 0.168, 0.170, 0.169, 0.170, 0.171, 0.170, 0.172, 0.172, 0.171, 0.173, 0.173, 0.175, 0.175, 0.175, 0.177, 0.178, 0.180, 0.180, 0.182, 0.183, 0.184, 0.186, 0.187, 0.189, 0.192, 0.193, 0.196, 0.197, 0.200, 0.201, 0.204, 0.208, 0.209, 0.210, 0.212, 0.211, 0.213, 0.215, 0.217, 0.216, 0.218, 0.220, 0.221, 0.223, 0.225, 0.228, 0.228, 0.231, 0.234, 0.234, 0.237, 0.241, 0.244, 0.245, 0.249, 0.253, 0.255, 0.259, 0.264, 0.266, 0.271, 0.276, 0.280, 0.286, 0.289, 0.287, 0.278, 0.271, 0.265, 0.258, 0.251, 0.245, 0.239, 0.234, 0.228, 0.223, 0.219, 0.215, 0.211, 0.209, 0.205, 0.202, 0.199, 0.195, 0.192, 0.190, 0.187, 0.185, 0.182, 0.180, 0.178, 0.176, 0.175, 0.174, 0.172, 0.170, 0.169, 0.167, 0.166, 0.165, 0.163, 0.162, 0.161, 0.160, 0.159, 0.158, 0.157, 0.156, 0.157, 0.157, 0.156, 0.155, 0.155, 0.154, 0.154, 0.154, 0.153, 0.153, 0.153, 0.151, 0.151, 0.149, 0.149, 0.147, 0.148, 0.147, 0.146, 0.146, 0.145, 0.145, 0.145, 0.144, 0.145, 0.144, 0.144, 0.144, 0.144, 0.144, 0.143, 0.144, 0.145, 0.144, 0.145, 0.145, 0.145, 0.147, 0.146, 0.147, 0.147, 0.148, 0.15, 0.149, 0.151, 0.151, 0.153, 0.154, 0.154, 0.156, 0.157, 0.159, 0.159, 0.162, 0.162, 0.165, 0.166, 0.169, 0.17, 0.173, 0.174, 0.178, 0.18, 0.182, 0.186, 0.189, 0.192, 0.197, 0.2, 0.204, 0.208, 0.213, 0.219, 0.224, 0.232, 0.242, 0.249, 0.262, 0.284, 0.308, 0.307, 0.307, 0.306, 0.304, 0.301, 0.301, 0.302, 0.3, 0.297, 0.297, 0.298, 0.296, 0.294, 0.294, 0.295, 0.294, 0.292, 0.292, 0.294, 0.292, 0.290, 0.292, 0.292, 0.29, 0.291, 0.292, 0.290, 0.291, 0.292, 0.291, 0.291, 0.293, 0.291, 0.293, 0.293, 0.292, 0.295, 0.294, 0.295, 0.296, 0.295, 0.298, 0.296, 0.299, 0.298, 0.301, 0.300, 0.303, 0.302, 0.305, 0.303, 0.307, 0.305, 0.308, 0.308, 0.310, 0.313, 0.311, 0.314, 0.316, 0.316, 0.319, 0.320, 0.320, 0.314, 0.312, 0.311, 0.309, 0.303, 0.302, 0.300, 0.299, 0.296, 0.292, 0.291, 0.289, 0.288, 0.287, 0.283, 0.280, 0.279, 0.278, 0.277, 0.276, 0.274, 0.271, 0.269, 0.268, 0.267, 0.266, 0.266, 0.265, 0.264, 0.262],
|
||||
marker: {
|
||||
color: srgb[7],
|
||||
},
|
||||
}, {
|
||||
type: "scatterpolar",
|
||||
mode: "markers+text",
|
||||
hoverinfo: "r+theta+text",
|
||||
showlegend: false,
|
||||
hovertext: [
|
||||
"Black",
|
||||
"Red",
|
||||
"Green",
|
||||
"Yellow",
|
||||
"Blue",
|
||||
"Purple",
|
||||
"Cyan",
|
||||
"White",
|
||||
"Bright Black",
|
||||
"Bright Red",
|
||||
"Bright Green",
|
||||
"Bright Yellow",
|
||||
"Bright Blue",
|
||||
"Bright Purple",
|
||||
"Bright Cyan",
|
||||
"Bright White",
|
||||
],
|
||||
marker: {
|
||||
color: srgb,
|
||||
size: 12,
|
||||
},
|
||||
theta: oklch.map(c => c.h),
|
||||
r: oklch.map(c => c.c),
|
||||
}], {
|
||||
width: 418,
|
||||
height: 418,
|
||||
margin: {
|
||||
l: 40,
|
||||
r: 40,
|
||||
b: 40,
|
||||
t: 40,
|
||||
},
|
||||
paper_bgcolor: "#000",
|
||||
polar: {
|
||||
bgcolor: srgb[0],
|
||||
angularaxis: {
|
||||
color: srgb[7],
|
||||
gridcolor: srgb[8],
|
||||
},
|
||||
radialaxis: {
|
||||
color: srgb[7],
|
||||
gridcolor: srgb[8],
|
||||
range: [0, 0.4],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const theme = document.createElement("div");
|
||||
theme.appendChild(title);
|
||||
theme.appendChild(swatch);
|
||||
theme.appendChild(plot);
|
||||
|
||||
document.getElementById("container").appendChild(theme);
|
||||
});
|
||||
})()</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Maxime Pinard
|
||||
|
||||
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.
|
||||
@@ -1,17 +0,0 @@
|
||||
### Notes for Future Maintainers
|
||||
|
||||
This was originally imported by @miniksa in March 2020.
|
||||
|
||||
The provenance information (where it came from and which commit) is stored in the file `cgmanifest.json` in the same directory as this readme.
|
||||
Please update the provenance information in that file when ingesting an updated version of the dependent library.
|
||||
That provenance file is automatically read and inventoried by Microsoft systems to ensure compliance with appropriate governance standards.
|
||||
|
||||
## What should be done to update this in the future?
|
||||
|
||||
1. Go to pinam45/dynamic_bitset repository on GitHub.
|
||||
2. Take the entire contents of the include directory wholesale and drop it in the root directory here.
|
||||
3. Don't change anything about it.
|
||||
4. Validate that the license in the root of the repository didn't change and update it if so. It is sitting in the same directory as this readme.
|
||||
If it changed dramatically, ensure that it is still compatible with our license scheme. Also update the NOTICE file in the root of our repository to declare the third-party usage.
|
||||
5. Submit the pull.
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/component-detection-manifest.json",
|
||||
"Registrations": [
|
||||
{
|
||||
"component": {
|
||||
"type": "git",
|
||||
"git": {
|
||||
"repositoryUrl": "https://github.com/pinam45/dynamic_bitset",
|
||||
"commitHash": "00f2d066ce9deebf28b006636150e5a882beb83f"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Version": 1
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,26 +0,0 @@
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2016 - 2019, Kim Walisch
|
||||
Copyright (c) 2016 - 2019, Wojciech Muła
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,17 +0,0 @@
|
||||
### Notes for Future Maintainers
|
||||
|
||||
This was originally imported by @miniksa in March 2020.
|
||||
|
||||
The provenance information (where it came from and which commit) is stored in the file `cgmanifest.json` in the same directory as this readme.
|
||||
Please update the provenance information in that file when ingesting an updated version of the dependent library.
|
||||
That provenance file is automatically read and inventoried by Microsoft systems to ensure compliance with appropriate governance standards.
|
||||
|
||||
## What should be done to update this in the future?
|
||||
|
||||
1. Go to kimwalisch/libpopcnt repository on GitHub.
|
||||
2. Take the `libpopcnt.h` file.
|
||||
3. Don't change anything about it.
|
||||
4. Validate that the `LICENSE` in the root of the repository didn't change and update it if so. It is sitting in the same directory as this readme.
|
||||
If it changed dramatically, ensure that it is still compatible with our license scheme. Also update the NOTICE file in the root of our repository to declare the third-party usage.
|
||||
5. Submit the pull.
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/component-detection-manifest.json",
|
||||
"Registrations": [
|
||||
{
|
||||
"component": {
|
||||
"type": "git",
|
||||
"git": {
|
||||
"repositoryUrl": "https://github.com/kimwalisch/libpopcnt",
|
||||
"commitHash": "c49987e90e56191c399cab881ab87b5daecc9b8e"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Version": 1
|
||||
}
|
||||
@@ -1,798 +0,0 @@
|
||||
/*
|
||||
* libpopcnt.h - C/C++ library for counting the number of 1 bits (bit
|
||||
* population count) in an array as quickly as possible using
|
||||
* specialized CPU instructions i.e. POPCNT, AVX2, AVX512, NEON.
|
||||
*
|
||||
* Copyright (c) 2016 - 2020, Kim Walisch
|
||||
* Copyright (c) 2016 - 2018, Wojciech Muła
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef LIBPOPCNT_H
|
||||
#define LIBPOPCNT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef __has_builtin
|
||||
#define __has_builtin(x) 0
|
||||
#endif
|
||||
|
||||
#ifndef __has_attribute
|
||||
#define __has_attribute(x) 0
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define GNUC_PREREQ(x, y) \
|
||||
(__GNUC__ > x || (__GNUC__ == x && __GNUC_MINOR__ >= y))
|
||||
#else
|
||||
#define GNUC_PREREQ(x, y) 0
|
||||
#endif
|
||||
|
||||
#ifdef __clang__
|
||||
#define CLANG_PREREQ(x, y) \
|
||||
(__clang_major__ > x || (__clang_major__ == x && __clang_minor__ >= y))
|
||||
#else
|
||||
#define CLANG_PREREQ(x, y) 0
|
||||
#endif
|
||||
|
||||
#if (_MSC_VER < 1900) && \
|
||||
!defined(__cplusplus)
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
#if (defined(__i386__) || \
|
||||
defined(__x86_64__) || \
|
||||
defined(_M_IX86) || \
|
||||
defined(_M_X64))
|
||||
#define X86_OR_X64
|
||||
#endif
|
||||
|
||||
#if GNUC_PREREQ(4, 2) || \
|
||||
__has_builtin(__builtin_popcount)
|
||||
#define HAVE_BUILTIN_POPCOUNT
|
||||
#endif
|
||||
|
||||
#if GNUC_PREREQ(4, 2) || \
|
||||
CLANG_PREREQ(3, 0)
|
||||
#define HAVE_ASM_POPCNT
|
||||
#endif
|
||||
|
||||
#if defined(X86_OR_X64) && \
|
||||
(defined(HAVE_ASM_POPCNT) || \
|
||||
defined(_MSC_VER))
|
||||
#define HAVE_POPCNT
|
||||
#endif
|
||||
|
||||
#if defined(X86_OR_X64) && \
|
||||
GNUC_PREREQ(4, 9)
|
||||
#define HAVE_AVX2
|
||||
#endif
|
||||
|
||||
#if defined(X86_OR_X64) && \
|
||||
GNUC_PREREQ(5, 0)
|
||||
#define HAVE_AVX512
|
||||
#endif
|
||||
|
||||
#if defined(X86_OR_X64) && !defined(_M_ARM64EC)
|
||||
/* MSVC compatible compilers (Windows) */
|
||||
#if defined(_MSC_VER)
|
||||
/* clang-cl (LLVM 10 from 2020) requires /arch:AVX2 or
|
||||
* /arch:AVX512 to enable vector instructions */
|
||||
#if defined(__clang__)
|
||||
#if defined(__AVX2__)
|
||||
#define HAVE_AVX2
|
||||
#endif
|
||||
#if defined(__AVX512__)
|
||||
#define HAVE_AVX2
|
||||
#define HAVE_AVX512
|
||||
#endif
|
||||
/* MSVC 2017 or later does not require
|
||||
* /arch:AVX2 or /arch:AVX512 */
|
||||
#elif _MSC_VER >= 1910
|
||||
#define HAVE_AVX2
|
||||
#define HAVE_AVX512
|
||||
#endif
|
||||
/* Clang (Unix-like OSes) */
|
||||
#elif CLANG_PREREQ(3, 8) && \
|
||||
__has_attribute(target) && \
|
||||
(!defined(__apple_build_version__) || __apple_build_version__ >= 8000000)
|
||||
#define HAVE_AVX2
|
||||
#define HAVE_AVX512
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Only enable CPUID runtime checks if this is really
|
||||
* needed. E.g. do not enable if user has compiled
|
||||
* using -march=native on a CPU that supports AVX512.
|
||||
*/
|
||||
#if defined(X86_OR_X64) && \
|
||||
(defined(__cplusplus) || \
|
||||
defined(_MSC_VER) || \
|
||||
(GNUC_PREREQ(4, 2) || \
|
||||
__has_builtin(__sync_val_compare_and_swap))) && \
|
||||
((defined(HAVE_AVX512) && !(defined(__AVX512__) || defined(__AVX512BW__))) || \
|
||||
(defined(HAVE_AVX2) && !defined(__AVX2__)) || \
|
||||
(defined(HAVE_POPCNT) && !defined(__POPCNT__)))
|
||||
#define HAVE_CPUID
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This uses fewer arithmetic operations than any other known
|
||||
* implementation on machines with fast multiplication.
|
||||
* It uses 12 arithmetic operations, one of which is a multiply.
|
||||
* http://en.wikipedia.org/wiki/Hamming_weight#Efficient_implementation
|
||||
*/
|
||||
static inline uint64_t popcount64(uint64_t x)
|
||||
{
|
||||
uint64_t m1 = 0x5555555555555555ll;
|
||||
uint64_t m2 = 0x3333333333333333ll;
|
||||
uint64_t m4 = 0x0F0F0F0F0F0F0F0Fll;
|
||||
uint64_t h01 = 0x0101010101010101ll;
|
||||
|
||||
x -= (x >> 1) & m1;
|
||||
x = (x & m2) + ((x >> 2) & m2);
|
||||
x = (x + (x >> 4)) & m4;
|
||||
|
||||
return (x * h01) >> 56;
|
||||
}
|
||||
|
||||
#if defined(HAVE_ASM_POPCNT) && \
|
||||
defined(__x86_64__)
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
__asm__ ("popcnt %1, %0" : "=r" (x) : "0" (x));
|
||||
return x;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_ASM_POPCNT) && \
|
||||
defined(__i386__)
|
||||
|
||||
static inline uint32_t popcnt32(uint32_t x)
|
||||
{
|
||||
__asm__ ("popcnt %1, %0" : "=r" (x) : "0" (x));
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
return popcnt32((uint32_t) x) +
|
||||
popcnt32((uint32_t)(x >> 32));
|
||||
}
|
||||
|
||||
#elif defined(_MSC_VER) && \
|
||||
defined(_M_X64)
|
||||
|
||||
#include <nmmintrin.h>
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
return _mm_popcnt_u64(x);
|
||||
}
|
||||
|
||||
#elif defined(_MSC_VER) && \
|
||||
defined(_M_IX86)
|
||||
|
||||
#include <nmmintrin.h>
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
return _mm_popcnt_u32((uint32_t) x) +
|
||||
_mm_popcnt_u32((uint32_t)(x >> 32));
|
||||
}
|
||||
|
||||
/* non x86 CPUs */
|
||||
#elif defined(HAVE_BUILTIN_POPCOUNT)
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
return __builtin_popcountll(x);
|
||||
}
|
||||
|
||||
/* no hardware POPCNT,
|
||||
* use pure integer algorithm */
|
||||
#else
|
||||
|
||||
static inline uint64_t popcnt64(uint64_t x)
|
||||
{
|
||||
return popcount64(x);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_CPUID)
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <intrin.h>
|
||||
#include <immintrin.h>
|
||||
#endif
|
||||
|
||||
/* %ecx bit flags */
|
||||
#define bit_POPCNT (1 << 23)
|
||||
|
||||
/* %ebx bit flags */
|
||||
#define bit_AVX2 (1 << 5)
|
||||
#define bit_AVX512 (1 << 30)
|
||||
|
||||
/* xgetbv bit flags */
|
||||
#define XSTATE_SSE (1 << 1)
|
||||
#define XSTATE_YMM (1 << 2)
|
||||
#define XSTATE_ZMM (7 << 5)
|
||||
|
||||
static inline void run_cpuid(int eax, int ecx, int* abcd)
|
||||
{
|
||||
#if defined(_MSC_VER)
|
||||
__cpuidex(abcd, eax, ecx);
|
||||
#else
|
||||
int ebx = 0;
|
||||
int edx = 0;
|
||||
|
||||
#if defined(__i386__) && \
|
||||
defined(__PIC__)
|
||||
/* in case of PIC under 32-bit EBX cannot be clobbered */
|
||||
__asm__ ("movl %%ebx, %%edi;"
|
||||
"cpuid;"
|
||||
"xchgl %%ebx, %%edi;"
|
||||
: "=D" (ebx),
|
||||
"+a" (eax),
|
||||
"+c" (ecx),
|
||||
"=d" (edx));
|
||||
#else
|
||||
__asm__ ("cpuid;"
|
||||
: "+b" (ebx),
|
||||
"+a" (eax),
|
||||
"+c" (ecx),
|
||||
"=d" (edx));
|
||||
#endif
|
||||
|
||||
abcd[0] = eax;
|
||||
abcd[1] = ebx;
|
||||
abcd[2] = ecx;
|
||||
abcd[3] = edx;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(HAVE_AVX2) || \
|
||||
defined(HAVE_AVX512)
|
||||
|
||||
static inline int get_xcr0()
|
||||
{
|
||||
int xcr0;
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
xcr0 = (int) _xgetbv(0);
|
||||
#else
|
||||
__asm__ ("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx" );
|
||||
#endif
|
||||
|
||||
return xcr0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline int get_cpuid()
|
||||
{
|
||||
int flags = 0;
|
||||
int abcd[4];
|
||||
|
||||
run_cpuid(1, 0, abcd);
|
||||
|
||||
if ((abcd[2] & bit_POPCNT) == bit_POPCNT)
|
||||
flags |= bit_POPCNT;
|
||||
|
||||
#if defined(HAVE_AVX2) || \
|
||||
defined(HAVE_AVX512)
|
||||
|
||||
int osxsave_mask = (1 << 27);
|
||||
|
||||
/* ensure OS supports extended processor state management */
|
||||
if ((abcd[2] & osxsave_mask) != osxsave_mask)
|
||||
return 0;
|
||||
|
||||
int ymm_mask = XSTATE_SSE | XSTATE_YMM;
|
||||
int zmm_mask = XSTATE_SSE | XSTATE_YMM | XSTATE_ZMM;
|
||||
|
||||
int xcr0 = get_xcr0();
|
||||
|
||||
if ((xcr0 & ymm_mask) == ymm_mask)
|
||||
{
|
||||
run_cpuid(7, 0, abcd);
|
||||
|
||||
if ((abcd[1] & bit_AVX2) == bit_AVX2)
|
||||
flags |= bit_AVX2;
|
||||
|
||||
if ((xcr0 & zmm_mask) == zmm_mask)
|
||||
{
|
||||
if ((abcd[1] & bit_AVX512) == bit_AVX512)
|
||||
flags |= bit_AVX512;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
#endif /* cpuid */
|
||||
|
||||
#if defined(HAVE_AVX2)
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx2")))
|
||||
#endif
|
||||
static inline void CSA256(__m256i* h, __m256i* l, __m256i a, __m256i b, __m256i c)
|
||||
{
|
||||
__m256i u = _mm256_xor_si256(a, b);
|
||||
*h = _mm256_or_si256(_mm256_and_si256(a, b), _mm256_and_si256(u, c));
|
||||
*l = _mm256_xor_si256(u, c);
|
||||
}
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx2")))
|
||||
#endif
|
||||
static inline __m256i popcnt256(__m256i v)
|
||||
{
|
||||
__m256i lookup1 = _mm256_setr_epi8(
|
||||
4, 5, 5, 6, 5, 6, 6, 7,
|
||||
5, 6, 6, 7, 6, 7, 7, 8,
|
||||
4, 5, 5, 6, 5, 6, 6, 7,
|
||||
5, 6, 6, 7, 6, 7, 7, 8
|
||||
);
|
||||
|
||||
__m256i lookup2 = _mm256_setr_epi8(
|
||||
4, 3, 3, 2, 3, 2, 2, 1,
|
||||
3, 2, 2, 1, 2, 1, 1, 0,
|
||||
4, 3, 3, 2, 3, 2, 2, 1,
|
||||
3, 2, 2, 1, 2, 1, 1, 0
|
||||
);
|
||||
|
||||
__m256i low_mask = _mm256_set1_epi8(0x0f);
|
||||
__m256i lo = _mm256_and_si256(v, low_mask);
|
||||
__m256i hi = _mm256_and_si256(_mm256_srli_epi16(v, 4), low_mask);
|
||||
__m256i popcnt1 = _mm256_shuffle_epi8(lookup1, lo);
|
||||
__m256i popcnt2 = _mm256_shuffle_epi8(lookup2, hi);
|
||||
|
||||
return _mm256_sad_epu8(popcnt1, popcnt2);
|
||||
}
|
||||
|
||||
/*
|
||||
* AVX2 Harley-Seal popcount (4th iteration).
|
||||
* The algorithm is based on the paper "Faster Population Counts
|
||||
* using AVX2 Instructions" by Daniel Lemire, Nathan Kurz and
|
||||
* Wojciech Mula (23 Nov 2016).
|
||||
* @see https://arxiv.org/abs/1611.07612
|
||||
*/
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx2")))
|
||||
#endif
|
||||
static inline uint64_t popcnt_avx2(const __m256i* ptr, uint64_t size)
|
||||
{
|
||||
__m256i cnt = _mm256_setzero_si256();
|
||||
__m256i ones = _mm256_setzero_si256();
|
||||
__m256i twos = _mm256_setzero_si256();
|
||||
__m256i fours = _mm256_setzero_si256();
|
||||
__m256i eights = _mm256_setzero_si256();
|
||||
__m256i sixteens = _mm256_setzero_si256();
|
||||
__m256i twosA, twosB, foursA, foursB, eightsA, eightsB;
|
||||
|
||||
uint64_t i = 0;
|
||||
uint64_t limit = size - size % 16;
|
||||
uint64_t* cnt64;
|
||||
|
||||
for(; i < limit; i += 16)
|
||||
{
|
||||
CSA256(&twosA, &ones, ones, _mm256_loadu_si256(ptr + i + 0), _mm256_loadu_si256(ptr + i + 1));
|
||||
CSA256(&twosB, &ones, ones, _mm256_loadu_si256(ptr + i + 2), _mm256_loadu_si256(ptr + i + 3));
|
||||
CSA256(&foursA, &twos, twos, twosA, twosB);
|
||||
CSA256(&twosA, &ones, ones, _mm256_loadu_si256(ptr + i + 4), _mm256_loadu_si256(ptr + i + 5));
|
||||
CSA256(&twosB, &ones, ones, _mm256_loadu_si256(ptr + i + 6), _mm256_loadu_si256(ptr + i + 7));
|
||||
CSA256(&foursB, &twos, twos, twosA, twosB);
|
||||
CSA256(&eightsA, &fours, fours, foursA, foursB);
|
||||
CSA256(&twosA, &ones, ones, _mm256_loadu_si256(ptr + i + 8), _mm256_loadu_si256(ptr + i + 9));
|
||||
CSA256(&twosB, &ones, ones, _mm256_loadu_si256(ptr + i + 10), _mm256_loadu_si256(ptr + i + 11));
|
||||
CSA256(&foursA, &twos, twos, twosA, twosB);
|
||||
CSA256(&twosA, &ones, ones, _mm256_loadu_si256(ptr + i + 12), _mm256_loadu_si256(ptr + i + 13));
|
||||
CSA256(&twosB, &ones, ones, _mm256_loadu_si256(ptr + i + 14), _mm256_loadu_si256(ptr + i + 15));
|
||||
CSA256(&foursB, &twos, twos, twosA, twosB);
|
||||
CSA256(&eightsB, &fours, fours, foursA, foursB);
|
||||
CSA256(&sixteens, &eights, eights, eightsA, eightsB);
|
||||
|
||||
cnt = _mm256_add_epi64(cnt, popcnt256(sixteens));
|
||||
}
|
||||
|
||||
cnt = _mm256_slli_epi64(cnt, 4);
|
||||
cnt = _mm256_add_epi64(cnt, _mm256_slli_epi64(popcnt256(eights), 3));
|
||||
cnt = _mm256_add_epi64(cnt, _mm256_slli_epi64(popcnt256(fours), 2));
|
||||
cnt = _mm256_add_epi64(cnt, _mm256_slli_epi64(popcnt256(twos), 1));
|
||||
cnt = _mm256_add_epi64(cnt, popcnt256(ones));
|
||||
|
||||
for(; i < size; i++)
|
||||
cnt = _mm256_add_epi64(cnt, popcnt256(_mm256_loadu_si256(ptr + i)));
|
||||
|
||||
cnt64 = (uint64_t*) &cnt;
|
||||
|
||||
return cnt64[0] +
|
||||
cnt64[1] +
|
||||
cnt64[2] +
|
||||
cnt64[3];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_AVX512)
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx512bw")))
|
||||
#endif
|
||||
static inline __m512i popcnt512(__m512i v)
|
||||
{
|
||||
__m512i m1 = _mm512_set1_epi8(0x55);
|
||||
__m512i m2 = _mm512_set1_epi8(0x33);
|
||||
__m512i m4 = _mm512_set1_epi8(0x0F);
|
||||
__m512i vm = _mm512_and_si512(_mm512_srli_epi16(v, 1), m1);
|
||||
__m512i t1 = _mm512_sub_epi8(v, vm);
|
||||
__m512i tm = _mm512_and_si512(t1, m2);
|
||||
__m512i tm2 = _mm512_and_si512(_mm512_srli_epi16(t1, 2), m2);
|
||||
__m512i t2 = _mm512_add_epi8(tm, tm2);
|
||||
__m512i tt = _mm512_add_epi8(t2, _mm512_srli_epi16(t2, 4));
|
||||
__m512i t3 = _mm512_and_si512(tt, m4);
|
||||
|
||||
return _mm512_sad_epu8(t3, _mm512_setzero_si512());
|
||||
}
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx512bw")))
|
||||
#endif
|
||||
static inline void CSA512(__m512i* h, __m512i* l, __m512i a, __m512i b, __m512i c)
|
||||
{
|
||||
*l = _mm512_ternarylogic_epi32(c, b, a, 0x96);
|
||||
*h = _mm512_ternarylogic_epi32(c, b, a, 0xe8);
|
||||
}
|
||||
|
||||
/*
|
||||
* AVX512 Harley-Seal popcount (4th iteration).
|
||||
* The algorithm is based on the paper "Faster Population Counts
|
||||
* using AVX2 Instructions" by Daniel Lemire, Nathan Kurz and
|
||||
* Wojciech Mula (23 Nov 2016).
|
||||
* @see https://arxiv.org/abs/1611.07612
|
||||
*/
|
||||
#if !defined(_MSC_VER)
|
||||
__attribute__ ((target ("avx512bw")))
|
||||
#endif
|
||||
static inline uint64_t popcnt_avx512(const __m512i* ptr, const uint64_t size)
|
||||
{
|
||||
__m512i cnt = _mm512_setzero_si512();
|
||||
__m512i ones = _mm512_setzero_si512();
|
||||
__m512i twos = _mm512_setzero_si512();
|
||||
__m512i fours = _mm512_setzero_si512();
|
||||
__m512i eights = _mm512_setzero_si512();
|
||||
__m512i sixteens = _mm512_setzero_si512();
|
||||
__m512i twosA, twosB, foursA, foursB, eightsA, eightsB;
|
||||
|
||||
uint64_t i = 0;
|
||||
uint64_t limit = size - size % 16;
|
||||
uint64_t* cnt64;
|
||||
|
||||
for(; i < limit; i += 16)
|
||||
{
|
||||
CSA512(&twosA, &ones, ones, _mm512_loadu_si512(ptr + i + 0), _mm512_loadu_si512(ptr + i + 1));
|
||||
CSA512(&twosB, &ones, ones, _mm512_loadu_si512(ptr + i + 2), _mm512_loadu_si512(ptr + i + 3));
|
||||
CSA512(&foursA, &twos, twos, twosA, twosB);
|
||||
CSA512(&twosA, &ones, ones, _mm512_loadu_si512(ptr + i + 4), _mm512_loadu_si512(ptr + i + 5));
|
||||
CSA512(&twosB, &ones, ones, _mm512_loadu_si512(ptr + i + 6), _mm512_loadu_si512(ptr + i + 7));
|
||||
CSA512(&foursB, &twos, twos, twosA, twosB);
|
||||
CSA512(&eightsA, &fours, fours, foursA, foursB);
|
||||
CSA512(&twosA, &ones, ones, _mm512_loadu_si512(ptr + i + 8), _mm512_loadu_si512(ptr + i + 9));
|
||||
CSA512(&twosB, &ones, ones, _mm512_loadu_si512(ptr + i + 10), _mm512_loadu_si512(ptr + i + 11));
|
||||
CSA512(&foursA, &twos, twos, twosA, twosB);
|
||||
CSA512(&twosA, &ones, ones, _mm512_loadu_si512(ptr + i + 12), _mm512_loadu_si512(ptr + i + 13));
|
||||
CSA512(&twosB, &ones, ones, _mm512_loadu_si512(ptr + i + 14), _mm512_loadu_si512(ptr + i + 15));
|
||||
CSA512(&foursB, &twos, twos, twosA, twosB);
|
||||
CSA512(&eightsB, &fours, fours, foursA, foursB);
|
||||
CSA512(&sixteens, &eights, eights, eightsA, eightsB);
|
||||
|
||||
cnt = _mm512_add_epi64(cnt, popcnt512(sixteens));
|
||||
}
|
||||
|
||||
cnt = _mm512_slli_epi64(cnt, 4);
|
||||
cnt = _mm512_add_epi64(cnt, _mm512_slli_epi64(popcnt512(eights), 3));
|
||||
cnt = _mm512_add_epi64(cnt, _mm512_slli_epi64(popcnt512(fours), 2));
|
||||
cnt = _mm512_add_epi64(cnt, _mm512_slli_epi64(popcnt512(twos), 1));
|
||||
cnt = _mm512_add_epi64(cnt, popcnt512(ones));
|
||||
|
||||
for(; i < size; i++)
|
||||
cnt = _mm512_add_epi64(cnt, popcnt512(_mm512_loadu_si512(ptr + i)));
|
||||
|
||||
cnt64 = (uint64_t*) &cnt;
|
||||
|
||||
return cnt64[0] +
|
||||
cnt64[1] +
|
||||
cnt64[2] +
|
||||
cnt64[3] +
|
||||
cnt64[4] +
|
||||
cnt64[5] +
|
||||
cnt64[6] +
|
||||
cnt64[7];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* x86 CPUs */
|
||||
#if defined(X86_OR_X64)
|
||||
|
||||
/*
|
||||
* Count the number of 1 bits in the data array
|
||||
* @data: An array
|
||||
* @size: Size of data in bytes
|
||||
*/
|
||||
static inline uint64_t popcnt(const void* data, uint64_t size)
|
||||
{
|
||||
uint64_t i = 0;
|
||||
uint64_t cnt = 0;
|
||||
const uint8_t* ptr = (const uint8_t*) data;
|
||||
|
||||
/*
|
||||
* CPUID runtime checks are only enabled if this is needed.
|
||||
* E.g. CPUID is disabled when a user compiles his
|
||||
* code using -march=native on a CPU with AVX512.
|
||||
*/
|
||||
#if defined(HAVE_CPUID)
|
||||
#if defined(__cplusplus)
|
||||
/* C++11 thread-safe singleton */
|
||||
static const int cpuid = get_cpuid();
|
||||
#else
|
||||
static int cpuid_ = -1;
|
||||
int cpuid = cpuid_;
|
||||
if (cpuid == -1)
|
||||
{
|
||||
cpuid = get_cpuid();
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
_InterlockedCompareExchange(&cpuid_, cpuid, -1);
|
||||
#else
|
||||
__sync_val_compare_and_swap(&cpuid_, -1, cpuid);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_AVX512)
|
||||
#if defined(__AVX512__) || defined(__AVX512BW__)
|
||||
/* AVX512 requires arrays >= 1024 bytes */
|
||||
if (i + 1024 <= size)
|
||||
#else
|
||||
if ((cpuid & bit_AVX512) &&
|
||||
i + 1024 <= size)
|
||||
#endif
|
||||
{
|
||||
const __m512i* ptr512 = (const __m512i*)(ptr + i);
|
||||
cnt += popcnt_avx512(ptr512, (size - i) / 64);
|
||||
i = size - size % 64;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_AVX2)
|
||||
#if defined(__AVX2__)
|
||||
/* AVX2 requires arrays >= 512 bytes */
|
||||
if (i + 512 <= size)
|
||||
#else
|
||||
if ((cpuid & bit_AVX2) &&
|
||||
i + 512 <= size)
|
||||
#endif
|
||||
{
|
||||
const __m256i* ptr256 = (const __m256i*)(ptr + i);
|
||||
cnt += popcnt_avx2(ptr256, (size - i) / 32);
|
||||
i = size - size % 32;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_POPCNT)
|
||||
/*
|
||||
* The user has compiled without -mpopcnt.
|
||||
* Unfortunately the MSVC compiler does not have
|
||||
* a POPCNT macro so we cannot get rid of the
|
||||
* runtime check for MSVC.
|
||||
*/
|
||||
#if !defined(__POPCNT__)
|
||||
if (cpuid & bit_POPCNT)
|
||||
#endif
|
||||
{
|
||||
/* We use unaligned memory accesses here to improve performance */
|
||||
for (; i < size - size % 8; i += 8)
|
||||
cnt += popcnt64(*(const uint64_t*)(ptr + i));
|
||||
for (; i < size; i++)
|
||||
cnt += popcnt64(ptr[i]);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_POPCNT) || \
|
||||
!defined(__POPCNT__)
|
||||
/*
|
||||
* Pure integer popcount algorithm.
|
||||
* We use unaligned memory accesses here to improve performance.
|
||||
*/
|
||||
for (; i < size - size % 8; i += 8)
|
||||
cnt += popcount64(*(const uint64_t*)(ptr + i));
|
||||
|
||||
if (i < size)
|
||||
{
|
||||
uint64_t val = 0;
|
||||
size_t bytes = (size_t)(size - i);
|
||||
memcpy(&val, &ptr[i], bytes);
|
||||
cnt += popcount64(val);
|
||||
}
|
||||
|
||||
return cnt;
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(__ARM_NEON) || \
|
||||
defined(__aarch64__)
|
||||
|
||||
#include <arm_neon.h>
|
||||
|
||||
static inline uint64x2_t vpadalq(uint64x2_t sum, uint8x16_t t)
|
||||
{
|
||||
return vpadalq_u32(sum, vpaddlq_u16(vpaddlq_u8(t)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Count the number of 1 bits in the data array
|
||||
* @data: An array
|
||||
* @size: Size of data in bytes
|
||||
*/
|
||||
static inline uint64_t popcnt(const void* data, uint64_t size)
|
||||
{
|
||||
uint64_t i = 0;
|
||||
uint64_t cnt = 0;
|
||||
uint64_t chunk_size = 64;
|
||||
const uint8_t* ptr = (const uint8_t*) data;
|
||||
|
||||
if (size >= chunk_size)
|
||||
{
|
||||
uint64_t iters = size / chunk_size;
|
||||
uint64x2_t sum = vcombine_u64(vcreate_u64(0), vcreate_u64(0));
|
||||
uint8x16_t zero = vcombine_u8(vcreate_u8(0), vcreate_u8(0));
|
||||
|
||||
do
|
||||
{
|
||||
uint8x16_t t0 = zero;
|
||||
uint8x16_t t1 = zero;
|
||||
uint8x16_t t2 = zero;
|
||||
uint8x16_t t3 = zero;
|
||||
|
||||
/*
|
||||
* After every 31 iterations we need to add the
|
||||
* temporary sums (t0, t1, t2, t3) to the total sum.
|
||||
* We must ensure that the temporary sums <= 255
|
||||
* and 31 * 8 bits = 248 which is OK.
|
||||
*/
|
||||
uint64_t limit = (i + 31 < iters) ? i + 31 : iters;
|
||||
|
||||
/* Each iteration processes 64 bytes */
|
||||
for (; i < limit; i++)
|
||||
{
|
||||
uint8x16x4_t input = vld4q_u8(ptr);
|
||||
ptr += chunk_size;
|
||||
|
||||
t0 = vaddq_u8(t0, vcntq_u8(input.val[0]));
|
||||
t1 = vaddq_u8(t1, vcntq_u8(input.val[1]));
|
||||
t2 = vaddq_u8(t2, vcntq_u8(input.val[2]));
|
||||
t3 = vaddq_u8(t3, vcntq_u8(input.val[3]));
|
||||
}
|
||||
|
||||
sum = vpadalq(sum, t0);
|
||||
sum = vpadalq(sum, t1);
|
||||
sum = vpadalq(sum, t2);
|
||||
sum = vpadalq(sum, t3);
|
||||
}
|
||||
while (i < iters);
|
||||
|
||||
i = 0;
|
||||
size %= chunk_size;
|
||||
|
||||
uint64_t tmp[2];
|
||||
vst1q_u64(tmp, sum);
|
||||
cnt += tmp[0];
|
||||
cnt += tmp[1];
|
||||
}
|
||||
|
||||
#if defined(__ARM_FEATURE_UNALIGNED)
|
||||
/* We use unaligned memory accesses here to improve performance */
|
||||
for (; i < size - size % 8; i += 8)
|
||||
cnt += popcnt64(*(const uint64_t*)(ptr + i));
|
||||
#else
|
||||
if (i + 8 <= size)
|
||||
{
|
||||
/* Align memory to an 8 byte boundary */
|
||||
for (; (uintptr_t)(ptr + i) % 8; i++)
|
||||
cnt += popcnt64(ptr[i]);
|
||||
for (; i < size - size % 8; i += 8)
|
||||
cnt += popcnt64(*(const uint64_t*)(ptr + i));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i < size)
|
||||
{
|
||||
uint64_t val = 0;
|
||||
size_t bytes = (size_t)(size - i);
|
||||
memcpy(&val, &ptr[i], bytes);
|
||||
cnt += popcount64(val);
|
||||
}
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/* all other CPUs */
|
||||
#else
|
||||
|
||||
/*
|
||||
* Count the number of 1 bits in the data array
|
||||
* @data: An array
|
||||
* @size: Size of data in bytes
|
||||
*/
|
||||
static inline uint64_t popcnt(const void* data, uint64_t size)
|
||||
{
|
||||
uint64_t i = 0;
|
||||
uint64_t cnt = 0;
|
||||
const uint8_t* ptr = (const uint8_t*) data;
|
||||
|
||||
if (size >= 8)
|
||||
{
|
||||
/*
|
||||
* Since we don't know whether this CPU architecture
|
||||
* supports unaligned memory accesses we align
|
||||
* memory to an 8 byte boundary.
|
||||
*/
|
||||
for (; (uintptr_t)(ptr + i) % 8; i++)
|
||||
cnt += popcnt64(ptr[i]);
|
||||
for (; i < size - size % 8; i += 8)
|
||||
cnt += popcnt64(*(const uint64_t*)(ptr + i));
|
||||
}
|
||||
|
||||
for (; i < size; i++)
|
||||
cnt += popcnt64(ptr[i]);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LIBPOPCNT_H */
|
||||
@@ -135,17 +135,5 @@
|
||||
</Target>
|
||||
<!-- **END VC LIBS HACK** -->
|
||||
|
||||
<!-- This is required to get the package dependency in the AppXManifest. -->
|
||||
<Import Project="..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets'))" />
|
||||
</Target>
|
||||
|
||||
|
||||
|
||||
|
||||
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
|
||||
</Project>
|
||||
|
||||
@@ -20,8 +20,9 @@
|
||||
|
||||
<PropertyGroup Label="NuGet Dependencies">
|
||||
<TerminalCppWinrt>true</TerminalCppWinrt>
|
||||
<TerminalMUX>true</TerminalMUX>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(SolutionDir)\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(OpenConsoleDir)src\common.nugetversions.props" />
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
|
||||
|
||||
@@ -156,14 +157,6 @@
|
||||
<!-- This -must- go after cppwinrt.build.post.props because that includes many VS-provided props including appcontainer.common.props, which stomps on what cppwinrt.targets did. -->
|
||||
<Import Project="$(OpenConsoleDir)src\common.nugetversions.targets" />
|
||||
|
||||
<Import Project="$(OpenConsoleDir)packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('$(OpenConsoleDir)packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('$(OpenConsoleDir)packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(OpenConsoleDir)\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets'))" />
|
||||
</Target>
|
||||
|
||||
<!--
|
||||
By default, the PRI file will contain resource paths beginning with the
|
||||
project name. Since we enabled XBF embedding, this *also* includes App.xbf.
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="NuGet Dependencies">
|
||||
<TerminalCppWinrt>true</TerminalCppWinrt>
|
||||
<TerminalMUX>true</TerminalMUX>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(SolutionDir)\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(OpenConsoleDir)src\common.nugetversions.props" />
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
|
||||
<!-- ========================= XAML files ======================== -->
|
||||
@@ -90,14 +91,6 @@
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<Import Project="$(OpenConsoleDir)packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('$(OpenConsoleDir)packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('$(OpenConsoleDir)\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(OpenConsoleDir)\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets'))" />
|
||||
</Target>
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(OpenConsoleDir)\dep\jsoncpp\json;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Toolkit.Win32.UI.XamlApplication" version="6.1.3" targetFramework="native" />
|
||||
<package id="Microsoft.UI.Xaml" version="2.7.3" targetFramework="native" />
|
||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.230207.1" targetFramework="native" />
|
||||
<package id="Microsoft.UI.Xaml" version="2.8.4" targetFramework="native" />
|
||||
<package id="Microsoft.Web.WebView2" version="1.0.1661.34" targetFramework="native" />
|
||||
</packages>
|
||||
|
||||
@@ -17,10 +17,9 @@
|
||||
|
||||
<PropertyGroup Label="NuGet Dependencies">
|
||||
<TerminalCppWinrt>true</TerminalCppWinrt>
|
||||
<TerminalThemeHelpers>true</TerminalThemeHelpers>
|
||||
<TerminalMUX>true</TerminalMUX>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(SolutionDir)\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||||
<Import Project="$(OpenConsoleDir)src\common.nugetversions.props" />
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
|
||||
|
||||
@@ -142,14 +141,6 @@
|
||||
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
|
||||
|
||||
<Import Project="..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.UI.Xaml.2.7.3\build\native\Microsoft.UI.Xaml.targets'))" />
|
||||
</Target>
|
||||
|
||||
<!-- Override GetPackagingOutputs to roll up all our dependencies.
|
||||
This ensures that when the WAP packaging project asks what files go into
|
||||
the package, we tell it.
|
||||
@@ -225,4 +216,3 @@
|
||||
<!-- This -must- go after cppwinrt.build.post.props because that includes many VS-provided props including appcontainer.common.props, which stomps on what cppwinrt.targets did. -->
|
||||
<Import Project="$(OpenConsoleDir)src\common.nugetversions.targets" />
|
||||
</Project>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Windows.CppWinRT" version="2.0.230207.1" targetFramework="native" />
|
||||
<package id="Microsoft.Toolkit.Win32.UI.XamlApplication" version="6.1.3" targetFramework="native" />
|
||||
<package id="Microsoft.UI.Xaml" version="2.7.3" targetFramework="native" />
|
||||
<package id="Microsoft.UI.Xaml" version="2.8.4" targetFramework="native" />
|
||||
<package id="Microsoft.Web.WebView2" version="1.0.1661.34" targetFramework="native" />
|
||||
</packages>
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Host" Name="fe1ff234-1f09-50a8-d38d-c44fab43e818"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Server" Name="1A541C01-589A-496E-85A7-A9E02170166D"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.VirtualTerminal.Parser" Name="c9ba2a84-d3ca-5e19-2bd6-776a0910cb9d"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Render.VtEngine" Name="c9ba2a95-d3ca-5e19-2bd6-776a0910cb9d"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.UIA" Name="e7ebce59-2161-572d-b263-2f16a6afb9e5"/>
|
||||
<!-- Now define some profiles. We'll call them by ID when collecting. Also, the Base is where it is inheriting from and is a .wprpi file built... -->
|
||||
<!-- ... into WPR automatically. Go look in the WPR install directory or in the documentation to find it. -->
|
||||
@@ -66,7 +65,6 @@
|
||||
<EventProviderId Value="EventProvider-Microsoft.Windows.Console.Host"/>
|
||||
<EventProviderId Value="EventProvider-Microsoft.Windows.Console.Server"/>
|
||||
<EventProviderId Value="EventProvider-Microsoft.Windows.Console.VirtualTerminal.Parser"/>
|
||||
<EventProviderId Value="EventProvider-Microsoft.Windows.Console.Render.VtEngine"/>
|
||||
<EventProviderId Value="EventProvider-Microsoft.Windows.Console.UIA"/>
|
||||
</EventProviders>
|
||||
</EventCollectorId>
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Host" Name="fe1ff234-1f09-50a8-d38d-c44fab43e818"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Server" Name="1A541C01-589A-496E-85A7-A9E02170166D"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.VirtualTerminal.Parser" Name="c9ba2a84-d3ca-5e19-2bd6-776a0910cb9d"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.Render.VtEngine" Name="c9ba2a95-d3ca-5e19-2bd6-776a0910cb9d"/>
|
||||
<EventProvider Id="EventProvider-Microsoft.Windows.Console.UIA" Name="e7ebce59-2161-572d-b263-2f16a6afb9e5"/>
|
||||
|
||||
<!-- Profile for General Terminal logging -->
|
||||
|
||||
@@ -7,11 +7,27 @@
|
||||
#include "Row.hpp"
|
||||
#include "textBuffer.hpp"
|
||||
|
||||
static std::atomic<uint64_t> s_revision{ 0 };
|
||||
|
||||
ImageSlice::ImageSlice(const til::size cellSize) noexcept :
|
||||
_cellSize{ cellSize }
|
||||
{
|
||||
}
|
||||
|
||||
void ImageSlice::BumpRevision() noexcept
|
||||
{
|
||||
// Avoid setting the revision to 0. This allows the renderer to use 0 as a sentinel value.
|
||||
do
|
||||
{
|
||||
_revision = s_revision.fetch_add(1, std::memory_order_relaxed);
|
||||
} while (_revision == 0);
|
||||
}
|
||||
|
||||
uint64_t ImageSlice::Revision() const noexcept
|
||||
{
|
||||
return _revision;
|
||||
}
|
||||
|
||||
til::size ImageSlice::CellSize() const noexcept
|
||||
{
|
||||
return _cellSize;
|
||||
@@ -49,7 +65,6 @@ RGBQUAD* ImageSlice::MutablePixels(const til::CoordType columnBegin, const til::
|
||||
_columnBegin = existingData ? std::min(_columnBegin, columnBegin) : columnBegin;
|
||||
_columnEnd = existingData ? std::max(_columnEnd, columnEnd) : columnEnd;
|
||||
_pixelWidth = (_columnEnd - _columnBegin) * _cellSize.width;
|
||||
_pixelWidth = (_pixelWidth + 3) & ~3; // Renderer needs this as a multiple of 4
|
||||
const auto bufferSize = _pixelWidth * _cellSize.height;
|
||||
if (existingData)
|
||||
{
|
||||
@@ -108,9 +123,8 @@ void ImageSlice::CopyBlock(const TextBuffer& srcBuffer, const til::rect srcRect,
|
||||
|
||||
void ImageSlice::CopyRow(const ROW& srcRow, ROW& dstRow)
|
||||
{
|
||||
const auto& srcSlice = srcRow.GetImageSlice();
|
||||
auto& dstSlice = dstRow.GetMutableImageSlice();
|
||||
dstSlice = srcSlice ? std::make_unique<ImageSlice>(*srcSlice) : nullptr;
|
||||
const auto srcSlice = srcRow.GetImageSlice();
|
||||
dstRow.SetImageSlice(srcSlice ? std::make_unique<ImageSlice>(*srcSlice) : nullptr);
|
||||
}
|
||||
|
||||
void ImageSlice::CopyCells(const ROW& srcRow, const til::CoordType srcColumn, ROW& dstRow, const til::CoordType dstColumnBegin, const til::CoordType dstColumnEnd)
|
||||
@@ -119,24 +133,25 @@ void ImageSlice::CopyCells(const ROW& srcRow, const til::CoordType srcColumn, RO
|
||||
// a blank image into the destination, which is the same thing as an erase.
|
||||
// Also if the line renditions are different, there's no meaningful way to
|
||||
// copy the image content, so we also just treat that as an erase.
|
||||
const auto& srcSlice = srcRow.GetImageSlice();
|
||||
const auto srcSlice = srcRow.GetImageSlice();
|
||||
if (!srcSlice || srcRow.GetLineRendition() != dstRow.GetLineRendition()) [[likely]]
|
||||
{
|
||||
ImageSlice::EraseCells(dstRow, dstColumnBegin, dstColumnEnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto& dstSlice = dstRow.GetMutableImageSlice();
|
||||
auto dstSlice = dstRow.GetMutableImageSlice();
|
||||
if (!dstSlice)
|
||||
{
|
||||
dstSlice = std::make_unique<ImageSlice>(srcSlice->CellSize());
|
||||
dstSlice = dstRow.SetImageSlice(std::make_unique<ImageSlice>(srcSlice->CellSize()));
|
||||
__assume(dstSlice != nullptr);
|
||||
}
|
||||
const auto scale = srcRow.GetLineRendition() != LineRendition::SingleWidth ? 1 : 0;
|
||||
if (dstSlice->_copyCells(*srcSlice, srcColumn << scale, dstColumnBegin << scale, dstColumnEnd << scale))
|
||||
{
|
||||
// If _copyCells returns true, that means the destination was
|
||||
// completely erased, so we can delete this slice.
|
||||
dstSlice = nullptr;
|
||||
dstRow.SetImageSlice(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -203,7 +218,7 @@ void ImageSlice::EraseCells(TextBuffer& buffer, const til::point at, const size_
|
||||
|
||||
void ImageSlice::EraseCells(ROW& row, const til::CoordType columnBegin, const til::CoordType columnEnd)
|
||||
{
|
||||
auto& imageSlice = row.GetMutableImageSlice();
|
||||
const auto imageSlice = row.GetMutableImageSlice();
|
||||
if (imageSlice) [[unlikely]]
|
||||
{
|
||||
const auto scale = row.GetLineRendition() != LineRendition::SingleWidth ? 1 : 0;
|
||||
@@ -211,7 +226,7 @@ void ImageSlice::EraseCells(ROW& row, const til::CoordType columnBegin, const ti
|
||||
{
|
||||
// If _eraseCells returns true, that means the image was
|
||||
// completely erased, so we can delete this slice.
|
||||
imageSlice = nullptr;
|
||||
row.SetImageSlice(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,9 @@ public:
|
||||
ImageSlice(const ImageSlice& rhs) = default;
|
||||
ImageSlice(const til::size cellSize) noexcept;
|
||||
|
||||
void BumpRevision() noexcept;
|
||||
uint64_t Revision() const noexcept;
|
||||
|
||||
til::size CellSize() const noexcept;
|
||||
til::CoordType ColumnOffset() const noexcept;
|
||||
til::CoordType PixelWidth() const noexcept;
|
||||
@@ -45,6 +48,7 @@ private:
|
||||
bool _copyCells(const ImageSlice& srcSlice, const til::CoordType srcColumn, const til::CoordType dstColumnBegin, const til::CoordType dstColumnEnd);
|
||||
bool _eraseCells(const til::CoordType columnBegin, const til::CoordType columnEnd);
|
||||
|
||||
uint64_t _revision = 0;
|
||||
til::size _cellSize;
|
||||
std::vector<RGBQUAD> _pixelBuffer;
|
||||
til::CoordType _columnBegin = 0;
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include "../../types/inc/convert.hpp"
|
||||
#include "../../inc/conattrs.hpp"
|
||||
|
||||
// BODGY: Misdiagnosis in MSVC 17.11: Referencing global constants in the member
|
||||
// initializer list leads to this warning. Can probably be removed in the future.
|
||||
#pragma warning(disable : 26493) // Don't use C-style casts (type.4).)
|
||||
|
||||
static constexpr TextAttribute InvalidTextAttribute{ INVALID_COLOR, INVALID_COLOR };
|
||||
|
||||
OutputCell::OutputCell() noexcept :
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
#include "../../types/inc/GlyphWidth.hpp"
|
||||
#include "../../inc/conattrs.hpp"
|
||||
|
||||
// BODGY: Misdiagnosis in MSVC 17.11: Referencing global constants in the member
|
||||
// initializer list leads to this warning. Can probably be removed in the future.
|
||||
#pragma warning(disable : 26493) // Don't use C-style casts (type.4).)
|
||||
|
||||
static constexpr TextAttribute InvalidTextAttribute{ INVALID_COLOR, INVALID_COLOR, INVALID_COLOR };
|
||||
|
||||
// Routine Description:
|
||||
@@ -274,7 +278,7 @@ OutputCellIterator& OutputCellIterator::operator++()
|
||||
}
|
||||
case Mode::CharInfo:
|
||||
{
|
||||
// Walk forward by one because charinfos are just the legacy version of cells and prealigned to columns
|
||||
// Walk forward by one because char infos are just the legacy version of cells and prealigned to columns
|
||||
_pos++;
|
||||
if (operator bool())
|
||||
{
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
|
||||
#include "OutputCellView.hpp"
|
||||
|
||||
// BODGY: Misdiagnosis in MSVC 17.11: Referencing global constants in the member
|
||||
// initializer list leads to this warning. Can probably be removed in the future.
|
||||
#pragma warning(disable : 26493) // Don't use C-style casts (type.4).)
|
||||
|
||||
// Routine Description:
|
||||
// - Constructs a read-only view of data formatted as a single output buffer cell
|
||||
// Arguments:
|
||||
|
||||
@@ -965,14 +965,26 @@ std::vector<uint16_t> ROW::GetHyperlinks() const
|
||||
return ids;
|
||||
}
|
||||
|
||||
const ImageSlice::Pointer& ROW::GetImageSlice() const noexcept
|
||||
ImageSlice* ROW::SetImageSlice(ImageSlice::Pointer imageSlice) noexcept
|
||||
{
|
||||
return _imageSlice;
|
||||
_imageSlice = std::move(imageSlice);
|
||||
return GetMutableImageSlice();
|
||||
}
|
||||
|
||||
ImageSlice::Pointer& ROW::GetMutableImageSlice() noexcept
|
||||
const ImageSlice* ROW::GetImageSlice() const noexcept
|
||||
{
|
||||
return _imageSlice;
|
||||
return _imageSlice.get();
|
||||
}
|
||||
|
||||
ImageSlice* ROW::GetMutableImageSlice() noexcept
|
||||
{
|
||||
const auto ptr = _imageSlice.get();
|
||||
if (!ptr)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
ptr->BumpRevision();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
uint16_t ROW::size() const noexcept
|
||||
|
||||
@@ -152,8 +152,9 @@ public:
|
||||
const til::small_rle<TextAttribute, uint16_t, 1>& Attributes() const noexcept;
|
||||
TextAttribute GetAttrByColumn(til::CoordType column) const;
|
||||
std::vector<uint16_t> GetHyperlinks() const;
|
||||
const ImageSlice::Pointer& GetImageSlice() const noexcept;
|
||||
ImageSlice::Pointer& GetMutableImageSlice() noexcept;
|
||||
ImageSlice* SetImageSlice(ImageSlice::Pointer imageSlice) noexcept;
|
||||
const ImageSlice* GetImageSlice() const noexcept;
|
||||
ImageSlice* GetMutableImageSlice() noexcept;
|
||||
uint16_t size() const noexcept;
|
||||
til::CoordType GetLastNonSpaceColumn() const noexcept;
|
||||
til::CoordType MeasureLeft() const noexcept;
|
||||
@@ -299,8 +300,6 @@ private:
|
||||
til::small_rle<TextAttribute, uint16_t, 1> _attr;
|
||||
// The width of the row in visual columns.
|
||||
uint16_t _columnCount = 0;
|
||||
// Stores any image content covering the row.
|
||||
ImageSlice::Pointer _imageSlice;
|
||||
// Stores double-width/height (DECSWL/DECDWL/DECDHL) attributes.
|
||||
LineRendition _lineRendition = LineRendition::SingleWidth;
|
||||
// Occurs when the user runs out of text in a given row and we're forced to wrap the cursor to the next line
|
||||
@@ -309,6 +308,9 @@ private:
|
||||
bool _doubleBytePadded = false;
|
||||
|
||||
std::optional<ScrollbarData> _promptData = std::nullopt;
|
||||
|
||||
// Stores any image content covering the row.
|
||||
ImageSlice::Pointer _imageSlice;
|
||||
};
|
||||
|
||||
#ifdef UNIT_TESTING
|
||||
|
||||
@@ -65,47 +65,6 @@ void TextAttribute::SetLegacyDefaultAttributes(const WORD defaultAttributes) noe
|
||||
gsl::at(s_legacyBackgroundColorMap, s_legacyDefaultBackground) = TextColor{};
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// Pursuant to GH#6807
|
||||
// This routine replaces VT colors from the 16-color set with the "default"
|
||||
// flag. It is intended to be used as part of the "VT Quirk" in
|
||||
// WriteConsole[AW].
|
||||
//
|
||||
// There is going to be a very long tail of applications that will
|
||||
// explicitly request VT SGR 40/37 when what they really want is to
|
||||
// SetConsoleTextAttribute() with a black background/white foreground.
|
||||
// Instead of making those applications look bad (and therefore making us
|
||||
// look bad, because we're releasing this as an update to something that
|
||||
// "looks good" already), we're introducing this compatibility hack. Before
|
||||
// the color reckoning in GH#6698 + GH#6506, *every* color was subject to
|
||||
// being spontaneously and erroneously turned into the default color. Now,
|
||||
// only the 16-color palette value that matches the active console
|
||||
// background color will be destroyed when the quirk is enabled.
|
||||
//
|
||||
// This is not intended to be a long-term solution. This comment will be
|
||||
// discovered in forty years(*) time and people will laugh at our hubris.
|
||||
//
|
||||
// *it doesn't matter when you're reading this, it will always be 40 years
|
||||
// from now.
|
||||
TextAttribute TextAttribute::StripErroneousVT16VersionsOfLegacyDefaults(const TextAttribute& attribute) noexcept
|
||||
{
|
||||
const auto fg{ attribute.GetForeground() };
|
||||
const auto bg{ attribute.GetBackground() };
|
||||
auto copy{ attribute };
|
||||
if (fg.IsIndex16() &&
|
||||
attribute.IsIntense() == WI_IsFlagSet(s_ansiDefaultForeground, FOREGROUND_INTENSITY) &&
|
||||
fg.GetIndex() == (s_ansiDefaultForeground & ~FOREGROUND_INTENSITY))
|
||||
{
|
||||
// We don't want to turn 1;37m into 39m (or even 1;39m), as this was meant to mimic a legacy color.
|
||||
copy.SetDefaultForeground();
|
||||
}
|
||||
if (bg.IsIndex16() && bg.GetIndex() == s_ansiDefaultBackground)
|
||||
{
|
||||
copy.SetDefaultBackground();
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Returns a WORD with legacy-style attributes for this textattribute.
|
||||
// Parameters:
|
||||
|
||||
@@ -93,7 +93,6 @@ public:
|
||||
}
|
||||
|
||||
static void SetLegacyDefaultAttributes(const WORD defaultAttributes) noexcept;
|
||||
static TextAttribute StripErroneousVT16VersionsOfLegacyDefaults(const TextAttribute& attribute) noexcept;
|
||||
WORD GetLegacyAttributes() const noexcept;
|
||||
|
||||
bool IsTopHorizontalDisplayed() const noexcept;
|
||||
|
||||
@@ -82,7 +82,8 @@ public:
|
||||
static constexpr size_t FRAME_FOREGROUND = 263;
|
||||
static constexpr size_t FRAME_BACKGROUND = 264;
|
||||
static constexpr size_t CURSOR_COLOR = 265;
|
||||
static constexpr size_t TABLE_SIZE = 266;
|
||||
static constexpr size_t SELECTION_BACKGROUND = 266;
|
||||
static constexpr size_t TABLE_SIZE = 267;
|
||||
|
||||
constexpr TextColor() noexcept :
|
||||
_meta{ ColorType::IsDefault },
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
#include "../types/inc/utils.hpp"
|
||||
#include "search.h"
|
||||
|
||||
// BODGY: Misdiagnosis in MSVC 17.11: Referencing global constants in the member
|
||||
// initializer list leads to this warning. Can probably be removed in the future.
|
||||
#pragma warning(disable : 26493) // Don't use C-style casts (type.4).)
|
||||
|
||||
using namespace Microsoft::Console;
|
||||
using namespace Microsoft::Console::Types;
|
||||
|
||||
@@ -716,13 +720,6 @@ OutputCellIterator TextBuffer::WriteLine(const OutputCellIterator givenIt,
|
||||
// - true if we successfully incremented the buffer.
|
||||
void TextBuffer::IncrementCircularBuffer(const TextAttribute& fillAttributes)
|
||||
{
|
||||
// FirstRow is at any given point in time the array index in the circular buffer that corresponds
|
||||
// to the logical position 0 in the window (cursor coordinates and all other coordinates).
|
||||
if (_isActiveBuffer && _renderer)
|
||||
{
|
||||
_renderer->TriggerFlush(true);
|
||||
}
|
||||
|
||||
// Prune hyperlinks to delete obsolete references
|
||||
_PruneHyperlinks();
|
||||
|
||||
@@ -918,7 +915,7 @@ void TextBuffer::SetCurrentLineRendition(const LineRendition lineRendition, cons
|
||||
// If the line rendition has changed, the row can no longer be wrapped.
|
||||
row.SetWrapForced(false);
|
||||
// And all image content on the row is removed.
|
||||
row.GetMutableImageSlice().reset();
|
||||
row.SetImageSlice(nullptr);
|
||||
// And if it's no longer single width, the right half of the row should be erased.
|
||||
if (lineRendition != LineRendition::SingleWidth)
|
||||
{
|
||||
@@ -2855,6 +2852,15 @@ void TextBuffer::Reflow(TextBuffer& oldBuffer, TextBuffer& newBuffer, const View
|
||||
}
|
||||
}
|
||||
|
||||
// The for loop right after this if condition will copy entire rows of attributes at a time.
|
||||
// This assumes of course that the "write cursor" (newX, newY) is at the start of a row.
|
||||
// If we didn't check for this, we may otherwise copy attributes from a later row into a previous one.
|
||||
if (newX != 0)
|
||||
{
|
||||
newX = 0;
|
||||
newY++;
|
||||
}
|
||||
|
||||
// Finish copying buffer attributes to remaining rows below the last
|
||||
// printable character. This is to fix the `color 2f` scenario, where you
|
||||
// change the buffer colors then resize and everything below the last
|
||||
@@ -3260,23 +3266,30 @@ MarkExtents TextBuffer::_scrollMarkExtentForRow(const til::CoordType rowOffset,
|
||||
return mark;
|
||||
}
|
||||
|
||||
std::wstring TextBuffer::_commandForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive) const
|
||||
std::wstring TextBuffer::_commandForRow(const til::CoordType rowOffset,
|
||||
const til::CoordType bottomInclusive,
|
||||
const bool clipAtCursor) const
|
||||
{
|
||||
std::wstring commandBuilder;
|
||||
MarkKind lastMarkKind = MarkKind::Prompt;
|
||||
const auto cursorPosition = GetCursor().GetPosition();
|
||||
for (auto y = rowOffset; y <= bottomInclusive; y++)
|
||||
{
|
||||
const bool onCursorRow = clipAtCursor && y == cursorPosition.y;
|
||||
// Now we need to iterate over text attributes. We need to find a
|
||||
// segment of Prompt attributes, we'll skip those. Then there should be
|
||||
// Command attributes. Collect up all of those, till we get to the next
|
||||
// Output attribute.
|
||||
|
||||
const auto& row = GetRowByOffset(y);
|
||||
const auto runs = row.Attributes().runs();
|
||||
auto x = 0;
|
||||
for (const auto& [attr, length] : runs)
|
||||
{
|
||||
const auto nextX = gsl::narrow_cast<uint16_t>(x + length);
|
||||
auto nextX = gsl::narrow_cast<uint16_t>(x + length);
|
||||
if (onCursorRow)
|
||||
{
|
||||
nextX = std::min(nextX, gsl::narrow_cast<uint16_t>(cursorPosition.x));
|
||||
}
|
||||
const auto markKind{ attr.GetMarkAttributes() };
|
||||
if (markKind != lastMarkKind)
|
||||
{
|
||||
@@ -3296,6 +3309,10 @@ std::wstring TextBuffer::_commandForRow(const til::CoordType rowOffset, const ti
|
||||
}
|
||||
// advance to next run of text
|
||||
x = nextX;
|
||||
if (onCursorRow && x == cursorPosition.x)
|
||||
{
|
||||
return commandBuilder;
|
||||
}
|
||||
}
|
||||
// we went over all the runs in this row, but we're not done yet. Keep iterating on the next row.
|
||||
}
|
||||
@@ -3319,7 +3336,7 @@ std::wstring TextBuffer::CurrentCommand() const
|
||||
// This row did start a prompt! Find the prompt that starts here.
|
||||
// Presumably, no rows below us will have prompts, so pass in the last
|
||||
// row with text as the bottom
|
||||
return _commandForRow(promptY, _estimateOffsetOfLastCommittedRow());
|
||||
return _commandForRow(promptY, _estimateOffsetOfLastCommittedRow(), true);
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ private:
|
||||
til::point _GetWordEndForSelection(const til::point target, const std::wstring_view wordDelimiters) const;
|
||||
void _PruneHyperlinks();
|
||||
|
||||
std::wstring _commandForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive) const;
|
||||
std::wstring _commandForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive, const bool clipAtCursor = false) const;
|
||||
MarkExtents _scrollMarkExtentForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive) const;
|
||||
bool _createPromptMarkIfNeeded();
|
||||
|
||||
|
||||
@@ -589,13 +589,13 @@ namespace
|
||||
TestBuffer{
|
||||
{ 2, 5 }, // reduce width aggressively
|
||||
{
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
{ L" ", false },
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
{ L" ", true },
|
||||
},
|
||||
{ 1, 0 },
|
||||
{ 1, 4 },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-100.png
Normal file
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-100.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 433 B |
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-150.png
Normal file
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-150.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 804 B |
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-200.png
Normal file
BIN
src/cascadia/CascadiaPackage/ProfileIcons/vs-cmd.scale-200.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user