mirror of
https://github.com/microsoft/terminal.git
synced 2026-05-21 22:37:19 +00:00
Compare commits
8 Commits
dev/duhowe
...
dev/lhecke
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d165136852 | ||
|
|
c77b79fb8d | ||
|
|
28fe5d81d7 | ||
|
|
318328d475 | ||
|
|
605ba75cea | ||
|
|
7ad3277136 | ||
|
|
e51769b072 | ||
|
|
c83fbbb89e |
3
.github/actions/spelling/allow/allow.txt
vendored
3
.github/actions/spelling/allow/allow.txt
vendored
@@ -67,14 +67,11 @@ servicebus
|
|||||||
slnt
|
slnt
|
||||||
stakeholders
|
stakeholders
|
||||||
subpage
|
subpage
|
||||||
subpages
|
|
||||||
sustainability
|
sustainability
|
||||||
sxn
|
sxn
|
||||||
Tencent
|
Tencent
|
||||||
toolset
|
toolset
|
||||||
Uids
|
|
||||||
UEFI
|
UEFI
|
||||||
UIDs
|
|
||||||
uiatextrange
|
uiatextrange
|
||||||
und
|
und
|
||||||
vsdevcmd
|
vsdevcmd
|
||||||
|
|||||||
6
.github/actions/spelling/expect/expect.txt
vendored
6
.github/actions/spelling/expect/expect.txt
vendored
@@ -256,6 +256,7 @@ conterm
|
|||||||
contsf
|
contsf
|
||||||
contypes
|
contypes
|
||||||
conwinuserrefs
|
conwinuserrefs
|
||||||
|
coordnew
|
||||||
COPYCOLOR
|
COPYCOLOR
|
||||||
COPYDATA
|
COPYDATA
|
||||||
COPYDATASTRUCT
|
COPYDATASTRUCT
|
||||||
@@ -572,7 +573,6 @@ FGHIJ
|
|||||||
fgidx
|
fgidx
|
||||||
FGs
|
FGs
|
||||||
FILEDESCRIPTION
|
FILEDESCRIPTION
|
||||||
filehops
|
|
||||||
FILESUBTYPE
|
FILESUBTYPE
|
||||||
FILESYSPATH
|
FILESYSPATH
|
||||||
FILEW
|
FILEW
|
||||||
@@ -622,6 +622,7 @@ fuzzmap
|
|||||||
fuzzwrapper
|
fuzzwrapper
|
||||||
fwdecl
|
fwdecl
|
||||||
fwe
|
fwe
|
||||||
|
fwlink
|
||||||
fzf
|
fzf
|
||||||
gci
|
gci
|
||||||
gcx
|
gcx
|
||||||
@@ -865,7 +866,6 @@ KILLACTIVE
|
|||||||
KILLFOCUS
|
KILLFOCUS
|
||||||
kinda
|
kinda
|
||||||
KIYEOK
|
KIYEOK
|
||||||
KKP
|
|
||||||
KLF
|
KLF
|
||||||
KLMNO
|
KLMNO
|
||||||
KOK
|
KOK
|
||||||
@@ -885,7 +885,6 @@ LBUTTONDOWN
|
|||||||
LBUTTONUP
|
LBUTTONUP
|
||||||
lcb
|
lcb
|
||||||
lci
|
lci
|
||||||
LCMAP
|
|
||||||
LCONTROL
|
LCONTROL
|
||||||
LCTRL
|
LCTRL
|
||||||
lcx
|
lcx
|
||||||
@@ -1773,7 +1772,6 @@ uldash
|
|||||||
uldb
|
uldb
|
||||||
ULONGLONG
|
ULONGLONG
|
||||||
ulwave
|
ulwave
|
||||||
Unaccess
|
|
||||||
Unadvise
|
Unadvise
|
||||||
unattend
|
unattend
|
||||||
UNCPRIORITY
|
UNCPRIORITY
|
||||||
|
|||||||
8
.github/workflows/spelling2.yml
vendored
8
.github/workflows/spelling2.yml
vendored
@@ -93,7 +93,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: check-spelling
|
- name: check-spelling
|
||||||
id: spelling
|
id: spelling
|
||||||
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
|
uses: check-spelling/check-spelling@v0.0.25
|
||||||
with:
|
with:
|
||||||
suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
|
suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
|
||||||
checkout: true
|
checkout: true
|
||||||
@@ -153,7 +153,7 @@ jobs:
|
|||||||
if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
|
if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
|
||||||
steps:
|
steps:
|
||||||
- name: comment
|
- name: comment
|
||||||
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
|
uses: check-spelling/check-spelling@v0.0.25
|
||||||
with:
|
with:
|
||||||
checkout: true
|
checkout: true
|
||||||
spell_check_this: microsoft/terminal@main
|
spell_check_this: microsoft/terminal@main
|
||||||
@@ -171,7 +171,7 @@ jobs:
|
|||||||
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
|
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
|
||||||
steps:
|
steps:
|
||||||
- name: comment
|
- name: comment
|
||||||
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
|
uses: check-spelling/check-spelling@v0.0.25
|
||||||
with:
|
with:
|
||||||
checkout: true
|
checkout: true
|
||||||
spell_check_this: microsoft/terminal@main
|
spell_check_this: microsoft/terminal@main
|
||||||
@@ -197,7 +197,7 @@ jobs:
|
|||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
steps:
|
steps:
|
||||||
- name: apply spelling updates
|
- name: apply spelling updates
|
||||||
uses: check-spelling/check-spelling@c635c2f3f714eec2fcf27b643a1919b9a811ef2e # v0.0.25
|
uses: check-spelling/check-spelling@v0.0.25
|
||||||
with:
|
with:
|
||||||
experimental_apply_changes_via_bot: ${{ github.repository_owner != 'microsoft' && 1 }}
|
experimental_apply_changes_via_bot: ${{ github.repository_owner != 'microsoft' && 1 }}
|
||||||
checkout: true
|
checkout: true
|
||||||
|
|||||||
@@ -860,6 +860,17 @@
|
|||||||
<Folder Name="/_Dependencies/Console/">
|
<Folder Name="/_Dependencies/Console/">
|
||||||
<File Path="dep/Console/winconp.h" />
|
<File Path="dep/Console/winconp.h" />
|
||||||
</Folder>
|
</Folder>
|
||||||
|
<Folder Name="/_Dependencies/gsl/">
|
||||||
|
<File Path="dep/gsl/include/gsl/gsl" />
|
||||||
|
<File Path="dep/gsl/include/gsl/gsl_algorithm" />
|
||||||
|
<File Path="dep/gsl/include/gsl/gsl_assert" />
|
||||||
|
<File Path="dep/gsl/include/gsl/gsl_byte" />
|
||||||
|
<File Path="dep/gsl/include/gsl/gsl_util" />
|
||||||
|
<File Path="dep/gsl/include/gsl/multi_span" />
|
||||||
|
<File Path="dep/gsl/include/gsl/pointers" />
|
||||||
|
<File Path="dep/gsl/include/gsl/span" />
|
||||||
|
<File Path="dep/gsl/include/gsl/string_span" />
|
||||||
|
</Folder>
|
||||||
<Folder Name="/_Dependencies/wil/">
|
<Folder Name="/_Dependencies/wil/">
|
||||||
<File Path="dep/wil/include/wil/common.h" />
|
<File Path="dep/wil/include/wil/common.h" />
|
||||||
<File Path="dep/wil/include/wil/filesystem.h" />
|
<File Path="dep/wil/include/wil/filesystem.h" />
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
- [Via Chocolatey (unofficial)](#via-chocolatey-unofficial)
|
- [Via Chocolatey (unofficial)](#via-chocolatey-unofficial)
|
||||||
- [Via Scoop (unofficial)](#via-scoop-unofficial)
|
- [Via Scoop (unofficial)](#via-scoop-unofficial)
|
||||||
- [Installing Windows Terminal Canary](#installing-windows-terminal-canary)
|
- [Installing Windows Terminal Canary](#installing-windows-terminal-canary)
|
||||||
|
- [Windows Terminal Roadmap](#windows-terminal-roadmap)
|
||||||
- [Terminal \& Console Overview](#terminal--console-overview)
|
- [Terminal \& Console Overview](#terminal--console-overview)
|
||||||
- [Windows Terminal](#windows-terminal)
|
- [Windows Terminal](#windows-terminal)
|
||||||
- [The Windows Console Host](#the-windows-console-host)
|
- [The Windows Console Host](#the-windows-console-host)
|
||||||
@@ -177,6 +178,11 @@ _Learn more about the [types of Windows Terminal distributions](https://learn.mi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Windows Terminal Roadmap
|
||||||
|
|
||||||
|
The plan for the Windows Terminal [is described here](/doc/roadmap-2023.md) and
|
||||||
|
will be updated as the project proceeds.
|
||||||
|
|
||||||
## Terminal & Console Overview
|
## Terminal & Console Overview
|
||||||
|
|
||||||
Please take a few minutes to review the overview below before diving into the
|
Please take a few minutes to review the overview below before diving into the
|
||||||
|
|||||||
@@ -56,10 +56,9 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme der Com
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
– Endlich die Möglichkeit, nach beliebigen Einstellungen zu suchen!
|
– Eine komplett neue Erweiterungsseite, die anzeigt, was in Ihrem Terminal installiert ist
|
||||||
– Ein neuer nativer Editor für Tastenkombinationen, Aktionen und Einträge in der Befehlspalette.
|
– Die Befehlspalette wird jetzt sowohl in Ihrer Muttersprache als auch auf Englisch angezeigt
|
||||||
– Neue Community-Übersetzungen für Serbisch und Ukrainisch
|
– Neue VT-Features wie synchronisiertes Rendering, neue Farbschemas, Konfiguration für schnelle Mausaktionen wie Zoomen und mehr
|
||||||
– Unterstützung für das „Kitty“-Tastaturprotokoll für hochauflösende Eingabecodierung
|
|
||||||
|
|
||||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -54,12 +54,11 @@ This is an open source project and we welcome community participation. To partic
|
|||||||
<!-- _locComment_text="{MaxLength=255} App DevStudio" -->
|
<!-- _locComment_text="{MaxLength=255} App DevStudio" -->
|
||||||
</DevStudio>
|
</DevStudio>
|
||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe}{Locked=Kitty} App Release Note" -->Version __VERSION_NUMBER__
|
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- Finally, the ability to search for any setting!
|
- A whole new Extensions page that shows what has been installed into your Terminal
|
||||||
- A new native editor for key bindings, actions and command palette entries.
|
- Command Palette now shows up in your native language as well as English
|
||||||
- New community localizations to Serbian and Ukrainian
|
- New VT features such as synchronized rendering, new color schemes, configuration for quick mouse actions like zooming, and more
|
||||||
- Support for the "Kitty" keyboard protocol for high-fidelity input encoding
|
|
||||||
|
|
||||||
Please see our GitHub releases page for additional details.
|
Please see our GitHub releases page for additional details.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -54,12 +54,11 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
|||||||
|
|
||||||
</DevStudio>
|
</DevStudio>
|
||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Versión __VERSION_NUMBER__
|
||||||
|
|
||||||
- Por último, la capacidad de buscar cualquier configuración.
|
- Página Extensiones completamente nueva que muestra lo que se ha instalado en tu terminal
|
||||||
- Nuevo editor nativo para asignaciones de teclas, acciones y entradas de la paleta de comandos.
|
- La paleta de comandos ahora se muestra en tu idioma nativo, así como en inglés
|
||||||
- Nuevas localizaciones comunitarias para serbio y ucraniano
|
- Nuevas características de VT, como la representación sincronizada, nuevos esquemas de color, configuración para acciones rápidas del ratón, como el zoom, y más
|
||||||
- Soporte para el protocolo de teclado "Kitty" para codificación de entrada de alta fidelidad
|
|
||||||
|
|
||||||
Consulta la página de versiones de GitHub para más información.
|
Consulta la página de versiones de GitHub para más información.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,12 +56,11 @@ Il s’agit d’un projet open source et nous vous invitons à participer dans l
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- Enfin, la possibilité de rechercher n’importe quel paramètre !
|
- Une toute nouvelle page Extensions qui montre ce qui a été installé dans votre terminal
|
||||||
- Un nouvel éditeur natif pour les raccourcis clavier, les actions et les entrées de la palette de commandes.
|
- La palette de commandes s’affiche désormais dans votre langue native, ainsi qu’en anglais
|
||||||
- De nouvelles localisations communautaires en serbe et en ukrainien
|
- Nouvelles fonctionnalités VT telles que le rendu synchronisé, de nouveaux schémas de couleurs, la configuration pour des actions rapides de la souris comme le zoom, et plus encore
|
||||||
- Une prise en charge du protocole clavier « Kitty » pour un encodage d’entrée à haute fidélité
|
|
||||||
|
|
||||||
Consultez notre page des versions de GitHub pour plus de détails.
|
Veuillez consulter notre page des versions GitHub pour découvrir d’autres détails.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -54,12 +54,11 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
|||||||
|
|
||||||
</DevStudio>
|
</DevStudio>
|
||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Versione __VERSION_NUMBER__
|
Versione __VERSION_NUMBER__
|
||||||
|
|
||||||
- Finalmente è possibile cercare qualsiasi impostazione
|
- Una pagina Estensioni completamente nuova che mostra ciò che è stato installato nel terminale
|
||||||
- Nuovo editor nativo per le associazioni di tasti, le azioni e le voci del riquadro comandi.
|
- Il riquadro comandi ora viene visualizzato nella tua lingua di origine oltre che in inglese
|
||||||
- Nuove localizzazioni della community in serbo e ucraino
|
- Nuove funzionalità VT come il rendering sincronizzato, le nuove combinazioni di colori, la configurazione per azioni rapide del mouse come lo zoom e altro ancora
|
||||||
- Supporto per il protocollo di tastiera "Kitty" per una codifica dell'input ad alta fedeltà
|
|
||||||
|
|
||||||
Per altri dettagli, vedi la pagina delle release di GitHub.
|
Per altri dettagli, vedi la pagina delle release di GitHub.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,10 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
バージョン __VERSION_NUMBER__
|
バージョン __VERSION_NUMBER__
|
||||||
|
|
||||||
- 最後に、任意の設定を検索する機能です。
|
- ターミナルに何がインストールされているかを表示する新しい [拡張機能] ページ
|
||||||
- キー バインド、アクション、コマンド パレット エントリ用の新しいネイティブ エディター。
|
- コマンド パレットがネイティブ言語と英語で表示されるようになりました
|
||||||
- セルビア語とウクライナ語への新しいコミュニティ ローカライズ
|
- 同期レンダリング、新しい配色、ズームなどのクイック マウス操作の構成などの、新しい VT 機能
|
||||||
- 高忠実度入力エンコード用の "Kitty" キーボード プロトコルのサポート
|
|
||||||
|
|
||||||
詳細については、GitHub リリース ページをご覧ください。
|
詳細については、GitHub リリース ページをご覧ください。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,12 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
버전 __VERSION_NUMBER__
|
버전 __VERSION_NUMBER__
|
||||||
|
|
||||||
- 드디어 모든 설정을 검색할 수 있게 되었어요!
|
- 터미널에 설치된 항목을 보여 주는 완전히 새로운 확장 페이지
|
||||||
- 키 바인딩, 작업, 명령 팔레트 항목을 위한 새로운 기본 편집기가 추가되었습니다.
|
- 명령 팔레트가 이제 영어뿐만 아니라 모국어로도 표시
|
||||||
- 세르비아어와 우크라이나어 커뮤니티 지역화를 새롭게 지원합니다.
|
- 동기화된 렌더링, 새로운 색 구성표, 확대/축소와 같은 빠른 마우스 동작을 위한 구성 등 새로운 VT 기능이 추가
|
||||||
- 고품질 입력 인코딩을 위해 "Kitty" 키보드 프로토콜을 지원합니다.
|
|
||||||
|
|
||||||
자세한 정보는 GitHub 릴리스 페이지를 참고하세요.
|
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,10 +56,9 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- Finalmente, a possibilidade de pesquisar qualquer configuração!
|
– Uma nova página de Extensões que mostra o que foi instalado no seu Terminal
|
||||||
- Um novo editor nativo para combinações de teclas, ações e entradas na paleta de comandos.
|
– A Paleta de Comandos agora aparece no seu idioma nativo, além do inglês
|
||||||
- Novas localizações da comunidade para sérvio e ucraniano
|
– Novos recursos da VT, como renderização sincronizada, novos esquemas de cores, configuração para ações rápidas do mouse, como zoom, e muito mais
|
||||||
- Suporte para o protocolo de teclado "Kitty" para codificação de entrada de alta fidelidade
|
|
||||||
|
|
||||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,12 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
|
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
|
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
|
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Ѕυррòŗт ƒòŗ ťĥё "Kitty" ĸ℮ŷъøàŗď ρřŏťô¢õℓ ƒŏґ нįģћ-ƒíđёℓïтÿ îńрüť êńсøďíлğ !!! !!! !!! !!! !!! !!! !!! !
|
|
||||||
|
|
||||||
Ρŀ℮âѕē şєё όûя ĜîтΗūь ŕεĺĕǻŝёš раġĕ ƒŏґ ãδđϊŧïбπåľ δеτáΐłś. !!! !!! !!! !!! !!! !!!
|
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,12 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
|
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
|
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
|
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Ѕυррòŗт ƒòŗ ťĥё "Kitty" ĸ℮ŷъøàŗď ρřŏťô¢õℓ ƒŏґ нįģћ-ƒíđёℓïтÿ îńрüť êńсøďíлğ !!! !!! !!! !!! !!! !!! !!! !
|
|
||||||
|
|
||||||
Ρŀ℮âѕē şєё όûя ĜîтΗūь ŕεĺĕǻŝёš раġĕ ƒŏґ ãδđϊŧïбπåľ δеτáΐłś. !!! !!! !!! !!! !!! !!!
|
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,12 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
|
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
|
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
|
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- Ѕυррòŗт ƒòŗ ťĥё "Kitty" ĸ℮ŷъøàŗď ρřŏťô¢õℓ ƒŏґ нįģћ-ƒíđёℓïтÿ îńрüť êńсøďíлğ !!! !!! !!! !!! !!! !!! !!! !
|
|
||||||
|
|
||||||
Ρŀ℮âѕē şєё όûя ĜîтΗūь ŕεĺĕǻŝёš раġĕ ƒŏґ ãδđϊŧïбπåľ δеτáΐłś. !!! !!! !!! !!! !!! !!!
|
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,10 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Версия __VERSION_NUMBER__
|
Версия __VERSION_NUMBER__
|
||||||
|
|
||||||
– Наконец-то появилась возможность поиска любых параметров!
|
– Новая страница расширений, на которой отображается информация о том, что было установлено в вашем терминале
|
||||||
– Новый собственный редактор для настраиваемых сочетаний клавиш, действий и записей палитры команд.
|
– Палитра команд теперь доступна на вашем языке, а также на английском
|
||||||
– Новые локализации сообщества на сербский и украинский языки
|
– Новые функции VT, например синхронизированная отрисовка, новые цветовые схемы, настройка быстрых действий мыши, таких как масштабирование, и т. д.
|
||||||
– Поддержка протокола клавиатуры Kitty для высокоточного кодирования ввода
|
|
||||||
|
|
||||||
Дополнительные сведения см. на странице выпусков GitHub.
|
Дополнительные сведения см. на странице выпусков GitHub.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -1,182 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ProductDescription language="sr-cyrl-rs" xmlns="http://schemas.microsoft.com/appx/2012/ProductDescription" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" Release="">
|
|
||||||
<AppStoreName _locID="App_AppStoreName">
|
|
||||||
<!-- This is optional. AppStoreName is typically extracted from your package's AppxManifest DisplayName property. -->
|
|
||||||
<!-- Uncomment (and localize) this Store name if your application package does not contain a localization for the DisplayName in this language. -->
|
|
||||||
<!-- Leaving this uncommented for a language that your application package DOES contain a DisplayName for will result in a submission failure with the API. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App AppStoreName" -->
|
|
||||||
<!-- Windows Terminal -->
|
|
||||||
</AppStoreName>
|
|
||||||
<Keywords>
|
|
||||||
<!-- Valid length: 30 character limit, up to 7 elements -->
|
|
||||||
<Keyword _locID="App_keyword1">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 1" -->Терминал</Keyword>
|
|
||||||
<Keyword _locID="App_keyword2">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 2" -->Конзола</Keyword>
|
|
||||||
<Keyword _locID="App_keyword3">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 3" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword4">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 4" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword5">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 5" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword6">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 6" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword7">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 7" -->
|
|
||||||
</Keyword>
|
|
||||||
</Keywords>
|
|
||||||
<Description _locID="App_Description">
|
|
||||||
<!-- _locComment_text="{MaxLength=10000} App Description" -->Ово је изградња прегледа апликације Windows терминал. Она садржи најновије могућности које се још увек развијају. Windows терминал је модерна, брза, ефикасна, моћна и продуктивна апликација терминала за кориснике алата из командне линије и љуски као што су Command Prompt, PowerShell, и WSL. Неке од његових главних функционалности су вишеструке картице, панели, подршка за Уникод и UTF-8, GPU убрзани механизам за исцртавање текста, произвољне теме, стилови и конфигурације.
|
|
||||||
|
|
||||||
Ово је пројекат отвореног кода и учешће заједнице је добродошло. Ако желите да учествујете, молимо вас да посетите https://github.com/microsoft/terminal </Description>
|
|
||||||
<ShortDescription _locID="App_ShortDescription">
|
|
||||||
<!-- Only used for games. This description appears in the Information section of the Game Hub on Xbox One, and helps customers understand more about your game. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=500} App ShortDescription" -->
|
|
||||||
</ShortDescription>
|
|
||||||
<ShortTitle _locID="App_ShortTitle">
|
|
||||||
<!-- A shorter version of your product's name. If provided, this shorter name may appear in various places on Xbox One (during installation, in Achievements, etc.) in place of the full title of your product. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=50} App ShortTitle" -->
|
|
||||||
</ShortTitle>
|
|
||||||
<SortTitle _locID="App_SortTitle">
|
|
||||||
<!-- If your product could be alphabetized in different ways, you can enter another version here. This may help customers find the product more quickly when searching. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App SortTitle" -->
|
|
||||||
</SortTitle>
|
|
||||||
<VoiceTitle _locID="App_VoiceTitle">
|
|
||||||
<!-- An alternate name for your product that, if provided, may be used in the audio experience on Xbox One when using Kinect or a headset. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App VoiceTitle" -->
|
|
||||||
</VoiceTitle>
|
|
||||||
<DevStudio _locID="App_DevStudio">
|
|
||||||
<!-- Specify this value if you want to include a "Developed by" field in the listing. (The "Published by" field will list the publisher display name associated with your account, whether or not you provide a devStudio value.) -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App DevStudio" -->
|
|
||||||
</DevStudio>
|
|
||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe}{Locked=Kitty} App Release Note" -->Верзија __VERSION_NUMBER__
|
|
||||||
|
|
||||||
- Коначно, могућност претраге било ког подешавања!
|
|
||||||
- Нови својствени едитор ставки пречица на тастатури, акција и командне палете
|
|
||||||
- Нова локализација заједнице на српски и украјински језик
|
|
||||||
- Подршка за „Kitty” протокол тастатуре који омогућава верно кодирање уноса
|
|
||||||
|
|
||||||
За више детаља, молимо вас да посетите нашу GitHub страницу издања.
|
|
||||||
</ReleaseNotes>
|
|
||||||
<ScreenshotCaptions>
|
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
|
||||||
<!-- Valid attributes: any of DesktopImage, MobileImage, XboxImage, SurfaceHubImage, and HoloLensImage -->
|
|
||||||
<Caption DesktopImage="acrylic-emoji.png" _locID="App_caption1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 1" -->
|
|
||||||
</Caption>
|
|
||||||
<Caption DesktopImage="panes.png" _locID="App_caption2">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 2" -->
|
|
||||||
</Caption>
|
|
||||||
<Caption DesktopImage="htop.png" _locID="App_caption3">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 3" -->
|
|
||||||
</Caption>
|
|
||||||
</ScreenshotCaptions>
|
|
||||||
<AdditionalAssets>
|
|
||||||
<!-- Valid elements:-->
|
|
||||||
<!-- HeroImage414x180, HeroImage846x468, HeroImage558x756, HeroImage414x468, HeroImage558x558, HeroImage2400x1200,-->
|
|
||||||
<!-- ScreenshotWXGA, ScreenshotHD720, ScreenshotWVGA, Doublewide, Panoramic, Square,-->
|
|
||||||
<!-- SmallMobileTile, SmallXboxLiveTile, LargeMobileTile, LargeXboxLiveTile, Tile,-->
|
|
||||||
<!-- DesktopIcon, Icon (use this value for the 1:1 300x300 pixels logo), AchievementIcon,-->
|
|
||||||
<!-- ChallengePromoIcon, RewardDisplayIcon, Icon150X150, Icon71X71,-->
|
|
||||||
<!-- BoxArt, BrandedKeyArt, PosterArt, FeaturedPromotionalArt, PromotionalArt16x9, TitledHeroArt-->
|
|
||||||
<!-- There is no content for any of these elements, just a single attribute called FileName. -->
|
|
||||||
<PosterArt FileName="Store Poster Art.png" />
|
|
||||||
<BoxArt FileName="Store Box Art.png" />
|
|
||||||
<PromotionalArt16x9 FileName="Store Thumbnail.png" />
|
|
||||||
</AdditionalAssets>
|
|
||||||
<Trailers>
|
|
||||||
<!-- Maximum number of trailers permitted: 15 -->
|
|
||||||
<Trailer FileName="CC0605_CommandLine_Teaser_WEB_MASTER_H264_1080p_23.976_-16LKFS_-3dbTP_ST.mp4">
|
|
||||||
<Title _locID="App_trailerTitle1">
|
|
||||||
<!-- _locComment_text="{MaxLength=255} Trailer title 1" -->Нови Windows терминал</Title>
|
|
||||||
<Images>
|
|
||||||
<!-- Current maximum of 1 image per trailer permitted. -->
|
|
||||||
<Image FileName="Store Thumbnail.png">
|
|
||||||
<!-- _locComment_text="{Locked} Trailer screenshot 1 description" -->
|
|
||||||
</Image>
|
|
||||||
</Images>
|
|
||||||
</Trailer>
|
|
||||||
</Trailers>
|
|
||||||
<AppFeatures>
|
|
||||||
<!-- Valid length: 200 character limit, up to 20 elements -->
|
|
||||||
<AppFeature _locID="App_feature1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 1" -->Вишеструке картице</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature2">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 2" -->Пуна Уникод подршка</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature3">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 3" -->GPU-убрзано исцртавање текста</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature4">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 4" -->Потпуна прилагодљивост</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature5">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 5" -->Подела панела</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature6">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 6" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature7">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 7" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature8">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 8" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature9">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 9" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature10">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 10" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature11">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 11" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature12">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 12" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature13">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 13" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature14">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 14" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature15">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 15" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature16">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 16" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature17">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 17" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature18">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 18" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature19">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 19" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature20">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 20" -->
|
|
||||||
</AppFeature>
|
|
||||||
</AppFeatures>
|
|
||||||
<RecommendedHardware>
|
|
||||||
<!-- Valid length: 200 character limit, up to 11 elements -->
|
|
||||||
<Recommendation _locID="App_RecommendedHW1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Recommended Hardware 1" -->Тастатура</Recommendation>
|
|
||||||
</RecommendedHardware>
|
|
||||||
<MinimumHardware>
|
|
||||||
<!-- Valid length: 200 character limit, up to 11 elements -->
|
|
||||||
</MinimumHardware>
|
|
||||||
<CopyrightAndTrademark _locID="App_CopyrightandTrademark">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Copyright and Trademark" -->Copyright (c) Microsoft Corporation</CopyrightAndTrademark>
|
|
||||||
<AdditionalLicenseTerms _locID="App_AdditionalLicenseTerms">
|
|
||||||
<!-- _locComment_text="{MaxLength=10000} Additional License Terms" -->
|
|
||||||
</AdditionalLicenseTerms>
|
|
||||||
<WebsiteURL _locID="App_WebsiteURL">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} WebsiteURL" -->https://github.com/microsoft/terminal</WebsiteURL>
|
|
||||||
<SupportContactInfo _locID="App_SupportContactInfo">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} Support Contact Info" -->https://github.com/microsoft/terminal/issues/new</SupportContactInfo>
|
|
||||||
<PrivacyPolicyURL _locID="App_PrivacyURL">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} Privacy Policy URL" -->https://go.microsoft.com/fwlink/?LinkID=521839</PrivacyPolicyURL>
|
|
||||||
</ProductDescription>
|
|
||||||
@@ -56,10 +56,9 @@
|
|||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Версія __VERSION_NUMBER__
|
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Версія __VERSION_NUMBER__
|
||||||
|
|
||||||
- Нарешті, можливість пошуку будь-якого налаштування!
|
- Цілком нова сторінка розширень, яка показує, що було встановлено у вашому терміналі
|
||||||
- Новий вбудований редактор для прив'язки клавіш, дій та палітри команд.
|
- Палітра команд тепер відображається вашою рідною мовою, а також англійською
|
||||||
- Нові локалізації спільноти на сербську та українську мови.
|
- Нові функції віртуального автомата, такі як синхронізований рендеринг, нові колірні схеми, налаштування для швидких дій миші, таких як масштабування, тощо
|
||||||
- Підтримка протоколу клавіатури "Kitty" для високоточного кодування введення.
|
|
||||||
|
|
||||||
Будь ласка, перегляньте нашу сторінку релізів GitHub для отримання додаткової інформації.
|
Будь ласка, перегляньте нашу сторінку релізів GitHub для отримання додаткової інформації.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,10 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- 终于可以搜索任何设置了!
|
- 一个全新的“扩展”页,显示已安装到终端的内容
|
||||||
- 新增用于键绑定、操作和命令面板条目的原生编辑器。
|
- 命令面板现在以你的母语和英语显示
|
||||||
- 新增塞尔维亚语和乌克兰语社区本地化支持
|
- 新的 VT 功能,例如同步渲染、新配色方案、快速鼠标操作(如缩放)的配置等
|
||||||
- 支持 "Kitty" 键盘协议,实现高保真输入编码
|
|
||||||
|
|
||||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,10 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- 終於,提供可搜尋任何設定的功能!
|
- 全新的延伸模組頁面會顯示已安裝在您終端機中的內容
|
||||||
- 全新原生編輯器,支援按鍵繫結、動作及命令選擇區項目。
|
- 命令選擇區現在以您的母語和英文顯示
|
||||||
- 新增社群本地語系化,包含塞爾維亞語與烏克蘭語
|
- 新的 VT 功能,例如同步轉譯、新的色彩配置、快速滑鼠動作 (例如縮放) 設定等等
|
||||||
- 支援高保真度輸入編碼的「Kitty」鍵盤通訊協定
|
|
||||||
|
|
||||||
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
|
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme an der
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
– Eine komplett neue Erweiterungsseite, die anzeigt, was in Ihrem Terminal installiert ist
|
– Wir haben der Benutzeroberfläche Dutzende von Einstellungen hinzugefügt, die nur einmal in der JSON-Datei vorhanden waren, einschließlich einer neuen Seite zum Anpassen des Layouts Ihres Menüs „Neue Registerkarte“!
|
||||||
– Die Befehlspalette wird jetzt sowohl in Ihrer Muttersprache als auch auf Englisch angezeigt
|
– Wir haben die Fensterverwaltung umgestaltet, um die Zuverlässigkeit zu verbessern. Melden Sie alle Fehler, die beim alias „wt.exe“ auftreten
|
||||||
– Neue VT-Features wie synchronisiertes Rendering, neue Farbschemas, Konfiguration für schnelle Mausaktionen wie Zoomen und mehr
|
– Profile zeigen jetzt ein Symbol an, wenn sie ausgeblendet wurden oder auf Programme verweisen, die deinstalliert wurden.
|
||||||
|
|
||||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ This is an open source project and we welcome community participation. To partic
|
|||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Version __VERSION_NUMBER__
|
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- A whole new Extensions page that shows what has been installed into your Terminal
|
- We've added dozens of settings to the UI that once only existed in the JSON file, including a new page for customizing the layout of your New Tab menu!
|
||||||
- Command Palette now shows up in your native language as well as English
|
- We have rearchitected window management to improve reliability; please file any bugs you encounter with the wt.exe alias
|
||||||
- New VT features such as synchronized rendering, new color schemes, configuration for quick mouse actions like zooming, and more
|
- Profiles now show an icon if they've been hidden or refer to programs which were uninstalled.
|
||||||
|
|
||||||
Please see our GitHub releases page for additional details.
|
Please see our GitHub releases page for additional details.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Versión __VERSION_NUMBER__
|
Versión __VERSION_NUMBER__
|
||||||
|
|
||||||
- Página Extensiones completamente nueva que muestra lo que se ha instalado en tu terminal
|
- Hemos añadido decenas de configuraciones a la interfaz de usuario que antes solo existían en el archivo JSON, incluida una nueva página para personalizar el diseño del menú Nueva pestaña.
|
||||||
- La paleta de comandos ahora se muestra en tu idioma nativo, así como en inglés
|
- Hemos reestructurado la gestión de ventanas para mejorar la fiabilidad; informe de cualquier error que encuentre con el alias wt.exe
|
||||||
- Nuevas características de VT, como la representación sincronizada, nuevos esquemas de color, configuración para acciones rápidas del ratón, como el zoom, y más
|
- Ahora, los perfiles muestran un icono si han sido ocultados o hacen referencia a programas que han sido desinstalados.
|
||||||
|
|
||||||
Consulte la página de versiones de GitHub para más información.
|
Consulte la página de versiones de GitHub para más información.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,11 +56,11 @@ Il s’agit d’un projet open source et nous encourageons la participation à l
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- Une toute nouvelle page Extensions qui affiche ce qui a été installé dans votre Terminal
|
- Nous avons ajouté des dizaines de paramètres à l’interface utilisateur qui n’existaient auparavant que dans le fichier JSON, y compris une nouvelle page pour personnaliser la disposition de votre menu Nouvel onglet.
|
||||||
- La palette de commandes s’affiche désormais dans votre langue native, ainsi qu’en anglais
|
- Nous avons fait une refonte de la gestion des fenêtres pour améliorer la fiabilité. Veuillez signaler les bogues que vous rencontrez avec l’alias wt.exe.
|
||||||
- De nouvelles fonctionnalités VT, telles que le rendu synchronisé, de nouveaux schémas de couleurs, une configuration pour des actions rapides de la souris comme le zoom, et bien plus encore
|
- Les profils affichent désormais une icône s’ils ont été masqués ou s’ils font référence à des programmes qui ont été désinstallés.
|
||||||
|
|
||||||
Consultez notre page des versions de GitHub pour plus de détails.
|
Veuillez consulter notre page des versions GitHub pour découvrir d’autres détails.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Versione __VERSION_NUMBER__
|
Versione __VERSION_NUMBER__
|
||||||
|
|
||||||
- Una pagina Estensioni completamente nuova che mostra ciò che è stato installato nel terminale
|
- Abbiamo aggiunto decine di impostazioni all'interfaccia utente che in precedenza esistevano solo nel file JSON, inclusa una nuova pagina per personalizzare il layout del menu Nuova scheda.
|
||||||
- Il riquadro comandi ora viene visualizzato nella tua lingua di origine oltre che in inglese
|
- Abbiamo riprogettato la gestione delle finestre per migliorarne l'affidabilità; segnala eventuali bug riscontrati con l'alias wt.exe
|
||||||
- Nuove funzionalità VT come il rendering sincronizzato, le nuove combinazioni di colori, la configurazione per azioni rapide del mouse come lo zoom e altro ancora
|
- I profili ora mostrano un'icona se sono stati nascosti o se fanno riferimento a programmi disinstallati.
|
||||||
|
|
||||||
Per altri dettagli, vedi la pagina delle release di GitHub.
|
Per altri dettagli, vedi la pagina delle release di GitHub.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
バージョン __VERSION_NUMBER__
|
バージョン __VERSION_NUMBER__
|
||||||
|
|
||||||
- お使いのターミナルに何がインストールされているかを表示する新しい [拡張機能] ページ
|
- 新しいタブ メニューのレイアウトをカスタマイズするための新しいページなど、以前は JSON ファイルにしかなかった設定が UI に多数追加されました。
|
||||||
- コマンド パレットがネイティブ言語と英語で表示されるようになりました
|
- 信頼性を向上させるために、ウィンドウ管理を再設計しました。wt.exe エイリアスで発生したバグを報告してください
|
||||||
- 同期レンダリング、新しい配色、ズームなどのクイック マウス操作の構成などの、新しい VT 機能
|
- プロファイルが非表示になっている場合や、アンインストールされたプログラムを参照している場合に、アイコンが表示されるようになりました。
|
||||||
|
|
||||||
詳細については、GitHub リリース ページをご覧ください。
|
詳細については、GitHub リリース ページをご覧ください。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,11 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
버전 __VERSION_NUMBER__
|
버전 __VERSION_NUMBER__
|
||||||
|
|
||||||
- 터미널에 설치된 항목을 보여 주는 완전히 새로운 확장 페이지
|
- 새 탭 메뉴의 레이아웃을 사용자 지정하기 위한 새 페이지를 포함하여 JSON 파일에만 존재했던 수십 개의 설정을 UI에 추가
|
||||||
- 이제 영어뿐만 아니라 모국어로도 표시되는 명령 팔레트
|
- 안정성을 개선하기 위해 창 관리 구조를 재구성했습니다. wt.exe 별칭과 관련하여 발생한 버그 신고
|
||||||
- 동기화된 렌더링, 새로운 색 구성표, 확대/축소와 같은 빠른 마우스 동작을 위한 구성 등 새로운 VT 기능 추가
|
- 프로필이 숨겨졌거나 제거된 프로그램을 참조하는 경우 이제 프로필에 아이콘이 표시됩니다.
|
||||||
|
|
||||||
자세한 정보는 GitHub 릴리스 페이지를 참고하세요.
|
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
– Uma nova página de Extensões que mostra o que foi instalado no seu Terminal
|
– Adicionamos várias configurações à interface do usuário que antes só existiam no arquivo JSON, incluindo uma nova página para personalizar o layout do seu menu Nova Guia!
|
||||||
– A Paleta de Comandos agora aparece no seu idioma nativo, além do inglês
|
– Reestruturamos o gerenciamento de janelas para melhorar a confiabilidade; registre os bugs que você encontrar com o alias wt.exe
|
||||||
– Novos recursos da VT, como renderização sincronizada, novos esquemas de cores, configuração para ações rápidas do mouse, como zoom, e muito mais
|
– Os perfis agora exibem um ícone se estiverem ocultos ou se referirem a programas que foram desinstalados.
|
||||||
|
|
||||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,11 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||||
|
|
||||||
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,11 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||||
|
|
||||||
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,11 +56,11 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||||
|
|
||||||
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
|
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
|
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||||
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||||
|
|
||||||
Ρĺęąŝэ ѕєě õμя ĞĭтΗύв řєĺэдšέŝ рάġě ƒοґ àďđϊтїõлаℓ ðêţǻїłş. !!! !!! !!! !!! !!! !!!
|
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
<ScreenshotCaptions>
|
<ScreenshotCaptions>
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||||
|
|||||||
@@ -56,9 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Версия __VERSION_NUMBER__
|
Версия __VERSION_NUMBER__
|
||||||
|
|
||||||
– Новая страница расширений, на которой отображается информация о том, что было установлено в вашем терминале
|
– Мы добавили в пользовательский интерфейс десятки параметров, которые ранее существовали только в JSON-файле, включая новую страницу для настройки макета меню новой вкладки.
|
||||||
– Палитра команд теперь доступна на вашем языке, а также на английском
|
– Мы переработали управление окнами для повышения надежности. Сообщайте о любых ошибках, которые вы обнаружите с псевдонимом wt.exe
|
||||||
– Новые функции VT, например синхронизированная отрисовка, новые цветовые схемы, настройка быстрых действий мыши, таких как масштабирование, и т. д.
|
– Профили теперь отображают значок, если они были скрыты или ссылаются на программы, которые были удалены.
|
||||||
|
|
||||||
Дополнительные сведения см. на странице выпусков GitHub.
|
Дополнительные сведения см. на странице выпусков GitHub.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -1,181 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ProductDescription language="sr-cyrl-rs" xmlns="http://schemas.microsoft.com/appx/2012/ProductDescription" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" Release="">
|
|
||||||
<AppStoreName _locID="App_AppStoreName">
|
|
||||||
<!-- This is optional. AppStoreName is typically extracted from your package's AppxManifest DisplayName property. -->
|
|
||||||
<!-- Uncomment (and localize) this Store name if your application package does not contain a localization for the DisplayName in this language. -->
|
|
||||||
<!-- Leaving this uncommented for a language that your application package DOES contain a DisplayName for will result in a submission failure with the API. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App AppStoreName" -->
|
|
||||||
<!-- Windows Terminal -->
|
|
||||||
</AppStoreName>
|
|
||||||
<Keywords>
|
|
||||||
<!-- Valid length: 30 character limit, up to 7 elements -->
|
|
||||||
<Keyword _locID="App_keyword1">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 1" -->Терминал</Keyword>
|
|
||||||
<Keyword _locID="App_keyword2">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 2" -->Конзола</Keyword>
|
|
||||||
<Keyword _locID="App_keyword3">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 3" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword4">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 4" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword5">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 5" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword6">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 6" -->
|
|
||||||
</Keyword>
|
|
||||||
<Keyword _locID="App_keyword7">
|
|
||||||
<!-- _locComment_text="{MaxLength=30} App keyword 7" -->
|
|
||||||
</Keyword>
|
|
||||||
</Keywords>
|
|
||||||
<Description _locID="App_Description">
|
|
||||||
<!-- _locComment_text="{MaxLength=10000} App Description" -->Windows терминал је модерна, брза, ефикасна, моћна и продуктивна апликација терминала за кориснике алата из командне линије и љуски као што су Command Prompt, PowerShell, и WSL. Неке од његових главних функционалности су вишеструке картице, панели, подршка за Уникод и UTF-8, GPU убрзани механизам за исцртавање текста, произвољне теме, стилови и конфигурације.
|
|
||||||
|
|
||||||
Ово је пројекат отвореног кода и учешће заједнице је добродошло. Ако желите да учествујете, молимо вас да посетите https://github.com/microsoft/terminal </Description>
|
|
||||||
<ShortDescription _locID="App_ShortDescription">
|
|
||||||
<!-- Only used for games. This description appears in the Information section of the Game Hub on Xbox One, and helps customers understand more about your game. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=500} App ShortDescription" -->
|
|
||||||
</ShortDescription>
|
|
||||||
<ShortTitle _locID="App_ShortTitle">
|
|
||||||
<!-- A shorter version of your product's name. If provided, this shorter name may appear in various places on Xbox One (during installation, in Achievements, etc.) in place of the full title of your product. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=50} App ShortTitle" -->
|
|
||||||
</ShortTitle>
|
|
||||||
<SortTitle _locID="App_SortTitle">
|
|
||||||
<!-- If your product could be alphabetized in different ways, you can enter another version here. This may help customers find the product more quickly when searching. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App SortTitle" -->
|
|
||||||
</SortTitle>
|
|
||||||
<VoiceTitle _locID="App_VoiceTitle">
|
|
||||||
<!-- An alternate name for your product that, if provided, may be used in the audio experience on Xbox One when using Kinect or a headset. -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App VoiceTitle" -->
|
|
||||||
</VoiceTitle>
|
|
||||||
<DevStudio _locID="App_DevStudio">
|
|
||||||
<!-- Specify this value if you want to include a "Developed by" field in the listing. (The "Published by" field will list the publisher display name associated with your account, whether or not you provide a devStudio value.) -->
|
|
||||||
<!-- _locComment_text="{MaxLength=255} App DevStudio" -->
|
|
||||||
</DevStudio>
|
|
||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Верзија __VERSION_NUMBER__
|
|
||||||
|
|
||||||
- Попуно нова страница Проширења која приказује шта је све инсталирано у ваш Терминал
|
|
||||||
- Палета команди се сада приказује и на вашем матерњем језику, као и на енглеском
|
|
||||||
- Нове VT функционалности као што су синхронизовано исцртавање, нове шеме боја, конфигурација за брзе акције мишем, као што је зумирање, и још тога
|
|
||||||
|
|
||||||
За више детаља, молимо вас да посетите нашу GitHub страницу издања.
|
|
||||||
</ReleaseNotes>
|
|
||||||
<ScreenshotCaptions>
|
|
||||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
|
||||||
<!-- Valid attributes: any of DesktopImage, MobileImage, XboxImage, SurfaceHubImage, and HoloLensImage -->
|
|
||||||
<Caption DesktopImage="acrylic-emoji.png" _locID="App_caption1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 1" -->
|
|
||||||
</Caption>
|
|
||||||
<Caption DesktopImage="panes.png" _locID="App_caption2">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 2" -->
|
|
||||||
</Caption>
|
|
||||||
<Caption DesktopImage="htop.png" _locID="App_caption3">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Screenshot caption 3" -->
|
|
||||||
</Caption>
|
|
||||||
</ScreenshotCaptions>
|
|
||||||
<AdditionalAssets>
|
|
||||||
<!-- Valid elements:-->
|
|
||||||
<!-- HeroImage414x180, HeroImage846x468, HeroImage558x756, HeroImage414x468, HeroImage558x558, HeroImage2400x1200,-->
|
|
||||||
<!-- ScreenshotWXGA, ScreenshotHD720, ScreenshotWVGA, Doublewide, Panoramic, Square,-->
|
|
||||||
<!-- SmallMobileTile, SmallXboxLiveTile, LargeMobileTile, LargeXboxLiveTile, Tile,-->
|
|
||||||
<!-- DesktopIcon, Icon (use this value for the 1:1 300x300 pixels logo), AchievementIcon,-->
|
|
||||||
<!-- ChallengePromoIcon, RewardDisplayIcon, Icon150X150, Icon71X71,-->
|
|
||||||
<!-- BoxArt, BrandedKeyArt, PosterArt, FeaturedPromotionalArt, PromotionalArt16x9, TitledHeroArt-->
|
|
||||||
<!-- There is no content for any of these elements, just a single attribute called FileName. -->
|
|
||||||
<PosterArt FileName="Store Poster Art.png" />
|
|
||||||
<BoxArt FileName="Store Box Art.png" />
|
|
||||||
<PromotionalArt16x9 FileName="Store Thumbnail.png" />
|
|
||||||
</AdditionalAssets>
|
|
||||||
<Trailers>
|
|
||||||
<!-- Maximum number of trailers permitted: 15 -->
|
|
||||||
<Trailer FileName="CC0605_CommandLine_Teaser_WEB_MASTER_H264_1080p_23.976_-16LKFS_-3dbTP_ST.mp4">
|
|
||||||
<Title _locID="App_trailerTitle1">
|
|
||||||
<!-- _locComment_text="{MaxLength=255} Trailer title 1" -->Нови Windows терминал</Title>
|
|
||||||
<Images>
|
|
||||||
<!-- Current maximum of 1 image per trailer permitted. -->
|
|
||||||
<Image FileName="Store Thumbnail.png">
|
|
||||||
<!-- _locComment_text="{Locked} Trailer screenshot 1 description" -->
|
|
||||||
</Image>
|
|
||||||
</Images>
|
|
||||||
</Trailer>
|
|
||||||
</Trailers>
|
|
||||||
<AppFeatures>
|
|
||||||
<!-- Valid length: 200 character limit, up to 20 elements -->
|
|
||||||
<AppFeature _locID="App_feature1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 1" -->Вишеструке картице</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature2">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 2" -->Пуна Уникод подршка</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature3">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 3" -->GPU-убрзано исцртавање текста</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature4">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 4" -->Потпуна прилагодљивост</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature5">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 5" -->Подела панела</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature6">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 6" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature7">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 7" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature8">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 8" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature9">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 9" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature10">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 10" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature11">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 11" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature12">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 12" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature13">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 13" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature14">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 14" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature15">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 15" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature16">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 16" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature17">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 17" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature18">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 18" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature19">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 19" -->
|
|
||||||
</AppFeature>
|
|
||||||
<AppFeature _locID="App_feature20">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Feature 20" -->
|
|
||||||
</AppFeature>
|
|
||||||
</AppFeatures>
|
|
||||||
<RecommendedHardware>
|
|
||||||
<!-- Valid length: 200 character limit, up to 11 elements -->
|
|
||||||
<Recommendation _locID="App_RecommendedHW1">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} App Recommended Hardware 1" -->Тастатура</Recommendation>
|
|
||||||
</RecommendedHardware>
|
|
||||||
<MinimumHardware>
|
|
||||||
<!-- Valid length: 200 character limit, up to 11 elements -->
|
|
||||||
</MinimumHardware>
|
|
||||||
<CopyrightAndTrademark _locID="App_CopyrightandTrademark">
|
|
||||||
<!-- _locComment_text="{MaxLength=200} Copyright and Trademark" -->Copyright (c) Microsoft Corporation</CopyrightAndTrademark>
|
|
||||||
<AdditionalLicenseTerms _locID="App_AdditionalLicenseTerms">
|
|
||||||
<!-- _locComment_text="{MaxLength=10000} Additional License Terms" -->
|
|
||||||
</AdditionalLicenseTerms>
|
|
||||||
<WebsiteURL _locID="App_WebsiteURL">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} WebsiteURL" -->https://github.com/microsoft/terminal</WebsiteURL>
|
|
||||||
<SupportContactInfo _locID="App_SupportContactInfo">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} Support Contact Info" -->https://github.com/microsoft/terminal/issues/new</SupportContactInfo>
|
|
||||||
<PrivacyPolicyURL _locID="App_PrivacyURL">
|
|
||||||
<!-- _locComment_text="{MaxLength=2048} Privacy Policy URL" -->https://go.microsoft.com/fwlink/?LinkID=521839</PrivacyPolicyURL>
|
|
||||||
</ProductDescription>
|
|
||||||
@@ -56,9 +56,9 @@
|
|||||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Версія __VERSION_NUMBER__
|
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Версія __VERSION_NUMBER__
|
||||||
|
|
||||||
- Цілком нова сторінка розширень, яка показує, що було встановлено у вашому Терміналі
|
- Ми додали десятки налаштувань до інтерфейсу користувача, які раніше існували лише у файлі JSON, включаючи нову сторінку для налаштування макета меню «Нова вкладка»!
|
||||||
- Палітра команд тепер відображається вашою рідною мовою, так само, як і англійською
|
- Ми переробили архітектуру керування вікнами для підвищення надійності; будь ласка, повідомляйте про будь-які помилки, з якими ви зіткнулися, за допомогою псевдоніма wt.exe.
|
||||||
- Нові VT функції, такі як синхронізований рендеринг, нові колірні схеми, налаштування для швидких дій миші, таких як масштабування, тощо
|
- Профілі тепер відображають значок, якщо вони були приховані, або посилаються на програми, які було видалено.
|
||||||
|
|
||||||
Будь ласка, перегляньте нашу сторінку релізів GitHub для отримання додаткової інформації.
|
Будь ласка, перегляньте нашу сторінку релізів GitHub для отримання додаткової інформації.
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- 一个全新的“扩展”页,显示已安装到终端的内容
|
- 我们向用户界面添加了许多之前仅存在于 JSON 文件中的设置,包括用于自定义“新建标签页”菜单布局的新页面!
|
||||||
- 命令面板现在以你的母语和英语显示
|
- 我们已重新架构窗口管理以提高可靠性; 请使用 wt.exe 别名提交您遇到的任何错误
|
||||||
- 新的 VT 功能,例如同步渲染、新配色方案、快速鼠标操作(如缩放)的配置等
|
- 配置文件如果已被隐藏或引用了已卸载的程序,现在会显示一个图标。
|
||||||
|
|
||||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -56,9 +56,9 @@
|
|||||||
<ReleaseNotes>
|
<ReleaseNotes>
|
||||||
Version __VERSION_NUMBER__
|
Version __VERSION_NUMBER__
|
||||||
|
|
||||||
- 全新的延伸模組頁面會顯示已安裝在您終端機中的內容
|
- 我們已在使用者介面中新增數十個曾經僅存在於 JSON 檔案中的設定,包括一個可自訂新索引標籤選單版面配置的新頁面!
|
||||||
- 命令選擇區現在以您的母語和英文顯示
|
- 我們已重新架構視窗管理以提升可靠性; 如果您在使用 wt.exe 別名時遇到任何錯誤,請提交錯誤回報
|
||||||
- 新的 VT 功能,例如同步轉譯、新的色彩配置、快速滑鼠動作 (例如縮放) 設定等等
|
- 如果設定檔已隱藏或參照已解除安裝的程式,現在會顯示圖示。
|
||||||
|
|
||||||
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
|
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ stages:
|
|||||||
name: SHINE-INT-L
|
name: SHINE-INT-L
|
||||||
${{ else }}:
|
${{ else }}:
|
||||||
name: SHINE-OSS-L
|
name: SHINE-OSS-L
|
||||||
demands: ImageOverride -equals SHINE-VS18-Latest
|
|
||||||
buildPlatforms: [x64]
|
buildPlatforms: [x64]
|
||||||
buildConfigurations: [AuditMode]
|
buildConfigurations: [AuditMode]
|
||||||
buildEverything: true
|
buildEverything: true
|
||||||
@@ -83,7 +82,6 @@ stages:
|
|||||||
name: SHINE-INT-L
|
name: SHINE-INT-L
|
||||||
${{ else }}:
|
${{ else }}:
|
||||||
name: SHINE-OSS-L
|
name: SHINE-OSS-L
|
||||||
demands: ImageOverride -equals SHINE-VS18-Latest
|
|
||||||
buildPlatforms:
|
buildPlatforms:
|
||||||
- ${{ platform }}
|
- ${{ platform }}
|
||||||
buildConfigurations: [Release]
|
buildConfigurations: [Release]
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ jobs:
|
|||||||
BuildConfiguration: ${{ config }}
|
BuildConfiguration: ${{ config }}
|
||||||
dependsOn: ${{ parameters.dependsOn }}
|
dependsOn: ${{ parameters.dependsOn }}
|
||||||
variables:
|
variables:
|
||||||
BuildPlatform: Any CPU
|
|
||||||
OutputBuildPlatform: AnyCPU
|
OutputBuildPlatform: AnyCPU
|
||||||
Terminal.BinDir: $(Build.SourcesDirectory)/bin/$(OutputBuildPlatform)/$(BuildConfiguration)
|
Terminal.BinDir: $(Build.SourcesDirectory)/bin/$(OutputBuildPlatform)/$(BuildConfiguration)
|
||||||
JobOutputDirectory: $(Build.ArtifactStagingDirectory)\nupkg
|
JobOutputDirectory: $(Build.ArtifactStagingDirectory)\nupkg
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ parameters:
|
|||||||
type: object
|
type: object
|
||||||
default:
|
default:
|
||||||
name: SHINE-INT-S # By default, send jobs to the small agent pool.
|
name: SHINE-INT-S # By default, send jobs to the small agent pool.
|
||||||
demands: ImageOverride -equals SHINE-VS18-Latest
|
demands: ImageOverride -equals SHINE-VS17-Latest
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
- template: variables-nuget-package-version.yml
|
- template: variables-nuget-package-version.yml
|
||||||
@@ -81,7 +81,7 @@ stages:
|
|||||||
parameters:
|
parameters:
|
||||||
pool:
|
pool:
|
||||||
name: SHINE-INT-L # Run the compilation on the large agent pool, rather than the default small one.
|
name: SHINE-INT-L # Run the compilation on the large agent pool, rather than the default small one.
|
||||||
demands: ImageOverride -equals SHINE-VS18-Latest
|
demands: ImageOverride -equals SHINE-VS17-Latest
|
||||||
branding: ${{ parameters.branding }}
|
branding: ${{ parameters.branding }}
|
||||||
buildTerminal: ${{ parameters.buildTerminal }}
|
buildTerminal: ${{ parameters.buildTerminal }}
|
||||||
buildConPTY: ${{ parameters.buildConPTY }}
|
buildConPTY: ${{ parameters.buildConPTY }}
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ extends:
|
|||||||
ob_createvpack_verbose: true
|
ob_createvpack_verbose: true
|
||||||
ob_createvpack_vpackdirectory: '$(JobOutputDirectory)\vpack'
|
ob_createvpack_vpackdirectory: '$(JobOutputDirectory)\vpack'
|
||||||
ob_createvpack_versionAs: string
|
ob_createvpack_versionAs: string
|
||||||
ob_createvpack_version: '$(XES_PACKAGEVERSIONNUMBER)'
|
ob_createvpack_version: '$(XES_APPXMANIFESTVERSION)'
|
||||||
ob_updateOSManifest_gitcheckinConfigPath: '$(Build.SourcesDirectory)\build\config\GitCheckin.json'
|
ob_updateOSManifest_gitcheckinConfigPath: '$(Build.SourcesDirectory)\build\config\GitCheckin.json'
|
||||||
# We're skipping the 'fetch' part of the OneBranch rules, but that doesn't mean
|
# We're skipping the 'fetch' part of the OneBranch rules, but that doesn't mean
|
||||||
# that it doesn't expect to have downloaded a manifest directly to some 'destination'
|
# that it doesn't expect to have downloaded a manifest directly to some 'destination'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
steps:
|
steps:
|
||||||
- pwsh: |-
|
- pwsh: |-
|
||||||
$VsInstallRoot = & 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe' -requires Microsoft.VisualStudio.Component.Vcpkg -property installationPath -latest
|
$VsInstallRoot = & 'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe' -requires Microsoft.VisualStudio.Component.Vcpkg -property installationPath
|
||||||
If ([String]::IsNullOrEmpty($VsInstallRoot)) {
|
If ([String]::IsNullOrEmpty($VsInstallRoot)) {
|
||||||
Remove-Item -Recurse -Force dep/vcpkg -ErrorAction:Ignore
|
Remove-Item -Recurse -Force dep/vcpkg -ErrorAction:Ignore
|
||||||
git clone https://github.com/microsoft/vcpkg dep/vcpkg
|
git clone https://github.com/microsoft/vcpkg dep/vcpkg
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
<!-- This file is read by XES, which we use in our Release builds. -->
|
<!-- This file is read by XES, which we use in our Release builds. -->
|
||||||
<PropertyGroup Label="Version">
|
<PropertyGroup Label="Version">
|
||||||
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
|
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
|
||||||
<XesBaseYearForStoreVersion>2026</XesBaseYearForStoreVersion>
|
<XesBaseYearForStoreVersion>2025</XesBaseYearForStoreVersion>
|
||||||
<VersionMajor>1</VersionMajor>
|
<VersionMajor>1</VersionMajor>
|
||||||
<VersionMinor>26</VersionMinor>
|
<VersionMinor>25</VersionMinor>
|
||||||
<VersionInfoProductName>Windows Terminal</VersionInfoProductName>
|
<VersionInfoProductName>Windows Terminal</VersionInfoProductName>
|
||||||
<VersionInfoCulture>1033</VersionInfoCulture>
|
<VersionInfoCulture>1033</VersionInfoCulture>
|
||||||
<!-- The default has a spacing problem -->
|
<!-- The default has a spacing problem -->
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|
||||||
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
||||||
set(VCPKG_C_FLAGS /fsanitize=address)
|
set(VCPKG_C_FLAGS /fsanitize=address)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|
||||||
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
||||||
set(VCPKG_C_FLAGS /fsanitize=address)
|
set(VCPKG_C_FLAGS /fsanitize=address)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|
||||||
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
set(VCPKG_CXX_FLAGS /fsanitize=address)
|
||||||
set(VCPKG_C_FLAGS /fsanitize=address)
|
set(VCPKG_C_FLAGS /fsanitize=address)
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ set(VCPKG_LIBRARY_LINKAGE static)
|
|||||||
|
|
||||||
# ...but with explicit platform toolset, so that future toolsets
|
# ...but with explicit platform toolset, so that future toolsets
|
||||||
# aren't automatically picked up (it defaults to the latest one).
|
# aren't automatically picked up (it defaults to the latest one).
|
||||||
set(VCPKG_PLATFORM_TOOLSET v145)
|
set(VCPKG_PLATFORM_TOOLSET v143)
|
||||||
|
|||||||
@@ -2407,14 +2407,6 @@
|
|||||||
"console"
|
"console"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"compatibility.ambiguousWidth": {
|
|
||||||
"default": "narrow",
|
|
||||||
"description": "Controls the cell width of East Asian Ambiguous characters.",
|
|
||||||
"enum": [
|
|
||||||
"narrow",
|
|
||||||
"wide"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"copyFormatting": {
|
"copyFormatting": {
|
||||||
"default": true,
|
"default": true,
|
||||||
"description": "When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied.",
|
"description": "When set to `true`, the color and font formatting of selected text is also copied to your clipboard. When set to `false`, only plain text is copied to your clipboard. An array of specific formats can also be used. Supported array values include `html` and `rtf`. Plain text is always copied.",
|
||||||
@@ -3174,11 +3166,6 @@
|
|||||||
"mingw"
|
"mingw"
|
||||||
],
|
],
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
|
||||||
"dragDropDelimiter": {
|
|
||||||
"default": " ",
|
|
||||||
"description": "The delimiter used when dropping multiple files onto the terminal.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -390,9 +390,6 @@ Microsoft::Console::ICU::unique_utext Microsoft::Console::ICU::UTextFromTextBuff
|
|||||||
utext_setup(&ut, 0, &status);
|
utext_setup(&ut, 0, &status);
|
||||||
FAIL_FAST_IF(status > U_ZERO_ERROR);
|
FAIL_FAST_IF(status > U_ZERO_ERROR);
|
||||||
|
|
||||||
rowBeg = std::max<til::CoordType>(0, rowBeg);
|
|
||||||
rowEnd = std::min(textBuffer.GetSize().BottomExclusive(), rowEnd);
|
|
||||||
|
|
||||||
ut.providerProperties = (1 << UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE) | (1 << UTEXT_PROVIDER_STABLE_CHUNKS);
|
ut.providerProperties = (1 << UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE) | (1 << UTEXT_PROVIDER_STABLE_CHUNKS);
|
||||||
ut.pFuncs = &utextFuncs;
|
ut.pFuncs = &utextFuncs;
|
||||||
ut.context = &textBuffer;
|
ut.context = &textBuffer;
|
||||||
|
|||||||
@@ -219,17 +219,6 @@ til::CoordType TextBuffer::_estimateOffsetOfLastCommittedRow() const noexcept
|
|||||||
return std::max(0, gsl::narrow_cast<til::CoordType>(lastRowOffset - 2));
|
return std::max(0, gsl::narrow_cast<til::CoordType>(lastRowOffset - 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextBuffer::_isRowCommitted(til::CoordType y) const noexcept
|
|
||||||
{
|
|
||||||
auto offset = (_firstRow + y + 1 /* account for the scratch row */) % _height;
|
|
||||||
if (offset < 0)
|
|
||||||
{
|
|
||||||
offset += _height;
|
|
||||||
}
|
|
||||||
const auto row = _buffer.get() + _bufferRowStride * offset;
|
|
||||||
return row < _commitWatermark;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieves a row from the buffer by its offset from the first row of the text buffer
|
// Retrieves a row from the buffer by its offset from the first row of the text buffer
|
||||||
// (what corresponds to the top row of the screen buffer).
|
// (what corresponds to the top row of the screen buffer).
|
||||||
const ROW& TextBuffer::GetRowByOffset(const til::CoordType index) const
|
const ROW& TextBuffer::GetRowByOffset(const til::CoordType index) const
|
||||||
@@ -945,10 +934,6 @@ void TextBuffer::ResetLineRenditionRange(const til::CoordType startRow, const ti
|
|||||||
|
|
||||||
LineRendition TextBuffer::GetLineRendition(const til::CoordType row) const
|
LineRendition TextBuffer::GetLineRendition(const til::CoordType row) const
|
||||||
{
|
{
|
||||||
if (!_isRowCommitted(row)) [[unlikely]]
|
|
||||||
{
|
|
||||||
return LineRendition::SingleWidth;
|
|
||||||
}
|
|
||||||
return GetRowByOffset(row).GetLineRendition();
|
return GetRowByOffset(row).GetLineRendition();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1156,20 +1141,7 @@ DelimiterClass TextBuffer::_GetDelimiterClassAt(const til::point pos, const std:
|
|||||||
return GetRowByOffset(realPos.y).DelimiterClassAt(realPos.x, wordDelimiters);
|
return GetRowByOffset(realPos.y).DelimiterClassAt(realPos.x, wordDelimiters);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
til::point TextBuffer::GetWordStart2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const
|
||||||
// - Get the start of the word at or before the given position
|
|
||||||
// - When includeWhitespace is false, returns the start of the current delimiter class run
|
|
||||||
// (selection behavior: stops at non-wrapped row boundaries)
|
|
||||||
// - When includeWhitespace is true, also skips backward past any leading ControlChars
|
|
||||||
// to include the preceding word (accessibility/UIA behavior: crosses all row boundaries)
|
|
||||||
// Arguments:
|
|
||||||
// - pos - the buffer position to start from
|
|
||||||
// - wordDelimiters - characters considered as DelimiterClass::DelimiterChar
|
|
||||||
// - includeWhitespace - when true, skip past leading whitespace to find the word start
|
|
||||||
// - limitOptional - (optional) the last possible position in the buffer that can be explored
|
|
||||||
// Return Value:
|
|
||||||
// - The position of the first character of the word (inclusive)
|
|
||||||
til::point TextBuffer::GetWordStart(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const
|
|
||||||
{
|
{
|
||||||
const auto bufferSize{ GetSize() };
|
const auto bufferSize{ GetSize() };
|
||||||
const auto limit{ limitOptional.value_or(bufferSize.BottomInclusiveRightExclusive()) };
|
const auto limit{ limitOptional.value_or(bufferSize.BottomInclusiveRightExclusive()) };
|
||||||
@@ -1202,7 +1174,7 @@ til::point TextBuffer::GetWordStart(til::point pos, const std::wstring_view word
|
|||||||
// 1. move to the beginning of the delimiter class run
|
// 1. move to the beginning of the delimiter class run
|
||||||
// 2. (includeWhitespace) if we were on a ControlChar, go back one more delimiter class run
|
// 2. (includeWhitespace) if we were on a ControlChar, go back one more delimiter class run
|
||||||
const auto initialDelimiter = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
const auto initialDelimiter = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
||||||
pos = _GetDelimiterClassRunStart(pos, wordDelimiters, includeWhitespace);
|
pos = _GetDelimiterClassRunStart(pos, wordDelimiters);
|
||||||
if (!includeWhitespace || pos.x == bufferSize.Left())
|
if (!includeWhitespace || pos.x == bufferSize.Left())
|
||||||
{
|
{
|
||||||
// Special case:
|
// Special case:
|
||||||
@@ -1213,26 +1185,12 @@ til::point TextBuffer::GetWordStart(til::point pos, const std::wstring_view word
|
|||||||
else if (initialDelimiter == DelimiterClass::ControlChar)
|
else if (initialDelimiter == DelimiterClass::ControlChar)
|
||||||
{
|
{
|
||||||
bufferSize.DecrementInExclusiveBounds(pos);
|
bufferSize.DecrementInExclusiveBounds(pos);
|
||||||
pos = _GetDelimiterClassRunStart(pos, wordDelimiters, includeWhitespace);
|
pos = _GetDelimiterClassRunStart(pos, wordDelimiters);
|
||||||
}
|
}
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
til::point TextBuffer::GetWordEnd2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const
|
||||||
// - Get the exclusive end of the word at or after the given position
|
|
||||||
// - When includeWhitespace is false, returns the exclusive end of the current delimiter class run
|
|
||||||
// (selection behavior: stops at non-wrapped row boundaries)
|
|
||||||
// - When includeWhitespace is true, also skips forward past any trailing ControlChars
|
|
||||||
// to include trailing whitespace (accessibility/UIA behavior: crosses all row boundaries)
|
|
||||||
// - The result is clamped to limitOptional when provided
|
|
||||||
// Arguments:
|
|
||||||
// - pos - the buffer position to start from
|
|
||||||
// - wordDelimiters - characters considered as DelimiterClass::DelimiterChar
|
|
||||||
// - includeWhitespace - when true, skip past trailing whitespace to find the next word boundary
|
|
||||||
// - limitOptional - (optional) the last possible position in the buffer that can be explored
|
|
||||||
// Return Value:
|
|
||||||
// - The exclusive end position of the word
|
|
||||||
til::point TextBuffer::GetWordEnd(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const
|
|
||||||
{
|
{
|
||||||
const auto bufferSize{ GetSize() };
|
const auto bufferSize{ GetSize() };
|
||||||
const auto limit{ limitOptional.value_or(bufferSize.BottomInclusiveRightExclusive()) };
|
const auto limit{ limitOptional.value_or(bufferSize.BottomInclusiveRightExclusive()) };
|
||||||
@@ -1265,12 +1223,8 @@ til::point TextBuffer::GetWordEnd(til::point pos, const std::wstring_view wordDe
|
|||||||
// So the heuristic we use is:
|
// So the heuristic we use is:
|
||||||
// 1. move to the end of the delimiter class run
|
// 1. move to the end of the delimiter class run
|
||||||
// 2. (includeWhitespace) if the next delimiter class run is a ControlChar, go forward one more delimiter class run
|
// 2. (includeWhitespace) if the next delimiter class run is a ControlChar, go forward one more delimiter class run
|
||||||
pos = _GetDelimiterClassRunEnd(pos, wordDelimiters, includeWhitespace);
|
pos = _GetDelimiterClassRunEnd(pos, wordDelimiters);
|
||||||
if (pos >= limit)
|
if (!includeWhitespace || pos.x == bufferSize.RightExclusive())
|
||||||
{
|
|
||||||
return limit;
|
|
||||||
}
|
|
||||||
else if (!includeWhitespace || pos.x == bufferSize.RightExclusive())
|
|
||||||
{
|
{
|
||||||
// Special case:
|
// Special case:
|
||||||
// we're at the right boundary (and end of a delimiter class run),
|
// we're at the right boundary (and end of a delimiter class run),
|
||||||
@@ -1281,8 +1235,7 @@ til::point TextBuffer::GetWordEnd(til::point pos, const std::wstring_view wordDe
|
|||||||
if (const auto nextDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
if (const auto nextDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
||||||
nextDelimClass == DelimiterClass::ControlChar)
|
nextDelimClass == DelimiterClass::ControlChar)
|
||||||
{
|
{
|
||||||
pos = _GetDelimiterClassRunEnd(pos, wordDelimiters, includeWhitespace);
|
return _GetDelimiterClassRunEnd(pos, wordDelimiters);
|
||||||
return std::min(pos, limit);
|
|
||||||
}
|
}
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
@@ -1335,48 +1288,29 @@ bool TextBuffer::IsWordBoundary(const til::point pos, const std::wstring_view wo
|
|||||||
return prevDelimiterClass != currentDelimiterClass && currentDelimiterClass != DelimiterClass::ControlChar;
|
return prevDelimiterClass != currentDelimiterClass && currentDelimiterClass != DelimiterClass::ControlChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
til::point TextBuffer::_GetDelimiterClassRunStart(til::point pos, const std::wstring_view wordDelimiters) const
|
||||||
// - Get the start position for the current delimiter class run, scanning backward
|
|
||||||
// - Stops when the delimiter class changes or a row boundary is reached
|
|
||||||
// - When accessibilityMode is true, freely crosses non-wrapped row boundaries
|
|
||||||
// - When accessibilityMode is false, only crosses wrap-forced row boundaries
|
|
||||||
// Arguments:
|
|
||||||
// - pos - the buffer position to start scanning from
|
|
||||||
// - wordDelimiters - what characters are we considering for the separation of words
|
|
||||||
// - accessibilityMode - when true, cross non-wrapped row boundaries freely
|
|
||||||
// Return Value:
|
|
||||||
// - The position of the first character in the current delimiter class run (inclusive)
|
|
||||||
til::point TextBuffer::_GetDelimiterClassRunStart(til::point pos, const std::wstring_view wordDelimiters, const bool accessibilityMode) const
|
|
||||||
{
|
{
|
||||||
const auto bufferSize = GetSize();
|
const auto bufferSize = GetSize();
|
||||||
const auto initialDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
const auto initialDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
||||||
auto nextPos = pos;
|
for (auto nextPos = pos; nextPos != bufferSize.Origin(); pos = nextPos)
|
||||||
while (nextPos != bufferSize.Origin())
|
|
||||||
{
|
{
|
||||||
bufferSize.DecrementInExclusiveBounds(nextPos);
|
bufferSize.DecrementInExclusiveBounds(nextPos);
|
||||||
|
|
||||||
if (nextPos.x == bufferSize.RightExclusive())
|
if (nextPos.x == bufferSize.RightExclusive())
|
||||||
{
|
{
|
||||||
// wrapped onto previous line
|
// wrapped onto previous line,
|
||||||
|
// check if it was forced to wrap
|
||||||
const auto& row = GetRowByOffset(nextPos.y);
|
const auto& row = GetRowByOffset(nextPos.y);
|
||||||
if (!row.WasWrapForced() && !accessibilityMode)
|
if (!row.WasWrapForced())
|
||||||
{
|
{
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
// In accessibility mode (or if row was wrap-forced), continue
|
|
||||||
// across the row boundary. The actual last character of the
|
|
||||||
// previous row will be checked on the next iteration.
|
|
||||||
// Don't update pos to avoid storing a transient position
|
|
||||||
}
|
}
|
||||||
else if (_GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass)
|
else if (_GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass)
|
||||||
{
|
{
|
||||||
// if we changed delim class, we're done (don't apply move)
|
// if we changed delim class, we're done (don't apply move)
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pos = nextPos;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
@@ -1386,8 +1320,7 @@ til::point TextBuffer::_GetDelimiterClassRunStart(til::point pos, const std::wst
|
|||||||
// Arguments:
|
// Arguments:
|
||||||
// - pos - the buffer position being within the current delimiter class
|
// - pos - the buffer position being within the current delimiter class
|
||||||
// - wordDelimiters - what characters are we considering for the separation of words
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
// - accessibilityMode - when true, cross non-wrapped row boundaries freely
|
til::point TextBuffer::_GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters) const
|
||||||
til::point TextBuffer::_GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters, const bool accessibilityMode) const
|
|
||||||
{
|
{
|
||||||
const auto bufferSize = GetSize();
|
const auto bufferSize = GetSize();
|
||||||
const auto initialDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
const auto initialDelimClass = bufferSize.IsInBounds(pos) ? _GetDelimiterClassAt(pos, wordDelimiters) : DelimiterClass::ControlChar;
|
||||||
@@ -1400,16 +1333,7 @@ til::point TextBuffer::_GetDelimiterClassRunEnd(til::point pos, const std::wstri
|
|||||||
// wrapped onto next line,
|
// wrapped onto next line,
|
||||||
// check if it was forced to wrap or switched delimiter class
|
// check if it was forced to wrap or switched delimiter class
|
||||||
const auto& row = GetRowByOffset(pos.y);
|
const auto& row = GetRowByOffset(pos.y);
|
||||||
if (accessibilityMode)
|
if (!row.WasWrapForced() || _GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass)
|
||||||
{
|
|
||||||
// In accessibility mode, always cross row boundaries,
|
|
||||||
// but still stop if the delimiter class changes
|
|
||||||
if (_GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass)
|
|
||||||
{
|
|
||||||
return nextPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!row.WasWrapForced() || _GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass)
|
|
||||||
{
|
{
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
@@ -1424,6 +1348,283 @@ til::point TextBuffer::_GetDelimiterClassRunEnd(til::point pos, const std::wstri
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Get the til::point for the beginning of the word you are on
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// - accessibilityMode - when enabled, we continue expanding left until we are at the beginning of a readable word.
|
||||||
|
// Otherwise, expand left until a character of a new delimiter class is found
|
||||||
|
// (or a row boundary is encountered)
|
||||||
|
// - limitOptional - (optional) the last possible position in the buffer that can be explored. This can be used to improve performance.
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the first character on the "word" (inclusive)
|
||||||
|
til::point TextBuffer::GetWordStart(const til::point target, const std::wstring_view wordDelimiters, bool accessibilityMode, std::optional<til::point> limitOptional) const
|
||||||
|
{
|
||||||
|
// Consider a buffer with this text in it:
|
||||||
|
// " word other "
|
||||||
|
// In selection (accessibilityMode = false),
|
||||||
|
// a "word" is defined as the range between two delimiters
|
||||||
|
// so the words in the example include [" ", "word", " ", "other", " "]
|
||||||
|
// In accessibility (accessibilityMode = true),
|
||||||
|
// a "word" includes the delimiters after a range of readable characters
|
||||||
|
// so the words in the example include ["word ", "other "]
|
||||||
|
// NOTE: the start anchor (this one) is inclusive, whereas the end anchor (GetWordEnd) is exclusive
|
||||||
|
|
||||||
|
#pragma warning(suppress : 26496)
|
||||||
|
auto copy{ target };
|
||||||
|
const auto bufferSize{ GetSize() };
|
||||||
|
const auto limit{ limitOptional.value_or(bufferSize.EndExclusive()) };
|
||||||
|
if (target == bufferSize.Origin())
|
||||||
|
{
|
||||||
|
// can't expand left
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
else if (target == bufferSize.EndExclusive())
|
||||||
|
{
|
||||||
|
// GH#7664: Treat EndExclusive as EndInclusive so
|
||||||
|
// that it actually points to a space in the buffer
|
||||||
|
copy = bufferSize.BottomRightInclusive();
|
||||||
|
}
|
||||||
|
else if (bufferSize.CompareInBounds(target, limit, true) >= 0)
|
||||||
|
{
|
||||||
|
// if at/past the limit --> clamp to limit
|
||||||
|
copy = limitOptional.value_or(bufferSize.BottomRightInclusive());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accessibilityMode)
|
||||||
|
{
|
||||||
|
return _GetWordStartForAccessibility(copy, wordDelimiters);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _GetWordStartForSelection(copy, wordDelimiters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Helper method for GetWordStart(). Get the til::point for the beginning of the word (accessibility definition) you are on
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the first character on the current/previous READABLE "word" (inclusive)
|
||||||
|
til::point TextBuffer::_GetWordStartForAccessibility(const til::point target, const std::wstring_view wordDelimiters) const
|
||||||
|
{
|
||||||
|
auto result = target;
|
||||||
|
const auto bufferSize = GetSize();
|
||||||
|
|
||||||
|
// ignore left boundary. Continue until readable text found
|
||||||
|
while (_GetDelimiterClassAt(result, wordDelimiters) != DelimiterClass::RegularChar)
|
||||||
|
{
|
||||||
|
if (result == bufferSize.Origin())
|
||||||
|
{
|
||||||
|
//looped around and hit origin (no word between origin and target)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bufferSize.DecrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure we expand to the left boundary or the beginning of the word
|
||||||
|
while (_GetDelimiterClassAt(result, wordDelimiters) == DelimiterClass::RegularChar)
|
||||||
|
{
|
||||||
|
if (result == bufferSize.Origin())
|
||||||
|
{
|
||||||
|
// first char in buffer is a RegularChar
|
||||||
|
// we can't move any further back
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bufferSize.DecrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move off of delimiter
|
||||||
|
bufferSize.IncrementInBounds(result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Helper method for GetWordStart(). Get the til::point for the beginning of the word (selection definition) you are on
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the first character on the current word or delimiter run (stopped by the left margin)
|
||||||
|
til::point TextBuffer::_GetWordStartForSelection(const til::point target, const std::wstring_view wordDelimiters) const
|
||||||
|
{
|
||||||
|
auto result = target;
|
||||||
|
const auto bufferSize = GetSize();
|
||||||
|
|
||||||
|
const auto initialDelimiter = _GetDelimiterClassAt(result, wordDelimiters);
|
||||||
|
const bool isControlChar = initialDelimiter == DelimiterClass::ControlChar;
|
||||||
|
|
||||||
|
// expand left until we hit the left boundary or a different delimiter class
|
||||||
|
while (result != bufferSize.Origin() && _GetDelimiterClassAt(result, wordDelimiters) == initialDelimiter)
|
||||||
|
{
|
||||||
|
if (result.x == bufferSize.Left())
|
||||||
|
{
|
||||||
|
// Prevent wrapping to the previous line if the selection begins on whitespace
|
||||||
|
if (isControlChar)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.y > 0)
|
||||||
|
{
|
||||||
|
// Prevent wrapping to the previous line if it was hard-wrapped (e.g. not forced by us to wrap)
|
||||||
|
const auto& priorRow = GetRowByOffset(result.y - 1);
|
||||||
|
if (!priorRow.WasWrapForced())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bufferSize.DecrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_GetDelimiterClassAt(result, wordDelimiters) != initialDelimiter)
|
||||||
|
{
|
||||||
|
// move off of delimiter
|
||||||
|
bufferSize.IncrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Get the til::point for the beginning of the NEXT word
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// - accessibilityMode - when enabled, we continue expanding right until we are at the beginning of the next READABLE word
|
||||||
|
// Otherwise, expand right until a character of a new delimiter class is found
|
||||||
|
// (or a row boundary is encountered)
|
||||||
|
// - limitOptional - (optional) the last possible position in the buffer that can be explored. This can be used to improve performance.
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the last character on the "word" (inclusive)
|
||||||
|
til::point TextBuffer::GetWordEnd(const til::point target, const std::wstring_view wordDelimiters, bool accessibilityMode, std::optional<til::point> limitOptional) const
|
||||||
|
{
|
||||||
|
// Consider a buffer with this text in it:
|
||||||
|
// " word other "
|
||||||
|
// In selection (accessibilityMode = false),
|
||||||
|
// a "word" is defined as the range between two delimiters
|
||||||
|
// so the words in the example include [" ", "word", " ", "other", " "]
|
||||||
|
// In accessibility (accessibilityMode = true),
|
||||||
|
// a "word" includes the delimiters after a range of readable characters
|
||||||
|
// so the words in the example include ["word ", "other "]
|
||||||
|
// NOTE: the end anchor (this one) is exclusive, whereas the start anchor (GetWordStart) is inclusive
|
||||||
|
|
||||||
|
// Already at/past the limit. Can't move forward.
|
||||||
|
const auto bufferSize{ GetSize() };
|
||||||
|
const auto limit{ limitOptional.value_or(bufferSize.EndExclusive()) };
|
||||||
|
if (bufferSize.CompareInBounds(target, limit, true) >= 0)
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accessibilityMode)
|
||||||
|
{
|
||||||
|
return _GetWordEndForAccessibility(target, wordDelimiters, limit);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _GetWordEndForSelection(target, wordDelimiters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Helper method for GetWordEnd(). Get the til::point for the beginning of the next READABLE word
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// - limit - the last "valid" position in the text buffer (to improve performance)
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the first character of the next readable "word". If no next word, return one past the end of the buffer
|
||||||
|
til::point TextBuffer::_GetWordEndForAccessibility(const til::point target, const std::wstring_view wordDelimiters, const til::point limit) const
|
||||||
|
{
|
||||||
|
const auto bufferSize{ GetSize() };
|
||||||
|
auto result{ target };
|
||||||
|
|
||||||
|
if (bufferSize.CompareInBounds(target, limit, true) >= 0)
|
||||||
|
{
|
||||||
|
// if we're already on/past the last RegularChar,
|
||||||
|
// clamp result to that position
|
||||||
|
result = limit;
|
||||||
|
|
||||||
|
// make the result exclusive
|
||||||
|
bufferSize.IncrementInBounds(result, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (result != limit && result != bufferSize.BottomRightInclusive() && _GetDelimiterClassAt(result, wordDelimiters) == DelimiterClass::RegularChar)
|
||||||
|
{
|
||||||
|
// Iterate through readable text
|
||||||
|
bufferSize.IncrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (result != limit && result != bufferSize.BottomRightInclusive() && _GetDelimiterClassAt(result, wordDelimiters) != DelimiterClass::RegularChar)
|
||||||
|
{
|
||||||
|
// expand to the beginning of the NEXT word
|
||||||
|
bufferSize.IncrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special case: we tried to move one past the end of the buffer
|
||||||
|
// Manually increment onto the EndExclusive point.
|
||||||
|
if (result == bufferSize.BottomRightInclusive())
|
||||||
|
{
|
||||||
|
bufferSize.IncrementInBounds(result, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Helper method for GetWordEnd(). Get the til::point for the beginning of the NEXT word
|
||||||
|
// Arguments:
|
||||||
|
// - target - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// Return Value:
|
||||||
|
// - The til::point for the last character of the current word or delimiter run (stopped by right margin)
|
||||||
|
til::point TextBuffer::_GetWordEndForSelection(const til::point target, const std::wstring_view wordDelimiters) const
|
||||||
|
{
|
||||||
|
const auto bufferSize = GetSize();
|
||||||
|
|
||||||
|
auto result = target;
|
||||||
|
const auto initialDelimiter = _GetDelimiterClassAt(result, wordDelimiters);
|
||||||
|
const bool isControlChar = initialDelimiter == DelimiterClass::ControlChar;
|
||||||
|
|
||||||
|
// expand right until we hit the right boundary as a ControlChar or a different delimiter class
|
||||||
|
while (result != bufferSize.BottomRightInclusive() && _GetDelimiterClassAt(result, wordDelimiters) == initialDelimiter)
|
||||||
|
{
|
||||||
|
if (result.x == bufferSize.RightInclusive())
|
||||||
|
{
|
||||||
|
// Prevent wrapping to the next line if the selection begins on whitespace
|
||||||
|
if (isControlChar)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent wrapping to the next line if this one was hard-wrapped (e.g. not forced by us to wrap)
|
||||||
|
const auto& row = GetRowByOffset(result.y);
|
||||||
|
if (!row.WasWrapForced())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bufferSize.IncrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_GetDelimiterClassAt(result, wordDelimiters) != initialDelimiter)
|
||||||
|
{
|
||||||
|
// move off of delimiter
|
||||||
|
bufferSize.DecrementInBounds(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void TextBuffer::_PruneHyperlinks()
|
void TextBuffer::_PruneHyperlinks()
|
||||||
{
|
{
|
||||||
// Check the old first row for hyperlink references
|
// Check the old first row for hyperlink references
|
||||||
@@ -1470,6 +1671,57 @@ void TextBuffer::_PruneHyperlinks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Update pos to be the position of the first character of the next word. This is used for accessibility
|
||||||
|
// Arguments:
|
||||||
|
// - pos - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// - limitOptional - (optional) the last possible position in the buffer that can be explored. This can be used to improve performance.
|
||||||
|
// Return Value:
|
||||||
|
// - true, if successfully updated pos. False, if we are unable to move (usually due to a buffer boundary)
|
||||||
|
// - pos - The til::point for the first character on the "word" (inclusive)
|
||||||
|
bool TextBuffer::MoveToNextWord(til::point& pos, const std::wstring_view wordDelimiters, std::optional<til::point> limitOptional) const
|
||||||
|
{
|
||||||
|
// move to the beginning of the next word
|
||||||
|
// NOTE: _GetWordEnd...() returns the exclusive position of the "end of the word"
|
||||||
|
// This is also the inclusive start of the next word.
|
||||||
|
const auto bufferSize{ GetSize() };
|
||||||
|
const auto limit{ limitOptional.value_or(bufferSize.EndExclusive()) };
|
||||||
|
const auto copy{ _GetWordEndForAccessibility(pos, wordDelimiters, limit) };
|
||||||
|
|
||||||
|
if (bufferSize.CompareInBounds(copy, limit, true) >= 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = copy;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Description:
|
||||||
|
// - Update pos to be the position of the first character of the previous word. This is used for accessibility
|
||||||
|
// Arguments:
|
||||||
|
// - pos - a til::point on the word you are currently on
|
||||||
|
// - wordDelimiters - what characters are we considering for the separation of words
|
||||||
|
// Return Value:
|
||||||
|
// - true, if successfully updated pos. False, if we are unable to move (usually due to a buffer boundary)
|
||||||
|
// - pos - The til::point for the first character on the "word" (inclusive)
|
||||||
|
bool TextBuffer::MoveToPreviousWord(til::point& pos, std::wstring_view wordDelimiters) const
|
||||||
|
{
|
||||||
|
// move to the beginning of the current word
|
||||||
|
auto copy{ GetWordStart(pos, wordDelimiters, true) };
|
||||||
|
|
||||||
|
if (!GetSize().DecrementInBounds(copy, true))
|
||||||
|
{
|
||||||
|
// can't move behind current word
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move to the beginning of the previous word
|
||||||
|
pos = GetWordStart(copy, wordDelimiters, true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
// - Update pos to be the beginning of the current glyph/character. This is used for accessibility
|
// - Update pos to be the beginning of the current glyph/character. This is used for accessibility
|
||||||
// Arguments:
|
// Arguments:
|
||||||
@@ -3527,34 +3779,3 @@ void TextBuffer::ManuallyMarkRowAsPrompt(til::CoordType y)
|
|||||||
attr.SetMarkAttributes(MarkKind::Prompt);
|
attr.SetMarkAttributes(MarkKind::Prompt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is an optimization used by the renderer to avoid scheduling a timer if not necessary;
|
|
||||||
// unlike the renderer, we know the committed range of our own buffer.
|
|
||||||
bool TextBuffer::ContainsBlinkAttributeInRegion(const Microsoft::Console::Types::Viewport& region) const
|
|
||||||
{
|
|
||||||
const auto top = region.Top();
|
|
||||||
auto bottom = std::min(region.BottomInclusive(), _estimateOffsetOfLastCommittedRow());
|
|
||||||
|
|
||||||
for (auto row = top; row < bottom; ++row)
|
|
||||||
{
|
|
||||||
const auto& r = GetRowByOffset(row);
|
|
||||||
for (const auto& attr : r.Attributes())
|
|
||||||
{
|
|
||||||
if (attr.IsBlinking())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TextBuffer::IsGlyphDoubleWidthAt(const til::point at) const
|
|
||||||
{
|
|
||||||
if (!_isRowCommitted(at.y)) [[unlikely]]
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return _getRow(at.y).DbcsAttrAt(at.x) != DbcsAttribute::Single;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -172,10 +172,15 @@ public:
|
|||||||
void TriggerNewTextNotification(const std::wstring_view newText);
|
void TriggerNewTextNotification(const std::wstring_view newText);
|
||||||
void TriggerSelection();
|
void TriggerSelection();
|
||||||
|
|
||||||
til::point GetWordStart(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional = std::nullopt) const;
|
til::point GetWordStart(const til::point target, const std::wstring_view wordDelimiters, bool accessibilityMode = false, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
til::point GetWordEnd(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional = std::nullopt) const;
|
til::point GetWordEnd(const til::point target, const std::wstring_view wordDelimiters, bool accessibilityMode = false, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
|
|
||||||
|
til::point GetWordStart2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
|
til::point GetWordEnd2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
|
|
||||||
bool IsWordBoundary(const til::point pos, const std::wstring_view wordDelimiters) const;
|
bool IsWordBoundary(const til::point pos, const std::wstring_view wordDelimiters) const;
|
||||||
|
bool MoveToNextWord(til::point& pos, const std::wstring_view wordDelimiters, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
|
bool MoveToPreviousWord(til::point& pos, const std::wstring_view wordDelimiters) const;
|
||||||
|
|
||||||
til::point GetGlyphStart(const til::point pos, std::optional<til::point> limitOptional = std::nullopt) const;
|
til::point GetGlyphStart(const til::point pos, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
til::point GetGlyphEnd(const til::point pos, bool accessibilityMode = false, std::optional<til::point> limitOptional = std::nullopt) const;
|
til::point GetGlyphEnd(const til::point pos, bool accessibilityMode = false, std::optional<til::point> limitOptional = std::nullopt) const;
|
||||||
@@ -310,9 +315,6 @@ public:
|
|||||||
void SetScrollbarData(ScrollbarData mark, til::CoordType y);
|
void SetScrollbarData(ScrollbarData mark, til::CoordType y);
|
||||||
void ManuallyMarkRowAsPrompt(til::CoordType y);
|
void ManuallyMarkRowAsPrompt(til::CoordType y);
|
||||||
|
|
||||||
bool ContainsBlinkAttributeInRegion(const Microsoft::Console::Types::Viewport& region) const;
|
|
||||||
bool IsGlyphDoubleWidthAt(const til::point at) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _reserve(til::size screenBufferSize, const TextAttribute& defaultAttributes);
|
void _reserve(til::size screenBufferSize, const TextAttribute& defaultAttributes);
|
||||||
void _commit(const std::byte* row);
|
void _commit(const std::byte* row);
|
||||||
@@ -322,13 +324,16 @@ private:
|
|||||||
ROW& _getRowByOffsetDirect(size_t offset);
|
ROW& _getRowByOffsetDirect(size_t offset);
|
||||||
ROW& _getRow(til::CoordType y) const;
|
ROW& _getRow(til::CoordType y) const;
|
||||||
til::CoordType _estimateOffsetOfLastCommittedRow() const noexcept;
|
til::CoordType _estimateOffsetOfLastCommittedRow() const noexcept;
|
||||||
bool _isRowCommitted(til::CoordType y) const noexcept;
|
|
||||||
|
|
||||||
void _SetFirstRowIndex(const til::CoordType FirstRowIndex) noexcept;
|
void _SetFirstRowIndex(const til::CoordType FirstRowIndex) noexcept;
|
||||||
void _ExpandTextRow(til::inclusive_rect& selectionRow) const;
|
void _ExpandTextRow(til::inclusive_rect& selectionRow) const;
|
||||||
DelimiterClass _GetDelimiterClassAt(const til::point pos, const std::wstring_view wordDelimiters) const;
|
DelimiterClass _GetDelimiterClassAt(const til::point pos, const std::wstring_view wordDelimiters) const;
|
||||||
til::point _GetDelimiterClassRunStart(til::point pos, const std::wstring_view wordDelimiters, const bool accessibilityMode = false) const;
|
til::point _GetDelimiterClassRunStart(til::point pos, const std::wstring_view wordDelimiters) const;
|
||||||
til::point _GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters, const bool accessibilityMode = false) const;
|
til::point _GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters) const;
|
||||||
|
til::point _GetWordStartForAccessibility(const til::point target, const std::wstring_view wordDelimiters) const;
|
||||||
|
til::point _GetWordStartForSelection(const til::point target, const std::wstring_view wordDelimiters) const;
|
||||||
|
til::point _GetWordEndForAccessibility(const til::point target, const std::wstring_view wordDelimiters, const til::point limit) const;
|
||||||
|
til::point _GetWordEndForSelection(const til::point target, const std::wstring_view wordDelimiters) const;
|
||||||
void _PruneHyperlinks();
|
void _PruneHyperlinks();
|
||||||
|
|
||||||
std::wstring _commandForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive, const bool clipAtCursor = false) const;
|
std::wstring _commandForRow(const til::CoordType rowOffset, const til::CoordType bottomInclusive, const bool clipAtCursor = false) const;
|
||||||
|
|||||||
@@ -600,6 +600,90 @@ namespace
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#pragma region TAEF hookup for the test case array above
|
||||||
|
struct ArrayIndexTaefAdapterRow : public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom | Microsoft::WRL::InhibitFtmBase>, IDataRow>
|
||||||
|
{
|
||||||
|
HRESULT RuntimeClassInitialize(const size_t index)
|
||||||
|
{
|
||||||
|
_index = index;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetTestData(BSTR /*pszName*/, SAFEARRAY** ppData) override
|
||||||
|
{
|
||||||
|
const auto indexString{ wil::str_printf<std::wstring>(L"%zu", _index) };
|
||||||
|
auto safeArray{ SafeArrayCreateVector(VT_BSTR, 0, 1) };
|
||||||
|
LONG index{ 0 };
|
||||||
|
auto indexBstr{ wil::make_bstr(indexString.c_str()) };
|
||||||
|
(void)SafeArrayPutElement(safeArray, &index, indexBstr.release());
|
||||||
|
*ppData = safeArray;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetMetadataNames(SAFEARRAY** ppMetadataNames) override
|
||||||
|
{
|
||||||
|
*ppMetadataNames = nullptr;
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetMetadata(BSTR /*pszName*/, SAFEARRAY** ppData) override
|
||||||
|
{
|
||||||
|
*ppData = nullptr;
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetName(BSTR* ppszRowName) override
|
||||||
|
{
|
||||||
|
*ppszRowName = nullptr;
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t _index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ArrayIndexTaefAdapterSource : public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom | Microsoft::WRL::InhibitFtmBase>, IDataSource>
|
||||||
|
{
|
||||||
|
STDMETHODIMP Advance(IDataRow** ppDataRow) override
|
||||||
|
{
|
||||||
|
if (_index < std::extent_v<decltype(testCases)>)
|
||||||
|
{
|
||||||
|
Microsoft::WRL::MakeAndInitialize<ArrayIndexTaefAdapterRow>(ppDataRow, _index++);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*ppDataRow = nullptr;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP Reset() override
|
||||||
|
{
|
||||||
|
_index = 0;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetTestDataNames(SAFEARRAY** names) override
|
||||||
|
{
|
||||||
|
auto safeArray{ SafeArrayCreateVector(VT_BSTR, 0, 1) };
|
||||||
|
LONG index{ 0 };
|
||||||
|
auto dataNameBstr{ wil::make_bstr(L"index") };
|
||||||
|
(void)SafeArrayPutElement(safeArray, &index, dataNameBstr.release());
|
||||||
|
*names = safeArray;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP GetTestDataType(BSTR /*name*/, BSTR* type) override
|
||||||
|
{
|
||||||
|
*type = nullptr;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t _index{ 0 };
|
||||||
|
};
|
||||||
|
#pragma endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" HRESULT __declspec(dllexport) __cdecl ReflowTestDataSource(IDataSource** ppDataSource, void*)
|
extern "C" HRESULT __declspec(dllexport) __cdecl ReflowTestDataSource(IDataSource** ppDataSource, void*)
|
||||||
|
|||||||
@@ -34,16 +34,6 @@ class UTextAdapterTests
|
|||||||
{
|
{
|
||||||
TEST_CLASS(UTextAdapterTests);
|
TEST_CLASS(UTextAdapterTests);
|
||||||
|
|
||||||
TEST_CLASS_SETUP(ClassSetup)
|
|
||||||
{
|
|
||||||
wil::unique_hmodule icu{ LoadLibraryExW(L"icu.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32) };
|
|
||||||
if (!icu)
|
|
||||||
{
|
|
||||||
WEX::Logging::Log::Result(WEX::Logging::TestResults::Skipped, L"ICU is not present");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD(Unicode)
|
TEST_METHOD(Unicode)
|
||||||
{
|
{
|
||||||
DummyRenderer renderer;
|
DummyRenderer renderer;
|
||||||
|
|||||||
@@ -26,9 +26,6 @@ TARGETLIBS = \
|
|||||||
$(CONSOLE_OBJ_PATH)\types\lib\$(O)\ConTypes.lib \
|
$(CONSOLE_OBJ_PATH)\types\lib\$(O)\ConTypes.lib \
|
||||||
$(TARGETLIBS) \
|
$(TARGETLIBS) \
|
||||||
|
|
||||||
DELAYLOAD = \
|
|
||||||
icu.dll \
|
|
||||||
|
|
||||||
# -------------------------------------
|
# -------------------------------------
|
||||||
# Localization
|
# Localization
|
||||||
# -------------------------------------
|
# -------------------------------------
|
||||||
|
|||||||
@@ -192,7 +192,7 @@
|
|||||||
ResourceKey="TabViewBackground" />
|
ResourceKey="TabViewBackground" />
|
||||||
|
|
||||||
<SolidColorBrush x:Key="SettingsUiTabBrush"
|
<SolidColorBrush x:Key="SettingsUiTabBrush"
|
||||||
Color="#282828" />
|
Color="#0c0c0c" />
|
||||||
|
|
||||||
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
||||||
Color="{StaticResource SystemAccentColorDark2}" />
|
Color="{StaticResource SystemAccentColorDark2}" />
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
ResourceKey="TabViewBackground" />
|
ResourceKey="TabViewBackground" />
|
||||||
|
|
||||||
<SolidColorBrush x:Key="SettingsUiTabBrush"
|
<SolidColorBrush x:Key="SettingsUiTabBrush"
|
||||||
Color="#F9F9F9" />
|
Color="#ffffff" />
|
||||||
|
|
||||||
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
||||||
Color="{StaticResource SystemAccentColorLight2}" />
|
Color="{StaticResource SystemAccentColorLight2}" />
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
ResourceKey="SystemColorButtonFaceColorBrush" />
|
ResourceKey="SystemColorButtonFaceColorBrush" />
|
||||||
|
|
||||||
<StaticResource x:Key="SettingsUiTabBrush"
|
<StaticResource x:Key="SettingsUiTabBrush"
|
||||||
ResourceKey="SystemColorWindowBrush" />
|
ResourceKey="SystemControlBackgroundBaseLowBrush" />
|
||||||
|
|
||||||
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
<SolidColorBrush x:Key="BroadcastPaneBorderColor"
|
||||||
Color="{StaticResource SystemColorHighlightColor}" />
|
Color="{StaticResource SystemColorHighlightColor}" />
|
||||||
|
|||||||
@@ -1475,7 +1475,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
WI_IsAnyFlagSet(source, SuggestionsSource::CommandHistory | SuggestionsSource::QuickFixes);
|
WI_IsAnyFlagSet(source, SuggestionsSource::CommandHistory | SuggestionsSource::QuickFixes);
|
||||||
if (const auto& control{ _GetActiveControl() })
|
if (const auto& control{ _GetActiveControl() })
|
||||||
{
|
{
|
||||||
currentWorkingDirectory = control.WorkingDirectory();
|
currentWorkingDirectory = control.CurrentWorkingDirectory();
|
||||||
|
|
||||||
if (shouldGetContext)
|
if (shouldGetContext)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -928,17 +928,6 @@ namespace winrt::TerminalApp::implementation
|
|||||||
void CommandPalette::_filterTextChanged(const IInspectable& /*sender*/,
|
void CommandPalette::_filterTextChanged(const IInspectable& /*sender*/,
|
||||||
const Windows::UI::Xaml::RoutedEventArgs& /*args*/)
|
const Windows::UI::Xaml::RoutedEventArgs& /*args*/)
|
||||||
{
|
{
|
||||||
// GH#18737: Only respond to this change if we are visible:
|
|
||||||
// _close calls _searchBox().Text(L"") to reset the search text, which lands us
|
|
||||||
// in here after the command palette is dismissed. Since we have a code path here that
|
|
||||||
// could potentially lead to an action being previewed (specifically if there is a
|
|
||||||
// preview-able action as the first entry in the command list), that preview will
|
|
||||||
// appear after the palette is dismissed without this check.
|
|
||||||
if (Visibility() != Visibility::Visible)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When we are executing the _SelectNextTab in the TabManagement.cpp, this method
|
// When we are executing the _SelectNextTab in the TabManagement.cpp, this method
|
||||||
// is getting triggered because we set up the default value for that CommandPalette
|
// is getting triggered because we set up the default value for that CommandPalette
|
||||||
// with an empty string. Therefore, to avoid the reset of the index when executing
|
// with an empty string. Therefore, to avoid the reset of the index when executing
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="FilteredCommand.h" />
|
<ClInclude Include="FilteredCommand.h" />
|
||||||
<ClInclude Include="Pane.h" />
|
<ClInclude Include="Pane.h" />
|
||||||
<ClInclude Include="../fzf/fzf.h" />
|
<ClInclude Include="fzf/fzf.h" />
|
||||||
<ClInclude Include="pch.h" />
|
<ClInclude Include="pch.h" />
|
||||||
<ClInclude Include="ShortcutActionDispatch.h">
|
<ClInclude Include="ShortcutActionDispatch.h">
|
||||||
<DependentUpon>ShortcutActionDispatch.idl</DependentUpon>
|
<DependentUpon>ShortcutActionDispatch.idl</DependentUpon>
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<ClCompile Include="Tab.cpp">
|
<ClCompile Include="Tab.cpp">
|
||||||
<DependentUpon>Tab.idl</DependentUpon>
|
<DependentUpon>Tab.idl</DependentUpon>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="../fzf/fzf.cpp" />
|
<ClCompile Include="fzf/fzf.cpp" />
|
||||||
<ClCompile Include="TaskbarState.cpp">
|
<ClCompile Include="TaskbarState.cpp">
|
||||||
<DependentUpon>TaskbarState.idl</DependentUpon>
|
<DependentUpon>TaskbarState.idl</DependentUpon>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -1482,9 +1482,6 @@ namespace winrt::TerminalApp::implementation
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
static const auto ambiguousIsWide = [&]() -> bool {
|
|
||||||
return _settings.GlobalSettings().AmbiguousWidth() == AmbiguousWidth::Wide;
|
|
||||||
}();
|
|
||||||
|
|
||||||
TerminalConnection::ITerminalConnection connection{ nullptr };
|
TerminalConnection::ITerminalConnection connection{ nullptr };
|
||||||
|
|
||||||
@@ -1550,10 +1547,6 @@ namespace winrt::TerminalApp::implementation
|
|||||||
{
|
{
|
||||||
valueSet.Insert(L"textMeasurement", Windows::Foundation::PropertyValue::CreateString(textMeasurement));
|
valueSet.Insert(L"textMeasurement", Windows::Foundation::PropertyValue::CreateString(textMeasurement));
|
||||||
}
|
}
|
||||||
if (ambiguousIsWide)
|
|
||||||
{
|
|
||||||
valueSet.Insert(L"ambiguousIsWide", Windows::Foundation::PropertyValue::CreateBoolean(true));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (const auto id = settings.SessionId(); id != winrt::guid{})
|
if (const auto id = settings.SessionId(); id != winrt::guid{})
|
||||||
{
|
{
|
||||||
@@ -1600,7 +1593,8 @@ namespace winrt::TerminalApp::implementation
|
|||||||
|
|
||||||
// Replace the Starting directory with the CWD, if given
|
// Replace the Starting directory with the CWD, if given
|
||||||
const auto workingDirectory = control.WorkingDirectory();
|
const auto workingDirectory = control.WorkingDirectory();
|
||||||
if (Utils::IsValidDirectory(workingDirectory.c_str()))
|
const auto validWorkingDirectory = !workingDirectory.empty();
|
||||||
|
if (validWorkingDirectory)
|
||||||
{
|
{
|
||||||
controlSettings.DefaultSettings()->StartingDirectory(workingDirectory);
|
controlSettings.DefaultSettings()->StartingDirectory(workingDirectory);
|
||||||
}
|
}
|
||||||
@@ -2947,7 +2941,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
// - Does some of this in a background thread, as to not hang/crash the UI thread.
|
// - Does some of this in a background thread, as to not hang/crash the UI thread.
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// - eventArgs: the PasteFromClipboard event sent from the TermControl
|
// - eventArgs: the PasteFromClipboard event sent from the TermControl
|
||||||
safe_void_coroutine TerminalPage::_PasteFromClipboardHandler(const IInspectable sender, const PasteFromClipboardEventArgs eventArgs)
|
safe_void_coroutine TerminalPage::_PasteFromClipboardHandler(const IInspectable /*sender*/, const PasteFromClipboardEventArgs eventArgs)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// The old Win32 clipboard API as used below is somewhere in the order of 300-1000x faster than
|
// The old Win32 clipboard API as used below is somewhere in the order of 300-1000x faster than
|
||||||
@@ -2956,7 +2950,6 @@ namespace winrt::TerminalApp::implementation
|
|||||||
const auto dispatcher = Dispatcher();
|
const auto dispatcher = Dispatcher();
|
||||||
const auto globalSettings = _settings.GlobalSettings();
|
const auto globalSettings = _settings.GlobalSettings();
|
||||||
const auto bracketedPaste = eventArgs.BracketedPasteEnabled();
|
const auto bracketedPaste = eventArgs.BracketedPasteEnabled();
|
||||||
const auto sourceId = sender.try_as<ControlInteractivity>().Id();
|
|
||||||
|
|
||||||
// GetClipboardData might block for up to 30s for delay-rendered contents.
|
// GetClipboardData might block for up to 30s for delay-rendered contents.
|
||||||
co_await winrt::resume_background();
|
co_await winrt::resume_background();
|
||||||
@@ -2972,11 +2965,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
text = winrt::hstring{ Utils::TrimPaste(text) };
|
text = winrt::hstring{ Utils::TrimPaste(text) };
|
||||||
}
|
}
|
||||||
|
|
||||||
// LOAD BEARING: Send an empty bracketed paste even if the clipboard was empty.
|
if (text.empty())
|
||||||
// Bracketed Paste provides an application a way to know whether the
|
|
||||||
// user pasted, even if there was no applicable content on it. This
|
|
||||||
// behavior is observed in GNOME Terminal, among others.
|
|
||||||
if (!bracketedPaste && text.empty())
|
|
||||||
{
|
{
|
||||||
co_return;
|
co_return;
|
||||||
}
|
}
|
||||||
@@ -3058,30 +3047,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
// This will end up calling ConptyConnection::WriteInput which calls WriteFile which may block for
|
// This will end up calling ConptyConnection::WriteInput which calls WriteFile which may block for
|
||||||
// an indefinite amount of time. Avoid freezes and deadlocks by running this on a background thread.
|
// an indefinite amount of time. Avoid freezes and deadlocks by running this on a background thread.
|
||||||
assert(!dispatcher.HasThreadAccess());
|
assert(!dispatcher.HasThreadAccess());
|
||||||
eventArgs.HandleClipboardData(text);
|
eventArgs.HandleClipboardData(std::move(text));
|
||||||
|
|
||||||
// GH#18821: If broadcast input is active, paste the same text into all other
|
|
||||||
// panes on the tab. We do this here (rather than re-reading the
|
|
||||||
// clipboard per-pane) so that only one paste warning is shown.
|
|
||||||
co_await wil::resume_foreground(dispatcher);
|
|
||||||
if (const auto strongThis = weakThis.get())
|
|
||||||
{
|
|
||||||
if (const auto& tab{ strongThis->_GetFocusedTabImpl() })
|
|
||||||
{
|
|
||||||
if (tab->TabStatus().IsInputBroadcastActive())
|
|
||||||
{
|
|
||||||
tab->GetRootPane()->WalkTree([&](auto&& pane) {
|
|
||||||
if (const auto control = pane->GetTerminalControl())
|
|
||||||
{
|
|
||||||
if (control.ContentId() != sourceId && !control.ReadOnly())
|
|
||||||
{
|
|
||||||
control.RawWriteString(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
CATCH_LOG();
|
CATCH_LOG();
|
||||||
|
|
||||||
@@ -3391,6 +3357,24 @@ namespace winrt::TerminalApp::implementation
|
|||||||
// - Paste text from the Windows Clipboard to the focused terminal
|
// - Paste text from the Windows Clipboard to the focused terminal
|
||||||
void TerminalPage::_PasteText()
|
void TerminalPage::_PasteText()
|
||||||
{
|
{
|
||||||
|
// First, check if we're in broadcast input mode. If so, let's tell all
|
||||||
|
// the controls to paste.
|
||||||
|
if (const auto& tab{ _GetFocusedTabImpl() })
|
||||||
|
{
|
||||||
|
if (tab->TabStatus().IsInputBroadcastActive())
|
||||||
|
{
|
||||||
|
tab->GetRootPane()->WalkTree([](auto&& pane) {
|
||||||
|
if (auto control = pane->GetTerminalControl())
|
||||||
|
{
|
||||||
|
control.PasteTextFromClipboard();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The focused tab wasn't in broadcast mode. No matter. Just ask the
|
||||||
|
// current one to paste.
|
||||||
if (const auto& control{ _GetActiveControl() })
|
if (const auto& control{ _GetActiveControl() })
|
||||||
{
|
{
|
||||||
control.PasteTextFromClipboard();
|
control.PasteTextFromClipboard();
|
||||||
@@ -3558,7 +3542,8 @@ namespace winrt::TerminalApp::implementation
|
|||||||
profile = GetClosestProfileForDuplicationOfProfile(profile);
|
profile = GetClosestProfileForDuplicationOfProfile(profile);
|
||||||
controlSettings = Settings::TerminalSettings::CreateWithProfile(_settings, profile);
|
controlSettings = Settings::TerminalSettings::CreateWithProfile(_settings, profile);
|
||||||
const auto workingDirectory = tabImpl->GetActiveTerminalControl().WorkingDirectory();
|
const auto workingDirectory = tabImpl->GetActiveTerminalControl().WorkingDirectory();
|
||||||
if (Utils::IsValidDirectory(workingDirectory.c_str()))
|
const auto validWorkingDirectory = !workingDirectory.empty();
|
||||||
|
if (validWorkingDirectory)
|
||||||
{
|
{
|
||||||
controlSettings.DefaultSettings()->StartingDirectory(workingDirectory);
|
controlSettings.DefaultSettings()->StartingDirectory(workingDirectory);
|
||||||
}
|
}
|
||||||
@@ -3744,13 +3729,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
// for nulls
|
// for nulls
|
||||||
if (const auto& connection{ _duplicateConnectionForRestart(paneContent) })
|
if (const auto& connection{ _duplicateConnectionForRestart(paneContent) })
|
||||||
{
|
{
|
||||||
// Reset the terminal's VT state before attaching the new connection.
|
paneContent.GetTermControl().Connection(connection);
|
||||||
// The previous client may have left dirty modes (e.g., bracketed
|
|
||||||
// paste, mouse tracking, alternate buffer, kitty keyboard) that
|
|
||||||
// would corrupt input/output for the new shell process.
|
|
||||||
const auto& termControl = paneContent.GetTermControl();
|
|
||||||
termControl.HardResetWithoutErase();
|
|
||||||
termControl.Connection(connection);
|
|
||||||
connection.Start();
|
connection.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4936,7 +4915,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
theme.TabRow().UnfocusedBackground()) :
|
theme.TabRow().UnfocusedBackground()) :
|
||||||
ThemeColor{ nullptr } };
|
ThemeColor{ nullptr } };
|
||||||
|
|
||||||
if (_settings.GlobalSettings().UseAcrylicInTabRow() && (_activated || _settings.GlobalSettings().EnableUnfocusedAcrylic()))
|
if (_settings.GlobalSettings().UseAcrylicInTabRow())
|
||||||
{
|
{
|
||||||
if (tabRowBg)
|
if (tabRowBg)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ namespace winrt::TerminalApp::implementation
|
|||||||
|
|
||||||
args.Profile(::Microsoft::Console::Utils::GuidToString(_profile.Guid()));
|
args.Profile(::Microsoft::Console::Utils::GuidToString(_profile.Guid()));
|
||||||
// If we know the user's working directory use it instead of the profile.
|
// If we know the user's working directory use it instead of the profile.
|
||||||
if (const auto dir = _control.WorkingDirectory(); ::Microsoft::Console::Utils::IsValidDirectory(dir.c_str()))
|
if (const auto dir = _control.WorkingDirectory(); !dir.empty())
|
||||||
{
|
{
|
||||||
args.StartingDirectory(dir);
|
args.StartingDirectory(dir);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -289,11 +289,6 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unbox_prop_or<bool>(settings, L"ambiguousIsWide", false))
|
|
||||||
{
|
|
||||||
_flags |= PSEUDOCONSOLE_AMBIGUOUS_IS_WIDE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& initialEnvironment{ unbox_prop_or<winrt::hstring>(settings, L"initialEnvironment", L"") };
|
const auto& initialEnvironment{ unbox_prop_or<winrt::hstring>(settings, L"initialEnvironment", L"") };
|
||||||
const bool reloadEnvironmentVariables = unbox_prop_or<bool>(settings, L"reloadEnvironmentVariables", false);
|
const bool reloadEnvironmentVariables = unbox_prop_or<bool>(settings, L"reloadEnvironmentVariables", false);
|
||||||
|
|
||||||
|
|||||||
@@ -85,12 +85,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
CodepointWidthDetector::Singleton().Reset(mode);
|
CodepointWidthDetector::Singleton().Reset(mode);
|
||||||
|
|
||||||
if (settings.AmbiguousWidth() == AmbiguousWidth::Wide)
|
|
||||||
{
|
|
||||||
CodepointWidthDetector::Singleton().SetAmbiguousWidth(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
@@ -355,12 +349,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlCore::HardResetWithoutErase()
|
|
||||||
{
|
|
||||||
const auto lock = _terminal->LockForWriting();
|
|
||||||
_terminal->HardResetWithoutErase();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ControlCore::Initialize(const float actualWidth,
|
bool ControlCore::Initialize(const float actualWidth,
|
||||||
const float actualHeight,
|
const float actualHeight,
|
||||||
const float compositionScale)
|
const float compositionScale)
|
||||||
@@ -2081,10 +2069,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// the selection (we need to reset selection on double-click or
|
// the selection (we need to reset selection on double-click or
|
||||||
// triple-click, so it captures the word or the line, rather than
|
// triple-click, so it captures the word or the line, rather than
|
||||||
// extending the selection)
|
// extending the selection)
|
||||||
// - GH#9608: VT mouse mode is enabled. In this mode, Shift is used
|
if (_terminal->IsSelectionActive() && (!shiftEnabled || isOnOriginalPosition))
|
||||||
// to override mouse input, so Shift+Click should start a fresh
|
|
||||||
// selection rather than extending the previous one.
|
|
||||||
if (_terminal->IsSelectionActive() && (!shiftEnabled || isOnOriginalPosition || _terminal->IsTrackingMouseInput()))
|
|
||||||
{
|
{
|
||||||
// Reset the selection
|
// Reset the selection
|
||||||
_terminal->ClearSelection();
|
_terminal->ClearSelection();
|
||||||
@@ -2426,6 +2411,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
return *context;
|
return *context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
winrt::hstring ControlCore::CurrentWorkingDirectory() const
|
||||||
|
{
|
||||||
|
return winrt::hstring{ _terminal->GetWorkingDirectory() };
|
||||||
|
}
|
||||||
|
|
||||||
bool ControlCore::QuickFixesAvailable() const noexcept
|
bool ControlCore::QuickFixesAvailable() const noexcept
|
||||||
{
|
{
|
||||||
return _cachedQuickFixes && _cachedQuickFixes.Size() > 0;
|
return _cachedQuickFixes && _cachedQuickFixes.Size() > 0;
|
||||||
|
|||||||
@@ -191,6 +191,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
void ContextMenuSelectCommand();
|
void ContextMenuSelectCommand();
|
||||||
void ContextMenuSelectOutput();
|
void ContextMenuSelectOutput();
|
||||||
|
|
||||||
|
winrt::hstring CurrentWorkingDirectory() const;
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
#pragma region ITerminalInput
|
#pragma region ITerminalInput
|
||||||
@@ -255,7 +257,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
TerminalConnection::ITerminalConnection Connection();
|
TerminalConnection::ITerminalConnection Connection();
|
||||||
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
||||||
void HardResetWithoutErase();
|
|
||||||
|
|
||||||
void AnchorContextMenu(til::point viewportRelativeCharacterPosition);
|
void AnchorContextMenu(til::point viewportRelativeCharacterPosition);
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
void ApplyAppearance(Boolean focused);
|
void ApplyAppearance(Boolean focused);
|
||||||
|
|
||||||
Microsoft.Terminal.TerminalConnection.ITerminalConnection Connection;
|
Microsoft.Terminal.TerminalConnection.ITerminalConnection Connection;
|
||||||
void HardResetWithoutErase();
|
|
||||||
|
|
||||||
IControlSettings Settings { get; };
|
IControlSettings Settings { get; };
|
||||||
IControlAppearance FocusedAppearance { get; };
|
IControlAppearance FocusedAppearance { get; };
|
||||||
|
|||||||
@@ -54,20 +54,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
self->Attached.raise(*self, nullptr);
|
self->Attached.raise(*self, nullptr);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// GH#14464: Mark mode and quick-edit (shift+arrow) selections update
|
|
||||||
// the selection through ControlCore, bypassing SetEndSelectionPoint.
|
|
||||||
// Listen for selection changes so _selectionNeedsToBeCopied is set
|
|
||||||
// for ALL selection types, not just mouse drag.
|
|
||||||
_core->UpdateSelectionMarkers([weakThis = get_weak()](auto&&, auto&&) {
|
|
||||||
if (auto self{ weakThis.get() })
|
|
||||||
{
|
|
||||||
if (self->_core->HasSelection())
|
|
||||||
{
|
|
||||||
self->_selectionNeedsToBeCopied = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ControlInteractivity::Id()
|
uint64_t ControlInteractivity::Id()
|
||||||
@@ -169,8 +155,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
void ControlInteractivity::GotFocus()
|
void ControlInteractivity::GotFocus()
|
||||||
{
|
{
|
||||||
_focused = true;
|
|
||||||
|
|
||||||
if (_uiaEngine.get())
|
if (_uiaEngine.get())
|
||||||
{
|
{
|
||||||
THROW_IF_FAILED(_uiaEngine->Enable());
|
THROW_IF_FAILED(_uiaEngine->Enable());
|
||||||
@@ -183,8 +167,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
void ControlInteractivity::LostFocus()
|
void ControlInteractivity::LostFocus()
|
||||||
{
|
{
|
||||||
_focused = false;
|
|
||||||
|
|
||||||
if (_uiaEngine.get())
|
if (_uiaEngine.get())
|
||||||
{
|
{
|
||||||
THROW_IF_FAILED(_uiaEngine->Disable());
|
THROW_IF_FAILED(_uiaEngine->Disable());
|
||||||
@@ -252,8 +234,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
PasteFromClipboard.raise(*this, std::move(args));
|
PasteFromClipboard.raise(*this, std::move(args));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlInteractivity::PointerPressed(const uint32_t /*pointerId*/,
|
void ControlInteractivity::PointerPressed(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const uint64_t timestamp,
|
const uint64_t timestamp,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
@@ -266,10 +247,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
const auto shiftEnabled = modifiers.IsShiftPressed();
|
const auto shiftEnabled = modifiers.IsShiftPressed();
|
||||||
const auto ctrlEnabled = modifiers.IsCtrlPressed();
|
const auto ctrlEnabled = modifiers.IsCtrlPressed();
|
||||||
|
|
||||||
// Mark that this pointer event actually started within our bounds.
|
|
||||||
// We'll need this later, for PointerMoved events.
|
|
||||||
_pointerPressedInBounds = true;
|
|
||||||
|
|
||||||
// GH#9396: we prioritize hyper-link over VT mouse events
|
// GH#9396: we prioritize hyper-link over VT mouse events
|
||||||
auto hyperlink = _core->GetHyperlink(terminalPosition.to_core_point());
|
auto hyperlink = _core->GetHyperlink(terminalPosition.to_core_point());
|
||||||
if (WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown) &&
|
if (WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown) &&
|
||||||
@@ -308,10 +285,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
const auto isOnOriginalPosition = _lastMouseClickPosNoSelection == pixelPosition;
|
const auto isOnOriginalPosition = _lastMouseClickPosNoSelection == pixelPosition;
|
||||||
|
|
||||||
// Rounded coordinates for text selection.
|
// Rounded coordinates for text selection
|
||||||
// Don't round in VT mouse mode; cell-level precision matters more
|
_core->LeftClickOnTerminal(_getTerminalPosition(til::point{ pixelPosition }, true),
|
||||||
const auto round = !_core->IsVtMouseModeEnabled();
|
|
||||||
_core->LeftClickOnTerminal(_getTerminalPosition(til::point{ pixelPosition }, round),
|
|
||||||
multiClickMapper,
|
multiClickMapper,
|
||||||
altEnabled,
|
altEnabled,
|
||||||
shiftEnabled,
|
shiftEnabled,
|
||||||
@@ -321,15 +296,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
if (_core->HasSelection())
|
if (_core->HasSelection())
|
||||||
{
|
{
|
||||||
// GH#9787: if selection is active we don't want to track the touchdown position
|
// GH#9787: if selection is active we don't want to track the touchdown position
|
||||||
// so that dragging the mouse will extend the selection rather than starting the new one.
|
// so that dragging the mouse will extend the selection rather than starting the new one
|
||||||
// In VT mouse mode, keep tracking the touchdown point so that PointerMoved
|
_singleClickTouchdownPos = std::nullopt;
|
||||||
// can re-anchor the selection based on drag direction (the dx < 0 adjustment).
|
|
||||||
// Without this, dragging left wouldn't include the initially clicked cell
|
|
||||||
// because floored coordinates place the anchor on the cell's left edge.
|
|
||||||
if (!_core->IsVtMouseModeEnabled())
|
|
||||||
{
|
|
||||||
_singleClickTouchdownPos = std::nullopt;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (WI_IsFlagSet(buttonState, MouseButtonState::IsRightButtonDown))
|
else if (WI_IsFlagSet(buttonState, MouseButtonState::IsRightButtonDown))
|
||||||
@@ -346,41 +314,37 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// GH#19942, GH#14464: Don't re-copy a selection that was
|
// Try to copy the text and clear the selection
|
||||||
// already copied via copyOnSelect on mouse-up. But DO copy
|
const auto successfulCopy = CopySelectionToClipboard(shiftEnabled, false, _core->Settings().CopyFormatting());
|
||||||
// if the selection was made via mark mode or modified with
|
|
||||||
// quick-edit keys (shift+arrow), since those paths never
|
|
||||||
// triggered an automatic copy.
|
|
||||||
const auto copied = (_selectionNeedsToBeCopied || !_core->CopyOnSelect()) &&
|
|
||||||
CopySelectionToClipboard(shiftEnabled, false, _core->Settings().CopyFormatting());
|
|
||||||
_core->ClearSelection();
|
_core->ClearSelection();
|
||||||
if (_core->CopyOnSelect() || !copied)
|
if (_core->CopyOnSelect() || !successfulCopy)
|
||||||
{
|
{
|
||||||
// CopyOnSelect: right-click always pastes.
|
// CopyOnSelect: right click always pastes!
|
||||||
// Otherwise: no selection → paste.
|
// Otherwise: no selection --> paste
|
||||||
RequestPasteTextFromClipboard();
|
RequestPasteTextFromClipboard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlInteractivity::TouchPressed(const Core::Point contactPoint)
|
void ControlInteractivity::TouchPressed(const winrt::Windows::Foundation::Point contactPoint)
|
||||||
{
|
{
|
||||||
_touchAnchor = contactPoint;
|
_touchAnchor = contactPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ControlInteractivity::PointerMoved(const uint32_t /*pointerId*/,
|
bool ControlInteractivity::PointerMoved(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
const Core::Point pixelPosition)
|
const bool focused,
|
||||||
|
const Core::Point pixelPosition,
|
||||||
|
const bool pointerPressedInBounds)
|
||||||
{
|
{
|
||||||
const auto terminalPosition = _getTerminalPosition(til::point{ pixelPosition }, false);
|
const auto terminalPosition = _getTerminalPosition(til::point{ pixelPosition }, false);
|
||||||
// Returning true from this function indicates that the caller should do no further processing of this movement.
|
// Returning true from this function indicates that the caller should do no further processing of this movement.
|
||||||
bool handledCompletely = false;
|
bool handledCompletely = false;
|
||||||
|
|
||||||
// Short-circuit isReadOnly check to avoid warning dialog
|
// Short-circuit isReadOnly check to avoid warning dialog
|
||||||
if (_focused && !_core->IsInReadOnlyMode() && _canSendVTMouseInput(modifiers))
|
if (focused && !_core->IsInReadOnlyMode() && _canSendVTMouseInput(modifiers))
|
||||||
{
|
{
|
||||||
_sendMouseEventHelper(terminalPosition, pointerUpdateKind, modifiers, 0, buttonState);
|
_sendMouseEventHelper(terminalPosition, pointerUpdateKind, modifiers, 0, buttonState);
|
||||||
handledCompletely = true;
|
handledCompletely = true;
|
||||||
@@ -389,7 +353,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// actually start _in_ the control bounds. Case in point - someone drags
|
// actually start _in_ the control bounds. Case in point - someone drags
|
||||||
// a file into the bounds of the control. That shouldn't send the
|
// a file into the bounds of the control. That shouldn't send the
|
||||||
// selection into space.
|
// selection into space.
|
||||||
else if (_focused && _pointerPressedInBounds && WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown))
|
else if (focused && pointerPressedInBounds && WI_IsFlagSet(buttonState, MouseButtonState::IsLeftButtonDown))
|
||||||
{
|
{
|
||||||
if (_singleClickTouchdownPos)
|
if (_singleClickTouchdownPos)
|
||||||
{
|
{
|
||||||
@@ -435,9 +399,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
return handledCompletely;
|
return handledCompletely;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlInteractivity::TouchMoved(const Core::Point newTouchPoint)
|
void ControlInteractivity::TouchMoved(const winrt::Windows::Foundation::Point newTouchPoint,
|
||||||
|
const bool focused)
|
||||||
{
|
{
|
||||||
if (_focused &&
|
if (focused &&
|
||||||
_touchAnchor)
|
_touchAnchor)
|
||||||
{
|
{
|
||||||
const auto anchor = _touchAnchor.value();
|
const auto anchor = _touchAnchor.value();
|
||||||
@@ -471,14 +436,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlInteractivity::PointerReleased(const uint32_t /*pointerId*/,
|
void ControlInteractivity::PointerReleased(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
const Core::Point pixelPosition)
|
const Core::Point pixelPosition)
|
||||||
{
|
{
|
||||||
_pointerPressedInBounds = false;
|
|
||||||
|
|
||||||
const auto terminalPosition = _getTerminalPosition(til::point{ pixelPosition }, false);
|
const auto terminalPosition = _getTerminalPosition(til::point{ pixelPosition }, false);
|
||||||
// Short-circuit isReadOnly check to avoid warning dialog
|
// Short-circuit isReadOnly check to avoid warning dialog
|
||||||
if (!_core->IsInReadOnlyMode() && _canSendVTMouseInput(modifiers))
|
if (!_core->IsInReadOnlyMode() && _canSendVTMouseInput(modifiers))
|
||||||
@@ -720,9 +682,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// - cursorPosition: in pixels, relative to the origin of the control
|
// - cursorPosition: in pixels, relative to the origin of the control
|
||||||
void ControlInteractivity::SetEndSelectionPoint(const Core::Point pixelPosition)
|
void ControlInteractivity::SetEndSelectionPoint(const Core::Point pixelPosition)
|
||||||
{
|
{
|
||||||
// Don't round in VT mouse mode; cell-level precision matters more
|
_core->SetEndSelectionPoint(_getTerminalPosition(til::point{ pixelPosition }, true));
|
||||||
const auto round = !_core->IsVtMouseModeEnabled();
|
|
||||||
_core->SetEndSelectionPoint(_getTerminalPosition(til::point{ pixelPosition }, round));
|
|
||||||
_selectionNeedsToBeCopied = true;
|
_selectionNeedsToBeCopied = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,23 +51,23 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
::Microsoft::Console::Render::IRenderData* GetRenderData() const;
|
::Microsoft::Console::Render::IRenderData* GetRenderData() const;
|
||||||
|
|
||||||
#pragma region Input Methods
|
#pragma region Input Methods
|
||||||
void PointerPressed(const uint32_t pointerId,
|
void PointerPressed(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const uint64_t timestamp,
|
const uint64_t timestamp,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
const Core::Point pixelPosition);
|
const Core::Point pixelPosition);
|
||||||
void TouchPressed(const Core::Point contactPoint);
|
void TouchPressed(const winrt::Windows::Foundation::Point contactPoint);
|
||||||
|
|
||||||
bool PointerMoved(const uint32_t pointerId,
|
bool PointerMoved(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
const Core::Point pixelPosition);
|
const bool focused,
|
||||||
void TouchMoved(const Core::Point newTouchPoint);
|
const Core::Point pixelPosition,
|
||||||
|
const bool pointerPressedInBounds);
|
||||||
|
void TouchMoved(const winrt::Windows::Foundation::Point newTouchPoint,
|
||||||
|
const bool focused);
|
||||||
|
|
||||||
void PointerReleased(const uint32_t pointerId,
|
void PointerReleased(Control::MouseButtonState buttonState,
|
||||||
Control::MouseButtonState buttonState,
|
|
||||||
const unsigned int pointerUpdateKind,
|
const unsigned int pointerUpdateKind,
|
||||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers,
|
||||||
const Core::Point pixelPosition);
|
const Core::Point pixelPosition);
|
||||||
@@ -115,7 +115,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
// If this is set, then we assume we are in the middle of panning the
|
// If this is set, then we assume we are in the middle of panning the
|
||||||
// viewport via touch input.
|
// viewport via touch input.
|
||||||
std::optional<Core::Point> _touchAnchor;
|
std::optional<winrt::Windows::Foundation::Point> _touchAnchor;
|
||||||
|
|
||||||
using Timestamp = uint64_t;
|
using Timestamp = uint64_t;
|
||||||
|
|
||||||
@@ -142,9 +142,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
uint64_t _id;
|
uint64_t _id;
|
||||||
static std::atomic<uint64_t> _nextId;
|
static std::atomic<uint64_t> _nextId;
|
||||||
|
|
||||||
bool _focused{ false };
|
|
||||||
bool _pointerPressedInBounds{ false };
|
|
||||||
|
|
||||||
unsigned int _numberOfClicks(Core::Point clickPos, Timestamp clickTime);
|
unsigned int _numberOfClicks(Core::Point clickPos, Timestamp clickTime);
|
||||||
void _updateSystemParameterSettings() noexcept;
|
void _updateSystemParameterSettings() noexcept;
|
||||||
|
|
||||||
|
|||||||
@@ -36,24 +36,24 @@ namespace Microsoft.Terminal.Control
|
|||||||
void RequestPasteTextFromClipboard();
|
void RequestPasteTextFromClipboard();
|
||||||
void SetEndSelectionPoint(Microsoft.Terminal.Core.Point point);
|
void SetEndSelectionPoint(Microsoft.Terminal.Core.Point point);
|
||||||
|
|
||||||
void PointerPressed(UInt32 pointerId,
|
void PointerPressed(MouseButtonState buttonState,
|
||||||
MouseButtonState buttonState,
|
|
||||||
UInt32 pointerUpdateKind,
|
UInt32 pointerUpdateKind,
|
||||||
UInt64 timestamp,
|
UInt64 timestamp,
|
||||||
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
||||||
Microsoft.Terminal.Core.Point pixelPosition);
|
Microsoft.Terminal.Core.Point pixelPosition);
|
||||||
void TouchPressed(Microsoft.Terminal.Core.Point contactPoint);
|
void TouchPressed(Windows.Foundation.Point contactPoint);
|
||||||
|
|
||||||
Boolean PointerMoved(UInt32 pointerId,
|
Boolean PointerMoved(MouseButtonState buttonState,
|
||||||
MouseButtonState buttonState,
|
|
||||||
UInt32 pointerUpdateKind,
|
UInt32 pointerUpdateKind,
|
||||||
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
||||||
Microsoft.Terminal.Core.Point pixelPosition);
|
Boolean focused,
|
||||||
|
Microsoft.Terminal.Core.Point pixelPosition,
|
||||||
|
Boolean pointerPressedInBounds);
|
||||||
|
|
||||||
void TouchMoved(Microsoft.Terminal.Core.Point newTouchPoint);
|
void TouchMoved(Windows.Foundation.Point newTouchPoint,
|
||||||
|
Boolean focused);
|
||||||
|
|
||||||
void PointerReleased(UInt32 pointerId,
|
void PointerReleased(MouseButtonState buttonState,
|
||||||
MouseButtonState buttonState,
|
|
||||||
UInt32 pointerUpdateKind,
|
UInt32 pointerUpdateKind,
|
||||||
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
Microsoft.Terminal.Core.ControlKeyStates modifiers,
|
||||||
Microsoft.Terminal.Core.Point pixelPosition);
|
Microsoft.Terminal.Core.Point pixelPosition);
|
||||||
|
|||||||
@@ -26,12 +26,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
Console,
|
Console,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AmbiguousWidth
|
|
||||||
{
|
|
||||||
Narrow,
|
|
||||||
Wide,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum DefaultInputScope
|
enum DefaultInputScope
|
||||||
{
|
{
|
||||||
Default,
|
Default,
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
Boolean DisablePartialInvalidation { get; };
|
Boolean DisablePartialInvalidation { get; };
|
||||||
Boolean SoftwareRendering { get; };
|
Boolean SoftwareRendering { get; };
|
||||||
Microsoft.Terminal.Control.TextMeasurement TextMeasurement { get; };
|
Microsoft.Terminal.Control.TextMeasurement TextMeasurement { get; };
|
||||||
Microsoft.Terminal.Control.AmbiguousWidth AmbiguousWidth { get; };
|
|
||||||
Microsoft.Terminal.Control.DefaultInputScope DefaultInputScope { get; };
|
Microsoft.Terminal.Control.DefaultInputScope DefaultInputScope { get; };
|
||||||
Boolean ShowMarks { get; };
|
Boolean ShowMarks { get; };
|
||||||
Boolean UseBackgroundImageForWindow { get; };
|
Boolean UseBackgroundImageForWindow { get; };
|
||||||
@@ -76,7 +75,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
Boolean RepositionCursorWithMouse { get; };
|
Boolean RepositionCursorWithMouse { get; };
|
||||||
|
|
||||||
PathTranslationStyle PathTranslationStyle { get; };
|
PathTranslationStyle PathTranslationStyle { get; };
|
||||||
String DragDropDelimiter { get; };
|
|
||||||
|
|
||||||
// NOTE! When adding something here, make sure to update ControlProperties.h too!
|
// NOTE! When adding something here, make sure to update ControlProperties.h too!
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -60,5 +60,7 @@ namespace Microsoft.Terminal.Control
|
|||||||
void SelectOutput(Boolean goUp);
|
void SelectOutput(Boolean goUp);
|
||||||
IVector<ScrollMark> ScrollMarks { get; };
|
IVector<ScrollMark> ScrollMarks { get; };
|
||||||
|
|
||||||
|
String CurrentWorkingDirectory { get; };
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,10 +49,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
void InteractivityAutomationPeer::ParentProvider(AutomationPeer parentProvider)
|
void InteractivityAutomationPeer::ParentProvider(AutomationPeer parentProvider)
|
||||||
{
|
{
|
||||||
// LOAD-BEARING: use _parentProvider->ProviderFromPeer(_parentProvider) instead of this->ProviderFromPeer(*this).
|
_parentProvider = parentProvider;
|
||||||
// Since we split the automation peer into TermControlAutomationPeer and InteractivityAutomationPeer,
|
|
||||||
// using "this" returns null. This can cause issues with some UIA Client scenarios like any navigation in Narrator.
|
|
||||||
_parentProvider = parentProvider ? parentProvider.as<IAutomationPeerProtected>().ProviderFromPeer(parentProvider) : nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
@@ -184,11 +181,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
XamlAutomation::ITextRangeProvider InteractivityAutomationPeer::_CreateXamlUiaTextRange(UIA::ITextRangeProvider* returnVal) const
|
XamlAutomation::ITextRangeProvider InteractivityAutomationPeer::_CreateXamlUiaTextRange(UIA::ITextRangeProvider* returnVal) const
|
||||||
{
|
{
|
||||||
if (!_parentProvider)
|
// LOAD-BEARING: use _parentProvider->ProviderFromPeer(_parentProvider) instead of this->ProviderFromPeer(*this).
|
||||||
|
// Since we split the automation peer into TermControlAutomationPeer and InteractivityAutomationPeer,
|
||||||
|
// using "this" returns null. This can cause issues with some UIA Client scenarios like any navigation in Narrator.
|
||||||
|
const auto parent{ _parentProvider.get() };
|
||||||
|
if (!parent)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, _parentProvider);
|
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, parent.as<IAutomationPeerProtected>().ProviderFromPeer(parent));
|
||||||
return xutr.as<XamlAutomation::ITextRangeProvider>();
|
return xutr.as<XamlAutomation::ITextRangeProvider>();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -200,24 +201,22 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// - com_array of Xaml Wrapped UiaTextRange (ITextRangeProviders)
|
// - com_array of Xaml Wrapped UiaTextRange (ITextRangeProviders)
|
||||||
com_array<XamlAutomation::ITextRangeProvider> InteractivityAutomationPeer::WrapArrayOfTextRangeProviders(SAFEARRAY* textRanges)
|
com_array<XamlAutomation::ITextRangeProvider> InteractivityAutomationPeer::WrapArrayOfTextRangeProviders(SAFEARRAY* textRanges)
|
||||||
{
|
{
|
||||||
if (!_parentProvider)
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// transfer ownership of UiaTextRanges to this new vector
|
// transfer ownership of UiaTextRanges to this new vector
|
||||||
auto providers = SafeArrayToOwningVector<::Microsoft::Terminal::TermControlUiaTextRange>(textRanges);
|
auto providers = SafeArrayToOwningVector<::Microsoft::Terminal::TermControlUiaTextRange>(textRanges);
|
||||||
const auto len = gsl::narrow<uint32_t>(providers.size());
|
auto count = gsl::narrow<int>(providers.size());
|
||||||
com_array<XamlAutomation::ITextRangeProvider> result{ len };
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < len; ++i)
|
std::vector<XamlAutomation::ITextRangeProvider> vec;
|
||||||
|
vec.reserve(count);
|
||||||
|
for (auto i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
if (auto xutr = _CreateXamlUiaTextRange(providers[i].detach()))
|
if (auto xutr = _CreateXamlUiaTextRange(providers[i].detach()))
|
||||||
{
|
{
|
||||||
result[i] = std::move(xutr);
|
vec.emplace_back(std::move(xutr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
com_array<XamlAutomation::ITextRangeProvider> result{ vec };
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
::Microsoft::WRL::ComPtr<::Microsoft::Terminal::TermControlUiaProvider> _uiaProvider;
|
::Microsoft::WRL::ComPtr<::Microsoft::Terminal::TermControlUiaProvider> _uiaProvider;
|
||||||
winrt::Microsoft::Terminal::Control::implementation::ControlInteractivity* _interactivity;
|
winrt::Microsoft::Terminal::Control::implementation::ControlInteractivity* _interactivity;
|
||||||
winrt::Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple _parentProvider{ nullptr };
|
weak_ref<Windows::UI::Xaml::Automation::Peers::AutomationPeer> _parentProvider;
|
||||||
|
|
||||||
til::rect _controlBounds{};
|
til::rect _controlBounds{};
|
||||||
til::rect _controlPadding{};
|
til::rect _controlPadding{};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
namespace Microsoft.Terminal.Control
|
namespace Microsoft.Terminal.Control
|
||||||
{
|
{
|
||||||
[default_interface] runtimeclass InteractivityAutomationPeer :
|
[default_interface] runtimeclass InteractivityAutomationPeer :
|
||||||
Windows.UI.Xaml.Automation.Peers.FrameworkElementAutomationPeer,
|
Windows.UI.Xaml.Automation.Peers.AutomationPeer,
|
||||||
Windows.UI.Xaml.Automation.Provider.ITextProvider
|
Windows.UI.Xaml.Automation.Provider.ITextProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -532,11 +532,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
_core.Connection(newConnection);
|
_core.Connection(newConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TermControl::HardResetWithoutErase()
|
|
||||||
{
|
|
||||||
_core.HardResetWithoutErase();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TermControl::_throttledUpdateScrollbar(const ScrollBarUpdate& update)
|
void TermControl::_throttledUpdateScrollbar(const ScrollBarUpdate& update)
|
||||||
{
|
{
|
||||||
if (!_initializedTerminal)
|
if (!_initializedTerminal)
|
||||||
@@ -1795,16 +1790,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// While TSF has an active composition, key events must not be forwarded
|
|
||||||
// to the PTY directly. The IME re-injects navigation/confirmation keys
|
|
||||||
// after composition ends, at which point HasActiveComposition() == false
|
|
||||||
// and they are forwarded normally. This mirrors conhost v1 behavior in
|
|
||||||
// src/interactivity/win32/windowio.cpp.
|
|
||||||
if (GetTSFHandle().HasActiveComposition())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_TrySendKeyEvent(vkey, scanCode, modifiers, keyDown))
|
if (_TrySendKeyEvent(vkey, scanCode, modifiers, keyDown))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@@ -1970,13 +1955,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
const auto point = args.GetCurrentPoint(*this);
|
const auto point = args.GetCurrentPoint(*this);
|
||||||
const auto type = ptr.PointerDeviceType();
|
const auto type = ptr.PointerDeviceType();
|
||||||
|
|
||||||
// GH#19908: _focused can be true even when the search box has
|
if (!_focused)
|
||||||
// keyboard focus, because GotFocus bubbles from the search box
|
|
||||||
// child and _GotFocusHandler sets _focused=true. If the user
|
|
||||||
// click-drags in the terminal while the search box is focused,
|
|
||||||
// we need to explicitly call Focus() to move keyboard focus back
|
|
||||||
// to the terminal so that Ctrl+C copies the selection.
|
|
||||||
if (!_focused || (_searchBox && _searchBox->ContainsFocus()))
|
|
||||||
{
|
{
|
||||||
Focus(FocusState::Pointer);
|
Focus(FocusState::Pointer);
|
||||||
}
|
}
|
||||||
@@ -1990,14 +1969,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// NB: I don't think this is correct because the touch should be in the center of the rect.
|
// NB: I don't think this is correct because the touch should be in the center of the rect.
|
||||||
// I suspect the point.Position() would be correct.
|
// I suspect the point.Position() would be correct.
|
||||||
const auto contactRect = point.Properties().ContactRect();
|
const auto contactRect = point.Properties().ContactRect();
|
||||||
til::point newTouchPoint{ til::math::rounding, contactRect.X, contactRect.Y };
|
_interactivity.TouchPressed({ contactRect.X, contactRect.Y });
|
||||||
_interactivity.TouchPressed(newTouchPoint.to_core_point());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const auto cursorPosition = point.Position();
|
const auto cursorPosition = point.Position();
|
||||||
_interactivity.PointerPressed(point.PointerId(),
|
_interactivity.PointerPressed(TermControl::GetPressedMouseButtons(point),
|
||||||
TermControl::GetPressedMouseButtons(point),
|
|
||||||
TermControl::GetPointerUpdateKind(point),
|
TermControl::GetPointerUpdateKind(point),
|
||||||
point.Timestamp(),
|
point.Timestamp(),
|
||||||
ControlKeyStates{ args.KeyModifiers() },
|
ControlKeyStates{ args.KeyModifiers() },
|
||||||
@@ -2036,11 +2013,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
if (type == Windows::Devices::Input::PointerDeviceType::Mouse ||
|
if (type == Windows::Devices::Input::PointerDeviceType::Mouse ||
|
||||||
type == Windows::Devices::Input::PointerDeviceType::Pen)
|
type == Windows::Devices::Input::PointerDeviceType::Pen)
|
||||||
{
|
{
|
||||||
auto suppressFurtherHandling = _interactivity.PointerMoved(point.PointerId(),
|
auto suppressFurtherHandling = _interactivity.PointerMoved(TermControl::GetPressedMouseButtons(point),
|
||||||
TermControl::GetPressedMouseButtons(point),
|
|
||||||
TermControl::GetPointerUpdateKind(point),
|
TermControl::GetPointerUpdateKind(point),
|
||||||
ControlKeyStates(args.KeyModifiers()),
|
ControlKeyStates(args.KeyModifiers()),
|
||||||
pixelPosition);
|
_focused,
|
||||||
|
pixelPosition,
|
||||||
|
_pointerPressedInBounds);
|
||||||
|
|
||||||
// GH#9109 - Only start an auto-scroll when the drag actually
|
// GH#9109 - Only start an auto-scroll when the drag actually
|
||||||
// started within our bounds. Otherwise, someone could start a drag
|
// started within our bounds. Otherwise, someone could start a drag
|
||||||
@@ -2079,9 +2057,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
else if (type == Windows::Devices::Input::PointerDeviceType::Touch)
|
else if (type == Windows::Devices::Input::PointerDeviceType::Touch)
|
||||||
{
|
{
|
||||||
const auto contactRect = point.Properties().ContactRect();
|
const auto contactRect = point.Properties().ContactRect();
|
||||||
til::point newTouchPoint{ til::math::rounding, contactRect.X, contactRect.Y };
|
_interactivity.TouchMoved({ contactRect.X, contactRect.Y }, _focused);
|
||||||
|
|
||||||
_interactivity.TouchMoved(newTouchPoint.to_core_point());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
args.Handled(true);
|
args.Handled(true);
|
||||||
@@ -2114,8 +2090,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
if (type == Windows::Devices::Input::PointerDeviceType::Mouse ||
|
if (type == Windows::Devices::Input::PointerDeviceType::Mouse ||
|
||||||
type == Windows::Devices::Input::PointerDeviceType::Pen)
|
type == Windows::Devices::Input::PointerDeviceType::Pen)
|
||||||
{
|
{
|
||||||
_interactivity.PointerReleased(point.PointerId(),
|
_interactivity.PointerReleased(TermControl::GetPressedMouseButtons(point),
|
||||||
TermControl::GetPressedMouseButtons(point),
|
|
||||||
TermControl::GetPointerUpdateKind(point),
|
TermControl::GetPointerUpdateKind(point),
|
||||||
ControlKeyStates(args.KeyModifiers()),
|
ControlKeyStates(args.KeyModifiers()),
|
||||||
pixelPosition);
|
pixelPosition);
|
||||||
@@ -2526,9 +2501,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
_updateScrollBar->Run(update);
|
_updateScrollBar->Run(update);
|
||||||
|
|
||||||
// If we have a selection with markers (exposed via selection mode),
|
// if a selection marker is already visible,
|
||||||
// update the position of the markers
|
// update the position of those markers
|
||||||
if (_core.HasSelection() && _core.SelectionMode() >= SelectionInteractionMode::Keyboard)
|
if (SelectionStartMarker().Visibility() == Visibility::Visible || SelectionEndMarker().Visibility() == Visibility::Visible)
|
||||||
{
|
{
|
||||||
_updateSelectionMarkers(nullptr, winrt::make<UpdateSelectionMarkersEventArgs>(false));
|
_updateSelectionMarkers(nullptr, winrt::make<UpdateSelectionMarkersEventArgs>(false));
|
||||||
}
|
}
|
||||||
@@ -3079,7 +3054,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// the full path of the file to our terminal connection. Like conhost, if
|
// the full path of the file to our terminal connection. Like conhost, if
|
||||||
// the path contains a space, we'll wrap the path in quotes.
|
// the path contains a space, we'll wrap the path in quotes.
|
||||||
// - Unlike conhost, if multiple files are dropped onto the terminal, we'll
|
// - Unlike conhost, if multiple files are dropped onto the terminal, we'll
|
||||||
// write all the paths to the terminal, separated by the configured delimiter.
|
// write all the paths to the terminal, separated by spaces.
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// - e: The DragEventArgs from the Drop event
|
// - e: The DragEventArgs from the Drop event
|
||||||
// Return Value:
|
// Return Value:
|
||||||
@@ -3092,11 +3067,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
co_return;
|
co_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (const auto hwnd = reinterpret_cast<HWND>(OwningHwnd()))
|
|
||||||
{
|
|
||||||
SetForegroundWindow(hwnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto weak = get_weak();
|
const auto weak = get_weak();
|
||||||
|
|
||||||
if (e.DataView().Contains(StandardDataFormats::ApplicationLink()))
|
if (e.DataView().Contains(StandardDataFormats::ApplicationLink()))
|
||||||
@@ -3200,13 +3170,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::wstring allPathsString;
|
std::wstring allPathsString;
|
||||||
const auto delimiter{ _core.Settings().DragDropDelimiter() };
|
|
||||||
for (auto& fullPath : fullPaths)
|
for (auto& fullPath : fullPaths)
|
||||||
{
|
{
|
||||||
// Join the paths with the delimiter
|
// Join the paths with spaces
|
||||||
if (!allPathsString.empty())
|
if (!allPathsString.empty())
|
||||||
{
|
{
|
||||||
allPathsString += delimiter;
|
allPathsString += L" ";
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto translationStyle{ _core.Settings().PathTranslationStyle() };
|
const auto translationStyle{ _core.Settings().PathTranslationStyle() };
|
||||||
@@ -3738,6 +3707,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
{
|
{
|
||||||
return _core.CommandHistory();
|
return _core.CommandHistory();
|
||||||
}
|
}
|
||||||
|
winrt::hstring TermControl::CurrentWorkingDirectory() const
|
||||||
|
{
|
||||||
|
return _core.CurrentWorkingDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
void TermControl::UpdateWinGetSuggestions(Windows::Foundation::Collections::IVector<hstring> suggestions)
|
void TermControl::UpdateWinGetSuggestions(Windows::Foundation::Collections::IVector<hstring> suggestions)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
void ScrollToMark(const Control::ScrollToMarkDirection& direction);
|
void ScrollToMark(const Control::ScrollToMarkDirection& direction);
|
||||||
void SelectCommand(const bool goUp);
|
void SelectCommand(const bool goUp);
|
||||||
void SelectOutput(const bool goUp);
|
void SelectOutput(const bool goUp);
|
||||||
|
|
||||||
|
winrt::hstring CurrentWorkingDirectory() const;
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
void ScrollViewport(int viewTop);
|
void ScrollViewport(int viewTop);
|
||||||
@@ -190,7 +192,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
|
|
||||||
TerminalConnection::ITerminalConnection Connection();
|
TerminalConnection::ITerminalConnection Connection();
|
||||||
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
||||||
void HardResetWithoutErase();
|
|
||||||
|
|
||||||
Control::CursorDisplayState CursorVisibility() const noexcept;
|
Control::CursorDisplayState CursorVisibility() const noexcept;
|
||||||
void CursorVisibility(Control::CursorDisplayState cursorVisibility);
|
void CursorVisibility(Control::CursorDisplayState cursorVisibility);
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ namespace Microsoft.Terminal.Control
|
|||||||
void SetOverrideColorScheme(Microsoft.Terminal.Core.ICoreScheme scheme);
|
void SetOverrideColorScheme(Microsoft.Terminal.Core.ICoreScheme scheme);
|
||||||
|
|
||||||
Microsoft.Terminal.TerminalConnection.ITerminalConnection Connection;
|
Microsoft.Terminal.TerminalConnection.ITerminalConnection Connection;
|
||||||
void HardResetWithoutErase();
|
|
||||||
|
|
||||||
UInt64 ContentId{ get; };
|
UInt64 ContentId{ get; };
|
||||||
|
|
||||||
|
|||||||
@@ -121,9 +121,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// GH#13978: If the TermControl has already been removed from the UI tree, XAML might run into weird bugs.
|
// GH#13978: If the TermControl has already been removed from the UI tree, XAML might run into weird bugs.
|
||||||
// This will prevent the `dispatcher.RunAsync` calls below from raising UIA events on the main thread.
|
// This will prevent the `dispatcher.RunAsync` calls below from raising UIA events on the main thread.
|
||||||
_termControl = {};
|
_termControl = {};
|
||||||
|
|
||||||
// Solve the circular reference between us and the content automation peer.
|
|
||||||
_contentAutomationPeer.ParentProvider(nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ namespace Microsoft.Terminal.Core
|
|||||||
String WordDelimiters { get; };
|
String WordDelimiters { get; };
|
||||||
|
|
||||||
Boolean ForceVTInput { get; };
|
Boolean ForceVTInput { get; };
|
||||||
Boolean AllowKittyKeyboardMode { get; };
|
|
||||||
Boolean AllowVtChecksumReport { get; };
|
Boolean AllowVtChecksumReport { get; };
|
||||||
Boolean AllowVtClipboardWrite { get; };
|
Boolean AllowVtClipboardWrite { get; };
|
||||||
Boolean TrimBlockSelection { get; };
|
Boolean TrimBlockSelection { get; };
|
||||||
|
|||||||
@@ -55,18 +55,6 @@ void Terminal::Create(til::size viewportSize, til::CoordType scrollbackLines, Re
|
|||||||
_stateMachine = std::make_unique<StateMachine>(std::move(engine));
|
_stateMachine = std::make_unique<StateMachine>(std::move(engine));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
|
||||||
// - Resets all VT state to defaults without clearing the buffer content.
|
|
||||||
// Called when a connection is restarted so that any dirty modes left
|
|
||||||
// behind by a crashed application don't affect the new connection.
|
|
||||||
void Terminal::HardResetWithoutErase()
|
|
||||||
{
|
|
||||||
_assertLocked();
|
|
||||||
_stateMachine->ResetState();
|
|
||||||
auto& engine = reinterpret_cast<OutputStateMachineEngine&>(_stateMachine->Engine());
|
|
||||||
engine.Dispatch().HardReset(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
// - Initializes the Terminal from the given set of settings.
|
// - Initializes the Terminal from the given set of settings.
|
||||||
// Arguments:
|
// Arguments:
|
||||||
@@ -110,7 +98,6 @@ void Terminal::UpdateSettings(ICoreSettings settings)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getTerminalInput().ForceDisableWin32InputMode(settings.ForceVTInput());
|
_getTerminalInput().ForceDisableWin32InputMode(settings.ForceVTInput());
|
||||||
_getTerminalInput().ForceDisableKittyKeyboardProtocol(!settings.AllowKittyKeyboardMode());
|
|
||||||
|
|
||||||
if (settings.TabColor() == nullptr)
|
if (settings.TabColor() == nullptr)
|
||||||
{
|
{
|
||||||
@@ -525,27 +512,52 @@ std::wstring Terminal::GetHyperlinkAtViewportPosition(const til::point viewportP
|
|||||||
|
|
||||||
std::wstring Terminal::GetHyperlinkAtBufferPosition(const til::point bufferPos)
|
std::wstring Terminal::GetHyperlinkAtBufferPosition(const til::point bufferPos)
|
||||||
{
|
{
|
||||||
const auto& buffer = _activeBuffer();
|
|
||||||
|
|
||||||
// Case 1: buffer position has a hyperlink stored in the buffer
|
// Case 1: buffer position has a hyperlink stored in the buffer
|
||||||
const auto attr = buffer.GetCellDataAt(bufferPos)->TextAttr();
|
const auto attr = _activeBuffer().GetCellDataAt(bufferPos)->TextAttr();
|
||||||
if (attr.IsHyperlink())
|
if (attr.IsHyperlink())
|
||||||
{
|
{
|
||||||
return buffer.GetHyperlinkUriFromId(attr.GetHyperlinkId());
|
return _activeBuffer().GetHyperlinkUriFromId(attr.GetHyperlinkId());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Case 2: buffer position may point to an auto-detected hyperlink
|
// Case 2: buffer position may point to an auto-detected hyperlink
|
||||||
// Check cached interval tree (covers visible viewport +/- viewport height)
|
// Case 2 - Step 1: get the auto-detected hyperlink
|
||||||
if (const auto results = _patternIntervalTree.findOverlapping({ bufferPos.x + 1, bufferPos.y }, bufferPos); !results.empty())
|
std::optional<interval_tree::Interval<til::point, size_t>> result;
|
||||||
|
const auto visibleViewport = _GetVisibleViewport();
|
||||||
|
if (visibleViewport.IsInBounds(bufferPos))
|
||||||
{
|
{
|
||||||
for (const auto& result : results)
|
// Hyperlink is in the current view, so let's just get it
|
||||||
|
auto viewportPos = bufferPos;
|
||||||
|
visibleViewport.ConvertToOrigin(&viewportPos);
|
||||||
|
result = GetHyperlinkIntervalFromViewportPosition(viewportPos);
|
||||||
|
if (result.has_value())
|
||||||
{
|
{
|
||||||
if (result.value == _hyperlinkPatternId)
|
result->start = _ConvertToBufferCell(result->start, false);
|
||||||
{
|
result->stop = _ConvertToBufferCell(result->stop, true);
|
||||||
return buffer.GetPlainText(result.start, result.stop);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Hyperlink is outside of the current view.
|
||||||
|
// We need to find if there's a pattern at that location.
|
||||||
|
const auto patterns = _getPatterns(bufferPos.y, bufferPos.y);
|
||||||
|
|
||||||
|
// NOTE: patterns is stored with top y-position being 0,
|
||||||
|
// so we need to cleverly set the y-pos to 0.
|
||||||
|
const til::point viewportPos{ bufferPos.x, 0 };
|
||||||
|
const auto results = patterns.findOverlapping(viewportPos, viewportPos);
|
||||||
|
if (!results.empty())
|
||||||
|
{
|
||||||
|
result = results.front();
|
||||||
|
result->start.y += bufferPos.y;
|
||||||
|
result->stop.y += bufferPos.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Case 2 - Step 2: get the auto-detected hyperlink
|
||||||
|
if (result.has_value() && result->value == _hyperlinkPatternId)
|
||||||
|
{
|
||||||
|
return _activeBuffer().GetPlainText(result->start, result->stop);
|
||||||
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,25 +577,17 @@ uint16_t Terminal::GetHyperlinkIdAtViewportPosition(const til::point viewportPos
|
|||||||
// Arguments:
|
// Arguments:
|
||||||
// - The position relative to the viewport
|
// - The position relative to the viewport
|
||||||
// Return value:
|
// Return value:
|
||||||
// - The interval representing the start and end coordinates (viewport-relative)
|
// - The interval representing the start and end coordinates
|
||||||
std::optional<PointTree::interval> Terminal::GetHyperlinkIntervalFromViewportPosition(const til::point viewportPos)
|
std::optional<PointTree::interval> Terminal::GetHyperlinkIntervalFromViewportPosition(const til::point viewportPos)
|
||||||
{
|
{
|
||||||
// GH#18177: The tree stores buffer-absolute coordinates
|
const auto results = _patternIntervalTree.findOverlapping({ viewportPos.x + 1, viewportPos.y }, viewportPos);
|
||||||
// Convert viewport-relative (y=0 at visible start) to buffer-absolute
|
|
||||||
const auto visStart = _VisibleStartIndex();
|
|
||||||
const til::point bufferPos{ viewportPos.x, viewportPos.y + visStart };
|
|
||||||
const auto results = _patternIntervalTree.findOverlapping({ bufferPos.x + 1, bufferPos.y }, bufferPos);
|
|
||||||
if (results.size() > 0)
|
if (results.size() > 0)
|
||||||
{
|
{
|
||||||
for (const auto& result : results)
|
for (const auto& result : results)
|
||||||
{
|
{
|
||||||
if (result.value == _hyperlinkPatternId)
|
if (result.value == _hyperlinkPatternId)
|
||||||
{
|
{
|
||||||
// Convert back to viewport-relative coordinates
|
return result;
|
||||||
auto interval = result;
|
|
||||||
interval.start.y -= visStart;
|
|
||||||
interval.stop.y -= visStart;
|
|
||||||
return interval;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -802,8 +806,11 @@ TerminalInput::OutputType Terminal::FocusChanged(const bool focused)
|
|||||||
// - The interval tree containing regions that need to be invalidated
|
// - The interval tree containing regions that need to be invalidated
|
||||||
void Terminal::_InvalidatePatternTree()
|
void Terminal::_InvalidatePatternTree()
|
||||||
{
|
{
|
||||||
|
const auto vis = _VisibleStartIndex();
|
||||||
_patternIntervalTree.visit_all([&](const PointTree::interval& interval) {
|
_patternIntervalTree.visit_all([&](const PointTree::interval& interval) {
|
||||||
_InvalidateFromCoords(interval.start, interval.stop);
|
const til::point startCoord{ interval.start.x, interval.start.y + vis };
|
||||||
|
const til::point endCoord{ interval.stop.x, interval.stop.y + vis };
|
||||||
|
_InvalidateFromCoords(startCoord, endCoord);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1201,16 +1208,7 @@ void Terminal::SetPlayMidiNoteCallback(std::function<void(const int, const int,
|
|||||||
void Terminal::UpdatePatternsUnderLock()
|
void Terminal::UpdatePatternsUnderLock()
|
||||||
{
|
{
|
||||||
_InvalidatePatternTree();
|
_InvalidatePatternTree();
|
||||||
const auto visStart = _VisibleStartIndex();
|
_patternIntervalTree = _getPatterns(_VisibleStartIndex(), _VisibleEndIndex());
|
||||||
const auto visEnd = _VisibleEndIndex();
|
|
||||||
const auto viewportHeight = visEnd - visStart;
|
|
||||||
|
|
||||||
// GH#18177: Scan extra rows beyond the viewport so that URLs
|
|
||||||
// wrapping across the viewport boundary are matched in full
|
|
||||||
const auto bufferSize = _activeBuffer().GetSize();
|
|
||||||
const auto beg = std::max<til::CoordType>(0, visStart - viewportHeight);
|
|
||||||
const auto end = std::min(bufferSize.BottomInclusive(), visEnd + viewportHeight);
|
|
||||||
_patternIntervalTree = _getPatterns(beg, end);
|
|
||||||
_InvalidatePatternTree();
|
_InvalidatePatternTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1425,8 +1423,10 @@ PointTree Terminal::_getPatterns(til::CoordType beg, til::CoordType end) const
|
|||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// PointTree uses half-open ranges and buffer-absolute coordinates.
|
auto range = ICU::BufferRangeFromMatch(&text, re.get());
|
||||||
const auto range = ICU::BufferRangeFromMatch(&text, re.get());
|
// PointTree uses half-open ranges and viewport-relative coordinates.
|
||||||
|
range.start.y -= beg;
|
||||||
|
range.end.y -= beg;
|
||||||
intervals.push_back(PointTree::interval(range.start, range.end, 0));
|
intervals.push_back(PointTree::interval(range.start, range.end, 0));
|
||||||
} while (uregex_findNext(re.get(), &status));
|
} while (uregex_findNext(re.get(), &status));
|
||||||
}
|
}
|
||||||
@@ -1534,10 +1534,6 @@ void Terminal::SerializeMainBuffer(HANDLE handle) const
|
|||||||
_mainBuffer->SerializeTo(handle);
|
_mainBuffer->SerializeTo(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terminal::UnknownSequence() noexcept
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Terminal::ColorSelection(const TextAttribute& attr, winrt::Microsoft::Terminal::Core::MatchMode matchMode)
|
void Terminal::ColorSelection(const TextAttribute& attr, winrt::Microsoft::Terminal::Core::MatchMode matchMode)
|
||||||
{
|
{
|
||||||
const auto colorSelection = [this](const til::point coordStartInclusive, const til::point coordEndExclusive, const TextAttribute& attr) {
|
const auto colorSelection = [this](const til::point coordStartInclusive, const til::point coordEndExclusive, const TextAttribute& attr) {
|
||||||
|
|||||||
@@ -85,7 +85,6 @@ public:
|
|||||||
void Create(til::size viewportSize,
|
void Create(til::size viewportSize,
|
||||||
til::CoordType scrollbackLines,
|
til::CoordType scrollbackLines,
|
||||||
Microsoft::Console::Render::Renderer& renderer);
|
Microsoft::Console::Render::Renderer& renderer);
|
||||||
void HardResetWithoutErase();
|
|
||||||
|
|
||||||
void CreateFromSettings(winrt::Microsoft::Terminal::Core::ICoreSettings settings,
|
void CreateFromSettings(winrt::Microsoft::Terminal::Core::ICoreSettings settings,
|
||||||
Microsoft::Console::Render::Renderer& renderer);
|
Microsoft::Console::Render::Renderer& renderer);
|
||||||
@@ -132,9 +131,7 @@ public:
|
|||||||
|
|
||||||
#pragma region ITerminalApi
|
#pragma region ITerminalApi
|
||||||
// These methods are defined in TerminalApi.cpp
|
// These methods are defined in TerminalApi.cpp
|
||||||
void UnknownSequence() noexcept override;
|
|
||||||
void ReturnResponse(const std::wstring_view response) override;
|
void ReturnResponse(const std::wstring_view response) override;
|
||||||
bool IsConPTY() const noexcept override;
|
|
||||||
Microsoft::Console::VirtualTerminal::StateMachine& GetStateMachine() noexcept override;
|
Microsoft::Console::VirtualTerminal::StateMachine& GetStateMachine() noexcept override;
|
||||||
BufferState GetBufferAndViewport() noexcept override;
|
BufferState GetBufferAndViewport() noexcept override;
|
||||||
void SetViewportPosition(const til::point position) noexcept override;
|
void SetViewportPosition(const til::point position) noexcept override;
|
||||||
@@ -207,7 +204,7 @@ public:
|
|||||||
bool IsGridLineDrawingAllowed() noexcept override;
|
bool IsGridLineDrawingAllowed() noexcept override;
|
||||||
std::wstring GetHyperlinkUri(uint16_t id) const override;
|
std::wstring GetHyperlinkUri(uint16_t id) const override;
|
||||||
std::wstring GetHyperlinkCustomId(uint16_t id) const override;
|
std::wstring GetHyperlinkCustomId(uint16_t id) const override;
|
||||||
std::vector<size_t> GetPatternId(const til::point viewportPos) const override;
|
std::vector<size_t> GetPatternId(const til::point location) const override;
|
||||||
|
|
||||||
std::pair<COLORREF, COLORREF> GetAttributeColors(const TextAttribute& attr) const noexcept override;
|
std::pair<COLORREF, COLORREF> GetAttributeColors(const TextAttribute& attr) const noexcept override;
|
||||||
std::span<const til::point_span> GetSelectionSpans() const noexcept override;
|
std::span<const til::point_span> GetSelectionSpans() const noexcept override;
|
||||||
@@ -400,6 +397,7 @@ private:
|
|||||||
std::wstring _wordDelimiters;
|
std::wstring _wordDelimiters;
|
||||||
SelectionExpansion _multiClickSelectionMode = SelectionExpansion::Char;
|
SelectionExpansion _multiClickSelectionMode = SelectionExpansion::Char;
|
||||||
SelectionInteractionMode _selectionMode = SelectionInteractionMode::None;
|
SelectionInteractionMode _selectionMode = SelectionInteractionMode::None;
|
||||||
|
bool _selectionIsTargetingUrl = false;
|
||||||
SelectionEndpoint _selectionEndpoint = SelectionEndpoint::None;
|
SelectionEndpoint _selectionEndpoint = SelectionEndpoint::None;
|
||||||
bool _anchorInactiveSelectionEndpoint = false;
|
bool _anchorInactiveSelectionEndpoint = false;
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|||||||
@@ -28,11 +28,6 @@ void Terminal::ReturnResponse(const std::wstring_view response)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Terminal::IsConPTY() const noexcept
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Microsoft::Console::VirtualTerminal::StateMachine& Terminal::GetStateMachine() noexcept
|
Microsoft::Console::VirtualTerminal::StateMachine& Terminal::GetStateMachine() noexcept
|
||||||
{
|
{
|
||||||
return *_stateMachine;
|
return *_stateMachine;
|
||||||
@@ -145,7 +140,7 @@ unsigned int Terminal::GetInputCodePage() const noexcept
|
|||||||
|
|
||||||
void Terminal::CopyToClipboard(wil::zwstring_view content)
|
void Terminal::CopyToClipboard(wil::zwstring_view content)
|
||||||
{
|
{
|
||||||
if (_clipboardOperationsAllowed && _focused)
|
if (_clipboardOperationsAllowed)
|
||||||
{
|
{
|
||||||
_pfnCopyToClipboard(content);
|
_pfnCopyToClipboard(content);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ void Terminal::_SetSelectionEnd(SelectionInfo* selection, const til::point viewp
|
|||||||
std::tie(selection->start, selection->end) = expandedAnchors;
|
std::tie(selection->start, selection->end) = expandedAnchors;
|
||||||
}
|
}
|
||||||
_selectionMode = SelectionInteractionMode::Mouse;
|
_selectionMode = SelectionInteractionMode::Mouse;
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
@@ -313,7 +314,7 @@ std::pair<til::point, til::point> Terminal::_ExpandSelectionAnchors(std::pair<ti
|
|||||||
break;
|
break;
|
||||||
case SelectionExpansion::Word:
|
case SelectionExpansion::Word:
|
||||||
{
|
{
|
||||||
start = buffer.GetWordStart(start, _wordDelimiters, false);
|
start = buffer.GetWordStart2(start, _wordDelimiters, false);
|
||||||
|
|
||||||
// GH#5099: We round to the nearest cell boundary,
|
// GH#5099: We round to the nearest cell boundary,
|
||||||
// so we would normally prematurely expand to the next word
|
// so we would normally prematurely expand to the next word
|
||||||
@@ -325,7 +326,7 @@ std::pair<til::point, til::point> Terminal::_ExpandSelectionAnchors(std::pair<ti
|
|||||||
{
|
{
|
||||||
bufferSize.DecrementInExclusiveBounds(end);
|
bufferSize.DecrementInExclusiveBounds(end);
|
||||||
}
|
}
|
||||||
end = buffer.GetWordEnd(end, _wordDelimiters, false);
|
end = buffer.GetWordEnd2(end, _wordDelimiters, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SelectionExpansion::Char:
|
case SelectionExpansion::Char:
|
||||||
@@ -398,6 +399,7 @@ void Terminal::ToggleMarkMode()
|
|||||||
}
|
}
|
||||||
_ScrollToPoint(_selection->start);
|
_ScrollToPoint(_selection->start);
|
||||||
_selectionMode = SelectionInteractionMode::Mark;
|
_selectionMode = SelectionInteractionMode::Mark;
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,9 +437,9 @@ void Terminal::ExpandSelectionToWord()
|
|||||||
const auto& buffer = _activeBuffer();
|
const auto& buffer = _activeBuffer();
|
||||||
auto selection{ _selection.write() };
|
auto selection{ _selection.write() };
|
||||||
wil::hide_name _selection;
|
wil::hide_name _selection;
|
||||||
selection->start = buffer.GetWordStart(selection->start, _wordDelimiters, false);
|
selection->start = buffer.GetWordStart2(selection->start, _wordDelimiters, false);
|
||||||
selection->pivot = selection->start;
|
selection->pivot = selection->start;
|
||||||
selection->end = buffer.GetWordEnd(selection->end, _wordDelimiters, false);
|
selection->end = buffer.GetWordEnd2(selection->end, _wordDelimiters, false);
|
||||||
|
|
||||||
// if we're targeting both endpoints, instead just target "end"
|
// if we're targeting both endpoints, instead just target "end"
|
||||||
if (WI_IsFlagSet(_selectionEndpoint, SelectionEndpoint::Start) && WI_IsFlagSet(_selectionEndpoint, SelectionEndpoint::End))
|
if (WI_IsFlagSet(_selectionEndpoint, SelectionEndpoint::Start) && WI_IsFlagSet(_selectionEndpoint, SelectionEndpoint::End))
|
||||||
@@ -458,6 +460,7 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
if (_selectionMode != SelectionInteractionMode::Mark)
|
if (_selectionMode != SelectionInteractionMode::Mark)
|
||||||
{
|
{
|
||||||
// This feature only works in mark mode
|
// This feature only works in mark mode
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,10 +469,19 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
const auto bufferSize = buffer.GetSize();
|
const auto bufferSize = buffer.GetSize();
|
||||||
const auto viewportHeight = _GetMutableViewport().Height();
|
const auto viewportHeight = _GetMutableViewport().Height();
|
||||||
|
|
||||||
|
// The patterns are stored relative to the "search area". Initially, this search area will be the viewport,
|
||||||
|
// but as we progressively search through more of the buffer, this will change.
|
||||||
|
// Keep track of the search area here, and use the lambda below to convert points to the search area coordinate space.
|
||||||
|
auto searchArea = _GetVisibleViewport();
|
||||||
|
auto convertToSearchArea = [&searchArea](const til::point pt) noexcept {
|
||||||
|
auto copy = pt;
|
||||||
|
searchArea.ConvertToOrigin(©);
|
||||||
|
return copy;
|
||||||
|
};
|
||||||
|
|
||||||
// extracts the next/previous hyperlink from the list of hyperlink ranges provided
|
// extracts the next/previous hyperlink from the list of hyperlink ranges provided
|
||||||
auto extractResultFromList = [&](std::vector<interval_tree::Interval<til::point, size_t>>& list) noexcept {
|
auto extractResultFromList = [&](std::vector<interval_tree::Interval<til::point, size_t>>& list) noexcept {
|
||||||
const auto selectionStart = _selection->start;
|
const auto selectionStartInSearchArea = convertToSearchArea(_selection->start);
|
||||||
const auto selectionEnd = _selection->end;
|
|
||||||
|
|
||||||
std::optional<std::pair<til::point, til::point>> resultFromList;
|
std::optional<std::pair<til::point, til::point>> resultFromList;
|
||||||
if (!list.empty())
|
if (!list.empty())
|
||||||
@@ -479,11 +491,12 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
// pattern tree includes the currently selected range when going forward,
|
// pattern tree includes the currently selected range when going forward,
|
||||||
// so we need to check if we're pointing to that one before returning it.
|
// so we need to check if we're pointing to that one before returning it.
|
||||||
auto range = list.front();
|
auto range = list.front();
|
||||||
if (range.start == selectionStart && range.stop == selectionEnd)
|
if (_selectionIsTargetingUrl && range.start == selectionStartInSearchArea)
|
||||||
{
|
{
|
||||||
if (list.size() > 1)
|
if (list.size() > 1)
|
||||||
{
|
{
|
||||||
// Selection matches the current URL, pick the next one
|
// if we're pointing to the currently selected URL,
|
||||||
|
// pick the next one.
|
||||||
range = til::at(list, 1);
|
range = til::at(list, 1);
|
||||||
resultFromList = { range.start, range.stop };
|
resultFromList = { range.start, range.stop };
|
||||||
}
|
}
|
||||||
@@ -508,6 +521,14 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
resultFromList = { range.start, range.stop };
|
resultFromList = { range.start, range.stop };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pattern tree stores everything as viewport coords,
|
||||||
|
// so we need to convert them on the way out
|
||||||
|
if (resultFromList)
|
||||||
|
{
|
||||||
|
searchArea.ConvertFromOrigin(&resultFromList->first);
|
||||||
|
searchArea.ConvertFromOrigin(&resultFromList->second);
|
||||||
|
}
|
||||||
return resultFromList;
|
return resultFromList;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -525,8 +546,8 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
searchEnd = _selection->start;
|
searchEnd = _selection->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.A) Try searching the cached pattern tree (no scanning required)
|
// 1.A) Try searching the current viewport (no scrolling required)
|
||||||
auto resultList = _patternIntervalTree.findContained(searchStart, searchEnd);
|
auto resultList = _patternIntervalTree.findContained(convertToSearchArea(searchStart), convertToSearchArea(searchEnd));
|
||||||
std::optional<std::pair<til::point, til::point>> result = extractResultFromList(resultList);
|
std::optional<std::pair<til::point, til::point>> result = extractResultFromList(resultList);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
@@ -541,12 +562,14 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
searchEnd = { bufferSize.RightInclusive(), searchStart.y - 1 };
|
searchEnd = { bufferSize.RightInclusive(), searchStart.y - 1 };
|
||||||
searchStart = { bufferSize.Left(), std::max(searchStart.y - viewportHeight, bufferSize.Top()) };
|
searchStart = { bufferSize.Left(), std::max(searchStart.y - viewportHeight, bufferSize.Top()) };
|
||||||
}
|
}
|
||||||
|
searchArea = Viewport::FromDimensions(searchStart, { searchEnd.x + 1, searchEnd.y + 1 });
|
||||||
|
|
||||||
const til::point bufferStart{ bufferSize.Origin() };
|
const til::point bufferStart{ bufferSize.Origin() };
|
||||||
const til::point bufferEnd{ bufferSize.RightInclusive(), ViewEndIndex() };
|
const til::point bufferEnd{ bufferSize.RightInclusive(), ViewEndIndex() };
|
||||||
while (!result && bufferSize.IsInBounds(searchStart) && bufferSize.IsInBounds(searchEnd) && searchStart <= searchEnd && bufferStart <= searchStart && searchEnd <= bufferEnd)
|
while (!result && bufferSize.IsInBounds(searchStart) && bufferSize.IsInBounds(searchEnd) && searchStart <= searchEnd && bufferStart <= searchStart && searchEnd <= bufferEnd)
|
||||||
{
|
{
|
||||||
auto patterns = _getPatterns(searchStart.y, searchEnd.y);
|
auto patterns = _getPatterns(searchStart.y, searchEnd.y);
|
||||||
resultList = patterns.findContained(searchStart, searchEnd);
|
resultList = patterns.findContained(convertToSearchArea(searchStart), convertToSearchArea(searchEnd));
|
||||||
result = extractResultFromList(resultList);
|
result = extractResultFromList(resultList);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
@@ -560,6 +583,7 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
searchEnd.y -= 1;
|
searchEnd.y -= 1;
|
||||||
searchStart.y = std::max(searchEnd.y - viewportHeight, bufferSize.Top());
|
searchStart.y = std::max(searchEnd.y - viewportHeight, bufferSize.Top());
|
||||||
}
|
}
|
||||||
|
searchArea = Viewport::FromDimensions(searchStart, { searchEnd.x + 1, searchEnd.y + 1 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -632,10 +656,11 @@ void Terminal::SelectHyperlink(const SearchDirection dir)
|
|||||||
selection->start = result->first;
|
selection->start = result->first;
|
||||||
selection->pivot = result->first;
|
selection->pivot = result->first;
|
||||||
selection->end = result->second;
|
selection->end = result->second;
|
||||||
|
_selectionIsTargetingUrl = true;
|
||||||
_selectionEndpoint = SelectionEndpoint::End;
|
_selectionEndpoint = SelectionEndpoint::End;
|
||||||
|
|
||||||
// 4. Scroll to the selected area (if necessary)
|
// 4. Scroll to the selected area (if necessary)
|
||||||
_ScrollToPoint(dir == SearchDirection::Forward ? selection->end : selection->start);
|
_ScrollToPoint(selection->end);
|
||||||
}
|
}
|
||||||
|
|
||||||
Terminal::UpdateSelectionParams Terminal::ConvertKeyEventToUpdateSelectionParams(const ControlKeyStates mods, const WORD vkey) const noexcept
|
Terminal::UpdateSelectionParams Terminal::ConvertKeyEventToUpdateSelectionParams(const ControlKeyStates mods, const WORD vkey) const noexcept
|
||||||
@@ -743,6 +768,7 @@ void Terminal::UpdateSelection(SelectionDirection direction, SelectionExpansion
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. Actually modify the selection state
|
// 3. Actually modify the selection state
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
_selectionMode = std::max(_selectionMode, SelectionInteractionMode::Keyboard);
|
_selectionMode = std::max(_selectionMode, SelectionInteractionMode::Keyboard);
|
||||||
|
|
||||||
auto selection{ _selection.write() };
|
auto selection{ _selection.write() };
|
||||||
@@ -785,6 +811,7 @@ void Terminal::SelectAll()
|
|||||||
};
|
};
|
||||||
|
|
||||||
_selectionMode = SelectionInteractionMode::Keyboard;
|
_selectionMode = SelectionInteractionMode::Keyboard;
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
_ScrollToPoint(_selection->start);
|
_ScrollToPoint(_selection->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -826,13 +853,13 @@ void Terminal::_MoveByWord(SelectionDirection direction, til::point& pos)
|
|||||||
case SelectionDirection::Left:
|
case SelectionDirection::Left:
|
||||||
{
|
{
|
||||||
auto nextPos = pos;
|
auto nextPos = pos;
|
||||||
nextPos = buffer.GetWordStart(nextPos, _wordDelimiters, true);
|
nextPos = buffer.GetWordStart2(nextPos, _wordDelimiters, true);
|
||||||
if (nextPos == pos)
|
if (nextPos == pos)
|
||||||
{
|
{
|
||||||
// didn't move because we're already at the beginning of a word,
|
// didn't move because we're already at the beginning of a word,
|
||||||
// so move to the beginning of the previous word
|
// so move to the beginning of the previous word
|
||||||
buffer.GetSize().DecrementInExclusiveBounds(nextPos);
|
buffer.GetSize().DecrementInExclusiveBounds(nextPos);
|
||||||
nextPos = buffer.GetWordStart(nextPos, _wordDelimiters, true);
|
nextPos = buffer.GetWordStart2(nextPos, _wordDelimiters, true);
|
||||||
}
|
}
|
||||||
pos = nextPos;
|
pos = nextPos;
|
||||||
break;
|
break;
|
||||||
@@ -841,24 +868,24 @@ void Terminal::_MoveByWord(SelectionDirection direction, til::point& pos)
|
|||||||
{
|
{
|
||||||
const auto mutableViewportEndExclusive = _GetMutableViewport().BottomInclusiveRightExclusive();
|
const auto mutableViewportEndExclusive = _GetMutableViewport().BottomInclusiveRightExclusive();
|
||||||
auto nextPos = pos;
|
auto nextPos = pos;
|
||||||
nextPos = buffer.GetWordEnd(nextPos, _wordDelimiters, true, mutableViewportEndExclusive);
|
nextPos = buffer.GetWordEnd2(nextPos, _wordDelimiters, true, mutableViewportEndExclusive);
|
||||||
if (nextPos == pos)
|
if (nextPos == pos)
|
||||||
{
|
{
|
||||||
// didn't move because we're already at the end of a word,
|
// didn't move because we're already at the end of a word,
|
||||||
// so move to the end of the next word
|
// so move to the end of the next word
|
||||||
buffer.GetSize().IncrementInExclusiveBounds(nextPos);
|
buffer.GetSize().IncrementInExclusiveBounds(nextPos);
|
||||||
nextPos = buffer.GetWordEnd(nextPos, _wordDelimiters, true, mutableViewportEndExclusive);
|
nextPos = buffer.GetWordEnd2(nextPos, _wordDelimiters, true, mutableViewportEndExclusive);
|
||||||
}
|
}
|
||||||
pos = nextPos;
|
pos = nextPos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SelectionDirection::Up:
|
case SelectionDirection::Up:
|
||||||
_MoveByChar(direction, pos);
|
_MoveByChar(direction, pos);
|
||||||
pos = buffer.GetWordStart(pos, _wordDelimiters, true);
|
pos = buffer.GetWordStart2(pos, _wordDelimiters, true);
|
||||||
break;
|
break;
|
||||||
case SelectionDirection::Down:
|
case SelectionDirection::Down:
|
||||||
_MoveByChar(direction, pos);
|
_MoveByChar(direction, pos);
|
||||||
pos = buffer.GetWordEnd(pos, _wordDelimiters, true);
|
pos = buffer.GetWordEnd2(pos, _wordDelimiters, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -916,6 +943,7 @@ void Terminal::ClearSelection()
|
|||||||
_assertLocked();
|
_assertLocked();
|
||||||
_selection.write()->active = false;
|
_selection.write()->active = false;
|
||||||
_selectionMode = SelectionInteractionMode::None;
|
_selectionMode = SelectionInteractionMode::None;
|
||||||
|
_selectionIsTargetingUrl = false;
|
||||||
_selectionEndpoint = static_cast<SelectionEndpoint>(0);
|
_selectionEndpoint = static_cast<SelectionEndpoint>(0);
|
||||||
_anchorInactiveSelectionEndpoint = false;
|
_anchorInactiveSelectionEndpoint = false;
|
||||||
}
|
}
|
||||||
@@ -1017,9 +1045,5 @@ void Terminal::_ScrollToPoint(const til::point pos)
|
|||||||
}
|
}
|
||||||
_NotifyScrollEvent();
|
_NotifyScrollEvent();
|
||||||
_activeBuffer().TriggerScroll();
|
_activeBuffer().TriggerScroll();
|
||||||
|
|
||||||
// Rebuild the pattern tree for the new viewport position
|
|
||||||
// so that callers always find a fresh cache after scrolling
|
|
||||||
_updateUrlDetection();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,16 +74,15 @@ std::wstring Microsoft::Terminal::Core::Terminal::GetHyperlinkCustomId(uint16_t
|
|||||||
// Method Description:
|
// Method Description:
|
||||||
// - Gets the regex pattern ids of a location
|
// - Gets the regex pattern ids of a location
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// - The viewport-relative location
|
// - The location
|
||||||
// Return value:
|
// Return value:
|
||||||
// - The pattern IDs of the location
|
// - The pattern IDs of the location
|
||||||
std::vector<size_t> Terminal::GetPatternId(const til::point viewportPos) const
|
std::vector<size_t> Terminal::GetPatternId(const til::point location) const
|
||||||
{
|
{
|
||||||
_assertLocked();
|
_assertLocked();
|
||||||
|
|
||||||
// Convert viewport-relative (y=0 at visible start) to buffer-absolute
|
// Look through our interval tree for this location
|
||||||
const til::point bufferPos{ viewportPos.x, viewportPos.y + _VisibleStartIndex() };
|
const auto intervals = _patternIntervalTree.findOverlapping({ location.x + 1, location.y }, location);
|
||||||
const auto intervals = _patternIntervalTree.findOverlapping({ bufferPos.x + 1, bufferPos.y }, bufferPos);
|
|
||||||
if (intervals.size() == 0)
|
if (intervals.size() == 0)
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
|
|||||||
@@ -349,11 +349,9 @@ namespace winrt::Microsoft::Terminal::Settings
|
|||||||
_ReloadEnvironmentVariables = profile.ReloadEnvironmentVariables();
|
_ReloadEnvironmentVariables = profile.ReloadEnvironmentVariables();
|
||||||
_RainbowSuggestions = profile.RainbowSuggestions();
|
_RainbowSuggestions = profile.RainbowSuggestions();
|
||||||
_ForceVTInput = profile.ForceVTInput();
|
_ForceVTInput = profile.ForceVTInput();
|
||||||
_AllowKittyKeyboardMode = profile.AllowKittyKeyboardMode();
|
|
||||||
_AllowVtChecksumReport = profile.AllowVtChecksumReport();
|
_AllowVtChecksumReport = profile.AllowVtChecksumReport();
|
||||||
_AllowVtClipboardWrite = profile.AllowVtClipboardWrite();
|
_AllowVtClipboardWrite = profile.AllowVtClipboardWrite();
|
||||||
_PathTranslationStyle = profile.PathTranslationStyle();
|
_PathTranslationStyle = profile.PathTranslationStyle();
|
||||||
_DragDropDelimiter = profile.DragDropDelimiter();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
@@ -377,7 +375,6 @@ namespace winrt::Microsoft::Terminal::Settings
|
|||||||
_DisablePartialInvalidation = globalSettings.DisablePartialInvalidation();
|
_DisablePartialInvalidation = globalSettings.DisablePartialInvalidation();
|
||||||
_SoftwareRendering = globalSettings.SoftwareRendering();
|
_SoftwareRendering = globalSettings.SoftwareRendering();
|
||||||
_TextMeasurement = globalSettings.TextMeasurement();
|
_TextMeasurement = globalSettings.TextMeasurement();
|
||||||
_AmbiguousWidth = globalSettings.AmbiguousWidth();
|
|
||||||
_DefaultInputScope = globalSettings.DefaultInputScope();
|
_DefaultInputScope = globalSettings.DefaultInputScope();
|
||||||
_UseBackgroundImageForWindow = globalSettings.UseBackgroundImageForWindow();
|
_UseBackgroundImageForWindow = globalSettings.UseBackgroundImageForWindow();
|
||||||
_TrimBlockSelection = globalSettings.TrimBlockSelection();
|
_TrimBlockSelection = globalSettings.TrimBlockSelection();
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include "Actions.h"
|
#include "Actions.h"
|
||||||
#include "Actions.g.cpp"
|
#include "Actions.g.cpp"
|
||||||
#include "LibraryResources.h"
|
|
||||||
#include "../TerminalSettingsModel/AllShortcutActions.h"
|
#include "../TerminalSettingsModel/AllShortcutActions.h"
|
||||||
|
|
||||||
using namespace winrt::Windows::UI::Xaml;
|
using namespace winrt::Windows::UI::Xaml;
|
||||||
@@ -23,7 +22,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
{
|
{
|
||||||
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
||||||
_ViewModel = args.ViewModel().as<Editor::ActionsViewModel>();
|
_ViewModel = args.ViewModel().as<Editor::ActionsViewModel>();
|
||||||
_ViewModel.ReSortCommandList();
|
_ViewModel.CurrentPage(ActionsSubPage::Base);
|
||||||
auto vmImpl = get_self<ActionsViewModel>(_ViewModel);
|
auto vmImpl = get_self<ActionsViewModel>(_ViewModel);
|
||||||
vmImpl->MarkAsVisited();
|
vmImpl->MarkAsVisited();
|
||||||
_layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {
|
_layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {
|
||||||
@@ -32,7 +31,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
|
|
||||||
AddNewButton().Focus(FocusState::Programmatic);
|
AddNewButton().Focus(FocusState::Programmatic);
|
||||||
});
|
});
|
||||||
BringIntoViewWhenLoaded(args.ElementToFocus());
|
|
||||||
|
|
||||||
TraceLoggingWrite(
|
TraceLoggingWrite(
|
||||||
g_hTerminalSettingsEditorProvider,
|
g_hTerminalSettingsEditorProvider,
|
||||||
|
|||||||
@@ -164,33 +164,17 @@
|
|||||||
Style="{StaticResource KeyBindingNameTextBlockStyle}"
|
Style="{StaticResource KeyBindingNameTextBlockStyle}"
|
||||||
Text="{x:Bind DisplayName, Mode=OneWay}" />
|
Text="{x:Bind DisplayName, Mode=OneWay}" />
|
||||||
<!-- Key Chord Text -->
|
<!-- Key Chord Text -->
|
||||||
<Grid Grid.Column="1"
|
<Border Grid.Column="1"
|
||||||
HorizontalAlignment="Right"
|
Padding="8,4,8,4"
|
||||||
VerticalAlignment="Center"
|
HorizontalAlignment="Right"
|
||||||
ColumnSpacing="4">
|
VerticalAlignment="Center"
|
||||||
<Grid.ColumnDefinitions>
|
Style="{ThemeResource KeyChordBorderStyle}"
|
||||||
<ColumnDefinition Width="Auto" />
|
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(FirstKeyChordText)}">
|
||||||
<ColumnDefinition Width="Auto" />
|
<TextBlock FontSize="14"
|
||||||
</Grid.ColumnDefinitions>
|
Style="{ThemeResource KeyChordTextBlockStyle}"
|
||||||
<Border Grid.Column="0"
|
Text="{x:Bind FirstKeyChordText, Mode=OneWay}"
|
||||||
Padding="8,4,8,4"
|
TextWrapping="WrapWholeWords" />
|
||||||
Style="{ThemeResource KeyChordBorderStyle}"
|
</Border>
|
||||||
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(FirstKeyChordText)}">
|
|
||||||
<TextBlock FontSize="14"
|
|
||||||
Style="{ThemeResource KeyChordTextBlockStyle}"
|
|
||||||
Text="{x:Bind FirstKeyChordText, Mode=OneWay}"
|
|
||||||
TextWrapping="WrapWholeWords" />
|
|
||||||
</Border>
|
|
||||||
<Border Grid.Column="1"
|
|
||||||
Padding="8,4,8,4"
|
|
||||||
Style="{ThemeResource KeyChordBorderStyle}"
|
|
||||||
ToolTipService.ToolTip="{x:Bind AdditionalKeyChordTooltipText, Mode=OneWay}"
|
|
||||||
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(AdditionalKeyChordCountText)}">
|
|
||||||
<TextBlock FontSize="14"
|
|
||||||
Style="{ThemeResource KeyChordTextBlockStyle}"
|
|
||||||
Text="{x:Bind AdditionalKeyChordCountText, Mode=OneWay}" />
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</ListViewItem>
|
</ListViewItem>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
@@ -198,7 +182,8 @@
|
|||||||
</Page.Resources>
|
</Page.Resources>
|
||||||
|
|
||||||
<Border MaxWidth="{StaticResource StandardControlMaxWidth}">
|
<Border MaxWidth="{StaticResource StandardControlMaxWidth}">
|
||||||
<StackPanel HorizontalAlignment="Stretch"
|
<StackPanel MaxWidth="600"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
Spacing="8"
|
Spacing="8"
|
||||||
Style="{StaticResource SettingsStackStyle}">
|
Style="{StaticResource SettingsStackStyle}">
|
||||||
<HyperlinkButton x:Uid="Actions_Disclaimer"
|
<HyperlinkButton x:Uid="Actions_Disclaimer"
|
||||||
|
|||||||
@@ -126,23 +126,18 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
|
|
||||||
void CommandViewModel::Name(const winrt::hstring& newName)
|
void CommandViewModel::Name(const winrt::hstring& newName)
|
||||||
{
|
{
|
||||||
if (_command.Name() != newName)
|
_command.Name(newName);
|
||||||
|
if (newName.empty())
|
||||||
{
|
{
|
||||||
_command.Name(newName);
|
// if the name was cleared, refresh the DisplayName
|
||||||
_NotifyChanges(L"DisplayName", L"DisplayNameAndKeyChordAutomationPropName");
|
_NotifyChanges(L"DisplayName", L"DisplayNameAndKeyChordAutomationPropName");
|
||||||
_cachedDisplayName.clear();
|
|
||||||
}
|
}
|
||||||
|
_cachedDisplayName.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
winrt::hstring CommandViewModel::DisplayNameAndKeyChordAutomationPropName()
|
winrt::hstring CommandViewModel::DisplayNameAndKeyChordAutomationPropName()
|
||||||
{
|
{
|
||||||
auto result = DisplayName() + L", " + FirstKeyChordText();
|
return DisplayName() + L", " + FirstKeyChordText();
|
||||||
const auto size = _KeyChordList.Size();
|
|
||||||
if (size > 1)
|
|
||||||
{
|
|
||||||
result = result + L" " + hstring{ RS_fmt(L"Actions_AdditionalKeyChords", winrt::to_hstring(size - 1)) };
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
winrt::hstring CommandViewModel::FirstKeyChordText()
|
winrt::hstring CommandViewModel::FirstKeyChordText()
|
||||||
@@ -154,35 +149,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
return L"";
|
return L"";
|
||||||
}
|
}
|
||||||
|
|
||||||
winrt::hstring CommandViewModel::AdditionalKeyChordCountText()
|
|
||||||
{
|
|
||||||
const auto size = _KeyChordList.Size();
|
|
||||||
if (size > 1)
|
|
||||||
{
|
|
||||||
return winrt::hstring{ L"+" + winrt::to_hstring(size - 1) };
|
|
||||||
}
|
|
||||||
return L"";
|
|
||||||
}
|
|
||||||
|
|
||||||
winrt::hstring CommandViewModel::AdditionalKeyChordTooltipText()
|
|
||||||
{
|
|
||||||
const auto size = _KeyChordList.Size();
|
|
||||||
if (size <= 1)
|
|
||||||
{
|
|
||||||
return L"";
|
|
||||||
}
|
|
||||||
std::wstring result;
|
|
||||||
for (uint32_t i = 1; i < size; ++i)
|
|
||||||
{
|
|
||||||
if (!result.empty())
|
|
||||||
{
|
|
||||||
result += L"\n";
|
|
||||||
}
|
|
||||||
result += std::wstring_view{ _KeyChordList.GetAt(i).KeyChordText() };
|
|
||||||
}
|
|
||||||
return winrt::hstring{ result };
|
|
||||||
}
|
|
||||||
|
|
||||||
winrt::hstring CommandViewModel::ID()
|
winrt::hstring CommandViewModel::ID()
|
||||||
{
|
{
|
||||||
return _command.ID();
|
return _command.ID();
|
||||||
@@ -321,10 +287,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
{
|
{
|
||||||
weak->_ReplaceCommandWithUserCopy(false);
|
weak->_ReplaceCommandWithUserCopy(false);
|
||||||
}
|
}
|
||||||
if (!weak->_command.HasName())
|
weak->_NotifyChanges(L"DisplayName");
|
||||||
{
|
|
||||||
weak->_NotifyChanges(L"DisplayName");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -361,10 +324,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
_RegisterActionArgsVMEvents(*actionArgsVM);
|
_RegisterActionArgsVMEvents(*actionArgsVM);
|
||||||
actionArgsVM->Initialize();
|
actionArgsVM->Initialize();
|
||||||
ActionArgsVM(*actionArgsVM);
|
ActionArgsVM(*actionArgsVM);
|
||||||
if (!_command.HasName())
|
_NotifyChanges(L"DisplayName");
|
||||||
{
|
|
||||||
_NotifyChanges(L"DisplayName");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ArgWrapper::ArgWrapper(const Model::ArgDescriptor& descriptor, const Windows::Foundation::IInspectable& value) :
|
ArgWrapper::ArgWrapper(const Model::ArgDescriptor& descriptor, const Windows::Foundation::IInspectable& value) :
|
||||||
@@ -1246,25 +1206,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
CurrentPage(ActionsSubPage::Edit);
|
CurrentPage(ActionsSubPage::Edit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActionsViewModel::ReSortCommandList()
|
|
||||||
{
|
|
||||||
if (_CommandListDirty)
|
|
||||||
{
|
|
||||||
std::vector<Editor::CommandViewModel> commandList;
|
|
||||||
commandList.reserve(_CommandList.Size());
|
|
||||||
for (const auto& cmd : _CommandList)
|
|
||||||
{
|
|
||||||
commandList.push_back(cmd);
|
|
||||||
}
|
|
||||||
std::sort(commandList.begin(), commandList.end(), [](const Editor::CommandViewModel& lhs, const Editor::CommandViewModel& rhs) {
|
|
||||||
return lhs.DisplayName() < rhs.DisplayName();
|
|
||||||
});
|
|
||||||
_CommandList = single_threaded_observable_vector(std::move(commandList));
|
|
||||||
_NotifyChanges(L"CommandList");
|
|
||||||
_CommandListDirty = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ActionsViewModel::CurrentCommand(const Editor::CommandViewModel& newCommand)
|
void ActionsViewModel::CurrentCommand(const Editor::CommandViewModel& newCommand)
|
||||||
{
|
{
|
||||||
_CurrentCommand = newCommand;
|
_CurrentCommand = newCommand;
|
||||||
@@ -1435,17 +1376,5 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
cmdVM->DeleteRequested({ this, &ActionsViewModel::_CmdVMDeleteRequestedHandler });
|
cmdVM->DeleteRequested({ this, &ActionsViewModel::_CmdVMDeleteRequestedHandler });
|
||||||
cmdVM->PropagateColorSchemeRequested({ this, &ActionsViewModel::_CmdVMPropagateColorSchemeRequestedHandler });
|
cmdVM->PropagateColorSchemeRequested({ this, &ActionsViewModel::_CmdVMPropagateColorSchemeRequestedHandler });
|
||||||
cmdVM->PropagateColorSchemeNamesRequested({ this, &ActionsViewModel::_CmdVMPropagateColorSchemeNamesRequestedHandler });
|
cmdVM->PropagateColorSchemeNamesRequested({ this, &ActionsViewModel::_CmdVMPropagateColorSchemeNamesRequestedHandler });
|
||||||
cmdVM->PropertyChanged([weakThis{ get_weak() }](const IInspectable& sender, const Windows::UI::Xaml::Data::PropertyChangedEventArgs& args) {
|
|
||||||
if (const auto self{ weakThis.get() })
|
|
||||||
{
|
|
||||||
const auto senderVM{ sender.as<Editor::CommandViewModel>() };
|
|
||||||
const auto propertyName{ args.PropertyName() };
|
|
||||||
if (propertyName == L"DisplayName")
|
|
||||||
{
|
|
||||||
// when a command's name changes, note that we need to re-sort the command list when we navigate back to the actions page
|
|
||||||
self->_CommandListDirty = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,8 +74,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
winrt::hstring DisplayNameAndKeyChordAutomationPropName();
|
winrt::hstring DisplayNameAndKeyChordAutomationPropName();
|
||||||
|
|
||||||
winrt::hstring FirstKeyChordText();
|
winrt::hstring FirstKeyChordText();
|
||||||
winrt::hstring AdditionalKeyChordCountText();
|
|
||||||
winrt::hstring AdditionalKeyChordTooltipText();
|
|
||||||
|
|
||||||
winrt::hstring ID();
|
winrt::hstring ID();
|
||||||
bool IsUserAction();
|
bool IsUserAction();
|
||||||
@@ -258,7 +256,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
bool DisplayBadge() const noexcept;
|
bool DisplayBadge() const noexcept;
|
||||||
|
|
||||||
void AddNewCommand();
|
void AddNewCommand();
|
||||||
void ReSortCommandList();
|
|
||||||
|
|
||||||
void CurrentCommand(const Editor::CommandViewModel& newCommand);
|
void CurrentCommand(const Editor::CommandViewModel& newCommand);
|
||||||
Editor::CommandViewModel CurrentCommand();
|
Editor::CommandViewModel CurrentCommand();
|
||||||
@@ -280,7 +277,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
Model::CascadiaSettings _Settings;
|
Model::CascadiaSettings _Settings;
|
||||||
Windows::Foundation::Collections::IMap<Model::ShortcutAction, winrt::hstring> _AvailableActionsAndNamesMap;
|
Windows::Foundation::Collections::IMap<Model::ShortcutAction, winrt::hstring> _AvailableActionsAndNamesMap;
|
||||||
Windows::Foundation::Collections::IMap<winrt::hstring, Model::ShortcutAction> _NameToActionMap;
|
Windows::Foundation::Collections::IMap<winrt::hstring, Model::ShortcutAction> _NameToActionMap;
|
||||||
bool _CommandListDirty{ false };
|
|
||||||
|
|
||||||
void _MakeCommandVMsHelper();
|
void _MakeCommandVMsHelper();
|
||||||
void _RegisterCmdVMEvents(com_ptr<implementation::CommandViewModel>& cmdVM);
|
void _RegisterCmdVMEvents(com_ptr<implementation::CommandViewModel>& cmdVM);
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ namespace Microsoft.Terminal.Settings.Editor
|
|||||||
// View-model specific
|
// View-model specific
|
||||||
String DisplayName { get; };
|
String DisplayName { get; };
|
||||||
String FirstKeyChordText { get; };
|
String FirstKeyChordText { get; };
|
||||||
String AdditionalKeyChordCountText { get; };
|
|
||||||
String AdditionalKeyChordTooltipText { get; };
|
|
||||||
String DisplayNameAndKeyChordAutomationPropName { get; };
|
String DisplayNameAndKeyChordAutomationPropName { get; };
|
||||||
|
|
||||||
// UI side (command list page)
|
// UI side (command list page)
|
||||||
@@ -166,7 +164,6 @@ namespace Microsoft.Terminal.Settings.Editor
|
|||||||
void UpdateSettings(Microsoft.Terminal.Settings.Model.CascadiaSettings settings);
|
void UpdateSettings(Microsoft.Terminal.Settings.Model.CascadiaSettings settings);
|
||||||
|
|
||||||
void AddNewCommand();
|
void AddNewCommand();
|
||||||
void ReSortCommandList();
|
|
||||||
|
|
||||||
ActionsSubPage CurrentPage;
|
ActionsSubPage CurrentPage;
|
||||||
Boolean DisplayBadge { get; };
|
Boolean DisplayBadge { get; };
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
{
|
{
|
||||||
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
||||||
_State = args.ViewModel().as<Editor::AddProfilePageNavigationState>();
|
_State = args.ViewModel().as<Editor::AddProfilePageNavigationState>();
|
||||||
BringIntoViewWhenLoaded(args.ElementToFocus());
|
|
||||||
|
|
||||||
TraceLoggingWrite(
|
TraceLoggingWrite(
|
||||||
g_hTerminalSettingsEditorProvider,
|
g_hTerminalSettingsEditorProvider,
|
||||||
|
|||||||
@@ -37,8 +37,7 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</Border>
|
</Border>
|
||||||
<StackPanel Margin="{StaticResource StandardControlMargin}">
|
<StackPanel Margin="{StaticResource StandardControlMargin}">
|
||||||
<local:SettingContainer x:Name="DuplicateProfile"
|
<local:SettingContainer x:Uid="AddProfile_Duplicate">
|
||||||
x:Uid="AddProfile_Duplicate">
|
|
||||||
<ComboBox x:Name="Profiles"
|
<ComboBox x:Name="Profiles"
|
||||||
AutomationProperties.AccessibilityView="Content"
|
AutomationProperties.AccessibilityView="Content"
|
||||||
ItemsSource="{x:Bind State.Settings.AllProfiles, Mode=OneWay}"
|
ItemsSource="{x:Bind State.Settings.AllProfiles, Mode=OneWay}"
|
||||||
|
|||||||
@@ -1138,27 +1138,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
INITIALIZE_BINDABLE_ENUM_SETTING(IntenseTextStyle, IntenseTextStyle, winrt::Microsoft::Terminal::Settings::Model::IntenseStyle, L"Appearance_IntenseTextStyle", L"Content");
|
INITIALIZE_BINDABLE_ENUM_SETTING(IntenseTextStyle, IntenseTextStyle, winrt::Microsoft::Terminal::Settings::Model::IntenseStyle, L"Appearance_IntenseTextStyle", L"Content");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Appearances doesn't implement HasScrollViewer<T> which normally adds this function.
|
|
||||||
void Appearances::BringIntoViewWhenLoaded(hstring elementToFocus)
|
|
||||||
{
|
|
||||||
if (elementToFocus.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_loadedRevoker = this->Loaded(winrt::auto_revoke, [weakThis{ get_weak() }, elementToFocus](auto&&, auto&&) {
|
|
||||||
if (const auto strongThis = weakThis.get())
|
|
||||||
{
|
|
||||||
if (const auto& controlToFocus{ strongThis->FindName(elementToFocus).try_as<Controls::Control>() })
|
|
||||||
{
|
|
||||||
controlToFocus.as<FrameworkElement>().StartBringIntoView();
|
|
||||||
controlToFocus.Focus(FocusState::Programmatic);
|
|
||||||
}
|
|
||||||
strongThis->_loadedRevoker.revoke();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
IObservableVector<Editor::Font> Appearances::FilteredFontList()
|
IObservableVector<Editor::Font> Appearances::FilteredFontList()
|
||||||
{
|
{
|
||||||
if (!_filteredFonts)
|
if (!_filteredFonts)
|
||||||
|
|||||||
@@ -188,7 +188,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
struct Appearances : AppearancesT<Appearances>
|
struct Appearances : AppearancesT<Appearances>
|
||||||
{
|
{
|
||||||
Appearances();
|
Appearances();
|
||||||
void BringIntoViewWhenLoaded(hstring elementToFocus);
|
|
||||||
|
|
||||||
// CursorShape visibility logic
|
// CursorShape visibility logic
|
||||||
bool IsVintageCursor() const;
|
bool IsVintageCursor() const;
|
||||||
@@ -214,7 +213,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
bool IsCustomFontWeight();
|
bool IsCustomFontWeight();
|
||||||
|
|
||||||
til::property_changed_event PropertyChanged;
|
til::property_changed_event PropertyChanged;
|
||||||
winrt::Windows::UI::Xaml::FrameworkElement::Loaded_revoker _loadedRevoker;
|
|
||||||
|
|
||||||
WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector<Microsoft::Terminal::Settings::Editor::EnumEntry>, FontWeightList);
|
WINRT_PROPERTY(Windows::Foundation::Collections::IObservableVector<Microsoft::Terminal::Settings::Editor::EnumEntry>, FontWeightList);
|
||||||
|
|
||||||
|
|||||||
@@ -75,8 +75,7 @@
|
|||||||
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
||||||
<!-- Color Scheme -->
|
<!-- Color Scheme -->
|
||||||
<!-- This currently only display the Dark color scheme, even if the user has a pair of schemes set. -->
|
<!-- This currently only display the Dark color scheme, even if the user has a pair of schemes set. -->
|
||||||
<local:SettingContainer x:Name="ColorScheme"
|
<local:SettingContainer x:Uid="Profile_ColorScheme"
|
||||||
x:Uid="Profile_ColorScheme"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearColorScheme}"
|
ClearSettingValue="{x:Bind Appearance.ClearColorScheme}"
|
||||||
CurrentValueAccessibleName="{x:Bind Appearance.CurrentColorScheme.Name, Mode=OneWay}"
|
CurrentValueAccessibleName="{x:Bind Appearance.CurrentColorScheme.Name, Mode=OneWay}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasDarkColorSchemeName, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasDarkColorSchemeName, Mode=OneWay}"
|
||||||
@@ -285,20 +284,17 @@
|
|||||||
IsChecked="{x:Bind ShowAllFonts, Mode=TwoWay}" />
|
IsChecked="{x:Bind ShowAllFonts, Mode=TwoWay}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
<local:SettingContainer x:Name="MissingFontFaces"
|
<local:SettingContainer x:Uid="Profile_MissingFontFaces"
|
||||||
x:Uid="Profile_MissingFontFaces"
|
|
||||||
HelpText="{x:Bind Appearance.MissingFontFaces, Mode=OneWay}"
|
HelpText="{x:Bind Appearance.MissingFontFaces, Mode=OneWay}"
|
||||||
Style="{StaticResource SettingContainerErrorStyle}"
|
Style="{StaticResource SettingContainerErrorStyle}"
|
||||||
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(Appearance.MissingFontFaces), Mode=OneWay}" />
|
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(Appearance.MissingFontFaces), Mode=OneWay}" />
|
||||||
<local:SettingContainer x:Name="ProportionalFontFaces"
|
<local:SettingContainer x:Uid="Profile_ProportionalFontFaces"
|
||||||
x:Uid="Profile_ProportionalFontFaces"
|
|
||||||
HelpText="{x:Bind Appearance.ProportionalFontFaces, Mode=OneWay}"
|
HelpText="{x:Bind Appearance.ProportionalFontFaces, Mode=OneWay}"
|
||||||
Style="{StaticResource SettingContainerWarningStyle}"
|
Style="{StaticResource SettingContainerWarningStyle}"
|
||||||
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(Appearance.ProportionalFontFaces), Mode=OneWay}" />
|
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(Appearance.ProportionalFontFaces), Mode=OneWay}" />
|
||||||
|
|
||||||
<!-- Font Size -->
|
<!-- Font Size -->
|
||||||
<local:SettingContainer x:Name="FontSize"
|
<local:SettingContainer x:Uid="Profile_FontSize"
|
||||||
x:Uid="Profile_FontSize"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearFontSize}"
|
ClearSettingValue="{x:Bind Appearance.ClearFontSize}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasFontSize, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasFontSize, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.FontSizeOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.FontSizeOverrideSource, Mode=OneWay}"
|
||||||
@@ -314,8 +310,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Line Height -->
|
<!-- Line Height -->
|
||||||
<local:SettingContainer x:Name="LineHeight"
|
<local:SettingContainer x:Uid="Profile_LineHeight"
|
||||||
x:Uid="Profile_LineHeight"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearLineHeight}"
|
ClearSettingValue="{x:Bind Appearance.ClearLineHeight}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasLineHeight, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasLineHeight, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.LineHeightOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.LineHeightOverrideSource, Mode=OneWay}"
|
||||||
@@ -331,8 +326,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Cell Width -->
|
<!-- Cell Width -->
|
||||||
<local:SettingContainer x:Name="CellWidth"
|
<local:SettingContainer x:Uid="Profile_CellWidth"
|
||||||
x:Uid="Profile_CellWidth"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearCellWidth}"
|
ClearSettingValue="{x:Bind Appearance.ClearCellWidth}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasCellWidth, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasCellWidth, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.CellWidthOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.CellWidthOverrideSource, Mode=OneWay}"
|
||||||
@@ -348,8 +342,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Font Weight -->
|
<!-- Font Weight -->
|
||||||
<local:SettingContainer x:Name="FontWeight"
|
<local:SettingContainer x:Uid="Profile_FontWeight"
|
||||||
x:Uid="Profile_FontWeight"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearFontWeight}"
|
ClearSettingValue="{x:Bind Appearance.ClearFontWeight}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasFontWeight, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasFontWeight, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.FontWeightOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.FontWeightOverrideSource, Mode=OneWay}"
|
||||||
@@ -385,8 +378,7 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
<local:SettingContainer x:Name="FontAxes"
|
<local:SettingContainer x:Uid="Profile_FontAxes"
|
||||||
x:Uid="Profile_FontAxes"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearFontAxes}"
|
ClearSettingValue="{x:Bind Appearance.ClearFontAxes}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasFontAxes, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasFontAxes, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.FontAxesOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.FontAxesOverrideSource, Mode=OneWay}"
|
||||||
@@ -413,8 +405,7 @@
|
|||||||
</muxc:DropDownButton>
|
</muxc:DropDownButton>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
<local:SettingContainer x:Name="FontFeatures"
|
<local:SettingContainer x:Uid="Profile_FontFeatures"
|
||||||
x:Uid="Profile_FontFeatures"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearFontFeatures}"
|
ClearSettingValue="{x:Bind Appearance.ClearFontFeatures}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasFontFeatures, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasFontFeatures, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.FontFeaturesOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.FontFeaturesOverrideSource, Mode=OneWay}"
|
||||||
@@ -443,8 +434,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Builtin Glyphs -->
|
<!-- Builtin Glyphs -->
|
||||||
<local:SettingContainer x:Name="EnableBuiltinGlyphs"
|
<local:SettingContainer x:Uid="Profile_EnableBuiltinGlyphs"
|
||||||
x:Uid="Profile_EnableBuiltinGlyphs"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearEnableBuiltinGlyphs}"
|
ClearSettingValue="{x:Bind Appearance.ClearEnableBuiltinGlyphs}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasEnableBuiltinGlyphs, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasEnableBuiltinGlyphs, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.EnableBuiltinGlyphsOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.EnableBuiltinGlyphsOverrideSource, Mode=OneWay}">
|
||||||
@@ -453,8 +443,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Color Glyphs -->
|
<!-- Color Glyphs -->
|
||||||
<local:SettingContainer x:Name="EnableColorGlyphs"
|
<local:SettingContainer x:Uid="Profile_EnableColorGlyphs"
|
||||||
x:Uid="Profile_EnableColorGlyphs"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearEnableColorGlyphs}"
|
ClearSettingValue="{x:Bind Appearance.ClearEnableColorGlyphs}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasEnableColorGlyphs, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasEnableColorGlyphs, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.EnableColorGlyphsOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.EnableColorGlyphsOverrideSource, Mode=OneWay}">
|
||||||
@@ -463,8 +452,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Retro Terminal Effect -->
|
<!-- Retro Terminal Effect -->
|
||||||
<local:SettingContainer x:Name="RetroTerminalEffect"
|
<local:SettingContainer x:Uid="Profile_RetroTerminalEffect"
|
||||||
x:Uid="Profile_RetroTerminalEffect"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearRetroTerminalEffect}"
|
ClearSettingValue="{x:Bind Appearance.ClearRetroTerminalEffect}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasRetroTerminalEffect, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasRetroTerminalEffect, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.RetroTerminalEffectOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.RetroTerminalEffectOverrideSource, Mode=OneWay}">
|
||||||
@@ -473,8 +461,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Adjust Indistinguishable Colors -->
|
<!-- Adjust Indistinguishable Colors -->
|
||||||
<local:SettingContainer x:Name="AdjustIndistinguishableColors"
|
<local:SettingContainer x:Uid="Profile_AdjustIndistinguishableColors"
|
||||||
x:Uid="Profile_AdjustIndistinguishableColors"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearAdjustIndistinguishableColors}"
|
ClearSettingValue="{x:Bind Appearance.ClearAdjustIndistinguishableColors}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasAdjustIndistinguishableColors, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasAdjustIndistinguishableColors, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.AdjustIndistinguishableColorsOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.AdjustIndistinguishableColorsOverrideSource, Mode=OneWay}">
|
||||||
@@ -492,8 +479,7 @@
|
|||||||
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
||||||
|
|
||||||
<!-- Cursor Shape -->
|
<!-- Cursor Shape -->
|
||||||
<local:SettingContainer x:Name="CursorShape"
|
<local:SettingContainer x:Uid="Profile_CursorShape"
|
||||||
x:Uid="Profile_CursorShape"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearCursorShape}"
|
ClearSettingValue="{x:Bind Appearance.ClearCursorShape}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasCursorShape, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasCursorShape, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.CursorShapeOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.CursorShapeOverrideSource, Mode=OneWay}">
|
||||||
@@ -505,8 +491,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Cursor Height -->
|
<!-- Cursor Height -->
|
||||||
<local:SettingContainer x:Name="CursorHeight"
|
<local:SettingContainer x:Uid="Profile_CursorHeight"
|
||||||
x:Uid="Profile_CursorHeight"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearCursorHeight}"
|
ClearSettingValue="{x:Bind Appearance.ClearCursorHeight}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasCursorHeight, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasCursorHeight, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.CursorHeightOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.CursorHeightOverrideSource, Mode=OneWay}"
|
||||||
@@ -578,8 +563,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Background Image Stretch Mode -->
|
<!-- Background Image Stretch Mode -->
|
||||||
<local:SettingContainer x:Name="BackgroundImageStretchMode"
|
<local:SettingContainer x:Uid="Profile_BackgroundImageStretchMode"
|
||||||
x:Uid="Profile_BackgroundImageStretchMode"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageStretchMode}"
|
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageStretchMode}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasBackgroundImageStretchMode, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasBackgroundImageStretchMode, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.BackgroundImageStretchModeOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.BackgroundImageStretchModeOverrideSource, Mode=OneWay}"
|
||||||
@@ -592,8 +576,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Background Image Alignment -->
|
<!-- Background Image Alignment -->
|
||||||
<local:SettingContainer x:Name="BackgroundImageAlignment"
|
<local:SettingContainer x:Uid="Profile_BackgroundImageAlignment"
|
||||||
x:Uid="Profile_BackgroundImageAlignment"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageAlignment}"
|
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageAlignment}"
|
||||||
CurrentValue="{x:Bind Appearance.BackgroundImageAlignmentCurrentValue, Mode=OneWay}"
|
CurrentValue="{x:Bind Appearance.BackgroundImageAlignmentCurrentValue, Mode=OneWay}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasBackgroundImageAlignment, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasBackgroundImageAlignment, Mode=OneWay}"
|
||||||
@@ -781,8 +764,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Background Image Opacity -->
|
<!-- Background Image Opacity -->
|
||||||
<local:SettingContainer x:Name="BackgroundImageOpacity"
|
<local:SettingContainer x:Uid="Profile_BackgroundImageOpacity"
|
||||||
x:Uid="Profile_BackgroundImageOpacity"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageOpacity}"
|
ClearSettingValue="{x:Bind Appearance.ClearBackgroundImageOpacity}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasBackgroundImageOpacity, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasBackgroundImageOpacity, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.BackgroundImageOpacityOverrideSource, Mode=OneWay}"
|
SettingOverrideSource="{x:Bind Appearance.BackgroundImageOpacityOverrideSource, Mode=OneWay}"
|
||||||
@@ -808,8 +790,7 @@
|
|||||||
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
Style="{StaticResource TextBlockSubHeaderStyle}" />
|
||||||
|
|
||||||
<!-- Intense is bold, bright -->
|
<!-- Intense is bold, bright -->
|
||||||
<local:SettingContainer x:Name="IntenseTextStyle"
|
<local:SettingContainer x:Uid="Appearance_IntenseTextStyle"
|
||||||
x:Uid="Appearance_IntenseTextStyle"
|
|
||||||
ClearSettingValue="{x:Bind Appearance.ClearIntenseTextStyle}"
|
ClearSettingValue="{x:Bind Appearance.ClearIntenseTextStyle}"
|
||||||
HasSettingValue="{x:Bind Appearance.HasIntenseTextStyle, Mode=OneWay}"
|
HasSettingValue="{x:Bind Appearance.HasIntenseTextStyle, Mode=OneWay}"
|
||||||
SettingOverrideSource="{x:Bind Appearance.IntenseTextStyleOverrideSource, Mode=OneWay}">
|
SettingOverrideSource="{x:Bind Appearance.IntenseTextStyleOverrideSource, Mode=OneWay}">
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
const auto args = e.Parameter().as<Editor::NavigateToPageArgs>();
|
||||||
_ViewModel = args.ViewModel().as<Editor::ColorSchemesPageViewModel>();
|
_ViewModel = args.ViewModel().as<Editor::ColorSchemesPageViewModel>();
|
||||||
_ViewModel.CurrentPage(ColorSchemesSubPage::Base);
|
_ViewModel.CurrentPage(ColorSchemesSubPage::Base);
|
||||||
BringIntoViewWhenLoaded(args.ElementToFocus());
|
|
||||||
|
|
||||||
_layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {
|
_layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {
|
||||||
// Only let this succeed once.
|
// Only let this succeed once.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user