Compare commits

...

21 Commits

Author SHA1 Message Date
Dustin L. Howett
2bc9e7540a tidy up the powershell module a little bit; perhaps add some of my helpers 2026-03-17 13:46:36 -05:00
Carlos Zamora
14ee19fc27 Fix selection markers disappearing after scrolling out of view (#19974)
## Summary of the Pull Request
Pretty straightforward

## Validation Steps Performed
 Selection markers are present after scrolling them out of view and
scrolling back

Closes #17135
2026-03-16 17:21:39 -05:00
Dustin L. Howett
987fce20a1 OS-15022958: conhost: onboard our RI-TPs for other internal Windows editions (#19975)
This required the following changes:
- Delayloading ICU in all of our tests, and skipping tests where it
could not be loaded
- Adding a new test group which skips the PolicyTests, which cannot be
run on some editions which have no app platform.

In addition, instead of onboarding new failing test passes, this pull
request finally repairs the broken ConPTY tests (which diverged from the
OSS implementation and had to be re-en-verged)

Closes MSFT-61409507
Reflected from OS PR !15022958
2026-03-14 11:33:04 -05:00
Carlos Zamora
040c730a44 Simplify word expansion functions (#19882)
## Summary of the Pull Request
Simplifies the word expansion functions in TextBuffer by removing the
following functions:
- `GetWordStart2()`
- `GetWordEnd2()`
- `MoveToNextWord()`
- `MoveToPreviousWord()`
-  `_GetWordStartForAccessibility()`
-  `_GetWordStartForSelection()`
- `_GetWordEndForAccessibility()`
- `_GetWordEndForSelection()`

In favor of a simple:
- `GetWordStart()`
- `GetWordEnd()`
- _GetDelimiterClassRunStart()`
- `_GetDelimiterClassRunEnd()`

Tests were used to help ensure a regression doesn't occur. That said,
there were a few modifications there too:
- Removed `MoveByWord` test
- It directly called `MoveToNextWord()` and `MoveToPreviousWord()`,
which no longer exist. These were helper functions for
`UiaTextRangeBase`, and any special logic has been moved into
`_moveEndpointByUnitWord` using the unified
`GetWordStart()`/`GetWordEnd()` APIs.
- The tested behavior is still covered by `MoveToPreviousWord`,
`MovementAtExclusiveEnd`, and the generated word movement tests.
- updated `GetWordBoundaries` tests
- Inclusive --> exclusive end positions for `GetWordEnd()`: The old
`_GetWordEndForSelection()` returned inclusive end positions, whereas
the new `GetWordEnd()` returns exclusive end positions. This is what
`GetWordEnd2()` already used, so every old expected value shifted +1 in
the x direction (or to {RightExclusive, y} at row boundaries) to account
for that.
- `ControlChar` wrap-crossing behavior: The old
`_GetWordStartForSelection()` had a special check at the left boundary
that prevented whitespace runs from crossing wrapped row boundaries. The
new `_GetDelimiterClassRunStart()` doesn't have this special case (it
treats ControlChar the same as other delimiter classes when the row was
wrap-forced). This changed one test case: `GetWordStart({1, 4})` in
selection mode went from `{0, 4}` to `{6, 3}` (the whitespace run now
crosses the wrap boundary to row 3). This matches the behavior
TerminalSelection was already getting from `GetWordStart2()`.

## Validation Steps Performed
Tests passed:
 Conhost.Interactivity.Win32.Unit.Tests.dll
 UnitTests_TerminalCore\Terminal.Core.Unit.Tests.dll

Word navigation feels good for...
 Narrator
 NVDA
 Mouse selection
 Mark mode

Closes #4423
2026-03-13 21:18:04 +00:00
Dustin L. Howett
6d7fac999a Suppress the invalid media error in Stable (#19969)
It's creating a lot of noise for folks, and it is not particularly
_helpful_ since it does not specify a location or even name which
resource failed to load or parse.

On stable, let's just silently ignore them.

Refs #19964
2026-03-12 17:07:18 -05:00
Dustin L. Howett
e6ea8ace6d conhost: Unlock the console while tearing down during coniosrv focus evt (#19967)
With the rendering thread changes in #18632 and #19330, we strengthened
a requirement that render shutdown be done outside of the console lock.
This works on all platforms except OneCore, where ConIoSrv manages the
focus of multiple console windows and we need to explicitly order the
handling of tearing down and relinquishing device resources.

The old code (before #18632) used to wait for a whole second before
giving up.

Instead, let's just unlock the console to let the final frame drain out.

I created a synthetic repro: start two cmd sessions with a lot of
rendering load (`cmdd start cmd /c dir /s c:\`), and then run `cmdd date
/t` in a tight loop while tabbing between the console windows.

Before this fix, it hangs within a couple tens of date invocations. With
this fix, it does not hang at all.

Fixes MSFT-61354695
2026-03-12 12:30:45 -05:00
Leonard Hecker
36fb444d3e Improve TSF failure handling (#19965)
An internal AI correctly flagged that we aren't calling
`UnadviseSink()` in case a later `Initialize()` call fails.
We can easily fix this by calling `Uninitialize()`.
2026-03-11 21:31:04 +01:00
Artem Lytkin
e2d51636cd control: focus terminal on click-drag while search is open (#19931)
## Summary
- Fix inability to copy terminal text via Ctrl+C when the search dialog
is open
- Root cause: click-and-drag doesn't call `Focus()` because `_focused`
is already `true` (set by the search box's bubbling GotFocus)
- Fix: also focus the terminal when the search box contains keyboard
focus

## Detailed Description of the Pull Request / Additional comments
When the search dialog is open and the user click-drags in the terminal
to select text, `_PointerPressedHandler` skips
`Focus(FocusState::Pointer)` because `_focused` is `true`. The
`_focused` flag is `true` because the `SearchBoxControl` is a child of
`TermControl` in the XAML visual tree, so `TermControl`'s
`_GotFocusHandler` fires (via bubbling `GotFocus`) when the search box's
`TextBox` gains focus, setting `_focused = true`.

The fix adds a `ContainsFocus()` check so that focus is explicitly moved
to the terminal when the search box has keyboard focus. This makes
click-drag behavior consistent with tap behavior (`_TappedHandler`
already focuses unconditionally) and uses the same `ContainsFocus()`
pattern already established at lines 1569 and 2366 in the same file.

## Validation Steps Performed
- Verified click-drag + Ctrl+C copies selected text when search dialog
is open
- Verified simple click (tap) in terminal while search is open still
works
- Verified clicking in the search box retains focus in the search box
- Verified typing in search box still works when it has focus
- Verified Escape still closes the search box
- Verified Ctrl+C with no selection while search is open doesn't break
- Code formatted with clang-format

## PR Checklist
 Closes #19908
2026-03-11 18:03:21 +00:00
Dustin L. Howett
80e4b3c947 Only honor Ctrl+Z during ReadFile if the console is in PROCESSED mode (#19940)
This restores the behavior of ReadFile to that of Windows 7.

Closes #4958
2026-03-11 11:52:33 -05:00
Carlos Zamora
e2110e716c Fix memory leaks with UIA (#19950)
## Summary of the Pull Request
This includes the memory leak fixes that @lhecker and I investigated as
a part of #19710.

The `ITextRangeProvider`s (namely `UiaTextRange`s) weren't being
destroyed after they were done being used by the screen reader.

## Validation Steps Performed
In my own testing, I set a breakpoint on the destructor for
`UiaTextRangeBase`. Prior to this change, that destructor would mainly
be called when the terminal control was closed, which would result in us
leaking these objects. With this change, I've confirmed that these text
ranges are being destroyed immediately after they are done being used
(without needing to close the terminal control).

## PR Checklist
Closes #19710
2026-03-11 02:08:32 +01:00
Dustin L. Howett
9e4986edb0 README: remove the outdated roadmap link (#19932)
Historical roadmaps remain available in the `doc` directory.
2026-03-10 16:24:13 -07:00
Leonard Hecker
30b1456ffe Make TSF initialization fully fallible (#19958)
Apparently, on some (internal) variants of Windows `TF_CategoryMgr`
can exist while `TF_DisplayAttributeMgr` is absent. This is likely
a variant configuration error, but we shouldn't crash anyway.

Closes MSFT-61309810
2026-03-10 21:31:54 +01:00
Leonard Hecker
5bd9e9fd89 Always use the cls shim for cmd/pwsh (#19957)
This improves performance and avoids a memory spike on `cls`.

## Validation Steps Performed
* `cls` clears 
* RSS doesn't spike 
2026-03-10 21:31:44 +01:00
sagarbhure-dev
8cad67020f Fix GenerateSettingsIndex using element name instead of x:Name (#19945)
Use GetAttribute('x:Name') instead of .Name in GenerateSettingsIndex.ps1
to avoid PowerShell's XML integration returning the element tag name
(e.g. 'local:SettingContainer') when x:Name is absent.

Also add missing x:Name attributes to:
- Compatibility.xaml: AmbiguousWidth SettingContainer
- NewTabMenu.xaml: AddRemainingProfiles and CurrentFolderIcon containers

## Summary of the Pull Request
Fix GenerateSettingsIndex.ps1 emitting "local:SettingContainer" as the
element name in the generated index when a SettingContainer has no
x:Name attribute.

## References and Relevant Issues
Per DHowett's comment - the root cause is PowerShell's XML integration:
$element.Name returns the XML element tag name (e.g.
local:SettingContainer) when no x:Name attribute exists.

## Detailed Description of the Pull Request / Additional comments
Two changes:

- GenerateSettingsIndex.ps1: Replace $settingContainer.Name with
$settingContainer.GetAttribute("x:Name"), which correctly returns an
empty string when the attribute is absent instead of the element tag
name.

- Add missing x:Name attributes to three SettingContainer elements:
    - Compatibility.xaml: AmbiguousWidth (Globals_AmbiguousWidth)
- NewTabMenu.xaml: AddRemainingProfiles
(NewTabMenu_AddRemainingProfiles)
    - NewTabMenu.xaml: CurrentFolderIcon (NewTabMenu_CurrentFolderIcon)
- This fixes four incorrect IndexEntry lines in the generated output
that previously contained L"local:SettingContainer" as the element name.

## Validation Steps Performed
Ran GenerateSettingsIndex.ps1 before and after - confirmed the four
incorrect entries with L"local:SettingContainer" are now generated with
the correct x:Name values (or empty string where appropriate).

## PR Checklist
Closes #19929

Co-authored-by: Sagar Bhure <sagarbhure@microsoft.com>
2026-03-10 17:03:15 +00:00
Dustin L. Howett
5828fb5ce5 vpack: actually, we have to use a 3-segment version number (#19939)
Our last build failed because it tried to pass "10621.0" off as a
uint64. I didn't know it had to be a single number... so let's use the
3-component equivalent (which would have been 1.24.260303001)
2026-03-05 16:44:39 -06:00
Ivan Pešić
55f96bc10d Inital translation of pdp to Serbian Cyrillic (sr-Cyrl-RS) (#19930) 2026-03-03 13:33:40 -06:00
Windows Console Service Bot
77bae1ff7a PDP Localization Updates - 03/03/2026 03:04:44 (#19928)
Co-authored-by: Console Service Bot <consvc@microsoft.com>
2026-03-03 13:31:39 -06:00
Dustin L. Howett
0f6ee4ad2e build: make sure the AnyCPU build sets BuildPlatform properly (#19925)
This caused the WPF-only build (packaging phase, really) to fail.

Fixes d6714f3ca9 (#19328)
2026-03-02 20:32:35 +00:00
Windows Console Service Bot
59c7e3b73c Localization Updates - main - 03/02/2026 (#19914)
Co-authored-by: Console Service Bot <consvc@microsoft.com>
2026-03-02 12:14:43 -06:00
Dustin L. Howett
26bcbf3656 pdp: cycle the preview release notes to stable (#19916)
This also moves the Ukrainian Preview release notes to Stable (which
wouldn't happen automatically) and updates them thanks to Serhii.

Co-authored-by: Serhii Pustovit <light.feel@gmail.com>
2026-03-02 12:01:07 -06:00
Dustin L. Howett
83d0d9df14 version: bump to 1.26 on main (#19915)
Signed-off-by: Dustin L. Howett <dustin@howett.net>
2026-02-27 17:52:43 -06:00
90 changed files with 1178 additions and 752 deletions

View File

@@ -572,6 +572,7 @@ FGHIJ
fgidx fgidx
FGs FGs
FILEDESCRIPTION FILEDESCRIPTION
filehops
FILESUBTYPE FILESUBTYPE
FILESYSPATH FILESYSPATH
FILEW FILEW
@@ -1772,6 +1773,7 @@ uldash
uldb uldb
ULONGLONG ULONGLONG
ulwave ulwave
Unaccess
Unadvise Unadvise
unattend unattend
UNCPRIORITY UNCPRIORITY

View File

@@ -15,7 +15,6 @@
- [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)
@@ -178,11 +177,6 @@ _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

View File

@@ -56,9 +56,10 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme der Com
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
Eine komplett neue Erweiterungsseite, die anzeigt, was in Ihrem Terminal installiert ist Endlich die Möglichkeit, nach beliebigen Einstellungen zu suchen!
Die Befehlspalette wird jetzt sowohl in Ihrer Muttersprache als auch auf Englisch angezeigt Ein neuer nativer Editor für Tastenkombinationen, Aktionen und Einträge in der Befehlspalette.
Neue VT-Features wie synchronisiertes Rendering, neue Farbschemas, Konfiguration für schnelle Mausaktionen wie Zoomen und mehr Neue Community-Übersetzungen für Serbisch und Ukrainisch
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>

View File

@@ -54,11 +54,12 @@ 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} App Release Note" -->Version __VERSION_NUMBER__ <!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe}{Locked=Kitty} App Release Note" -->Version __VERSION_NUMBER__
- A whole new Extensions page that shows what has been installed into your Terminal - Finally, the ability to search for any setting!
- Command Palette now shows up in your native language as well as English - A new native editor for key bindings, actions and command palette entries.
- New VT features such as synchronized rendering, new color schemes, configuration for quick mouse actions like zooming, and more - New community localizations to Serbian and Ukrainian
- 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>

View File

@@ -54,11 +54,12 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
</DevStudio> </DevStudio>
<ReleaseNotes> <ReleaseNotes>
Versión __VERSION_NUMBER__ Version __VERSION_NUMBER__
- Página Extensiones completamente nueva que muestra lo que se ha instalado en tu terminal - Por último, la capacidad de buscar cualquier configuración.
- La paleta de comandos ahora se muestra en tu idioma nativo, así como en inglés - Nuevo editor nativo para asignaciones de teclas, acciones y entradas de la paleta de comandos.
- 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 - Nuevas localizaciones comunitarias para serbio y ucraniano
- 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>

View File

@@ -56,11 +56,12 @@ Il sagit dun projet open source et nous vous invitons à participer dans l
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- Une toute nouvelle page Extensions qui montre ce qui a été installé dans votre terminal - Enfin, la possibilité de rechercher nimporte quel paramètre !
- La palette de commandes saffiche désormais dans votre langue native, ainsi quen anglais - Un nouvel éditeur natif pour les raccourcis clavier, les actions et les entrées de la palette de commandes.
- 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 - De nouvelles localisations communautaires en serbe et en ukrainien
- Une prise en charge du protocole clavier « Kitty » pour un encodage dentrée à haute fidélité
Veuillez consulter notre page des versions GitHub pour découvrir dautres détails. Consultez notre page des versions de GitHub pour plus de 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 -->

View File

@@ -54,11 +54,12 @@ Si tratta di un progetto open source e la partecipazione della community è molt
</DevStudio> </DevStudio>
<ReleaseNotes> <ReleaseNotes>
Versione __VERSION_NUMBER__ Versione __VERSION_NUMBER__
- Una pagina Estensioni completamente nuova che mostra ciò che è stato installato nel terminale - Finalmente è possibile cercare qualsiasi impostazione
- Il riquadro comandi ora viene visualizzato nella tua lingua di origine oltre che in inglese - Nuovo editor nativo per le associazioni di tasti, le azioni e le voci del riquadro comandi.
- 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 - Nuove localizzazioni della community in serbo e ucraino
- 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>

View File

@@ -56,9 +56,10 @@
<ReleaseNotes> <ReleaseNotes>
バージョン __VERSION_NUMBER__ バージョン __VERSION_NUMBER__
- ターミナルに何がインストールされているかを表示する新しい [拡張機能] ページ - 最後に、任意の設定を検索する機能です。
- コマンド パレットがネイティブ言語と英語で表示されるようになりました - キー バインド、アクション、コマンド パレット エントリ用の新しいネイティブ エディター。
- 同期レンダリング、新しい配色、ズームなどのクイック マウス操作の構成などの、新しい VT 機能 - セルビア語とウクライナ語への新しいコミュニティ ローカライズ
- 高忠実度入力エンコード用の "Kitty" キーボード プロトコルのサポート
詳細については、GitHub リリース ページをご覧ください。 詳細については、GitHub リリース ページをご覧ください。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -56,11 +56,12 @@
<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 -->

View File

@@ -56,9 +56,10 @@ 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 - Finalmente, a possibilidade de pesquisar qualquer configuração!
A Paleta de Comandos agora aparece no seu idioma nativo, além do inglês - Um novo editor nativo para combinações de teclas, ações e entradas na paleta de comandos.
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 - Novas localizações da comunidade para sérvio e ucraniano
- 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>

View File

@@ -56,11 +56,12 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!! - ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!! - Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
- Ѕυррòŗт ƒòŗ ťĥё "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 -->

View File

@@ -56,11 +56,12 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!! - ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!! - Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
- Ѕυррòŗт ƒòŗ ťĥё "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 -->

View File

@@ -56,11 +56,12 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!! - ₣ïňάĺĺў, ŧне âъΐŀίťŷ ţø şēаґсђ ƒбг ăиÿ şēťτіήġ! !!! !!! !!! !!! !!!
- €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!! - Á ŋеώ ñăŧїνе ěðíτōг ƒοѓ ќэÿ вїñďĭňğş, дčтιθήѕ дñð çθmmãήδ ρàľěţťę ёñтгĩέś. !!! !!! !!! !!! !!! !!! !!! !
- ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ möűšë ąćŧϊόņŝ ľîķє žøōmίйğ, ǻⁿđ мόřε !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Пėώ čоmmμñìтў ŀό¢àłįżåţίòйš ŧō Šэґъιäñ åηδ Ůκŗăįлīăπ !!! !!! !!! !!! !!! !
- Ѕυррòŗт ƒòŗ ťĥё "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 -->

View File

@@ -56,9 +56,10 @@
<ReleaseNotes> <ReleaseNotes>
Версия __VERSION_NUMBER__ Версия __VERSION_NUMBER__
Новая страница расширений, на которой отображается информация о том, что было установлено в вашем терминале Наконец-то появилась возможность поиска любых параметров!
Палитра команд теперь доступна на вашем языке, а также на английском Новый собственный редактор для настраиваемых сочетаний клавиш, действий и записей палитры команд.
Новые функции VT, например синхронизированная отрисовка, новые цветовые схемы, настройка быстрых действий мыши, таких как масштабирование, и т. д. Новые локализации сообщества на сербский и украинский языки
Поддержка протокола клавиатуры Kitty для высокоточного кодирования ввода
Дополнительные сведения см. на странице выпусков GitHub. Дополнительные сведения см. на странице выпусков GitHub.
</ReleaseNotes> </ReleaseNotes>

View File

@@ -0,0 +1,182 @@
<?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>

View File

@@ -56,9 +56,10 @@
<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>

View File

@@ -56,9 +56,10 @@
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- 一个全新的“扩展”页,显示已安装到终端的内容 - 终于可以搜索任何设置了!
- 命令面板现在以你的母语和英语显示 - 新增用于键绑定、操作和命令面板条目的原生编辑器。
- 新的 VT 功能,例如同步渲染、新配色方案、快速鼠标操作(如缩放)的配置等 - 新增塞尔维亚语和乌克兰语社区本地化支持
- 支持 "Kitty" 键盘协议,实现高保真输入编码
有关其他详细信息,请参阅我们的 GitHub 发布页面。 有关其他详细信息,请参阅我们的 GitHub 发布页面。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -56,9 +56,10 @@
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- 全新的延伸模組頁面會顯示已安裝在您終端機中的內容 - 終於,提供可搜尋任何設定的功能!
- 命令選擇區現在以您的母語和英文顯示 - 全新原生編輯器,支援按鍵繫結、動作及命令選擇區項目。
- 新的 VT 功能,例如同步轉譯、新的色彩配置、快速滑鼠動作 (例如縮放) 設定等等 - 新增社群本地語系化,包含塞爾維亞語與烏克蘭語
- 支援高保真度輸入編碼的「Kitty」鍵盤通訊協定
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。 如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -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__
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“! Eine komplett neue Erweiterungsseite, die anzeigt, was in Ihrem Terminal installiert ist
Wir haben die Fensterverwaltung umgestaltet, um die Zuverlässigkeit zu verbessern. Melden Sie alle Fehler, die beim alias „wt.exe“ auftreten Die Befehlspalette wird jetzt sowohl in Ihrer Muttersprache als auch auf Englisch angezeigt
Profile zeigen jetzt ein Symbol an, wenn sie ausgeblendet wurden oder auf Programme verweisen, die deinstalliert wurden. Neue VT-Features wie synchronisiertes Rendering, neue Farbschemas, Konfiguration für schnelle Mausaktionen wie Zoomen und mehr
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite. Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
</ReleaseNotes> </ReleaseNotes>

View File

@@ -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__
- 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! - A whole new Extensions page that shows what has been installed into your Terminal
- We have rearchitected window management to improve reliability; please file any bugs you encounter with the wt.exe alias - Command Palette now shows up in your native language as well as English
- Profiles now show an icon if they've been hidden or refer to programs which were uninstalled. - New VT features such as synchronized rendering, new color schemes, configuration for quick mouse actions like zooming, and more
Please see our GitHub releases page for additional details. Please see our GitHub releases page for additional details.
</ReleaseNotes> </ReleaseNotes>

View File

@@ -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__
- 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. - Página Extensiones completamente nueva que muestra lo que se ha instalado en tu terminal
- Hemos reestructurado la gestión de ventanas para mejorar la fiabilidad; informe de cualquier error que encuentre con el alias wt.exe - La paleta de comandos ahora se muestra en tu idioma nativo, así como en inglés
- Ahora, los perfiles muestran un icono si han sido ocultados o hacen referencia a programas que han sido desinstalados. - 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
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>

View File

@@ -56,11 +56,11 @@ Il sagit dun projet open source et nous encourageons la participation à l
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- Nous avons ajouté des dizaines de paramètres à linterface utilisateur qui nexistaient auparavant que dans le fichier JSON, y compris une nouvelle page pour personnaliser la disposition de votre menu Nouvel onglet. - Une toute nouvelle page Extensions qui affiche ce qui a été installé dans votre Terminal
- Nous avons fait une refonte de la gestion des fenêtres pour améliorer la fiabilité. Veuillez signaler les bogues que vous rencontrez avec lalias wt.exe. - La palette de commandes saffiche désormais dans votre langue native, ainsi quen anglais
- Les profils affichent désormais une icône sils ont été masqués ou sils font référence à des programmes qui ont été désinstallés. - 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
Veuillez consulter notre page des versions GitHub pour découvrir dautres détails. Consultez notre page des versions de GitHub pour plus de 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 -->

View File

@@ -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__
- 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. - Una pagina Estensioni completamente nuova che mostra ciò che è stato installato nel terminale
- Abbiamo riprogettato la gestione delle finestre per migliorarne l'affidabilità; segnala eventuali bug riscontrati con l'alias wt.exe - Il riquadro comandi ora viene visualizzato nella tua lingua di origine oltre che in inglese
- I profili ora mostrano un'icona se sono stati nascosti o se fanno riferimento a programmi disinstallati. - 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
Per altri dettagli, vedi la pagina delle release di GitHub. Per altri dettagli, vedi la pagina delle release di GitHub.
</ReleaseNotes> </ReleaseNotes>

View File

@@ -56,9 +56,9 @@
<ReleaseNotes> <ReleaseNotes>
バージョン __VERSION_NUMBER__ バージョン __VERSION_NUMBER__
- 新しいタブ メニューのレイアウトをカスタマイズするための新しいページなど、以前は JSON ファイルにしかなかった設定が UI に多数追加されました。 - お使いのターミナルに何がインストールされているかを表示する新しい [拡張機能] ページ
- 信頼性を向上させるために、ウィンドウ管理を再設計しました。wt.exe エイリアスで発生したバグを報告してください - コマンド パレットがネイティブ言語と英語で表示されるようになりました
- プロファイルが非表示になっている場合や、アンインストールされたプログラムを参照している場合に、アイコンが表示されるようになりました。 - 同期レンダリング、新しい配色、ズームなどのクイック マウス操作の構成などの、新しい VT 機能
詳細については、GitHub リリース ページをご覧ください。 詳細については、GitHub リリース ページをご覧ください。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -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 -->

View File

@@ -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__
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! Uma nova página de Extensões que mostra o que foi instalado no seu Terminal
Reestruturamos o gerenciamento de janelas para melhorar a confiabilidade; registre os bugs que você encontrar com o alias wt.exe A Paleta de Comandos agora aparece no seu idioma nativo, além do inglês
Os perfis agora exibem um ícone se estiverem ocultos ou se referirem a programas que foram desinstalados. 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
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>

View File

@@ -56,11 +56,11 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! ! - ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ 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 -->

View File

@@ -56,11 +56,11 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! ! - ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ 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 -->

View File

@@ -56,11 +56,11 @@
<ReleaseNotes> <ReleaseNotes>
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! ! Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - Ą ωћόĺé ņέш ∑×τзńşĩōиŝ ρâģε τђат šнòωş ωħąт нǻś ъеēñ įηšтǻľĺéδ ĭʼnтο ўбμŗ Ţзřmĭňāŀ !!! !!! !!! !!! !!! !!! !!! !!!
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! - €όммаήδ Рдĺēтţĕ пŏẅ şĥŏшś üρ ϊñ ỳоũѓ йαťïνє ļäŋģµаġέ άś ŵєŀľ åś Σиĝℓĭŝђ !!! !!! !!! !!! !!! !!! !!!
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! ! - ∏еẅ VΤ ƒэåŧύґέŝ şűçн ăŝ ѕỳňсĥŗǿйìźėð гēŋďзříⁿğ, ηĕш ćôĺõг şĉћěмєѕ, çóńƒіĝџŗáτїöπ ƒοг qũī¢ķ 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 -->

View File

@@ -56,9 +56,9 @@
<ReleaseNotes> <ReleaseNotes>
Версия __VERSION_NUMBER__ Версия __VERSION_NUMBER__
Мы добавили в пользовательский интерфейс десятки параметров, которые ранее существовали только в JSON-файле, включая новую страницу для настройки макета меню новой вкладки. Новая страница расширений, на которой отображается информация о том, что было установлено в вашем терминале
Мы переработали управление окнами для повышения надежности. Сообщайте о любых ошибках, которые вы обнаружите с псевдонимом wt.exe Палитра команд теперь доступна на вашем языке, а также на английском
Профили теперь отображают значок, если они были скрыты или ссылаются на программы, которые были удалены. Новые функции VT, например синхронизированная отрисовка, новые цветовые схемы, настройка быстрых действий мыши, таких как масштабирование, и т. д.
Дополнительные сведения см. на странице выпусков GitHub. Дополнительные сведения см. на странице выпусков GitHub.
</ReleaseNotes> </ReleaseNotes>

View File

@@ -0,0 +1,181 @@
<?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>

View File

@@ -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>

View File

@@ -56,9 +56,9 @@
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- 我们向用户界面添加了许多之前仅存在于 JSON 文件中的设置,包括用于自定义“新建标签页”菜单布局的新页面! - 一个全新的“扩展”页,显示已安装到终端的内容
- 我们已重新架构窗口管理以提高可靠性; 请使用 wt.exe 别名提交您遇到的任何错误 - 命令面板现在以你的母语和英语显示
- 配置文件如果已被隐藏或引用了已卸载的程序,现在会显示一个图标。 - 新的 VT 功能,例如同步渲染、新配色方案、快速鼠标操作(如缩放)的配置等
有关其他详细信息,请参阅我们的 GitHub 发布页面。 有关其他详细信息,请参阅我们的 GitHub 发布页面。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -56,9 +56,9 @@
<ReleaseNotes> <ReleaseNotes>
Version __VERSION_NUMBER__ Version __VERSION_NUMBER__
- 我們已在使用者介面中新增數十個曾經僅存在於 JSON 檔案中的設定,包括一個可自訂新索引標籤選單版面配置的新頁面! - 全新的延伸模組頁面會顯示已安裝在您終端機中的內容
- 我們已重新架構視窗管理以提升可靠性; 如果您在使用 wt.exe 別名時遇到任何錯誤,請提交錯誤回報 - 命令選擇區現在以您的母語和英文顯示
- 如果設定檔已隱藏或參照已解除安裝的程式,現在會顯示圖示。 - 新的 VT 功能,例如同步轉譯、新的色彩配置、快速滑鼠動作 (例如縮放) 設定等等
如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。 如需更多詳細資料,請參閱我們的 GitHub 發行版本頁面。
</ReleaseNotes> </ReleaseNotes>

View File

@@ -46,6 +46,7 @@ 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

View File

@@ -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_APPXMANIFESTVERSION)' ob_createvpack_version: '$(XES_PACKAGEVERSIONNUMBER)'
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'

View File

@@ -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>2025</XesBaseYearForStoreVersion> <XesBaseYearForStoreVersion>2026</XesBaseYearForStoreVersion>
<VersionMajor>1</VersionMajor> <VersionMajor>1</VersionMajor>
<VersionMinor>25</VersionMinor> <VersionMinor>26</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 -->

View File

@@ -1141,7 +1141,20 @@ 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);
} }
til::point TextBuffer::GetWordStart2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const // Method Description:
// - 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()) };
@@ -1174,7 +1187,7 @@ til::point TextBuffer::GetWordStart2(til::point pos, const std::wstring_view wor
// 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); pos = _GetDelimiterClassRunStart(pos, wordDelimiters, includeWhitespace);
if (!includeWhitespace || pos.x == bufferSize.Left()) if (!includeWhitespace || pos.x == bufferSize.Left())
{ {
// Special case: // Special case:
@@ -1185,12 +1198,26 @@ til::point TextBuffer::GetWordStart2(til::point pos, const std::wstring_view wor
else if (initialDelimiter == DelimiterClass::ControlChar) else if (initialDelimiter == DelimiterClass::ControlChar)
{ {
bufferSize.DecrementInExclusiveBounds(pos); bufferSize.DecrementInExclusiveBounds(pos);
pos = _GetDelimiterClassRunStart(pos, wordDelimiters); pos = _GetDelimiterClassRunStart(pos, wordDelimiters, includeWhitespace);
} }
return pos; return pos;
} }
til::point TextBuffer::GetWordEnd2(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, std::optional<til::point> limitOptional) const // Method Description:
// - 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()) };
@@ -1223,8 +1250,12 @@ til::point TextBuffer::GetWordEnd2(til::point pos, const std::wstring_view wordD
// 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); pos = _GetDelimiterClassRunEnd(pos, wordDelimiters, includeWhitespace);
if (!includeWhitespace || pos.x == bufferSize.RightExclusive()) if (pos >= limit)
{
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),
@@ -1235,7 +1266,8 @@ til::point TextBuffer::GetWordEnd2(til::point pos, const std::wstring_view wordD
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)
{ {
return _GetDelimiterClassRunEnd(pos, wordDelimiters); pos = _GetDelimiterClassRunEnd(pos, wordDelimiters, includeWhitespace);
return std::min(pos, limit);
} }
return pos; return pos;
} }
@@ -1288,29 +1320,48 @@ bool TextBuffer::IsWordBoundary(const til::point pos, const std::wstring_view wo
return prevDelimiterClass != currentDelimiterClass && currentDelimiterClass != DelimiterClass::ControlChar; return prevDelimiterClass != currentDelimiterClass && currentDelimiterClass != DelimiterClass::ControlChar;
} }
til::point TextBuffer::_GetDelimiterClassRunStart(til::point pos, const std::wstring_view wordDelimiters) const // Method Description:
// - 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;
for (auto nextPos = pos; nextPos != bufferSize.Origin(); pos = nextPos) auto nextPos = pos;
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()) if (!row.WasWrapForced() && !accessibilityMode)
{ {
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;
} }
@@ -1320,7 +1371,8 @@ 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
til::point TextBuffer::_GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters) const // - accessibilityMode - when true, cross non-wrapped row boundaries freely
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;
@@ -1333,7 +1385,16 @@ 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 (!row.WasWrapForced() || _GetDelimiterClassAt(nextPos, wordDelimiters) != initialDelimClass) if (accessibilityMode)
{
// 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;
} }
@@ -1348,283 +1409,6 @@ 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
@@ -1671,57 +1455,6 @@ 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:

View File

@@ -172,15 +172,10 @@ public:
void TriggerNewTextNotification(const std::wstring_view newText); void TriggerNewTextNotification(const std::wstring_view newText);
void TriggerSelection(); void TriggerSelection();
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 GetWordStart(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 GetWordEnd(til::point pos, const std::wstring_view wordDelimiters, bool includeWhitespace, 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;
@@ -328,12 +323,8 @@ private:
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; til::point _GetDelimiterClassRunStart(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 _GetDelimiterClassRunEnd(til::point pos, const std::wstring_view wordDelimiters, const bool accessibilityMode = false) 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;

View File

@@ -34,6 +34,16 @@ 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;

View File

@@ -26,6 +26,9 @@ TARGETLIBS = \
$(CONSOLE_OBJ_PATH)\types\lib\$(O)\ConTypes.lib \ $(CONSOLE_OBJ_PATH)\types\lib\$(O)\ConTypes.lib \
$(TARGETLIBS) \ $(TARGETLIBS) \
DELAYLOAD = \
icu.dll \
# ------------------------------------- # -------------------------------------
# Localization # Localization
# ------------------------------------- # -------------------------------------

View File

@@ -49,7 +49,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void InteractivityAutomationPeer::ParentProvider(AutomationPeer parentProvider) void InteractivityAutomationPeer::ParentProvider(AutomationPeer parentProvider)
{ {
_parentProvider = 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.
_parentProvider = parentProvider ? parentProvider.as<IAutomationPeerProtected>().ProviderFromPeer(parentProvider) : nullptr;
} }
// Method Description: // Method Description:
@@ -181,15 +184,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
XamlAutomation::ITextRangeProvider InteractivityAutomationPeer::_CreateXamlUiaTextRange(UIA::ITextRangeProvider* returnVal) const XamlAutomation::ITextRangeProvider InteractivityAutomationPeer::_CreateXamlUiaTextRange(UIA::ITextRangeProvider* returnVal) const
{ {
// LOAD-BEARING: use _parentProvider->ProviderFromPeer(_parentProvider) instead of this->ProviderFromPeer(*this). if (!_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.
const auto parent{ _parentProvider.get() };
if (!parent)
{ {
return nullptr; return nullptr;
} }
const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, parent.as<IAutomationPeerProtected>().ProviderFromPeer(parent)); const auto xutr = winrt::make_self<XamlUiaTextRange>(returnVal, _parentProvider);
return xutr.as<XamlAutomation::ITextRangeProvider>(); return xutr.as<XamlAutomation::ITextRangeProvider>();
}; };
@@ -201,22 +200,24 @@ 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);
auto count = gsl::narrow<int>(providers.size()); const auto len = gsl::narrow<uint32_t>(providers.size());
com_array<XamlAutomation::ITextRangeProvider> result{ len };
std::vector<XamlAutomation::ITextRangeProvider> vec; for (uint32_t i = 0; i < len; ++i)
vec.reserve(count);
for (auto i = 0; i < count; i++)
{ {
if (auto xutr = _CreateXamlUiaTextRange(providers[i].detach())) if (auto xutr = _CreateXamlUiaTextRange(providers[i].detach()))
{ {
vec.emplace_back(std::move(xutr)); result[i] = std::move(xutr);
} }
} }
com_array<XamlAutomation::ITextRangeProvider> result{ vec };
return result; return result;
} }
} }

View File

@@ -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;
weak_ref<Windows::UI::Xaml::Automation::Peers::AutomationPeer> _parentProvider; winrt::Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple _parentProvider{ nullptr };
til::rect _controlBounds{}; til::rect _controlBounds{};
til::rect _controlPadding{}; til::rect _controlPadding{};

View File

@@ -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.AutomationPeer, Windows.UI.Xaml.Automation.Peers.FrameworkElementAutomationPeer,
Windows.UI.Xaml.Automation.Provider.ITextProvider Windows.UI.Xaml.Automation.Provider.ITextProvider
{ {

View File

@@ -1955,7 +1955,13 @@ 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();
if (!_focused) // GH#19908: _focused can be true even when the search box has
// 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);
} }
@@ -2501,9 +2507,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_updateScrollBar->Run(update); _updateScrollBar->Run(update);
// if a selection marker is already visible, // if we have a selection, update the position of the markers
// update the position of those markers // (they may have been hidden when the endpoint scrolled out of view)
if (SelectionStartMarker().Visibility() == Visibility::Visible || SelectionEndMarker().Visibility() == Visibility::Visible) if (_core.HasSelection())
{ {
_updateSelectionMarkers(nullptr, winrt::make<UpdateSelectionMarkersEventArgs>(false)); _updateSelectionMarkers(nullptr, winrt::make<UpdateSelectionMarkersEventArgs>(false));
} }

View File

@@ -121,6 +121,9 @@ 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:

View File

@@ -313,7 +313,7 @@ std::pair<til::point, til::point> Terminal::_ExpandSelectionAnchors(std::pair<ti
break; break;
case SelectionExpansion::Word: case SelectionExpansion::Word:
{ {
start = buffer.GetWordStart2(start, _wordDelimiters, false); start = buffer.GetWordStart(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 +325,7 @@ std::pair<til::point, til::point> Terminal::_ExpandSelectionAnchors(std::pair<ti
{ {
bufferSize.DecrementInExclusiveBounds(end); bufferSize.DecrementInExclusiveBounds(end);
} }
end = buffer.GetWordEnd2(end, _wordDelimiters, false); end = buffer.GetWordEnd(end, _wordDelimiters, false);
break; break;
} }
case SelectionExpansion::Char: case SelectionExpansion::Char:
@@ -435,9 +435,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.GetWordStart2(selection->start, _wordDelimiters, false); selection->start = buffer.GetWordStart(selection->start, _wordDelimiters, false);
selection->pivot = selection->start; selection->pivot = selection->start;
selection->end = buffer.GetWordEnd2(selection->end, _wordDelimiters, false); selection->end = buffer.GetWordEnd(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))
@@ -826,13 +826,13 @@ void Terminal::_MoveByWord(SelectionDirection direction, til::point& pos)
case SelectionDirection::Left: case SelectionDirection::Left:
{ {
auto nextPos = pos; auto nextPos = pos;
nextPos = buffer.GetWordStart2(nextPos, _wordDelimiters, true); nextPos = buffer.GetWordStart(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.GetWordStart2(nextPos, _wordDelimiters, true); nextPos = buffer.GetWordStart(nextPos, _wordDelimiters, true);
} }
pos = nextPos; pos = nextPos;
break; break;
@@ -841,24 +841,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.GetWordEnd2(nextPos, _wordDelimiters, true, mutableViewportEndExclusive); nextPos = buffer.GetWordEnd(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.GetWordEnd2(nextPos, _wordDelimiters, true, mutableViewportEndExclusive); nextPos = buffer.GetWordEnd(nextPos, _wordDelimiters, true, mutableViewportEndExclusive);
} }
pos = nextPos; pos = nextPos;
break; break;
} }
case SelectionDirection::Up: case SelectionDirection::Up:
_MoveByChar(direction, pos); _MoveByChar(direction, pos);
pos = buffer.GetWordStart2(pos, _wordDelimiters, true); pos = buffer.GetWordStart(pos, _wordDelimiters, true);
break; break;
case SelectionDirection::Down: case SelectionDirection::Down:
_MoveByChar(direction, pos); _MoveByChar(direction, pos);
pos = buffer.GetWordEnd2(pos, _wordDelimiters, true); pos = buffer.GetWordEnd(pos, _wordDelimiters, true);
break; break;
} }
} }

View File

@@ -43,7 +43,8 @@
</local:SettingContainer> </local:SettingContainer>
<!-- Ambiguous Width --> <!-- Ambiguous Width -->
<local:SettingContainer x:Uid="Globals_AmbiguousWidth"> <local:SettingContainer x:Name="AmbiguousWidth"
x:Uid="Globals_AmbiguousWidth">
<ComboBox AutomationProperties.AccessibilityView="Content" <ComboBox AutomationProperties.AccessibilityView="Content"
ItemTemplate="{StaticResource EnumComboBoxTemplate}" ItemTemplate="{StaticResource EnumComboBoxTemplate}"
ItemsSource="{x:Bind ViewModel.AmbiguousWidthList}" ItemsSource="{x:Bind ViewModel.AmbiguousWidthList}"

View File

@@ -329,7 +329,8 @@
</local:SettingContainer> </local:SettingContainer>
<!-- Icon --> <!-- Icon -->
<local:SettingContainer x:Uid="NewTabMenu_CurrentFolderIcon" <local:SettingContainer x:Name="CurrentFolderIcon"
x:Uid="NewTabMenu_CurrentFolderIcon"
CurrentValueAccessibleName="{x:Bind ViewModel.CurrentFolderLocalizedIcon, Mode=OneWay}" CurrentValueAccessibleName="{x:Bind ViewModel.CurrentFolderLocalizedIcon, Mode=OneWay}"
Style="{StaticResource ExpanderSettingContainerStyleWithComplexPreview}"> Style="{StaticResource ExpanderSettingContainerStyleWithComplexPreview}">
<local:SettingContainer.CurrentValue> <local:SettingContainer.CurrentValue>
@@ -497,7 +498,8 @@
</local:SettingContainer> </local:SettingContainer>
<!-- Add Remaining Profiles --> <!-- Add Remaining Profiles -->
<local:SettingContainer x:Uid="NewTabMenu_AddRemainingProfiles" <local:SettingContainer x:Name="AddRemainingProfiles"
x:Uid="NewTabMenu_AddRemainingProfiles"
FontIconGlyph="&#xE902;" FontIconGlyph="&#xE902;"
Style="{StaticResource SettingContainerWithIcon}"> Style="{StaticResource SettingContainerWithIcon}">
<Button x:Name="AddRemainingProfilesButton" <Button x:Name="AddRemainingProfilesButton"

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows-Konsole</value> <value>Windows-Konsole</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Breite von mehrdeutigen Zeichen</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Legt die Breite fest, die für ostasiatische mehrdeutige Zeichen verwendet wird. „Eng“ (Standard) priorisiert die Kompatibilität, während „Weit“ die Lesbarkeit mit vielen CJK-Schriftarten priorisiert. Im Modus „Breit“ funktionieren einige Anwendungen möglicherweise nicht ordnungsgemäß und verursachen eine erratische Cursorbewegung. Das Ändern dieser Einstellung erfordert einen Neustart von Windows-Terminal und gilt nur für Anwendungen, die von dort aus gestartet werden.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Schmal</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Breit</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Spalten</value> <value>Spalten</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Consola de Windows</value> <value>Consola de Windows</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Ancho de caracteres ambiguos</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Establece el ancho usado para los caracteres ambiguos de Asia Oriental. "Estrecho" (valor predeterminado) da prioridad a la compatibilidad, mientras que "Ancho" da prioridad a la legibilidad con muchas fuentes CJK. En el modo "Ancho", es posible que algunas aplicaciones no funcionen correctamente y provoquen un movimiento errático del cursor. Cambiar esta configuración requiere un reinicio de Terminal Windows y solo se aplica a las aplicaciones que se inician desde dentro de ella.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Estrecho</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Anchura</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Columnas</value> <value>Columnas</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Console Windows</value> <value>Console Windows</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Largeur des caractères ambigus dAsie de lEst</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Définit la largeur utilisée pour les caractères ambigus dAsie de lEst. « Narrow » (par défaut) privilégie la compatibilité, tandis que « Wide » favorise la lisibilité avec de nombreuses polices CJK. En mode « Wide », certaines applications peuvent ne pas fonctionner correctement et provoquer un déplacement erratique du curseur. La modification de ce paramètre nécessite le redémarrage du Terminal Windows et ne sapplique quaux applications lancées à partir de celui-ci.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Étroites</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Larges</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Colonnes</value> <value>Colonnes</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows Console</value> <value>Windows Console</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Larghezza dei caratteri ambigui</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Imposta la larghezza usata per i caratteri ambigui dell'Asia orientale. "Narrow" (impostazione predefinita) privilegia la compatibilità, mentre "Wide" privilegia la leggibilità con molti tipi di carattere CJK. In modalità "Wide", alcune applicazioni potrebbero non funzionare correttamente e causare movimenti irregolari del cursore. Per applicare questa modifica è necessario riavviare Terminale Windows e si applica solo alle applicazioni avviate all'interno.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Stretti</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Ampiezza</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Colonne</value> <value>Colonne</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows コンソール</value> <value>Windows コンソール</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>あいまいな文字の幅</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>東アジアのあいまいな文字に使用する幅を設定します。[幅を狭くする] (既定) は互換性を優先し、[幅を広くする] は多くの CJK フォントでの読みやすさを優先します。[幅を広くする] モードでは、一部のアプリケーションが正しく動作せず、カーソルの動きが不安定になることがあります。この設定を変更するには、Windows ターミナルの再起動が必要で、Windows ターミナル内から起動したアプリケーションにのみ適用されます。</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>狭い</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>広い</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>列</value> <value>列</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows 콘솔</value> <value>Windows 콘솔</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>모호한 문자 너비</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>동아시아의 모호한 문자에 사용되는 너비를 설정하세요. "좁게"(기본값)는 호환성을 우선시하고, "넓게"는 많은 CJK 글꼴에서 가독성을 우선시합니다. "넓게" 모드에서는 일부 애플리케이션이 제대로 작동하지 않아 커서가 이상하게 움직일 수 있습니다. 이 설정을 변경하려면 Windows 터미널을 다시 시작해야 하며, 이 설정은 Windows 터미널 내에서 실행된 애플리케이션에만 적용됩니다.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>좁게</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>넓게</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>열</value> <value>열</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Console do Windows</value> <value>Console do Windows</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Largura de caracteres ambíguos</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Define a largura usada para caracteres ambíguos do Leste Asiático. "Estreito" (padrão) prioriza a compatibilidade, enquanto "Amplo" prioriza a legibilidade com muitas fontes CJK. No modo "Amplo", alguns aplicativos podem não funcionar corretamente e provocar movimento irregular do cursor. Alterar essa configuração exige reiniciar o Terminal do Windows e vale só para aplicativos iniciados dentro dele.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Estreita</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Largo</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Colunas</value> <value>Colunas</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value> <value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Ẅίďτħ οƒ àmъïġũõŭś ¢ћäřаčτëŕś !!! !!! !!!</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Šеŧѕ тĥé ẃίďтн цšеď ƒθŕ Ёāѕť Дѕїāπ Δmъìĝůόųş ¢ĥǻŕǻćτєŗş. "Νǻяѓòш" (đéƒåųĺţ) ρґΐõѓіŧīźéѕ ċǿmραťĭвĭľΐτŷ, ẃђίļė "Ẁîδ℮" рŕīόŕïтϊźĕş гèáðàвіℓīτў ẁìτн мâйý ČЈК ƒблťś. Ĩл "Шϊďε" mőδє, şõmе áρφļĭĉªτιόņś мąу ⁿõт ẃóѓк çθřŕзçτłў αŋδ čäűѕє ℮ŗѓāŧíć ςŭѓşοґ mòνėmĕŋť. Ċђªŋĝϊйġ тнϊş śэттĩņģ ŕêqůįŗëš å ř℮ŝţâгŧ ōƒ Ẁίήďôωş Ţёŕмĭиàĺ ąηδ îт öʼnłý ãφрŀįέѕ τő ąρрļĭсатįŏлŝ ℓаϋⁿćћ℮ð ƒřом шìтħїή îť. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Ŋǻŕґŏш !</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Шĭðе !</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Ċσŀùмñѕ !!</value> <value>Ċσŀùмñѕ !!</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value> <value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Ẅίďτħ οƒ àmъïġũõŭś ¢ћäřаčτëŕś !!! !!! !!!</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Šеŧѕ тĥé ẃίďтн цšеď ƒθŕ Ёāѕť Дѕїāπ Δmъìĝůόųş ¢ĥǻŕǻćτєŗş. "Νǻяѓòш" (đéƒåųĺţ) ρґΐõѓіŧīźéѕ ċǿmραťĭвĭľΐτŷ, ẃђίļė "Ẁîδ℮" рŕīόŕïтϊźĕş гèáðàвіℓīτў ẁìτн мâйý ČЈК ƒблťś. Ĩл "Шϊďε" mőδє, şõmе áρφļĭĉªτιόņś мąу ⁿõт ẃóѓк çθřŕзçτłў αŋδ čäűѕє ℮ŗѓāŧíć ςŭѓşοґ mòνėmĕŋť. Ċђªŋĝϊйġ тнϊş śэттĩņģ ŕêqůįŗëš å ř℮ŝţâгŧ ōƒ Ẁίήďôωş Ţёŕмĭиàĺ ąηδ îт öʼnłý ãφрŀįέѕ τő ąρрļĭсатįŏлŝ ℓаϋⁿćћ℮ð ƒřом шìтħїή îť. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Ŋǻŕґŏш !</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Шĭðе !</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Ċσŀùмñѕ !!</value> <value>Ċσŀùмñѕ !!</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value> <value>Щіŋďŏшś Ĉǿʼnşöℓę !!! !</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Ẅίďτħ οƒ àmъïġũõŭś ¢ћäřаčτëŕś !!! !!! !!!</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Šеŧѕ тĥé ẃίďтн цšеď ƒθŕ Ёāѕť Дѕїāπ Δmъìĝůόųş ¢ĥǻŕǻćτєŗş. "Νǻяѓòш" (đéƒåųĺţ) ρґΐõѓіŧīźéѕ ċǿmραťĭвĭľΐτŷ, ẃђίļė "Ẁîδ℮" рŕīόŕïтϊźĕş гèáðàвіℓīτў ẁìτн мâйý ČЈК ƒблťś. Ĩл "Шϊďε" mőδє, şõmе áρφļĭĉªτιόņś мąу ⁿõт ẃóѓк çθřŕзçτłў αŋδ čäűѕє ℮ŗѓāŧíć ςŭѓşοґ mòνėmĕŋť. Ċђªŋĝϊйġ тнϊş śэттĩņģ ŕêqůįŗëš å ř℮ŝţâгŧ ōƒ Ẁίήďôωş Ţёŕмĭиàĺ ąηδ îт öʼnłý ãφрŀįέѕ τő ąρрļĭсатįŏлŝ ℓаϋⁿćћ℮ð ƒřом шìтħїή îť. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Ŋǻŕґŏш !</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Шĭðе !</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Ċσŀùмñѕ !!</value> <value>Ċσŀùмñѕ !!</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Консоль Windows</value> <value>Консоль Windows</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>Ширина символов в пропорциональных шрифтах</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>Задает ширину для символов восточноазиатских шрифтов. Значение "Узкая" (по умолчанию) обеспечивает совместимость, а "Широкая" улучшает читаемость большинства шрифтов CJK. В режиме "Широкая" некоторые приложения могут работать неправильно, что приводит к беспорядочному движению курсора. Изменение этого параметра требует перезапуска Терминала Windows и применяется только к приложениям, запущенным из него.</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>Узкие</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>Широкие</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>Столбцы</value> <value>Столбцы</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows 控制台</value> <value>Windows 控制台</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>模糊字符的宽度</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>设置东亚模糊字符的宽度。"窄"模式(默认)优先考虑兼容性,而"宽"模式优先考虑很多中日韩字体的可读性。在"宽"模式下,某些应用程序可能无法正常工作,并导致光标不规则移动。更改此设置需要重启 Windows 终端,而且仅适用于从终端中启动的应用程序。</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>窄</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>宽</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>列</value> <value>列</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -371,6 +371,21 @@
<data name="Globals_TextMeasurement_Console.Text" xml:space="preserve"> <data name="Globals_TextMeasurement_Console.Text" xml:space="preserve">
<value>Windows 主控台</value> <value>Windows 主控台</value>
</data> </data>
<data name="Globals_AmbiguousWidth.Header" xml:space="preserve">
<value>模糊字元寬度</value>
<comment>A label for a drop down selector, referring to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth.HelpText" xml:space="preserve">
<value>設定東亞模糊字元的寬度。「窄」(預設) 以相容性為優先,而「寬」則以多數中日韓字型的可讀性為優先。在「寬」模式下,部分應用程式可能無法正常運作,導致游標移動異常。變更此設定後,需重新啟動 Windows 終端機,且僅適用於從 Windows 終端機內啟動的應用程式。</value>
</data>
<data name="Globals_AmbiguousWidth_Narrow.Text" xml:space="preserve">
<value>窄</value>
<comment>As in "narrow width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_AmbiguousWidth_Wide.Text" xml:space="preserve">
<value>寬</value>
<comment>As in "wide width". Refers to the East Asian Ambiguous Width Unicode specification.</comment>
</data>
<data name="Globals_InitialCols.Text" xml:space="preserve"> <data name="Globals_InitialCols.Text" xml:space="preserve">
<value>欄</value> <value>欄</value>
<comment>Header for a control to choose the number of columns in the terminal's text grid.</comment> <comment>Header for a control to choose the number of columns in the terminal's text grid.</comment>

View File

@@ -647,9 +647,12 @@ void CascadiaSettings::_validateMediaResources()
_globals->ResolveMediaResources(mediaResourceResolver); _globals->ResolveMediaResources(mediaResourceResolver);
if (_foundInvalidUserResources) if (Feature_WarnOnInvalidSettingsMediaResources::IsEnabled())
{ {
_warnings.Append(SettingsLoadWarnings::InvalidMediaResource); if (_foundInvalidUserResources)
{
_warnings.Append(SettingsLoadWarnings::InvalidMediaResource);
}
} }
} }

View File

@@ -324,9 +324,11 @@ std::vector<wil::com_ptr<T>> SafeArrayToOwningVector(SAFEARRAY* safeArray)
std::vector<wil::com_ptr<T>> result{ gsl::narrow<std::size_t>(count) }; std::vector<wil::com_ptr<T>> result{ gsl::narrow<std::size_t>(count) };
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
result[i].attach(pVals[i]); result[i] = pVals[i];
} }
THROW_IF_FAILED(SafeArrayUnaccessData(safeArray));
THROW_IF_FAILED(SafeArrayDestroy(safeArray));
return result; return result;
} }

View File

@@ -187,4 +187,11 @@
<alwaysDisabledReleaseTokens/> <alwaysDisabledReleaseTokens/>
</feature> </feature>
<feature>
<name>Feature_WarnOnInvalidSettingsMediaResources</name>
<description>Controls whether Terminal should display a warning dialog when icon, backgroundImage, shader, etc. could not be found.</description>
<stage>AlwaysEnabled</stage>
<alwaysDisabledReleaseTokens/>
</feature>
</featureStaging> </featureStaging>

View File

@@ -400,20 +400,16 @@ static FillConsoleResult FillConsoleImpl(SCREEN_INFORMATION& screenInfo, FillCon
// See FillConsoleOutputCharacterWImpl and its identical code. // See FillConsoleOutputCharacterWImpl and its identical code.
if (enablePowershellShim) if (enablePowershellShim)
{ {
auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); const auto currentBufferDimensions{ OutContext.GetBufferSize().Dimensions() };
if (const auto writer = gci.GetVtWriterForBuffer(&OutContext)) const auto wroteWholeBuffer = lengthToWrite == (currentBufferDimensions.area<size_t>());
{ const auto startedAtOrigin = startingCoordinate == til::point{ 0, 0 };
const auto currentBufferDimensions{ OutContext.GetBufferSize().Dimensions() }; const auto wroteSpaces = attribute == (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
const auto wroteWholeBuffer = lengthToWrite == (currentBufferDimensions.area<size_t>());
const auto startedAtOrigin = startingCoordinate == til::point{ 0, 0 };
const auto wroteSpaces = attribute == (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
if (wroteWholeBuffer && startedAtOrigin && wroteSpaces) if (wroteWholeBuffer && startedAtOrigin && wroteSpaces)
{ {
// PowerShell has previously called FillConsoleOutputCharacterW() which triggered a call to WriteClearScreen(). // PowerShell has previously called FillConsoleOutputCharacterW() which triggered a call to WriteClearScreen().
cellsModified = lengthToWrite; cellsModified = lengthToWrite;
return S_OK; return S_OK;
}
} }
} }
@@ -457,21 +453,23 @@ static FillConsoleResult FillConsoleImpl(SCREEN_INFORMATION& screenInfo, FillCon
// their entire buffer will be cleared as well. // their entire buffer will be cleared as well.
if (enablePowershellShim) if (enablePowershellShim)
{ {
auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); const auto currentBufferDimensions{ OutContext.GetBufferSize().Dimensions() };
if (auto writer = gci.GetVtWriterForBuffer(&OutContext)) const auto wroteWholeBuffer = lengthToWrite == (currentBufferDimensions.area<size_t>());
{ const auto startedAtOrigin = startingCoordinate == til::point{ 0, 0 };
const auto currentBufferDimensions{ OutContext.GetBufferSize().Dimensions() }; const auto wroteSpaces = character == UNICODE_SPACE;
const auto wroteWholeBuffer = lengthToWrite == (currentBufferDimensions.area<size_t>());
const auto startedAtOrigin = startingCoordinate == til::point{ 0, 0 };
const auto wroteSpaces = character == UNICODE_SPACE;
if (wroteWholeBuffer && startedAtOrigin && wroteSpaces) if (wroteWholeBuffer && startedAtOrigin && wroteSpaces)
{
WriteClearScreen(OutContext);
auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
if (auto writer = gci.GetVtWriterForBuffer(&OutContext))
{ {
WriteClearScreen(OutContext);
writer.Submit(); writer.Submit();
cellsModified = lengthToWrite;
return S_OK;
} }
cellsModified = lengthToWrite;
return S_OK;
} }
} }

View File

@@ -670,7 +670,7 @@ void FileTests::TestReadFileBasicEmpty()
const auto hIn = GetStdInputHandle(); const auto hIn = GetStdInputHandle();
VERIFY_IS_NOT_NULL(hIn, L"Verify we have the standard input handle."); VERIFY_IS_NOT_NULL(hIn, L"Verify we have the standard input handle.");
DWORD dwMode = 0; DWORD dwMode = ENABLE_PROCESSED_INPUT; // ^Z is only handled when processed input is enabled.
VERIFY_WIN32_BOOL_SUCCEEDED(SetConsoleMode(hIn, dwMode), L"Set input mode for test."); VERIFY_WIN32_BOOL_SUCCEEDED(SetConsoleMode(hIn, dwMode), L"Set input mode for test.");
VERIFY_WIN32_BOOL_SUCCEEDED(FlushConsoleInputBuffer(hIn), L"Flush input buffer in preparation for test."); VERIFY_WIN32_BOOL_SUCCEEDED(FlushConsoleInputBuffer(hIn), L"Flush input buffer in preparation for test.");

View File

@@ -40,6 +40,12 @@
"Execution": { "Execution": {
"AdditionalParameter": "/select:\"@IsPerfTest=true\"" "AdditionalParameter": "/select:\"@IsPerfTest=true\""
} }
},
{
"Name": "NoAppPlatform",
"Execution": {
"AdditionalParameter": "/select:\"not(@Name='PolicyTests::*')\""
}
} }
] ]
} }

View File

@@ -982,23 +982,20 @@ void ApiRoutines::GetLargestConsoleWindowSizeImpl(const SCREEN_INFORMATION& cont
// A null character will get translated to whitespace. // A null character will get translated to whitespace.
fillCharacter = Microsoft::Console::VirtualTerminal::VtIo::SanitizeUCS2(fillCharacter); fillCharacter = Microsoft::Console::VirtualTerminal::VtIo::SanitizeUCS2(fillCharacter);
if (writer) // GH#3126 - This is a shim for cmd's `cls` function. In the
// legacy console, `cls` is supposed to clear the entire buffer.
// We always use a VT sequence, even if ConPTY isn't used, because those are faster nowadays.
if (enableCmdShim &&
source.left <= 0 && source.top <= 0 &&
source.right >= bufferSize.RightInclusive() && source.bottom >= bufferSize.BottomInclusive() &&
target.x == 0 && target.y <= -bufferSize.BottomExclusive() &&
!clip &&
fillCharacter == UNICODE_SPACE && fillAttribute == buffer.GetAttributes().GetLegacyAttributes())
{
WriteClearScreen(context);
}
else if (writer)
{ {
// GH#3126 - This is a shim for cmd's `cls` function. In the
// legacy console, `cls` is supposed to clear the entire buffer.
// We always use a VT sequence, even if ConPTY isn't used, because those are faster nowadays.
if (enableCmdShim &&
source.left <= 0 && source.top <= 0 &&
source.right >= bufferSize.RightInclusive() && source.bottom >= bufferSize.BottomInclusive() &&
target.x == 0 && target.y <= -bufferSize.BottomExclusive() &&
!clip &&
fillCharacter == UNICODE_SPACE && fillAttribute == buffer.GetAttributes().GetLegacyAttributes())
{
WriteClearScreen(context);
writer.Submit();
return S_OK;
}
const auto clipViewport = clip ? Viewport::FromInclusive(*clip).Clamp(bufferSize) : bufferSize; const auto clipViewport = clip ? Viewport::FromInclusive(*clip).Clamp(bufferSize) : bufferSize;
const auto sourceViewport = Viewport::FromInclusive(source); const auto sourceViewport = Viewport::FromInclusive(source);
const auto fillViewport = sourceViewport.Clamp(clipViewport); const auto fillViewport = sourceViewport.Clamp(clipViewport);
@@ -1084,8 +1081,6 @@ void ApiRoutines::GetLargestConsoleWindowSizeImpl(const SCREEN_INFORMATION& cont
RETURN_IF_FAILED(WriteConsoleOutputWImplHelper(context, fill, w, fillViewport, writtenViewport)); RETURN_IF_FAILED(WriteConsoleOutputWImplHelper(context, fill, w, fillViewport, writtenViewport));
RETURN_IF_FAILED(WriteConsoleOutputWImplHelper(context, backup, w, Viewport::FromDimensions(target, readViewport.Dimensions()).Clamp(clipViewport), writtenViewport)); RETURN_IF_FAILED(WriteConsoleOutputWImplHelper(context, backup, w, Viewport::FromDimensions(target, readViewport.Dimensions()).Clamp(clipViewport), writtenViewport));
} }
writer.Submit();
} }
else else
{ {
@@ -1093,6 +1088,11 @@ void ApiRoutines::GetLargestConsoleWindowSizeImpl(const SCREEN_INFORMATION& cont
ScrollRegion(buffer, source, clip, target, fillCharacter, useThisAttr); ScrollRegion(buffer, source, clip, target, fillCharacter, useThisAttr);
} }
if (writer)
{
writer.Submit();
}
return S_OK; return S_OK;
} }
CATCH_RETURN(); CATCH_RETURN();

View File

@@ -18,10 +18,17 @@ class SearchTests
{ {
TEST_CLASS(SearchTests); TEST_CLASS(SearchTests);
CommonState* m_state; CommonState* m_state{ nullptr };
TEST_CLASS_SETUP(ClassSetup) TEST_CLASS_SETUP(ClassSetup)
{ {
wil::unique_hmodule icu{ LoadLibraryExW(L"icu.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32) };
if (!icu)
{
Log::Result(TestResults::Skipped, L"ICU is not present");
return true;
}
m_state = new CommonState(); m_state = new CommonState();
m_state->PrepareGlobalScreenBuffer(); m_state->PrepareGlobalScreenBuffer();
return true; return true;
@@ -29,8 +36,11 @@ class SearchTests
TEST_CLASS_CLEANUP(ClassCleanup) TEST_CLASS_CLEANUP(ClassCleanup)
{ {
m_state->CleanupGlobalScreenBuffer(); if (m_state)
delete m_state; {
m_state->CleanupGlobalScreenBuffer();
delete m_state;
}
return true; return true;
} }

View File

@@ -143,7 +143,7 @@ class TextBufferTests
void WriteLinesToBuffer(const std::vector<std::wstring>& text, TextBuffer& buffer); void WriteLinesToBuffer(const std::vector<std::wstring>& text, TextBuffer& buffer);
TEST_METHOD(GetWordBoundaries); TEST_METHOD(GetWordBoundaries);
TEST_METHOD(MoveByWord);
TEST_METHOD(GetGlyphBoundaries); TEST_METHOD(GetGlyphBoundaries);
TEST_METHOD(GetTextRects); TEST_METHOD(GetTextRects);
@@ -2039,12 +2039,12 @@ void TextBufferTests::GetWordBoundaries()
// Test Data: // Test Data:
// - til::point - starting position // - til::point - starting position
// - til::point - expected result (accessibilityMode = false) // - til::point - expected result (includeWhitespace = false)
// - til::point - expected result (accessibilityMode = true) // - til::point - expected result (includeWhitespace = true)
struct ExpectedResult struct ExpectedResult
{ {
til::point accessibilityModeDisabled; til::point selectionMode;
til::point accessibilityModeEnabled; til::point accessibilityMode;
}; };
struct Test struct Test
@@ -2056,7 +2056,8 @@ void TextBufferTests::GetWordBoundaries()
// Set testData for GetWordStart tests // Set testData for GetWordStart tests
// clang-format off // clang-format off
std::vector<Test> testData = { std::vector<Test> testData = {
// tests for first line of text // tests for first line of text ("word other" + spaces)
// selectionMode accessibilityMode
{ { 0, 0 }, {{ 0, 0 }, { 0, 0 }} }, { { 0, 0 }, {{ 0, 0 }, { 0, 0 }} },
{ { 1, 0 }, {{ 0, 0 }, { 0, 0 }} }, { { 1, 0 }, {{ 0, 0 }, { 0, 0 }} },
{ { 3, 0 }, {{ 0, 0 }, { 0, 0 }} }, { { 3, 0 }, {{ 0, 0 }, { 0, 0 }} },
@@ -2066,7 +2067,7 @@ void TextBufferTests::GetWordBoundaries()
{ { 20, 0 }, {{ 10, 0 }, { 5, 0 }} }, { { 20, 0 }, {{ 10, 0 }, { 5, 0 }} },
{ { 79, 0 }, {{ 10, 0 }, { 5, 0 }} }, { { 79, 0 }, {{ 10, 0 }, { 5, 0 }} },
// tests for second line of text // tests for second line of text (" more words" + spaces)
{ { 0, 1 }, {{ 0, 1 }, { 5, 0 }} }, { { 0, 1 }, {{ 0, 1 }, { 5, 0 }} },
{ { 1, 1 }, {{ 0, 1 }, { 5, 0 }} }, { { 1, 1 }, {{ 0, 1 }, { 5, 0 }} },
{ { 2, 1 }, {{ 2, 1 }, { 2, 1 }} }, { { 2, 1 }, {{ 2, 1 }, { 2, 1 }} },
@@ -2082,54 +2083,56 @@ void TextBufferTests::GetWordBoundaries()
// clang-format on // clang-format on
BEGIN_TEST_METHOD_PROPERTIES() BEGIN_TEST_METHOD_PROPERTIES()
TEST_METHOD_PROPERTY(L"Data:accessibilityMode", L"{false, true}") TEST_METHOD_PROPERTY(L"Data:includeWhitespace", L"{false, true}")
END_TEST_METHOD_PROPERTIES(); END_TEST_METHOD_PROPERTIES();
bool accessibilityMode; bool includeWhitespace;
VERIFY_SUCCEEDED(TestData::TryGetValue(L"accessibilityMode", accessibilityMode), L"Get accessibility mode variant"); VERIFY_SUCCEEDED(TestData::TryGetValue(L"includeWhitespace", includeWhitespace), L"Get includeWhitespace variant");
const std::wstring_view delimiters = L" "; const std::wstring_view delimiters = L" ";
for (const auto& test : testData) for (const auto& test : testData)
{ {
Log::Comment(NoThrowString().Format(L"til::point (%hd, %hd)", test.startPos.x, test.startPos.y)); Log::Comment(NoThrowString().Format(L"til::point (%hd, %hd)", test.startPos.x, test.startPos.y));
const auto result = _buffer->GetWordStart(test.startPos, delimiters, accessibilityMode); const auto result = _buffer->GetWordStart(test.startPos, delimiters, includeWhitespace);
const auto expected = accessibilityMode ? test.expected.accessibilityModeEnabled : test.expected.accessibilityModeDisabled; const auto expected = includeWhitespace ? test.expected.accessibilityMode : test.expected.selectionMode;
VERIFY_ARE_EQUAL(expected, result); VERIFY_ARE_EQUAL(expected, result);
} }
// Update testData for GetWordEnd tests // Update testData for GetWordEnd tests
// Note: GetWordEnd returns exclusive end positions
// clang-format off // clang-format off
testData = { testData = {
// tests for first line of text // tests for first line of text ("word other" + spaces)
{ { 0, 0 }, { { 3, 0 }, { 5, 0 } } }, // selectionMode accessibilityMode
{ { 1, 0 }, { { 3, 0 }, { 5, 0 } } }, { { 0, 0 }, { { 4, 0 }, { 5, 0 } } },
{ { 3, 0 }, { { 3, 0 }, { 5, 0 } } }, { { 1, 0 }, { { 4, 0 }, { 5, 0 } } },
{ { 4, 0 }, { { 4, 0 }, { 5, 0 } } }, { { 3, 0 }, { { 4, 0 }, { 5, 0 } } },
{ { 5, 0 }, { { 9, 0 }, { 2, 1 } } }, { { 4, 0 }, { { 5, 0 }, { 5, 0 } } },
{ { 6, 0 }, { { 9, 0 }, { 2, 1 } } }, { { 5, 0 }, { { 10, 0 }, { 2, 1 } } },
{ { 20, 0 }, { { 79, 0 }, { 2, 1 } } }, { { 6, 0 }, { { 10, 0 }, { 2, 1 } } },
{ { 79, 0 }, { { 79, 0 }, { 2, 1 } } }, { { 20, 0 }, { { 80, 0 }, { 2, 1 } } },
{ { 79, 0 }, { { 80, 0 }, { 2, 1 } } },
// tests for second line of text // tests for second line of text (" more words" + spaces)
{ { 0, 1 }, { { 1, 1 }, { 2, 1 } } }, { { 0, 1 }, { { 2, 1 }, { 2, 1 } } },
{ { 1, 1 }, { { 1, 1 }, { 2, 1 } } }, { { 1, 1 }, { { 2, 1 }, { 2, 1 } } },
{ { 2, 1 }, { { 5, 1 }, { 9, 1 } } }, { { 2, 1 }, { { 6, 1 }, { 9, 1 } } },
{ { 3, 1 }, { { 5, 1 }, { 9, 1 } } }, { { 3, 1 }, { { 6, 1 }, { 9, 1 } } },
{ { 5, 1 }, { { 5, 1 }, { 9, 1 } } }, { { 5, 1 }, { { 6, 1 }, { 9, 1 } } },
{ { 6, 1 }, { { 8, 1 }, { 9, 1 } } }, { { 6, 1 }, { { 9, 1 }, { 9, 1 } } },
{ { 7, 1 }, { { 8, 1 }, { 9, 1 } } }, { { 7, 1 }, { { 9, 1 }, { 9, 1 } } },
{ { 9, 1 }, { { 13, 1 }, { 0, 9001 } } }, { { 9, 1 }, { { 14, 1 }, { 80, 9000 } } },
{ { 10, 1 }, { { 13, 1 }, { 0, 9001 } } }, { { 10, 1 }, { { 14, 1 }, { 80, 9000 } } },
{ { 20, 1 }, { { 79, 1 }, { 0, 9001 } } }, { { 20, 1 }, { { 80, 1 }, { 80, 9000 } } },
{ { 79, 1 }, { { 79, 1 }, { 0, 9001 } } }, { { 79, 1 }, { { 80, 1 }, { 80, 9000 } } },
}; };
// clang-format on // clang-format on
for (const auto& test : testData) for (const auto& test : testData)
{ {
Log::Comment(NoThrowString().Format(L"til::point (%hd, %hd)", test.startPos.x, test.startPos.y)); Log::Comment(NoThrowString().Format(L"til::point (%hd, %hd)", test.startPos.x, test.startPos.y));
auto result = _buffer->GetWordEnd(test.startPos, delimiters, accessibilityMode); auto result = _buffer->GetWordEnd(test.startPos, delimiters, includeWhitespace);
const auto expected = accessibilityMode ? test.expected.accessibilityModeEnabled : test.expected.accessibilityModeDisabled; const auto expected = includeWhitespace ? test.expected.accessibilityMode : test.expected.selectionMode;
VERIFY_ARE_EQUAL(expected, result); VERIFY_ARE_EQUAL(expected, result);
} }
@@ -2161,6 +2164,7 @@ void TextBufferTests::GetWordBoundaries()
// clang-format off // clang-format off
testData = { testData = {
// selectionMode accessibilityMode
{ { 0, 0 }, { { 0, 0 }, { 0, 0 } } }, { { 0, 0 }, { { 0, 0 }, { 0, 0 } } },
{ { 1, 0 }, { { 0, 0 }, { 0, 0 } } }, { { 1, 0 }, { { 0, 0 }, { 0, 0 } } },
{ { 4, 0 }, { { 4, 0 }, { 0, 0 } } }, { { 4, 0 }, { { 4, 0 }, { 0, 0 } } },
@@ -2173,11 +2177,11 @@ void TextBufferTests::GetWordBoundaries()
{ { 0, 2 }, { { 0, 2 }, { 0, 2 } } }, { { 0, 2 }, { { 0, 2 }, { 0, 2 } } },
{ { 9, 2 }, { { 0, 2 }, { 0, 2 } } }, { { 9, 2 }, { { 0, 2 }, { 0, 2 } } },
// v accessibility does not consider wrapping
{ { 0, 3 }, { { 0, 3 }, { 0, 2 } } }, { { 0, 3 }, { { 0, 3 }, { 0, 2 } } },
{ { 7, 3 }, { { 6, 3 }, { 0, 2 } } }, { { 7, 3 }, { { 6, 3 }, { 0, 2 } } },
// v accessibility does not consider wrapping // v selection mode now also crosses wrapped rows for ControlChar
{ { 1, 4 }, { { 0, 4 }, { 0, 2 } } }, { { 1, 4 }, { { 6, 3 }, { 0, 2 } } },
{ { 4, 4 }, { { 4, 4 }, { 4, 4 } } }, { { 4, 4 }, { { 4, 4 }, { 4, 4 } } },
{ { 8, 4 }, { { 4, 4 }, { 4, 4 } } }, { { 8, 4 }, { { 4, 4 }, { 4, 4 } } },
@@ -2188,8 +2192,8 @@ void TextBufferTests::GetWordBoundaries()
for (const auto& test : testData) for (const auto& test : testData)
{ {
Log::Comment(NoThrowString().Format(L"Testing til::point (%hd, %hd)", test.startPos.x, test.startPos.y)); Log::Comment(NoThrowString().Format(L"Testing til::point (%hd, %hd)", test.startPos.x, test.startPos.y));
const auto result = _buffer->GetWordStart(test.startPos, delimiters, accessibilityMode); const auto result = _buffer->GetWordStart(test.startPos, delimiters, includeWhitespace);
const auto expected = accessibilityMode ? test.expected.accessibilityModeEnabled : test.expected.accessibilityModeDisabled; const auto expected = includeWhitespace ? test.expected.accessibilityMode : test.expected.selectionMode;
VERIFY_ARE_EQUAL(expected, result); VERIFY_ARE_EQUAL(expected, result);
} }
@@ -2205,123 +2209,43 @@ void TextBufferTests::GetWordBoundaries()
// clang-format off // clang-format off
testData = { testData = {
// tests for first line of text // tests for first line of text
{ { 0, 0 }, { { 3, 0 }, { 5, 0 } } }, // selectionMode accessibilityMode
{ { 1, 0 }, { { 3, 0 }, { 5, 0 } } }, { { 0, 0 }, { { 4, 0 }, { 5, 0 } } },
{ { 4, 0 }, { { 4, 0 }, { 5, 0 } } }, { { 1, 0 }, { { 4, 0 }, { 5, 0 } } },
{ { 5, 0 }, { { 7, 1 }, { 0, 2 } } }, { { 4, 0 }, { { 5, 0 }, { 5, 0 } } },
{ { 7, 0 }, { { 7, 1 }, { 0, 2 } } }, { { 5, 0 }, { { 8, 1 }, { 0, 2 } } },
{ { 7, 0 }, { { 8, 1 }, { 0, 2 } } },
{ { 4, 1 }, { { 7, 1 }, { 0, 2 } } }, { { 4, 1 }, { { 8, 1 }, { 0, 2 } } },
{ { 7, 1 }, { { 7, 1 }, { 0, 2 } } }, { { 7, 1 }, { { 8, 1 }, { 0, 2 } } },
{ { 9, 1 }, { { 9, 1 }, { 0, 2 } } }, { { 9, 1 }, { { 10, 1 }, { 0, 2 } } },
{ { 0, 2 }, { { 9, 2 }, { 4, 4 } } }, { { 0, 2 }, { { 10, 2 }, { 4, 4 } } },
{ { 9, 2 }, { { 9, 2 }, { 4, 4 } } }, { { 9, 2 }, { { 10, 2 }, { 4, 4 } } },
{ { 0, 3 }, { { 5, 3 }, { 4, 4 } } }, { { 0, 3 }, { { 6, 3 }, { 4, 4 } } },
{ { 7, 3 }, { { 9, 3 }, { 4, 4 } } }, { { 7, 3 }, { { 4, 4 }, { 4, 4 } } },
{ { 1, 4 }, { { 3, 4 }, { 4, 4 } } }, { { 1, 4 }, { { 4, 4 }, { 4, 4 } } },
{ { 4, 4 }, { { 0, 5 }, { 2, 5 } } }, { { 4, 4 }, { { 1, 5 }, { 2, 5 } } },
{ { 8, 4 }, { { 0, 5 }, { 2, 5 } } }, { { 8, 4 }, { { 1, 5 }, { 2, 5 } } },
{ { 0, 5 }, { { 0, 5 }, { 2, 5 } } }, { { 0, 5 }, { { 1, 5 }, { 2, 5 } } },
{ { 1, 5 }, { { 1, 5 }, { 2, 5 } } }, { { 1, 5 }, { { 2, 5 }, { 2, 5 } } },
{ { 4, 5 }, { { 9, 5 }, { 0, 6 } } }, { { 4, 5 }, { { 10, 5 }, { 10, 5 } } },
{ { 9, 5 }, { { 9, 5 }, { 0, 6 } } }, { { 9, 5 }, { { 10, 5 }, { 10, 5 } } },
}; };
// clang-format on // clang-format on
for (const auto& test : testData) for (const auto& test : testData)
{ {
Log::Comment(NoThrowString().Format(L"TestEnd til::point (%hd, %hd)", test.startPos.x, test.startPos.y)); Log::Comment(NoThrowString().Format(L"TestEnd til::point (%hd, %hd)", test.startPos.x, test.startPos.y));
auto result = _buffer->GetWordEnd(test.startPos, delimiters, accessibilityMode); auto result = _buffer->GetWordEnd(test.startPos, delimiters, includeWhitespace);
const auto expected = accessibilityMode ? test.expected.accessibilityModeEnabled : test.expected.accessibilityModeDisabled; const auto expected = includeWhitespace ? test.expected.accessibilityMode : test.expected.selectionMode;
VERIFY_ARE_EQUAL(expected, result); VERIFY_ARE_EQUAL(expected, result);
} }
} }
void TextBufferTests::MoveByWord()
{
til::size bufferSize{ 80, 9001 };
UINT cursorSize = 12;
TextAttribute attr{ 0x7f };
auto _buffer = std::make_unique<TextBuffer>(bufferSize, attr, cursorSize, false, &_renderer);
// Setup: Write lines of text to the buffer
const std::vector<std::wstring> text = { L"word other",
L" more words" };
WriteLinesToBuffer(text, *_buffer);
// Test Data:
// - til::point - starting position
// - til::point - expected result (moving forwards)
// - til::point - expected result (moving backwards)
struct ExpectedResult
{
til::point moveForwards;
til::point moveBackwards;
};
struct Test
{
til::point startPos;
ExpectedResult expected;
};
// Set testData for GetWordStart tests
// clang-format off
std::vector<Test> testData = {
// tests for first line of text
{ { 0, 0 }, {{ 5, 0 }, { 0, 0 }} },
{ { 1, 0 }, {{ 5, 0 }, { 1, 0 }} },
{ { 3, 0 }, {{ 5, 0 }, { 3, 0 }} },
{ { 4, 0 }, {{ 5, 0 }, { 4, 0 }} },
{ { 5, 0 }, {{ 2, 1 }, { 0, 0 }} },
{ { 6, 0 }, {{ 2, 1 }, { 0, 0 }} },
{ { 20, 0 }, {{ 2, 1 }, { 0, 0 }} },
{ { 79, 0 }, {{ 2, 1 }, { 0, 0 }} },
// tests for second line of text
{ { 0, 1 }, {{ 2, 1 }, { 0, 0 }} },
{ { 1, 1 }, {{ 2, 1 }, { 0, 0 }} },
{ { 2, 1 }, {{ 9, 1 }, { 5, 0 }} },
{ { 3, 1 }, {{ 9, 1 }, { 5, 0 }} },
{ { 5, 1 }, {{ 9, 1 }, { 5, 0 }} },
{ { 6, 1 }, {{ 9, 1 }, { 5, 0 }} },
{ { 7, 1 }, {{ 9, 1 }, { 5, 0 }} },
{ { 9, 1 }, {{ 9, 1 }, { 2, 1 }} },
{ { 10, 1 }, {{10, 1 }, { 2, 1 }} },
{ { 20, 1 }, {{20, 1 }, { 2, 1 }} },
{ { 79, 1 }, {{79, 1 }, { 2, 1 }} },
};
// clang-format on
BEGIN_TEST_METHOD_PROPERTIES()
TEST_METHOD_PROPERTY(L"Data:movingForwards", L"{false, true}")
END_TEST_METHOD_PROPERTIES();
bool movingForwards;
VERIFY_SUCCEEDED(TestData::TryGetValue(L"movingForwards", movingForwards), L"Get movingForwards variant");
const std::wstring_view delimiters = L" ";
const auto lastCharPos = _buffer->GetLastNonSpaceCharacter();
for (const auto& test : testData)
{
Log::Comment(NoThrowString().Format(L"COORD (%hd, %hd)", test.startPos.x, test.startPos.y));
auto pos{ test.startPos };
const auto result = movingForwards ?
_buffer->MoveToNextWord(pos, delimiters, lastCharPos) :
_buffer->MoveToPreviousWord(pos, delimiters);
const auto expected = movingForwards ? test.expected.moveForwards : test.expected.moveBackwards;
VERIFY_ARE_EQUAL(expected, pos);
// if we moved, result is true and pos != startPos.
// otherwise, result is false and pos == startPos.
VERIFY_ARE_EQUAL(result, pos != test.startPos);
}
}
void TextBufferTests::GetGlyphBoundaries() void TextBufferTests::GetGlyphBoundaries()
{ {
struct ExpectedResult struct ExpectedResult

View File

@@ -444,7 +444,15 @@ VOID ConIoSrvComm::HandleFocusEvent(const CIS_EVENT* const Event)
// TODO: MSFT: 11833883 - Determine action when wait on paint operation via // TODO: MSFT: 11833883 - Determine action when wait on paint operation via
// DirectX on OneCoreUAP times out while switching console // DirectX on OneCoreUAP times out while switching console
// applications. // applications.
UnlockConsole();
// Teardown may need to wait for an entire frame to finish, but it will not be
// able to do so while we are holding the console lock. Relinquish the lock
// for as long as it takes to quiesce the render thread, and then take it back
// afterwards. This is globally safe because ConIoSrv will not process any other
// requests while the focus event is outstanding.
Renderer->TriggerTeardown(); Renderer->TriggerTeardown();
LockConsole();
// Relinquish control of the graphics device (only one // Relinquish control of the graphics device (only one
// DirectX application may control the device at any one // DirectX application may control the device at any one

View File

@@ -270,6 +270,16 @@ constexpr T saturate(auto val)
} }
CATCH_RETURN(); CATCH_RETURN();
if (a->ProcessControlZ)
{
// ProcessControlZ is only set for CONSOLE_IO_RAW_READ. To restore
// the behavior from Windows 7 (see filehops.c:123) we need to honor
// ^Z only if PROCESSED_INPUT is enabled.
ULONG InputMode{ 0 };
m->_pApiRoutines->GetConsoleInputModeImpl(*pInputBuffer, InputMode);
a->ProcessControlZ = (InputMode & ENABLE_PROCESSED_INPUT) != 0;
}
TraceConsoleAPICallWithOrigin( TraceConsoleAPICallWithOrigin(
"ReadConsole", "ReadConsole",
TraceLoggingBoolean(a->Unicode, "Unicode"), TraceLoggingBoolean(a->Unicode, "Unicode"),

View File

@@ -2,5 +2,8 @@
"$schema": "http://universaltest/schema/testlist-2.json", "$schema": "http://universaltest/schema/testlist-2.json",
"Testlists": [ "Testlists": [
{ "FilePath": "Microsoft.Console.Tests.testlist" } { "FilePath": "Microsoft.Console.Tests.testlist" }
] ],
} "TestMDs" : [
{ "FilePath": "Microsoft.Console.Host.FeatureTests.testmd" }
]
}

View File

@@ -2,5 +2,8 @@
"$schema": "http://universaltest/schema/testlist-2.json", "$schema": "http://universaltest/schema/testlist-2.json",
"Testlists": [ "Testlists": [
{ "FilePath": "Microsoft.Console.Tests.testlist" } { "FilePath": "Microsoft.Console.Tests.testlist" }
] ],
} "TestMDs" : [
{ "FilePath": "Microsoft.Console.Host.FeatureTests.testmd" }
]
}

View File

@@ -0,0 +1,14 @@
{
"$schema": "http://universaltest/schema/testlist-3.json",
"Testlists": [
{
"FilePath": "Microsoft.Console.Tests.testlist"
}
],
"TestMDs": [
{
"FilePath": "Microsoft.Console.Host.FeatureTests.testmd",
"Profile": "NoAppPlatform"
}
]
}

View File

@@ -3,7 +3,6 @@
"TestMDs" : [ "TestMDs" : [
{ "FilePath": "Microsoft.Console.Host.UnitTests.testmd" }, { "FilePath": "Microsoft.Console.Host.UnitTests.testmd" },
{ "FilePath": "Microsoft.Console.TextBuffer.UnitTests.testmd" }, { "FilePath": "Microsoft.Console.TextBuffer.UnitTests.testmd" },
{ "FilePath": "Microsoft.Console.Host.FeatureTests.testmd" },
{ "FilePath": "Microsoft.Console.VirtualTerminal.Adapter.UnitTests.testmd" }, { "FilePath": "Microsoft.Console.VirtualTerminal.Adapter.UnitTests.testmd" },
{ "FilePath": "Microsoft.Console.VirtualTerminal.Parser.UnitTests.testmd" }, { "FilePath": "Microsoft.Console.VirtualTerminal.Parser.UnitTests.testmd" },
{ "FilePath": "Microsoft.Console.Conpty.UnitTests.testmd" }, { "FilePath": "Microsoft.Console.Conpty.UnitTests.testmd" },

View File

@@ -8,6 +8,7 @@ TESTLIST_SOURCES=\
Microsoft.Console.TestLab.Desktop.testlist \ Microsoft.Console.TestLab.Desktop.testlist \
Microsoft.Console.TestLab.OneCoreUap.testlist \ Microsoft.Console.TestLab.OneCoreUap.testlist \
Microsoft.Console.TestLab.Performance.testlist \ Microsoft.Console.TestLab.Performance.testlist \
Microsoft.Console.TestLab.Win3.testlist \
TESTLIST_REFERENCE_DIRS=\ TESTLIST_REFERENCE_DIRS=\
$(OBJ_PATH)\..\interactivity\win32\ut_interactivity_win32\$O \ $(OBJ_PATH)\..\interactivity\win32\ut_interactivity_win32\$O \

View File

@@ -12,9 +12,9 @@ Handle Handle::Create()
{ {
Handle handle; Handle handle;
handle._impl = new Implementation(); handle._impl = new Implementation();
if (!handle._impl->Initialize()) if (FAILED(handle._impl->Initialize()))
{ {
delete handle._impl; handle._destroy();
handle._impl = nullptr; handle._impl = nullptr;
} }
return handle; return handle;
@@ -32,11 +32,7 @@ void Handle::SetDefaultScopeAlphanumericHalfWidth(bool enable)
Handle::~Handle() Handle::~Handle()
{ {
if (_impl) _destroy();
{
_impl->Uninitialize();
_impl->Release();
}
} }
Handle::Handle(Handle&& other) noexcept : Handle::Handle(Handle&& other) noexcept :
@@ -94,3 +90,12 @@ bool Handle::HasActiveComposition() const noexcept
{ {
return _impl ? _impl->HasActiveComposition() : false; return _impl ? _impl->HasActiveComposition() : false;
} }
void Handle::_destroy() noexcept
{
if (_impl)
{
_impl->Uninitialize();
_impl->Release();
}
}

View File

@@ -51,6 +51,8 @@ namespace Microsoft::Console::TSF
bool HasActiveComposition() const noexcept; bool HasActiveComposition() const noexcept;
private: private:
void _destroy() noexcept;
Implementation* _impl = nullptr; Implementation* _impl = nullptr;
}; };
} }

View File

@@ -71,33 +71,27 @@ void Implementation::SetDefaultScopeAlphanumericHalfWidth(bool enable) noexcept
s_wantsAnsiInputScope.store(enable, std::memory_order_relaxed); s_wantsAnsiInputScope.store(enable, std::memory_order_relaxed);
} }
bool Implementation::Initialize() HRESULT Implementation::Initialize()
{ {
_categoryMgr = wil::CoCreateInstanceNoThrow<ITfCategoryMgr>(CLSID_TF_CategoryMgr); RETURN_IF_FAILED_EXPECTED(CoCreateInstance(CLSID_TF_CategoryMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(_categoryMgr.addressof())));
if (!_categoryMgr) RETURN_IF_FAILED_EXPECTED(CoCreateInstance(CLSID_TF_DisplayAttributeMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(_displayAttributeMgr.addressof())));
{
return false;
}
_displayAttributeMgr = wil::CoCreateInstance<ITfDisplayAttributeMgr>(CLSID_TF_DisplayAttributeMgr);
// There's no point in calling TF_GetThreadMgr. ITfThreadMgr is a per-thread singleton. // There's no point in calling TF_GetThreadMgr. ITfThreadMgr is a per-thread singleton.
_threadMgrEx = wil::CoCreateInstance<ITfThreadMgrEx>(CLSID_TF_ThreadMgr, CLSCTX_INPROC_SERVER); RETURN_IF_FAILED_EXPECTED(CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(_threadMgrEx.addressof())));
THROW_IF_FAILED(_threadMgrEx->ActivateEx(&_clientId, s_activationFlags.load(std::memory_order_relaxed))); RETURN_IF_FAILED(_threadMgrEx->ActivateEx(&_clientId, s_activationFlags.load(std::memory_order_relaxed)));
THROW_IF_FAILED(_threadMgrEx->CreateDocumentMgr(_documentMgr.addressof())); RETURN_IF_FAILED(_threadMgrEx->CreateDocumentMgr(_documentMgr.addressof()));
TfEditCookie ecTextStore; TfEditCookie ecTextStore;
THROW_IF_FAILED(_documentMgr->CreateContext(_clientId, 0, static_cast<ITfContextOwnerCompositionSink*>(this), _context.addressof(), &ecTextStore)); RETURN_IF_FAILED(_documentMgr->CreateContext(_clientId, 0, static_cast<ITfContextOwnerCompositionSink*>(this), _context.addressof(), &ecTextStore));
_ownerCompositionServices = _context.try_query<ITfContextOwnerCompositionServices>(); _ownerCompositionServices = _context.try_query<ITfContextOwnerCompositionServices>();
_contextSource = _context.query<ITfSource>(); _contextSource = _context.query<ITfSource>();
THROW_IF_FAILED(_contextSource->AdviseSink(IID_ITfContextOwner, static_cast<ITfContextOwner*>(this), &_cookieContextOwner)); RETURN_IF_FAILED(_contextSource->AdviseSink(IID_ITfContextOwner, static_cast<ITfContextOwner*>(this), &_cookieContextOwner));
THROW_IF_FAILED(_contextSource->AdviseSink(IID_ITfTextEditSink, static_cast<ITfTextEditSink*>(this), &_cookieTextEditSink)); RETURN_IF_FAILED(_contextSource->AdviseSink(IID_ITfTextEditSink, static_cast<ITfTextEditSink*>(this), &_cookieTextEditSink));
THROW_IF_FAILED(_documentMgr->Push(_context.get())); RETURN_IF_FAILED(_documentMgr->Push(_context.get()));
return true; return S_OK;
} }
void Implementation::Uninitialize() noexcept void Implementation::Uninitialize() noexcept

View File

@@ -21,7 +21,7 @@ namespace Microsoft::Console::TSF
virtual ~Implementation() = default; virtual ~Implementation() = default;
bool Initialize(); HRESULT Initialize();
void Uninitialize() noexcept; void Uninitialize() noexcept;
HWND FindWindowOfActiveTSF() noexcept; HWND FindWindowOfActiveTSF() noexcept;
void AssociateFocus(IDataProvider* provider); void AssociateFocus(IDataProvider* provider);

View File

@@ -234,7 +234,7 @@ IFACEMETHODIMP ScreenInfoUiaProviderBase::GetSelection(_Outptr_result_maybenull_
UiaTracing::TextProvider::GetSelection(*this, *range.Get()); UiaTracing::TextProvider::GetSelection(*this, *range.Get());
LONG currentIndex = 0; LONG currentIndex = 0;
hr = SafeArrayPutElement(*ppRetVal, &currentIndex, range.Detach()); hr = SafeArrayPutElement(*ppRetVal, &currentIndex, range.Get());
if (FAILED(hr)) if (FAILED(hr))
{ {
SafeArrayDestroy(*ppRetVal); SafeArrayDestroy(*ppRetVal);
@@ -278,7 +278,7 @@ IFACEMETHODIMP ScreenInfoUiaProviderBase::GetVisibleRanges(_Outptr_result_mayben
UiaTracing::TextProvider::GetVisibleRanges(*this, *range.Get()); UiaTracing::TextProvider::GetVisibleRanges(*this, *range.Get());
LONG currentIndex = 0; LONG currentIndex = 0;
hr = SafeArrayPutElement(*ppRetVal, &currentIndex, range.Detach()); hr = SafeArrayPutElement(*ppRetVal, &currentIndex, range.Get());
if (FAILED(hr)) if (FAILED(hr))
{ {
SafeArrayDestroy(*ppRetVal); SafeArrayDestroy(*ppRetVal);

View File

@@ -1490,19 +1490,25 @@ void UiaTextRangeBase::_moveEndpointByUnitWord(_In_ const int moveCount,
{ {
success = false; success = false;
} }
else if (buffer.MoveToNextWord(nextPos, _wordDelimiters, documentEnd))
{
resultPos = nextPos;
(*pAmountMoved)++;
}
else if (allowBottomExclusive)
{
resultPos = documentEnd;
(*pAmountMoved)++;
}
else else
{ {
success = false; // Move to the end of the current word (including trailing whitespace),
// which is also the start of the next word
const auto wordEnd = buffer.GetWordEnd(nextPos, _wordDelimiters, true, documentEnd);
if (wordEnd < documentEnd)
{
resultPos = wordEnd;
(*pAmountMoved)++;
}
else if (allowBottomExclusive)
{
resultPos = documentEnd;
(*pAmountMoved)++;
}
else
{
success = false;
}
} }
break; break;
} }
@@ -1520,14 +1526,22 @@ void UiaTextRangeBase::_moveEndpointByUnitWord(_In_ const int moveCount,
// to the next branch and move to the previous word! // to the next branch and move to the previous word!
(*pAmountMoved)--; (*pAmountMoved)--;
} }
else if (buffer.MoveToPreviousWord(nextPos, _wordDelimiters))
{
resultPos = nextPos;
(*pAmountMoved)--;
}
else else
{ {
resultPos = bufferOrigin; // Move to the beginning of the current word
auto copy = buffer.GetWordStart(nextPos, _wordDelimiters, true, documentEnd);
// Step back one position, then find the start of that word
if (!buffer.GetSize().DecrementInBounds(copy, true))
{
// can't move behind current word
resultPos = bufferOrigin;
}
else
{
resultPos = buffer.GetWordStart(copy, _wordDelimiters, true, documentEnd);
(*pAmountMoved)--;
}
} }
break; break;
} }

View File

@@ -28,6 +28,9 @@ TARGETLIBS = \
$(ONECORE_EXTERNAL_SDK_LIB_PATH)\ntdll.lib \ $(ONECORE_EXTERNAL_SDK_LIB_PATH)\ntdll.lib \
$(TARGETLIBS) \ $(TARGETLIBS) \
DELAYLOAD = \
icu.dll \
# ------------------------------------- # -------------------------------------
# Localization # Localization
# ------------------------------------- # -------------------------------------

View File

@@ -39,7 +39,8 @@ static Pipes createPipes()
VERIFY_IS_TRUE(SetHandleInformation(p.our.out.get(), HANDLE_FLAG_INHERIT, 0)); VERIFY_IS_TRUE(SetHandleInformation(p.our.out.get(), HANDLE_FLAG_INHERIT, 0));
// ConPTY requests a DA1 report on startup. Emulate the response from the terminal. // ConPTY requests a DA1 report on startup. Emulate the response from the terminal.
WriteFile(p.our.in.get(), "\x1b[?61c", 6, nullptr, nullptr); DWORD written{};
WriteFile(p.our.in.get(), "\x1b[?61c", 6, &written, nullptr);
return p; return p;
} }
@@ -125,6 +126,7 @@ static HRESULT AttachPseudoConsole(HPCON hPC, std::wstring command, PROCESS_INFO
STARTUPINFOEXW siEx{}; STARTUPINFOEXW siEx{};
siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW); siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW);
siEx.StartupInfo.dwFlags = STARTF_USESTDHANDLES; // we will leave the handles empty to ensure none are inherited.
siEx.lpAttributeList = reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(buffer.get()); siEx.lpAttributeList = reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(buffer.get());
RETURN_IF_WIN32_BOOL_FALSE(InitializeProcThreadAttributeList(siEx.lpAttributeList, 1, 0, &size)); RETURN_IF_WIN32_BOOL_FALSE(InitializeProcThreadAttributeList(siEx.lpAttributeList, 1, 0, &size));

View File

@@ -207,8 +207,13 @@ foreach ($xamlFile in Get-ChildItem -Path $SourceDir -Filter *.xaml)
continue continue
} }
# Extract Name (prefer x:Name over Name) # Extract Name via GetAttribute to avoid PowerShell's XML integration
$name = $null -ne $settingContainer.Name ? $settingContainer.Name : "" # returning the element name (e.g. "local:SettingContainer") when x:Name is absent.
$name = $settingContainer.GetAttribute("x:Name")
if ([string]::IsNullOrEmpty($name))
{
$name = ""
}
if ($filename -eq "Appearances.xaml") if ($filename -eq "Appearances.xaml")
{ {
# Profile.Appearance settings need a special prefix for the ElementName. # Profile.Appearance settings need a special prefix for the ElementName.

View File

@@ -33,13 +33,7 @@ Function Mangle-CommitMessage($object) {
$s $s
} }
Function Get-Git2GitIgnoresAsExcludes() { Import-Module "$PSScriptRoot\OpenConsole.psd1"
$filters = (Get-Content (Join-Path (& git rev-parse --show-toplevel) consolegit2gitfilters.json) | ConvertFrom-Json)
$excludes = $filters.ContainsFilters | ? { $_ -Ne "/." } | % { $_ -Replace "^/","" }
$excludes += $filters.SuffixFilters | % { "**/*$_"; "*$_" }
$excludes += $filters.PrefixFilters | % { "**/$_*"; "$_*" }
$excludes | % { ":(top,exclude)$_" }
}
$Excludes = Get-Git2GitIgnoresAsExcludes $Excludes = Get-Git2GitIgnoresAsExcludes
Write-Verbose "IGNORING: $Excludes" Write-Verbose "IGNORING: $Excludes"

81
tools/OpenConsole.psd1 Normal file
View File

@@ -0,0 +1,81 @@
#
# Module manifest for module 'OpenConsole'
#
@{
# Script module or binary module file associated with this manifest.
RootModule = '.\OpenConsole.psm1'
# Version number of this module.
ModuleVersion = '0.0.1'
# Supported PSEditions
# CompatiblePSEditions = @()
# ID used to uniquely identify this module
GUID = '54190442-b882-4aea-b8a6-a65f9d56026c'
# Author of this module
Author = 'duhowett'
# Company or vendor of this module
CompanyName = 'Microsoft Corporation'
# Copyright statement for this module
Copyright = '(c) Microsoft Corporation.'
# Modules that must be imported into the global environment prior to importing this module
# RequiredModules = @()
# Assemblies that must be loaded prior to importing this module
# RequiredAssemblies = @()
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
# ScriptsToProcess = @()
# Type files (.ps1xml) to be loaded when importing this module
# TypesToProcess = @()
# Format files (.ps1xml) to be loaded when importing this module
# FormatsToProcess = @()
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
# NestedModules = @()
CmdletsToExport = @()
VariablesToExport = @()
AliasesToExport = @()
FunctionsToExport = @(
'Set-MsbuildDevEnvironment',
'Invoke-OpenConsoleTests',
'Invoke-OpenConsoleBuild',
'Start-OpenConsole',
'Debug-OpenConsole',
'Invoke-CodeFormat',
'Invoke-XamlFormat',
'Test-XamlFormat',
'Find-OpenConsoleRoot',
'Get-Git2GitIgnoresAsExcludes',
'New-ConhostIngestionArchive'
)
# DSC resources to export from this module
# DscResourcesToExport = @()
# List of all modules packaged with this module
# ModuleList = @()
# List of all files packaged with this module
# FileList = @()
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
PrivateData = @{
PSData = @{
} # End of PSData hashtable
} # End of PrivateData hashtable
}

View File

@@ -431,4 +431,22 @@ function Invoke-CodeFormat() {
} }
} }
Export-ModuleMember -Function Set-MsbuildDevEnvironment,Invoke-OpenConsoleTests,Invoke-OpenConsoleBuild,Start-OpenConsole,Debug-OpenConsole,Invoke-CodeFormat,Invoke-XamlFormat,Test-XamlFormat Function Get-Git2GitIgnoresAsExcludes() {
$filters = (Get-Content (Join-Path (Find-OpenConsoleRoot) consolegit2gitfilters.json) | ConvertFrom-Json)
$excludes = $filters.ContainsFilters | ? { $_ -Ne "/." } | % { $_ -Replace "^/","" }
$excludes += $filters.SuffixFilters | % { "**/*$_"; "*$_" }
$excludes += $filters.PrefixFilters | % { "**/$_*"; "$_*" }
$excludes | % { ":(top,exclude)$_" }
}
Function New-ConhostIngestionArchive() {
[CmdletBinding()]
param(
[parameter(Mandatory=$true, Position=0)]
[string]$Path
)
& git archive -o $Path HEAD (Get-Git2GitIgnoresAsExcludes)
Get-Item $Path
}
Export-ModuleMember -Function Set-MsbuildDevEnvironment,Invoke-OpenConsoleTests,Invoke-OpenConsoleBuild,Start-OpenConsole,Debug-OpenConsole,Invoke-CodeFormat,Invoke-XamlFormat,Test-XamlFormat,Get-Git2GitIgnoresAsExcludes,New-ConhostIngestionArchive