Compare commits

...

46 Commits

Author SHA1 Message Date
Mike Griese
972464b403 Log when WindowsTerminal.exe starts (#17745)
as discussed in team sync

(cherry picked from commit 60ac45c239)
Service-Card-Id: 93750274
Service-Version: 1.20
2024-08-20 11:44:12 -05:00
Dustin L. Howett
60544d783b Restore the ability to disable checking for URLs (#17731)
Fixes #17727

(cherry picked from commit 735ef2823e)
Service-Card-Id: 93736212
Service-Version: 1.20
2024-08-20 11:44:10 -05:00
Carlos Zamora
56e96c30b0 schema: add reloadEnvironmentVariables to newTerminalArgs (#17696)
(cherry picked from commit 1511d2c2ad)
Service-Card-Id: 93522518
Service-Version: 1.20
2024-08-20 11:44:09 -05:00
Dustin L. Howett
7e67791f45 Switch to the new and beautiful VS Dev Shell icons (#17706)
We got some new icons for Developer Command Prompt and Developer
PowerShell from our friends over on Visual Studio!

This pull request includes them in the package, and fixes up the VS
dynamic profiles to reset any icons that matched the old paths.

This may be a minor breaking change for user settings, but we're making
the assumption that if they didn't change their VS profile icons from
the defaults, they probably want to follow us to the new defaults.

To prevent anything like this from happening again, we're going to stop
serializing icons for stub profiles.

I've also included a VS version of the PowerShell "black" icon which is
currently unused, but can be used in the future for PS7+-based VS Dev
Shell.

Closes #17627

(cherry picked from commit 06c07ab50d)
Service-Card-Id: 93531228
Service-Version: 1.20
2024-08-20 11:44:07 -05:00
Carlos Zamora
a8064e7eef Log number of interactive sessions (#17682)
This sends a telemetry event if a session is interacted with.
Specifically, key events are essential to have an interactive session in
Windows Terminal, so we're tracking sessions that have had a key down
event.

(cherry picked from commit ac865e6666)
Service-Card-Id: 93498659
Service-Version: 1.20
2024-08-13 16:22:48 -05:00
Leonard Hecker
85e79e9c8d Fix colors getting lost on reflow (#17568)
The "copy the remaining attributes" loop assumes that it has full
ownership over the rows that it copies. For that to be true,
we have to of course make sure that the current write-cursor
is at a fresh, new row in the first place.

## Validation Steps Performed
* In a new pwsh tab with 120 colums:
  ``Write-Host -NoNewline "`e[36m$('a'*120)`e[m"; sleep 10``
* Resize the window wider
* Color doesn't get lost

(cherry picked from commit 2f43886ab5)
Service-Card-Id: 93522523
Service-Version: 1.20
2024-08-13 16:22:47 -05:00
Leonard Hecker
a11b37efad AtlasEngine: Fix a buffer overrun (#17536)
The strided `memcpy` between buffers failed to account for situations
where the destination stride is smaller than the source stride.
The solution is to only copy as many bytes as are in each row.

## Validation Steps Performed
Even with AppVerifier the issue could not be reproduced.
Adding an `assert(srcStride <= mapped.RowPitch)`, however, did trap
the bug when WARP is used while BackendD3D is force-enabled.

(cherry picked from commit ae8c868a1c)
Service-Card-Id: 92972719
Service-Version: 1.20
2024-07-09 17:52:39 -05:00
Dustin L. Howett
58073ce869 Fix MacType renderer warning callback
Fixes: c318eb947
2024-06-26 14:49:08 -05:00
Windows Console Service Bot
18f564df43 Localization Updates for #17369 (#17380)
(cherry picked from commit 5359e71ca1)
Service-Card-Id: 92701123
Service-Version: 1.20
2024-06-25 19:45:29 -05:00
flyingcat
30882240a5 Make subsequent windows open in the foreground (#17368)
Sometimes subsequent WT windows open in the background behind other
applications. This PR tries to fix it.

Refs #15895
Refs #15479

Mysterious bug (and annoying). There are even some discussions about
happening to the first startup, not just subsequent ones. Sometimes the
window may show up without animation too. So I don't think this is the
final solution, but it did get solved on my computer, for now.

## Validation Steps Performed
0. Quit all WT windows if some.
1. Open File Explorer, click "Open in Terminal" in context menu.
2. Move the newly opened window and minimize it.
3. Back to step 1 and repeat several times.
4. All the windows should open in the foreground correctly (yet possibly
without animation).

---------

Co-authored-by: Mike Griese <migrie@microsoft.com>
(cherry picked from commit c52ba7dec6)
Service-Card-Id: 92715121
Service-Version: 1.20
2024-06-25 19:44:16 -05:00
Leonard Hecker
c318eb9473 Warn when using old MacType versions (#17369)
This adds a check for whether MacType is injected and whether it's
a known bad version (pre-2023). In that case we avoid calling the
known faulty `ID2D1Device4` interface. We could avoid it in general to
fix the issue without a warning (it's only a very mild optimization),
but on the other hand, the bug that MacType has is a very serious one
and it's probably better overall to suggest users to update.

See: https://github.com/snowie2000/mactype/pull/938

* MacType 2021.1-RC1 results in a warning and no crash 
* MacType 2023.5.31 results in no warning 

---------

Co-authored-by: Dustin L. Howett <duhowett@microsoft.com>
(cherry picked from commit 9317d42045)
Service-Card-Id: 92687128
Service-Version: 1.20
2024-06-07 17:55:36 -05:00
Leonard Hecker
0e6ecdafef Support valid out-of-bounds access in utextAccess (#17361)
`utextAccess` apparently doesn't actually need to clamp the
`chunkOffset` to be in range of the current chunk. Also, I missed to
implement the part of the spec that says to leave the iterator on the
first/last chunk of the `UText` in case of an out-of-bounds index.

This PR fixes the issue by simply not returning early, doing a more
liberal clamp of the offset, and then checking whether it was in range.

As an aside, this also fixes a one-off bug when hovering URLs that
end on the very last cell of the viewport (or are cut off).

Closes #17343

## Validation Steps Performed
* Write an URL that wraps across the last 2 lines in the buffer
* Scroll 1 line up
* No assert 
* Hovering the URL shows the full, still visible parts of the URL 

(cherry picked from commit 261a3fec7a)
Service-Card-Id: 92678595
Service-Version: 1.20
2024-06-07 17:54:09 -05:00
Windows Console Service Bot
72596d9371 Localization Updates - fix issues in Korean, Italian, Spanish (#17304)
Closes #12665
Closes #12712
Closes #16867

(cherry picked from commit 13de7c6685)
Service-Card-Id: 92614019
Service-Version: 1.20
2024-06-07 17:51:16 -05:00
Tushar Singh
20d5b843fd Fix hyperlinks using an extra character at the end (#17326)
Closes: #17323

- Run `echo Hello ^(https://github.com/microsoft/terminal^)` in cmd.
- Ctrl+click on the URL opens `https://github.com/microsoft/terminal` in
the browser.
- Hovering over the url in the terminal shows
`https://github.com/microsoft/terminal` in the hover UI.

(cherry picked from commit 212f43e7fb)
Service-Card-Id: 92637504
Service-Version: 1.20
2024-06-07 17:51:15 -05:00
Dustin L. Howett
27fff2c1a3 build: move ESRP to a parameterized subtask which takes signingId (#17216)
This centralized all our ESRP calls in one file, which will make it
easier in the future when we are invariable required to change how we
call it again.

(cherry picked from commit 5ce7fb7403)
Service-Card-Id: 92577954
Service-Version: 1.20
2024-05-17 12:41:17 -05:00
Dustin L. Howett
5f3492f8bc build: switch to ESRP v5, which supports managed identities (#17134)
This required me to push a bunch more parameters through the build
pipeline, but it gave me the opportunity to define them as variables
that can be set at queue time.

(cherry picked from commit 2f52f27197)
Service-Card-Id: 92577964
Service-Version: 1.20
2024-05-17 12:41:16 -05:00
Leonard Hecker
b02c11b4aa AtlasEngine: Improve robustness against weird font sizes (#17258)
This clamps the font sizes between 1 and 100. Additionally, it fixes
a warning that I randomly noticed when reproducing the issue: D2D
complained that `EndDraw` must be called before releasing resources.
Finally, this fixes a crash when the terminal size is exactly (1,1)
cells, which happened because the initial (invalid) size was (1,1) too.

This doesn't fully fix all font-size related issues, but that's
currently difficult to achieve, as for instance the swap chain size
isn't actually based on the window size, nay, it's based on the cell
size multiplied by the cell count. So if the cell size is egregiously
large then we get a swap chain size that's larger than the display and
potentially larger than what the GPU supports which results in errors.

Closes #17227

(cherry picked from commit f62d2d5d2c)
Service-Card-Id: 92546859
Service-Version: 1.20
2024-05-16 18:59:45 -05:00
Dustin L. Howett
fc6f83e086 ServicingPipeline: Warn when local release-XX branch is not uptodate (#17260)
This prevents me from making dumb mistakes, really.

(cherry picked from commit bf55c44460)
Service-Card-Id: 92546837
Service-Version: 1.20
2024-05-16 18:59:44 -05:00
Leonard Hecker
488bef7bca Backport session persistence fixes in #17211 and #17268 (#17269)
As the title says, this backports the changes in #17211 and #17268:
* `PersistState` being called when the window is closed
  (as opposed to closing the tab). The settings check was missing.
* Avoid persisting windows with 0 tabs (= last tab gets closed).
2024-05-16 02:10:53 +02:00
Leonard Hecker
c6c078834c Fix race conditions in UiaTextRangeBase (#17257)
We need to lock the buffer when getting the viewport/cursor position.
This caused the UIA overlay to randomly fail to update.

## Validation Steps Performed
* Open a cmd tab and hold any key immediately
* Repeat until you're somewhat confident it's gone 

(cherry picked from commit e1b102a354)
Service-Card-Id: 92546851
Service-Version: 1.20
2024-05-13 12:34:28 -05:00
Tushar Singh
2c5018db43 Fix single-tab window tear-off crash (#17251)
## Validation Steps Performed
- Opened multi-tab terminal window with Narrator. Narrator can read
characters from the tabs.
- Started a drag and drop (tear-off) of a tab, and it didn't crash. This
was repeated multiple times.

(cherry picked from commit 30ef1f461d)
Service-Card-Id: 92546868
Service-Version: 1.20
2024-05-13 12:34:27 -05:00
Leonard Hecker
0cc5194def Add nullptr checks to shared_ptr conversions (#17199)
We use `if (auto self = weakSelf.get())` in a lot of places.
That assigns the value to `self` and then checks if it's truthy.
Sometimes we need to add a "is (app) closing" check because XAML,
so we wrote something akin to `if (self = ...; !closing)`.

But that's wrong because the correct `if (foo)` is the same as
`if (void; foo)` and not `if (foo; void)` and that meant that
we didn't check for `self`'s truthiness anymore.

This issue became apparent now, because we added a new kind of
delayed callback invocation (which is a lot cheaper).
This made the lack of a `nullptr` check finally obvious.

(cherry picked from commit 6d0342f0bb)
Service-Card-Id: 92509287
Service-Version: 1.20
2024-05-07 17:14:43 -05:00
Leonard Hecker
2b156d2efe Make UTextFromTextBuffer newline aware (#17120)
This PR achieves two things:
* When encountering rows with newlines (`WasForceWrapped` = `false`)
  we'll now copy the contents out of the row and append a `\n`.
  To make `utext_clone` cheap, it adds a reference counted buffer.
* Text extraction in `Terminal::GetHyperlinkAtBufferPosition`
  was fixed by using a higher level `TextBuffer::GetPlainText`
  instead of iterating through each cell.

Closes #16676
Closes #17065

## Validation Steps Performed
* In pwsh execute the following:
  ``"`e[999C`e[22Dhttps://example.com/foo`nbar"``
* Hovering over the URL only underlines `.../foo` and not `bar` 
* The tooltip ends in `.../foo` and not `.../fo` 

(cherry picked from commit 5b8eadb2ea)
Service-Card-Id: 92509615
Service-Version: 1.20
2024-05-07 17:12:35 -05:00
Dustin L. Howett
e349130d4e Fix ed2923ba by backporting HRESULT change from de7f9312 2024-05-06 16:30:48 -05:00
Dustin L. Howett
42bc7f20a9 PGO: train 1.20 separately 2024-05-06 16:03:08 -05:00
Leonard Hecker
ed2923ba8c AtlasEngine: Fix several error handling bugs (#17193)
This fixes:
* `HRESULT`s not being shown as unsigned hex
* `D2DERR_RECREATE_TARGET` not being handled
* 4 calls not checking their `HRESULT` return
  Out of the 4 only `CreateCompatibleRenderTarget` will throw in
  practice, however it throws `D2DERR_RECREATE_TARGET` which is common.
  Without this error handling, AtlasEngine may crash.

* Set Graphics API to Direct2D
* Use `DXGIAdapterRemovalSupportTest.exe` to trigger
  `D2DERR_RECREATE_TARGET`
* No error message is shown 
* If the `D2DERR_RECREATE_TARGET` handling is removed, the application
  never crashes due to `cursorRenderTarget` being `nullptr` 

(cherry picked from commit b31059e53e)
Service-Card-Id: 92500372
Service-Version: 1.20
2024-05-06 16:01:27 -05:00
Dustin L. Howett
345d266350 Take wrapping into account when expanding wordwise selections (#17170)
Closes #17165

(cherry picked from commit 6cda6797f8)
Service-Card-Id: 92471634
Service-Version: 1.20
2024-05-06 15:59:58 -05:00
Dustin L. Howett
47da9a0502 Fix RequestLaunchPosition (e2a076c038) 2024-04-30 15:58:05 -05:00
James Holderness
12a5c95b98 Fix the DECTCEM reset position in the conpty stream (#17148)
## Summary of the Pull Request

When the conpty renderer determines that it needs to hide the cursor,
it does so by inserting a `DECTCEM` reset sequence at the start of the
output buffer, assuming that is the start of the frame. But when the
`_noFlushOnEnd` flag is set, you can have multiple frames pending in the
buffer, and the `DECTCEM` sequence will then end up in the wrong place.

This PR fixes the issue by saving the buffer size at the start of the
frame, and using that saved offset as the insert position for the
`DECTCEM` sequence.

## Validation Steps Performed

I have a game that was frequently affected by this issue (the cursor
would be visible when it was meant to be hidden). With this PR applied,
it now works perfectly.

## PR Checklist
- [x] Closes #15449

(cherry picked from commit ef318a1450)
Service-Card-Id: 92457090
Service-Version: 1.20
2024-04-30 14:26:41 -05:00
Mike Griese
fa7198de88 Fix repositioning with the cursor, again (#17141)
This shouldn't have ever worked...? This looks like it was a typo and
should have been `mark.end`.

Thanks @joadoumie for asking about the moving the cursor in the prompt,
that convo lead to me finding this.

(cherry picked from commit d14ff939dc)
Service-Card-Id: 92441646
Service-Version: 1.20
2024-04-30 14:26:39 -05:00
Dustin L. Howett
164df3c959 Revert "Properly fix ConPTY buffer corking (#16793)"
This reverts commit 275e8d115a.
2024-04-30 14:15:03 -05:00
Dustin L. Howett
743d5681cf Update Cascadia Code to 2404.23 (#17137)
This update adds support for:

- Unicode 16 Large Type Pieces (they are really cool, you *have* to see
them)
- Unicode 13 Sextants (U+1FB00 - U+1FB3B)
- Octants, sedecimants, eights, miscellanrous blocks, separated
quadrants and sextants, and diagonals
- Segmented digits (think LED numbers)
- Checkerboards

It also fixes the coordinate system used in all of the blocks,
half-blocks, quadrants and eights for consistency.

This update does **not** include the new "Nerd Fonts" variant of
Cascadia Code or Cascadia Mono.

With big thanks to @PhMajerus for contributing all of the new symbols
for legacy computing.

See microsoft/cascadia-code#723, microsoft/cascadia-code#708 and
microsoft/cascadia-code#727 for more details.

(cherry picked from commit 41bb28c46d)
Service-Card-Id: 92434845
Service-Version: 1.20
2024-04-26 11:33:08 -05:00
Mike Griese
464c0a3b3d Fix persisting the size of a focus mode window (#17068)
While I was fixing the initial position thing, I figured I'd fix this
too. We were mistakenly accounting for the size of the titlebar when we
should launch into focus mode (without one)

Closes #10730

(cherry picked from commit f36d589a8e)
Service-Card-Id: 92410732
Service-Version: 1.20
2024-04-26 11:33:06 -05:00
Dustin L. Howett
fb3147fd44 build: disable CheckCFlags for now, as it is blowing up the build (#17116)
OneBranch no likey. A test build is running now.

(cherry picked from commit 19f43f70bd)
Service-Card-Id: 92421264
Service-Version: 1.20
2024-04-26 11:33:04 -05:00
Dustin L. Howett
849766cda3 [REPLAY] Move to AzureFileCopy@6 for Managed Identity support (#17121)
This is required for us to move off Entra ID Application identity.

(cherry picked from commit 2e7c3fa313)

This was approved in #16957, so I will merge with one signoff.

(cherry picked from commit 3a63832c31)
Service-Card-Id: 92421061
Service-Version: 1.20
2024-04-26 11:33:03 -05:00
PankajBhojwani
7bb70b0330 Update Azure Cloud Shell API to the newer version (#17115)
Updates the `api-version` to `2023-02-01-preview` when requesting for
CloudShell settings and shell

## Validation Steps Performed
Can still use Azure Cloud Shell through Windows Terminal

(cherry picked from commit ce4e0df7b0)
Service-Card-Id: 92411552
Service-Version: 1.20
2024-04-26 11:33:01 -05:00
Leonard Hecker
f442109748 AtlasEngine: Fix custom shader time imprecision (#17104)
Since floats are imprecise we need to constrain the time value into a
range that can be accurately represented. Assuming a monitor refresh
rate of 1000 Hz, we can still easily represent 1000 seconds accurately
(roughly 16 minutes). So to solve this, we'll simply treat the shader
time modulo 1000s. This may lead to some unexpected jank every 16min
but it keeps any ongoing animation smooth otherwise.

(cherry picked from commit daffb2dbbf)
Service-Card-Id: 92409332
Service-Version: 1.20
2024-04-23 16:50:22 -05:00
Leonard Hecker
8c1316cf09 Fix TerminalPage not being released on window close (#17107)
Because this holds onto the root element, `TerminalPage` gets "leaked"
on Windows 10 when a window is closed until another is opened.

## Validation Steps Performed
* Set a breakpoint in `Renderer::~Renderer`
* Open and close a window
* Breakpoint used to not get hit and now it does 

(cherry picked from commit a590a1bff0)
Service-Card-Id: 92407667
Service-Version: 1.20
2024-04-23 16:49:58 -05:00
Mike Griese
e2a076c038 Also remember to persist window positions (#17066)
This got lost in #16598. `TerminalPage` needs to ask the window where
the it actually is, so it can persist it. More details in
https://github.com/microsoft/terminal/pull/16598#discussion_r1511519304

Closes #17010

(cherry picked from commit 643f7167a6)
Service-Card-Id: 92360686
Service-Version: 1.20
2024-04-23 16:49:57 -05:00
Leonard Hecker
ff99f4b7c4 [1.20] Backport session persistence improvements (#17049)
This contains all the changes of 5dda507, c4c5206, 9f08ee7, and
5f10159 (#16598 and all related PRs), but without the buffer restore
feature. The hope is that these changes fix some rarer issues
we've been hearing about, where persistence doesn't work correctly.

## Validation Steps Performed
This changeset was tested on Windows 11 with 2 windows and 4 tabs
where 1 tab had 2 mixed split panes. All windows and tabs got
restored properly. It didn't crash on Windows 10.
2024-04-23 16:47:14 -05:00
Dustin L. Howett
7637e89566 [1.20] Revert search result highlighting from stable (#17103)
This wasn't guarded under velocity, and some of the fixes are coming in
too hot to be serviced into 1.20.

Reverts PR #16227 and #16691
2024-04-23 12:00:23 -07:00
Leonard Hecker
8a6941c269 Replace WinRT clipboard API with Win32 for copying (#17006)
In the spirit of #15360 this implements the copy part.
The problem is that we have an issue accessing the clipboard while
other applications continue to work just fine. The major difference
between us and the others is that we use the WinRT clipboard APIs.
So, the idea is that we just use the Win32 APIs instead.

The feel-good side-effect is that this is (no joke) 200-1000x faster,
but I suspect no one will notice the -3ms difference down to <0.01ms.

The objective effect however is that it just works.

This may resolve #16982.

* Cycle through Text/HTML/RTF-only in the Interaction settings
* Paste the contents into Word each time
* Text is plain and HTML/RTF are colored 

(cherry picked from commit 5f3a857192)
Service-Card-Id: 92308708
Service-Version: 1.20
2024-04-22 17:27:52 -05:00
Leonard Hecker
c0b2f55b87 Add more TraceLogging to ApiDispatchers (#17085)
More TraceLogging = More better?
I made this change as I noticed that most calls are not being logged.
Even after this change some crucial information won't be logged
(for instance arrays of `INPUT_RECORD`), because I couldn't come up
with a clever way to do so, but I think this is better than nothing.

(cherry picked from commit f49cf44b79)
Service-Card-Id: 92374415
Service-Version: 1.20
2024-04-22 17:25:39 -05:00
Tushar Singh
248665b9bb Fix window style under minimized state (#17058)
Closes: #13961

This PR changes the window styling we use under the minimized state. We
now retain the active window styling so the content's height doesn't
change when switching between minimized and maximized states.

## Validation Steps Performed
- Open Terminal and go into Maximized mode.
- Click on the Minimize button.
- No `SizeChanged` event in `ControlCore`.
- Click on the WT icon in the taskbar to restore it.
- No `SizeChanged` event in `ControlCore`.

(cherry picked from commit 11c4aa459d)
Service-Card-Id: 92350319
Service-Version: 1.20
2024-04-22 17:25:32 -05:00
Mike Griese
b5b32dad19 Add a WT_SETTINGS_DIR env variable that portable profiles can use (#16949)
Basically, title.

It'd be a neat idea for portable installs of the Terminal to reference
files that are right there in the portable install.

This PR adds a `WT_SETTINGS_DIR` var to Terminal's own env block. This
allows us to resolve profiles relative to our own settings folder.

Closes #16295

(cherry picked from commit 36c81f24fb)
Service-Card-Id: 92352620
Service-Version: 1.20
2024-04-22 17:22:54 -05:00
Leonard Hecker
a2ab91f8a4 Make ploc translations predictable (#16924)
(cherry picked from commit 77d5e23ef2)
Service-Card-Id: 92350470
Service-Version: 1.20
2024-04-16 10:49:08 -05:00
197 changed files with 3530 additions and 3699 deletions

View File

@@ -78,6 +78,7 @@ mnt
mru
nje
noreply
notwrapped
ogonek
ok'd
overlined

View File

@@ -1,6 +1,8 @@
ACLs
ADMINS
advapi
akv
AKV
altform
altforms
appendwttlogging
@@ -14,6 +16,7 @@ autoexec
backplating
bitmaps
BOMs
checkcflags
COMPUTERNAME
CPLs
cpptools
@@ -97,3 +100,4 @@ wtl
wtt
wttlog
Xamarin
xfgcheck

View File

@@ -19,6 +19,7 @@ AFew
AFill
AFX
AHelper
ahicon
ahz
AImpl
AInplace
@@ -227,6 +228,7 @@ commandline
commctrl
commdlg
COMMITID
commoncontrols
componentization
conapi
conareainfo
@@ -283,6 +285,7 @@ convarea
conwinuserrefs
coordnew
COPYCOLOR
COPYFROMRESOURCE
CORESYSTEM
cotaskmem
countof
@@ -578,6 +581,7 @@ EVENTID
eventing
evflags
evt
EXACTSIZEONLY
execd
executionengine
exemain
@@ -603,6 +607,7 @@ FEEF
fesb
FFAF
FFDE
FFFDb
FFrom
fgbg
FGCOLOR
@@ -772,6 +777,7 @@ hhx
HIBYTE
hicon
HIDEWINDOW
HIGHQUALITYSCALE
hinst
HISTORYBUFS
HISTORYNODUP
@@ -821,6 +827,7 @@ hwnd
HWNDPARENT
iccex
ICONERROR
ICONINFO
ICONINFORMATION
IConsole
ICONSTOP
@@ -842,7 +849,11 @@ IGNOREEND
IGNORELANGUAGE
IHosted
iid
IImage
IIo
ILC
ILCo
ILD
ime
IMPEXP
inbox
@@ -1116,8 +1127,8 @@ msix
msrc
MSVCRTD
MTSM
munges
Munged
munges
murmurhash
muxes
myapplet
@@ -1340,11 +1351,14 @@ pgomgr
PGONu
pguid
phhook
phico
phicon
phwnd
pidl
PIDLIST
pids
pii
piml
pinvoke
pipename
pipestr
@@ -1676,6 +1690,8 @@ slpit
SManifest
SMARTQUOTE
SMTO
snapcx
snapcy
SOLIDBOX
Solutiondir
somefile
@@ -1876,8 +1892,8 @@ UINTs
ul
ulcch
uld
uldb
uldash
uldb
ulwave
Unadvise
unattend

View File

@@ -9,7 +9,7 @@
<PropertyGroup>
<!-- Optional, defaults to main. Name of the branch which will be used for calculating branch point. -->
<PGOBranch>main</PGOBranch>
<PGOBranch>release-1.20</PGOBranch>
<!-- Mandatory. Name of the NuGet package which will contain PGO databases for consumption by build system. -->
<PGOPackageName>Microsoft.Internal.Windows.Terminal.PGODatabase</PGOPackageName>

View File

@@ -75,6 +75,7 @@ steps:
rm LocOutputMunged.tar
rm -r -fo LocOutput
& ./build/scripts/Copy-ContextMenuResourcesToCascadiaPackage.ps1
& ./build/scripts/Generate-PseudoLocalizations.ps1
displayName: Move Loc files to the right places
- pwsh: |-

View File

@@ -30,6 +30,13 @@ extends:
buildTerminal: true
pgoBuildMode: Optimize
codeSign: true
signingIdentity:
serviceName: $(SigningServiceName)
appId: $(SigningAppId)
tenantId: $(SigningTenantId)
akvName: $(SigningAKVName)
authCertName: $(SigningAuthCertName)
signCertName: $(SigningSignCertName)
publishSymbolsToPublic: true
publishVpackToWindows: false
symbolExpiryTime: 15

View File

@@ -78,6 +78,13 @@ extends:
buildConfigurations: ${{ parameters.buildConfigurations }}
buildPlatforms: ${{ parameters.buildPlatforms }}
codeSign: true
signingIdentity:
serviceName: $(SigningServiceName)
appId: $(SigningAppId)
tenantId: $(SigningTenantId)
akvName: $(SigningAKVName)
authCertName: $(SigningAuthCertName)
signCertName: $(SigningSignCertName)
terminalInternalPackageVersion: ${{ parameters.terminalInternalPackageVersion }}
publishSymbolsToPublic: ${{ parameters.publishSymbolsToPublic }}
publishVpackToWindows: ${{ parameters.publishVpackToWindows }}

View File

@@ -27,6 +27,9 @@ parameters:
- name: publishArtifacts
type: boolean
default: true
- name: signingIdentity
type: object
default: {}
jobs:
- job: ${{ parameters.jobName }}
@@ -97,31 +100,32 @@ jobs:
flattenFolders: true
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@3
displayName: Submit *.nupkg to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
FolderPath: $(Build.ArtifactStagingDirectory)/nupkg
Pattern: '*.nupkg'
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetSign",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- template: steps-esrp-signing.yml
parameters:
displayName: Submit *.nupkg to ESRP for code signing
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: $(Build.ArtifactStagingDirectory)/nupkg
Pattern: '*.nupkg'
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetSign",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- ${{ if eq(parameters.generateSbom, true) }}:
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0

View File

@@ -65,6 +65,9 @@ parameters:
- name: removeAllNonSignedFiles
type: boolean
default: false
- name: signingIdentity
type: object
default: {}
jobs:
- job: ${{ parameters.jobName }}
@@ -235,13 +238,14 @@ jobs:
# Code-sign everything we just put together.
# We run the signing in Terminal.BinDir, because all of the signing batches are relative to the final architecture/configuration output folder.
- task: EsrpCodeSigning@3
displayName: Submit Signing Request
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
FolderPath: '$(Terminal.BinDir)'
signType: batchSigning
batchSignPolicyFile: '$(Build.SourcesDirectory)/ESRPSigningConfig.json'
- template: steps-esrp-signing.yml
parameters:
displayName: Submit Signing Request
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: '$(Terminal.BinDir)'
signType: batchSigning
batchSignPolicyFile: '$(Build.SourcesDirectory)/ESRPSigningConfig.json'
# We only need to re-pack the MSIX if we actually signed, so this can stay in the codeSign conditional
- ${{ if or(parameters.buildTerminal, parameters.buildEverything) }}:

View File

@@ -80,7 +80,7 @@ jobs:
Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute
displayName: Install Azure Module Dependencies
- task: AzureFileCopy@5
- task: AzureFileCopy@6
displayName: Publish to Storage Account
inputs:
sourcePath: _out/*

View File

@@ -32,6 +32,9 @@ parameters:
- name: afterBuildSteps
type: stepList
default: []
- name: signingIdentity
type: object
default: {}
jobs:
- job: ${{ parameters.jobName }}
@@ -94,40 +97,41 @@ jobs:
displayName: Create msixbundle
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@3
displayName: Submit *.msixbundle to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
FolderPath: $(System.ArtifactsDirectory)\bundle
Pattern: $(BundleStemName)*.msixbundle
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "Dynamic",
"CertTemplateName": "WINMSAPP1ST",
"CertSubjectName": "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US",
"OperationCode": "SigntoolSign",
"Parameters": {
"OpusName": "Microsoft",
"OpusInfo": "http://www.microsoft.com",
"FileDigest": "/fd \"SHA256\"",
"TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "Dynamic",
"CertTemplateName": "WINMSAPP1ST",
"CertSubjectName": "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US",
"OperationCode": "SigntoolVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- template: steps-esrp-signing.yml
parameters:
displayName: Submit *.msixbundle to ESRP for code signing
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: $(System.ArtifactsDirectory)\bundle
Pattern: $(BundleStemName)*.msixbundle
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "Dynamic",
"CertTemplateName": "WINMSAPP1ST",
"CertSubjectName": "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US",
"OperationCode": "SigntoolSign",
"Parameters": {
"OpusName": "Microsoft",
"OpusInfo": "http://www.microsoft.com",
"FileDigest": "/fd \"SHA256\"",
"TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "Dynamic",
"CertTemplateName": "WINMSAPP1ST",
"CertSubjectName": "CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US",
"OperationCode": "SigntoolVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- ${{ if eq(parameters.generateSbom, true) }}:
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0

View File

@@ -27,6 +27,9 @@ parameters:
- name: publishArtifacts
type: boolean
default: true
- name: signingIdentity
type: object
default: {}
jobs:
- job: ${{ parameters.jobName }}
@@ -82,31 +85,32 @@ jobs:
versionEnvVar: XES_PACKAGEVERSIONNUMBER
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@3
displayName: Submit *.nupkg to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
FolderPath: $(Build.ArtifactStagingDirectory)/nupkg
Pattern: '*.nupkg'
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetSign",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- template: steps-esrp-signing.yml
parameters:
displayName: Submit *.nupkg to ESRP for code signing
signingIdentity: ${{ parameters.signingIdentity }}
inputs:
FolderPath: $(Build.ArtifactStagingDirectory)/nupkg
Pattern: '*.nupkg'
UseMinimatch: true
signConfigType: inlineSignParams
inlineOperation: >-
[
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetSign",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
},
{
"KeyCode": "CP-401405",
"OperationCode": "NuGetVerify",
"Parameters": {},
"ToolName": "sign",
"ToolVersion": "1.0"
}
]
- ${{ if eq(parameters.generateSbom, true) }}:
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0

View File

@@ -33,7 +33,7 @@ parameters:
- arm64
- name: codeSign
type: boolean
default: true
default: false
- name: generateSbom
type: boolean
default: true

View File

@@ -60,6 +60,9 @@ parameters:
- name: extraPublishJobs
type: object
default: []
- name: signingIdentity
type: object
default: {}
resources:
repositories:
@@ -82,6 +85,7 @@ extends:
cloudvault: # https://aka.ms/obpipelines/cloudvault
enabled: false
globalSdl: # https://aka.ms/obpipelines/sdl
enableCheckCFlags: false # CheckCFlags is broken and exploding our builds; to remove, :g/BAD-FLAGS/d
asyncSdl:
enabled: true
tsaOptionsFile: 'build/config/tsa.json'
@@ -107,6 +111,8 @@ extends:
parameters:
pool: { type: windows }
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(JobOutputDirectory)
@@ -122,6 +128,7 @@ extends:
generateSbom: false # this is handled by onebranch
removeAllNonSignedFiles: true # appease the overlords
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
beforeBuildSteps: # Right before we build, lay down the universal package and localizations
- task: PkgESSetupBuild@12
displayName: Package ES - Setup Build
@@ -141,6 +148,8 @@ extends:
parameters:
pool: { type: windows }
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(JobOutputDirectory)
@@ -156,6 +165,7 @@ extends:
generateSbom: false # this is handled by onebranch
removeAllNonSignedFiles: true # appease the overlords
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
beforeBuildSteps:
- task: PkgESSetupBuild@12
displayName: Package ES - Setup Build
@@ -172,6 +182,8 @@ extends:
parameters:
pool: { type: windows }
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(JobOutputDirectory)
@@ -207,6 +219,7 @@ extends:
buildPlatforms: ${{ parameters.buildPlatforms }}
generateSbom: false # Handled by onebranch
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
afterBuildSteps:
# This directory has to exist, even if we aren't using createvpack, because the Guardian rules demand it.
- pwsh: |-
@@ -223,6 +236,8 @@ extends:
parameters:
pool: { type: windows }
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(JobOutputDirectory)
@@ -232,12 +247,15 @@ extends:
buildPlatforms: ${{ parameters.buildPlatforms }}
generateSbom: false # this is handled by onebranch
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
- ${{ if eq(parameters.buildWPF, true) }}:
- template: ./build/pipelines/templates-v2/job-build-package-wpf.yml@self
parameters:
pool: { type: windows }
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(JobOutputDirectory)
@@ -247,6 +265,7 @@ extends:
buildPlatforms: ${{ parameters.buildPlatforms }}
generateSbom: false # this is handled by onebranch
codeSign: ${{ parameters.codeSign }}
signingIdentity: ${{ parameters.signingIdentity }}
- stage: Publish
displayName: Publish
@@ -260,6 +279,8 @@ extends:
subscription: ${{ parameters.symbolPublishingSubscription }}
symbolProject: ${{ parameters.symbolPublishingProject }}
variables:
ob_sdl_checkcflags_enabled: false # BAD-FLAGS
ob_sdl_xfgcheck_enabled: false # BAD-FLAGS
ob_git_checkout: false # This job checks itself out
ob_git_skip_checkout_none: true
ob_outputDirectory: $(Build.ArtifactStagingDirectory)

View File

@@ -0,0 +1,22 @@
parameters:
- name: displayName
type: string
default: ESRP Code Signing
- name: inputs
type: object
default: {}
- name: signingIdentity
type: object
default: {}
steps:
- task: EsrpCodeSigning@5
displayName: ${{ parameters.displayName }}
inputs:
ConnectedServiceName: ${{ parameters.signingIdentity.serviceName }}
AppRegistrationClientId: ${{ parameters.signingIdentity.appId }}
AppRegistrationTenantId: ${{ parameters.signingIdentity.tenantId }}
AuthAKVName: ${{ parameters.signingIdentity.akvName }}
AuthCertName: ${{ parameters.signingIdentity.authCertName }}
AuthSignCertName: ${{ parameters.signingIdentity.signCertName }}
${{ insert }}: ${{ parameters.inputs }}

View File

@@ -0,0 +1,16 @@
Get-ChildItem -Recurse -Filter *.resw
| Where-Object { $_.Directory.Name.StartsWith("qps-ploc") }
| ForEach-Object {
$source = Join-Path $_.Directory "../en-US/$($_.Name)"
$target = $_
$ploc = ./tools/ConvertTo-PseudoLocalization.ps1 -Path $source
$writerSettings = [System.Xml.XmlWriterSettings]::new()
$writerSettings.NewLineChars = "`r`n"
$writerSettings.Indent = $true
$writer = [System.Xml.XmlWriter]::Create($target, $writerSettings)
$ploc.Save($writer)
$writer.Flush()
$writer.Close()
}

View File

@@ -618,6 +618,11 @@
"type": "boolean",
"default": false,
"description": "This will override the profile's `elevate` setting."
},
"reloadEnvironmentVariables": {
"type": "boolean",
"default": true,
"description": "When set to true, a new environment block will be generated when creating a new session. Otherwise, the session will inherit the variables the Terminal was started with."
}
},
"type": "object"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -8,5 +8,5 @@ Please consult the [license](https://raw.githubusercontent.com/microsoft/cascadi
### Fonts Included
* Cascadia Code, Cascadia Mono (2111.01)
* from microsoft/cascadia-code@de36d62e777d34d3bed92a7e23988e5d61e0ba02
* Cascadia Code, Cascadia Mono (2404.23)
* from microsoft/cascadia-code@1034791e5fc6e060a448d2b29cd94a6c683edb36

View File

@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AppDescription" xml:space="preserve">
<value>А şςѓάţćћ ǻрр ƒθŗ χÂΜĿ Íŝĺąήðş ŧеšτş !!! !!! !!! !</value>
<value>Ά śςґàτсн ąρφ ƒоř ΧΆΜĻ Ìŝļàиđś τёşτś !!! !!! !!! !</value>
</data>
</root>

View File

@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AppDescription" xml:space="preserve">
<value>Ă šςґаτćĥ àρφ ƒǿя ЖΆΜĹ Іѕℓаñďş ťêšţŝ !!! !!! !!! !</value>
<value>Ά śςґàτсн ąρφ ƒоř ΧΆΜĻ Ìŝļàиđś τёşτś !!! !!! !!! !</value>
</data>
</root>

View File

@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AppDescription" xml:space="preserve">
<value>Ă śćяǻт¢н ãрρ ƒσг ХĂМĽ Īşłдήďѕ ťέśτş !!! !!! !!! !</value>
<value>Ά śςґàτсн ąρφ ƒоř ΧΆΜĻ Ìŝļàиđś τёşτś !!! !!! !!! !</value>
</data>
</root>

View File

@@ -6,19 +6,87 @@
#include "textBuffer.hpp"
// All of these are somewhat annoying when trying to implement RefcountBuffer.
// You can't stuff a unique_ptr into ut->q (= void*) after all.
#pragma warning(disable : 26402) // Return a scoped object instead of a heap-allocated if it has a move constructor (r.3).
#pragma warning(disable : 26403) // Reset or explicitly delete an owner<T> pointer '...' (r.3).
#pragma warning(disable : 26409) // Avoid calling new and delete explicitly, use std::make_unique<T> instead (r.11).
struct RowRange
{
til::CoordType begin;
til::CoordType end;
};
struct RefcountBuffer
{
size_t references;
size_t capacity;
wchar_t data[1];
static RefcountBuffer* EnsureCapacityForOverwrite(RefcountBuffer* buffer, size_t capacity)
{
// We must not just ensure that `buffer` has at least `capacity`, but also that its reference count is <= 1, because otherwise we would resize a shared buffer.
if (buffer != nullptr && buffer->references <= 1 && buffer->capacity >= capacity)
{
return buffer;
}
const auto oldCapacity = buffer ? buffer->capacity << 1 : 0;
const auto newCapacity = std::max(capacity + 128, oldCapacity);
const auto newBuffer = static_cast<RefcountBuffer*>(::operator new(sizeof(RefcountBuffer) - sizeof(data) + newCapacity * sizeof(wchar_t)));
if (!newBuffer)
{
return nullptr;
}
if (buffer)
{
buffer->Release();
}
// Copying the old buffer's data is not necessary because utextAccess() will scribble right over it.
newBuffer->references = 1;
newBuffer->capacity = newCapacity;
return newBuffer;
}
void AddRef() noexcept
{
// With our usage patterns, either of these two would indicate
// an unbalanced AddRef/Release or a memory corruption.
assert(references > 0 && references < 1000);
references++;
}
void Release() noexcept
{
// With our usage patterns, either of these two would indicate
// an unbalanced AddRef/Release or a memory corruption.
assert(references > 0 && references < 1000);
if (--references == 0)
{
::operator delete(this);
}
}
};
constexpr size_t& accessLength(UText* ut) noexcept
{
static_assert(sizeof(ut->p) == sizeof(size_t));
return *std::bit_cast<size_t*>(&ut->p);
}
constexpr RefcountBuffer*& accessBuffer(UText* ut) noexcept
{
static_assert(sizeof(ut->q) == sizeof(RefcountBuffer*));
return *std::bit_cast<RefcountBuffer**>(&ut->q);
}
constexpr RowRange& accessRowRange(UText* ut) noexcept
{
static_assert(sizeof(ut->a) == sizeof(RowRange));
return *std::bit_cast<RowRange*>(&ut->a);
}
@@ -56,11 +124,16 @@ static UText* U_CALLCONV utextClone(UText* dest, const UText* src, UBool deep, U
}
dest = utext_setup(dest, 0, status);
if (*status <= U_ZERO_ERROR)
if (*status > U_ZERO_ERROR)
{
memcpy(dest, src, sizeof(UText));
return dest;
}
memcpy(dest, src, sizeof(UText));
if (const auto buf = accessBuffer(dest))
{
buf->AddRef();
}
return dest;
}
@@ -82,7 +155,9 @@ try
for (til::CoordType y = range.begin; y < range.end; ++y)
{
length += textBuffer.GetRowByOffset(y).GetText().size();
const auto& row = textBuffer.GetRowByOffset(y);
// Later down below we'll add a newline to the text if !wasWrapForced, so we need to account for that here.
length += row.GetText().size() + !row.WasWrapForced();
}
accessLength(ut) = length;
@@ -111,12 +186,9 @@ catch (...)
static UBool U_CALLCONV utextAccess(UText* ut, int64_t nativeIndex, UBool forward) noexcept
try
{
if (nativeIndex < 0)
{
nativeIndex = 0;
}
auto neededIndex = nativeIndex;
// This will make it simpler for us to search the row that contains the nativeIndex,
// because we'll now only need to check for `start<=index<limit` and nothing else.
if (!forward)
{
neededIndex--;
@@ -124,13 +196,17 @@ try
const auto& textBuffer = *static_cast<const TextBuffer*>(ut->context);
const auto range = accessRowRange(ut);
auto start = ut->chunkNativeStart;
auto limit = ut->chunkNativeLimit;
auto y = accessCurrentRow(ut);
std::wstring_view text;
const auto startOld = ut->chunkNativeStart;
const auto limitOld = ut->chunkNativeLimit;
auto start = startOld;
auto limit = limitOld;
if (neededIndex < start || neededIndex >= limit)
if (neededIndex < startOld || neededIndex >= limitOld)
{
auto y = accessCurrentRow(ut);
std::wstring_view text;
bool wasWrapForced = false;
if (neededIndex < start)
{
do
@@ -138,12 +214,16 @@ try
--y;
if (y < range.begin)
{
return false;
break;
}
text = textBuffer.GetRowByOffset(y).GetText();
const auto& row = textBuffer.GetRowByOffset(y);
text = row.GetText();
wasWrapForced = row.WasWrapForced();
limit = start;
start -= text.size();
// Later down below we'll add a newline to the text if !wasWrapForced, so we need to account for that here.
start -= text.size() + !wasWrapForced;
} while (neededIndex < start);
}
else
@@ -153,35 +233,63 @@ try
++y;
if (y >= range.end)
{
return false;
break;
}
text = textBuffer.GetRowByOffset(y).GetText();
const auto& row = textBuffer.GetRowByOffset(y);
text = row.GetText();
wasWrapForced = row.WasWrapForced();
start = limit;
limit += text.size();
// Later down below we'll add a newline to the text if !wasWrapForced, so we need to account for that here.
limit += text.size() + !wasWrapForced;
} while (neededIndex >= limit);
}
accessCurrentRow(ut) = y;
ut->chunkNativeStart = start;
ut->chunkNativeLimit = limit;
ut->chunkLength = gsl::narrow_cast<int32_t>(text.size());
assert(start >= 0);
// If we have already calculated the total length we can also assert that the limit is in range.
assert(ut->p == nullptr || static_cast<size_t>(limit) <= accessLength(ut));
// Even if we went out-of-bounds, we still need to update the chunkContents to contain the first/last chunk.
if (limit != limitOld)
{
if (!wasWrapForced)
{
const auto newSize = text.size() + 1;
const auto buffer = RefcountBuffer::EnsureCapacityForOverwrite(accessBuffer(ut), newSize);
memcpy(&buffer->data[0], text.data(), text.size() * sizeof(wchar_t));
til::at(buffer->data, text.size()) = L'\n';
text = { &buffer->data[0], newSize };
accessBuffer(ut) = buffer;
}
accessCurrentRow(ut) = y;
ut->chunkNativeStart = start;
ut->chunkNativeLimit = limit;
ut->chunkLength = gsl::narrow_cast<int32_t>(text.size());
#pragma warning(suppress : 26490) // Don't use reinterpret_cast (type.1).
ut->chunkContents = reinterpret_cast<const char16_t*>(text.data());
ut->nativeIndexingLimit = ut->chunkLength;
ut->chunkContents = reinterpret_cast<const char16_t*>(text.data());
ut->nativeIndexingLimit = ut->chunkLength;
}
}
auto offset = gsl::narrow_cast<int32_t>(nativeIndex - start);
// The ICU documentation is a little bit misleading. It states:
// > @param forward [...] If true, start<=index<limit. If false, [...] start<index<=limit.
// but that's just for finding the target chunk. The chunkOffset is not actually constrained to that!
// std::clamp will perform a<=b<=c, which is what we want.
const auto clampedIndex = std::clamp(nativeIndex, start, limit);
auto offset = gsl::narrow_cast<int32_t>(clampedIndex - start);
// Don't leave the offset on a trailing surrogate pair. See U16_SET_CP_START.
// This assumes that the TextBuffer contains valid UTF-16 which may theoretically not be the case.
if (offset > 0 && offset < ut->chunkLength && U16_IS_TRAIL(til::at(ut->chunkContents, offset)))
{
offset--;
}
ut->chunkOffset = offset;
return true;
return neededIndex >= start && neededIndex < limit;
}
catch (...)
{
@@ -256,18 +364,32 @@ catch (...)
return 0;
}
static void U_CALLCONV utextClose(UText* ut) noexcept
{
if (const auto buffer = accessBuffer(ut))
{
buffer->Release();
}
}
static constexpr UTextFuncs utextFuncs{
.tableSize = sizeof(UTextFuncs),
.clone = utextClone,
.nativeLength = utextNativeLength,
.access = utextAccess,
.close = utextClose,
};
// Creates a UText from the given TextBuffer that spans rows [rowBeg,RowEnd).
UText Microsoft::Console::ICU::UTextFromTextBuffer(const TextBuffer& textBuffer, til::CoordType rowBeg, til::CoordType rowEnd) noexcept
Microsoft::Console::ICU::unique_utext Microsoft::Console::ICU::UTextFromTextBuffer(const TextBuffer& textBuffer, til::CoordType rowBeg, til::CoordType rowEnd) noexcept
{
#pragma warning(suppress : 26477) // Use 'nullptr' rather than 0 or NULL (es.47).
UText ut = UTEXT_INITIALIZER;
unique_utext ut{ UTEXT_INITIALIZER };
UErrorCode status = U_ZERO_ERROR;
utext_setup(&ut, 0, &status);
FAIL_FAST_IF(status > U_ZERO_ERROR);
ut.providerProperties = (1 << UTEXT_PROVIDER_LENGTH_IS_EXPENSIVE) | (1 << UTEXT_PROVIDER_STABLE_CHUNKS);
ut.pFuncs = &utextFuncs;
ut.context = &textBuffer;

View File

@@ -10,8 +10,9 @@ class TextBuffer;
namespace Microsoft::Console::ICU
{
using unique_uregex = wistd::unique_ptr<URegularExpression, wil::function_deleter<decltype(&uregex_close), &uregex_close>>;
using unique_utext = wil::unique_struct<UText, decltype(&utext_close), &utext_close>;
UText UTextFromTextBuffer(const TextBuffer& textBuffer, til::CoordType rowBeg, til::CoordType rowEnd) noexcept;
unique_utext UTextFromTextBuffer(const TextBuffer& textBuffer, til::CoordType rowBeg, til::CoordType rowEnd) noexcept;
unique_uregex CreateRegex(const std::wstring_view& pattern, uint32_t flags, UErrorCode* status) noexcept;
til::point_span BufferRangeFromMatch(UText* ut, URegularExpression* re);
}

View File

@@ -111,28 +111,6 @@ const til::point_span* Search::GetCurrent() const noexcept
return nullptr;
}
void Search::HighlightResults() const
{
std::vector<til::inclusive_rect> toSelect;
const auto& textBuffer = _renderData->GetTextBuffer();
for (const auto& r : _results)
{
const auto rbStart = textBuffer.BufferToScreenPosition(r.start);
const auto rbEnd = textBuffer.BufferToScreenPosition(r.end);
til::inclusive_rect re;
re.top = rbStart.y;
re.bottom = rbEnd.y;
re.left = rbStart.x;
re.right = rbEnd.x;
toSelect.emplace_back(re);
}
_renderData->SelectSearchRegions(std::move(toSelect));
}
// Routine Description:
// - Takes the found word and selects it in the screen buffer
@@ -149,7 +127,6 @@ bool Search::SelectCurrent() const
return true;
}
_renderData->ClearSelection();
return false;
}

View File

@@ -33,7 +33,6 @@ public:
void FindNext() noexcept;
const til::point_span* GetCurrent() const noexcept;
void HighlightResults() const;
bool SelectCurrent() const;
const std::vector<til::point_span>& Results() const noexcept;

View File

@@ -1414,10 +1414,23 @@ til::point TextBuffer::_GetWordStartForSelection(const til::point target, const
// expand left until we hit the left boundary or a different delimiter class
while (result != bufferSize.Origin() && _GetDelimiterClassAt(result, wordDelimiters) == initialDelimiter)
{
//prevent selection wrapping on whitespace selection
if (isControlChar && result.x == bufferSize.Left())
if (result.x == bufferSize.Left())
{
break;
// 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);
}
@@ -1537,10 +1550,22 @@ til::point TextBuffer::_GetWordEndForSelection(const til::point target, const st
// 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 (isControlChar && result.x == bufferSize.RightInclusive())
if (result.x == bufferSize.RightInclusive())
{
break;
// 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.IncrementInBoundsCircular(result);
}
@@ -1969,25 +1994,10 @@ size_t TextBuffer::SpanLength(const til::point coordStart, const til::point coor
// - end - where to end getting text
// Return Value:
// - Just the text.
std::wstring TextBuffer::GetPlainText(const til::point& start, const til::point& end) const
std::wstring TextBuffer::GetPlainText(const til::point start, const til::point end) const
{
std::wstring text;
auto spanLength = SpanLength(start, end);
text.reserve(spanLength);
auto it = GetCellDataAt(start);
for (; it && spanLength > 0; ++it, --spanLength)
{
const auto& cell = *it;
if (cell.DbcsAttr() != DbcsAttribute::Trailing)
{
const auto chars = cell.Chars();
text.append(chars);
}
}
return text;
const auto req = CopyRequest::FromConfig(*this, start, end, true, false, false, false);
return GetPlainText(req);
}
// Routine Description:
@@ -2702,6 +2712,15 @@ void TextBuffer::Reflow(TextBuffer& oldBuffer, TextBuffer& newBuffer, const View
}
}
// The for loop right after this if condition will copy entire rows of attributes at a time.
// This assumes of course that the "write cursor" (newX, newY) is at the start of a row.
// If we didn't check for this, we may otherwise copy attributes from a later row into a previous one.
if (newX != 0)
{
newX = 0;
newY++;
}
// Finish copying buffer attributes to remaining rows below the last
// printable character. This is to fix the `color 2f` scenario, where you
// change the buffer colors then resize and everything below the last

View File

@@ -232,7 +232,7 @@ public:
size_t SpanLength(const til::point coordStart, const til::point coordEnd) const;
std::wstring GetPlainText(const til::point& start, const til::point& end) const;
std::wstring GetPlainText(til::point start, til::point end) const;
struct CopyRequest
{

View File

@@ -589,13 +589,13 @@ namespace
TestBuffer{
{ 2, 5 }, // reduce width aggressively
{
{ L" ", true },
{ L" ", true },
{ L" ", true },
{ L" ", true },
{ L" ", false },
{ L" ", true },
{ L" ", true },
{ L" ", true },
{ L" ", true },
},
{ 1, 0 },
{ 1, 4 },
},
},
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Τнĕ Ņëω Ẅίηđŏẃś Ťėŗmįйάĺ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Ŵíňďōẁŝ Тєřмīπǻļ ωїτĥ å ρѓēνіéŵ θƒ ũφсőмϊπġ ƒєąτΰґёѕ !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Ŏрέи ìη Тèřmīŋªŀ (&amp;Cãńãґγ) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Φφєň ΐñ Ŧéгмϊñаľ &amp;Pŕėνĭώ !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ωρєⁿ ïπ &amp;Těѓmĭñäĺ !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Ťĥё Ñēщ Шίⁿðоẅś Ťėгмîήāľ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Шίηđóŵš Ŧĕяmїйà ẁітħ ª φяęνîёщ όƒ ûφĉбмíήĝ ƒêåťµřεŝ !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Óрëπ íи Ťēяmілǻŀ (&amp;Cäηàřÿ) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Óрзń ΐή Ŧěґмιлāℓ &amp;Pѓéνīĕω !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ôрëη ïп &amp;Tēѓмϊŋãł !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Тĥё Ńēẁ Шіπđοωš Тěřмιňαŀ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Шίήďŏшś Ŧêямĩňāľ ŵíτн ă ρѓëνιêω øƒ ũρčŏмįηğ ƒєáţũŗêš !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Фφěй ĩń Тêřmιπâł (&amp;Cãⁿǻřу) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Óφ℮ʼn ΐŋ Τėřmīйäĺ &amp;Pяєνϊëẃ !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ορέл ϊŋ &amp;Téŕmįñā !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -1,5 +0,0 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "pch.h"
#include "GetWindowLayoutArgs.h"
#include "GetWindowLayoutArgs.g.cpp"

View File

@@ -1,31 +0,0 @@
/*++
Copyright (c) Microsoft Corporation
Licensed under the MIT license.
Class Name:
- GetWindowLayoutArgs.h
Abstract:
- This is a helper class for getting the window layout from a peasant.
Depending on if we are running on the monarch or on a peasant we might need
to switch what thread we are executing on. This gives us the option of
either returning the json result synchronously, or as a promise.
--*/
#pragma once
#include "GetWindowLayoutArgs.g.h"
namespace winrt::Microsoft::Terminal::Remoting::implementation
{
struct GetWindowLayoutArgs : public GetWindowLayoutArgsT<GetWindowLayoutArgs>
{
WINRT_PROPERTY(winrt::hstring, WindowLayoutJson, L"");
WINRT_PROPERTY(winrt::Windows::Foundation::IAsyncOperation<winrt::hstring>, WindowLayoutJsonAsync, nullptr)
};
}
namespace winrt::Microsoft::Terminal::Remoting::factory_implementation
{
BASIC_FACTORY(GetWindowLayoutArgs);
}

View File

@@ -37,12 +37,6 @@
<ClInclude Include="WindowActivatedArgs.h">
<DependentUpon>Peasant.idl</DependentUpon>
</ClInclude>
<ClInclude Include="GetWindowLayoutArgs.h">
<DependentUpon>Peasant.idl</DependentUpon>
</ClInclude>
<ClInclude Include="QuitAllRequestedArgs.h">
<DependentUpon>Monarch.idl</DependentUpon>
</ClInclude>
<ClInclude Include="pch.h" />
<ClInclude Include="MonarchFactory.h" />
<ClInclude Include="Peasant.h">
@@ -78,12 +72,6 @@
<ClCompile Include="WindowActivatedArgs.cpp">
<DependentUpon>Peasant.idl</DependentUpon>
</ClCompile>
<ClCompile Include="GetWindowLayoutArgs.cpp">
<DependentUpon>Peasant.idl</DependentUpon>
</ClCompile>
<ClCompile Include="QuitAllRequestedArgs.cpp">
<DependentUpon>Monarch.idl</DependentUpon>
</ClCompile>
<ClCompile Include="pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>

View File

@@ -6,7 +6,6 @@
#include "Monarch.h"
#include "CommandlineArgs.h"
#include "FindTargetWindowArgs.h"
#include "QuitAllRequestedArgs.h"
#include "ProposeCommandlineResult.h"
#include "Monarch.g.cpp"
@@ -135,21 +134,13 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
// - <none> used
// Return Value:
// - <none>
winrt::fire_and_forget Monarch::_handleQuitAll(const winrt::Windows::Foundation::IInspectable& /*sender*/,
const winrt::Windows::Foundation::IInspectable& /*args*/)
void Monarch::_handleQuitAll(const winrt::Windows::Foundation::IInspectable& /*sender*/, const winrt::Windows::Foundation::IInspectable& /*args*/)
{
// Let the process hosting the monarch run any needed logic before
// closing all windows.
auto args = winrt::make_self<implementation::QuitAllRequestedArgs>();
_QuitAllRequestedHandlers(*this, *args);
if (const auto action = args->BeforeQuitAllAction())
if (_quitting.exchange(true, std::memory_order_relaxed))
{
co_await action;
return;
}
_quitting.store(true);
// Tell all peasants to exit.
const auto callback = [&](const auto& id, const auto& p) {
// We want to tell our peasant to quit last, so that we don't try
// to perform a bunch of elections on quit.
@@ -197,7 +188,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
// If we are quitting we don't care about maintaining our list of
// peasants anymore, and don't need to notify the host that something
// changed.
if (_quitting.load(std::memory_order_acquire))
if (_quitting.load(std::memory_order_relaxed))
{
return;
}
@@ -1036,30 +1027,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
_forEachPeasant(func, onError);
}
// Method Description:
// - Ask all peasants to return their window layout as json
// Arguments:
// - <none>
// Return Value:
// - The collection of window layouts from each peasant.
Windows::Foundation::Collections::IVector<winrt::hstring> Monarch::GetAllWindowLayouts()
{
std::vector<winrt::hstring> vec;
auto callback = [&](const auto& /*id*/, const auto& p) {
vec.emplace_back(p.GetWindowLayout());
};
auto onError = [](auto&& id) {
TraceLoggingWrite(g_hRemotingProvider,
"Monarch_GetAllWindowLayouts_Failed",
TraceLoggingInt64(id, "peasantID", "The ID of the peasant which we could not get a window layout from"),
TraceLoggingLevel(WINEVENT_LEVEL_VERBOSE),
TraceLoggingKeyword(TIL_KEYWORD_TRACE));
};
_forEachPeasant(callback, onError);
return winrt::single_threaded_vector(std::move(vec));
}
void Monarch::RequestMoveContent(winrt::hstring window,
winrt::hstring content,
uint32_t tabIndex,

View File

@@ -96,7 +96,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
void SummonAllWindows();
bool DoesQuakeWindowExist();
Windows::Foundation::Collections::IVectorView<winrt::Microsoft::Terminal::Remoting::PeasantInfo> GetPeasantInfos();
Windows::Foundation::Collections::IVector<winrt::hstring> GetAllWindowLayouts();
void RequestMoveContent(winrt::hstring window, winrt::hstring content, uint32_t tabIndex, const Windows::Foundation::IReference<Windows::Foundation::Rect>& windowBounds);
void RequestSendContent(const Remoting::RequestReceiveContentArgs& args);
@@ -106,8 +105,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
TYPED_EVENT(HideNotificationIconRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(WindowCreated, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(WindowClosed, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(QuitAllRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::QuitAllRequestedArgs);
TYPED_EVENT(RequestNewWindow, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs);
private:
@@ -146,8 +143,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
void _renameRequested(const winrt::Windows::Foundation::IInspectable& sender,
const winrt::Microsoft::Terminal::Remoting::RenameRequestArgs& args);
winrt::fire_and_forget _handleQuitAll(const winrt::Windows::Foundation::IInspectable& sender,
const winrt::Windows::Foundation::IInspectable& args);
void _handleQuitAll(const winrt::Windows::Foundation::IInspectable& sender,
const winrt::Windows::Foundation::IInspectable& args);
// Method Description:
// - Helper for doing something on each and every peasant.

View File

@@ -46,11 +46,6 @@ namespace Microsoft.Terminal.Remoting
Windows.Foundation.IReference<UInt64> WindowID;
}
[default_interface] runtimeclass QuitAllRequestedArgs {
QuitAllRequestedArgs();
Windows.Foundation.IAsyncAction BeforeQuitAllAction;
}
struct PeasantInfo
{
UInt64 Id;
@@ -72,7 +67,6 @@ namespace Microsoft.Terminal.Remoting
void SummonAllWindows();
Boolean DoesQuakeWindowExist();
Windows.Foundation.Collections.IVectorView<PeasantInfo> GetPeasantInfos { get; };
Windows.Foundation.Collections.IVector<String> GetAllWindowLayouts();
void RequestMoveContent(String window, String content, UInt32 tabIndex, Windows.Foundation.IReference<Windows.Foundation.Rect> bounds);
void RequestSendContent(RequestReceiveContentArgs args);
@@ -82,7 +76,6 @@ namespace Microsoft.Terminal.Remoting
event Windows.Foundation.TypedEventHandler<Object, Object> HideNotificationIconRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> WindowCreated;
event Windows.Foundation.TypedEventHandler<Object, Object> WindowClosed;
event Windows.Foundation.TypedEventHandler<Object, QuitAllRequestedArgs> QuitAllRequested;
event Windows.Foundation.TypedEventHandler<Object, WindowRequestedArgs> RequestNewWindow;
};

View File

@@ -5,7 +5,6 @@
#include "Peasant.h"
#include "CommandlineArgs.h"
#include "SummonWindowBehavior.h"
#include "GetWindowLayoutArgs.h"
#include "Peasant.g.cpp"
#include "../../types/inc/utils.hpp"
#include "AttachRequest.g.cpp"
@@ -309,26 +308,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
TraceLoggingKeyword(TIL_KEYWORD_TRACE));
}
// Method Description:
// - Request and return the window layout from the current TerminalPage
// Arguments:
// - <none>
// Return Value:
// - the window layout as a json string
hstring Peasant::GetWindowLayout()
{
auto args = winrt::make_self<implementation::GetWindowLayoutArgs>();
_GetWindowLayoutRequestedHandlers(nullptr, *args);
if (const auto op = args->WindowLayoutJsonAsync())
{
// This will fail if called on the UI thread, so the monarch should
// never set WindowLayoutJsonAsync.
auto str = op.get();
return str;
}
return args->WindowLayoutJson();
}
void Peasant::SendContent(const Remoting::RequestReceiveContentArgs& args)
{
_SendContentRequestedHandlers(*this, args);

View File

@@ -65,7 +65,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
winrt::Microsoft::Terminal::Remoting::CommandlineArgs InitialArgs();
winrt::hstring GetWindowLayout();
void SendContent(const winrt::Microsoft::Terminal::Remoting::RequestReceiveContentArgs& args);
WINRT_PROPERTY(winrt::hstring, WindowName);
@@ -82,7 +81,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
TYPED_EVENT(HideNotificationIconRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(QuitAllRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(QuitRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(GetWindowLayoutRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::GetWindowLayoutArgs);
TYPED_EVENT(AttachRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::AttachRequest);
TYPED_EVENT(SendContentRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::RequestReceiveContentArgs);

View File

@@ -32,12 +32,6 @@ namespace Microsoft.Terminal.Remoting
Windows.Foundation.DateTime ActivatedTime { get; };
};
[default_interface] runtimeclass GetWindowLayoutArgs {
GetWindowLayoutArgs();
String WindowLayoutJson;
Windows.Foundation.IAsyncOperation<String> WindowLayoutJsonAsync;
}
enum MonitorBehavior
{
InPlace,
@@ -88,7 +82,6 @@ namespace Microsoft.Terminal.Remoting
void RequestHideNotificationIcon();
void RequestQuitAll();
void Quit();
String GetWindowLayout();
void AttachContentToWindow(AttachRequest request);
void SendContent(RequestReceiveContentArgs args);
@@ -102,7 +95,6 @@ namespace Microsoft.Terminal.Remoting
event Windows.Foundation.TypedEventHandler<Object, Object> ShowNotificationIconRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> HideNotificationIconRequested;
event Windows.Foundation.TypedEventHandler<Object, GetWindowLayoutArgs> GetWindowLayoutRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> QuitAllRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> QuitRequested;

View File

@@ -1,5 +0,0 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "pch.h"
#include "QuitAllRequestedArgs.h"
#include "QuitAllRequestedArgs.g.cpp"

View File

@@ -1,29 +0,0 @@
/*++
Copyright (c) Microsoft Corporation
Licensed under the MIT license.
Class Name:
- QuitAllRequestedArgs.h
Abstract:
- This is a helper class for allowing the monarch to run code before telling all
peasants to quit. This way the monarch can raise an event and get back a future
to wait for before continuing.
--*/
#pragma once
#include "QuitAllRequestedArgs.g.h"
namespace winrt::Microsoft::Terminal::Remoting::implementation
{
struct QuitAllRequestedArgs : public QuitAllRequestedArgsT<QuitAllRequestedArgs>
{
WINRT_PROPERTY(winrt::Windows::Foundation::IAsyncAction, BeforeQuitAllAction, nullptr)
};
}
namespace winrt::Microsoft::Terminal::Remoting::factory_implementation
{
BASIC_FACTORY(QuitAllRequestedArgs);
}

View File

@@ -92,8 +92,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
_monarch.WindowCreated({ get_weak(), &WindowManager::_WindowCreatedHandlers });
_monarch.WindowClosed({ get_weak(), &WindowManager::_WindowClosedHandlers });
_monarch.FindTargetWindowRequested({ this, &WindowManager::_raiseFindTargetWindowRequested });
_monarch.QuitAllRequested({ get_weak(), &WindowManager::_QuitAllRequestedHandlers });
_monarch.RequestNewWindow({ get_weak(), &WindowManager::_raiseRequestNewWindow });
}
@@ -131,6 +129,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
// We connected to a monarch instance, not us though. This won't hit
// in isolated mode.
LOG_IF_FAILED(CoAllowSetForegroundWindow(winrt::get_unknown(_monarch), nullptr));
// Send the commandline over to the monarch process
if (_proposeToMonarch(args))
{
@@ -356,8 +356,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
_monarch.AddPeasant(*p);
p->GetWindowLayoutRequested({ get_weak(), &WindowManager::_GetWindowLayoutRequestedHandlers });
TraceLoggingWrite(g_hRemotingProvider,
"WindowManager_CreateOurPeasant",
TraceLoggingUInt64(p->GetID(), "peasantID", "The ID of our new peasant"),
@@ -412,18 +410,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
return 0;
}
// Method Description:
// - Ask the monarch to quit all windows.
// Arguments:
// - <none>
// Return Value:
// - <none>
winrt::fire_and_forget WindowManager::RequestQuitAll(Remoting::Peasant peasant)
{
co_await winrt::resume_background();
peasant.RequestQuitAll();
}
bool WindowManager::DoesQuakeWindowExist()
{
return _monarch.DoesQuakeWindowExist();
@@ -434,19 +420,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
winrt::get_self<implementation::Peasant>(peasant)->ActiveTabTitle(title);
}
Windows::Foundation::Collections::IVector<winrt::hstring> WindowManager::GetAllWindowLayouts()
{
if (_monarch)
{
try
{
return _monarch.GetAllWindowLayouts();
}
CATCH_LOG()
}
return nullptr;
}
winrt::fire_and_forget WindowManager::RequestMoveContent(winrt::hstring window,
winrt::hstring content,
uint32_t tabIndex,

View File

@@ -38,10 +38,8 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
uint64_t GetNumberOfPeasants();
static winrt::fire_and_forget RequestQuitAll(Remoting::Peasant peasant);
void UpdateActiveTabTitle(const winrt::hstring& title, const Remoting::Peasant& peasant);
Windows::Foundation::Collections::IVector<winrt::hstring> GetAllWindowLayouts();
bool DoesQuakeWindowExist();
winrt::fire_and_forget RequestMoveContent(winrt::hstring window, winrt::hstring content, uint32_t tabIndex, Windows::Foundation::IReference<Windows::Foundation::Rect> windowBounds);
@@ -51,9 +49,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
TYPED_EVENT(WindowCreated, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(WindowClosed, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
TYPED_EVENT(QuitAllRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::QuitAllRequestedArgs);
TYPED_EVENT(GetWindowLayoutRequested, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::GetWindowLayoutArgs);
TYPED_EVENT(RequestNewWindow, winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::WindowRequestedArgs);
private:

View File

@@ -14,12 +14,10 @@ namespace Microsoft.Terminal.Remoting
void SignalClose(Peasant p);
void UpdateActiveTabTitle(String title, Peasant p);
static void RequestQuitAll(Peasant p);
void SummonWindow(SummonWindowSelectionArgs args);
void SummonAllWindows();
Windows.Foundation.Collections.IVector<String> GetAllWindowLayouts();
Windows.Foundation.Collections.IVectorView<PeasantInfo> GetPeasantInfos();
UInt64 GetNumberOfPeasants();
@@ -33,8 +31,6 @@ namespace Microsoft.Terminal.Remoting
event Windows.Foundation.TypedEventHandler<Object, Object> WindowCreated;
event Windows.Foundation.TypedEventHandler<Object, Object> WindowClosed;
event Windows.Foundation.TypedEventHandler<Object, QuitAllRequestedArgs> QuitAllRequested;
event Windows.Foundation.TypedEventHandler<Object, GetWindowLayoutArgs> GetWindowLayoutRequested;
event Windows.Foundation.TypedEventHandler<Object, WindowRequestedArgs> RequestNewWindow;

View File

@@ -124,8 +124,7 @@ namespace winrt::TerminalApp::implementation
return appLogic->GetSettings();
}
AppLogic::AppLogic() :
_reloadState{ std::chrono::milliseconds(100), []() { ApplicationState::SharedInstance().Reload(); } }
AppLogic::AppLogic()
{
// For your own sanity, it's better to do setup outside the ctor.
// If you do any setup in the ctor that ends up throwing an exception,
@@ -150,6 +149,11 @@ namespace winrt::TerminalApp::implementation
_languageProfileNotifier = winrt::make_self<LanguageProfileNotifier>([this]() {
_reloadSettings->Run();
});
// Do this here, rather than at the top of main. This will prevent us from
// including this variable in the vars we serialize in the
// Remoting::CommandlineArgs up in HandleCommandlineArgs.
_setupFolderPathEnvVar();
}
// Method Description:
@@ -327,10 +331,6 @@ namespace winrt::TerminalApp::implementation
{
_reloadSettings->Run();
}
else if (ApplicationState::SharedInstance().IsStatePath(modifiedBasename))
{
_reloadState();
}
});
}
@@ -702,22 +702,6 @@ namespace winrt::TerminalApp::implementation
return _settings.GlobalSettings().ShouldUsePersistedLayout();
}
void AppLogic::SaveWindowLayoutJsons(const Windows::Foundation::Collections::IVector<hstring>& layouts)
{
std::vector<WindowLayout> converted;
converted.reserve(layouts.Size());
for (const auto& json : layouts)
{
if (json != L"")
{
converted.emplace_back(WindowLayout::FromJson(json));
}
}
ApplicationState::SharedInstance().PersistedWindowLayouts(winrt::single_threaded_vector(std::move(converted)));
}
TerminalApp::ParseCommandlineResult AppLogic::GetParseCommandlineMessage(array_view<const winrt::hstring> args)
{
::TerminalApp::AppCommandlineArgs _appArgs;
@@ -725,4 +709,14 @@ namespace winrt::TerminalApp::implementation
return TerminalApp::ParseCommandlineResult{ winrt::to_hstring(_appArgs.GetExitMessage()), r };
}
// Function Description
// * Adds a `WT_SETTINGS_DIR` env var to our own environment block, that
// points at our settings directory. This allows portable installs to
// refer to files in the portable install using %WT_SETTINGS_DIR%
void AppLogic::_setupFolderPathEnvVar()
{
std::wstring path{ CascadiaSettings::SettingsPath() };
auto folderPath = path.substr(0, path.find_last_of(L"\\"));
SetEnvironmentVariableW(L"WT_SETTINGS_DIR", folderPath.c_str());
}
}

View File

@@ -53,9 +53,7 @@ namespace winrt::TerminalApp::implementation
void NotifyRootInitialized();
bool HasSettingsStartupActions() const noexcept;
bool ShouldUsePersistedLayout() const;
void SaveWindowLayoutJsons(const Windows::Foundation::Collections::IVector<hstring>& layouts);
[[nodiscard]] Microsoft::Terminal::Settings::Model::CascadiaSettings GetSettings() const noexcept;
@@ -91,7 +89,6 @@ namespace winrt::TerminalApp::implementation
::TerminalApp::AppCommandlineArgs _settingsAppArgs;
std::shared_ptr<ThrottledFuncTrailing<>> _reloadSettings;
til::throttled_func_trailing<> _reloadState;
std::vector<Microsoft::Terminal::Settings::Model::SettingsLoadWarnings> _warnings{};
@@ -113,6 +110,8 @@ namespace winrt::TerminalApp::implementation
void _RegisterSettingsChange();
fire_and_forget _DispatchReloadSettings();
void _setupFolderPathEnvVar();
#ifdef UNIT_TESTING
friend class TerminalAppLocalTests::CommandlineTest;
#endif

View File

@@ -37,7 +37,6 @@ namespace TerminalApp
Boolean HasSettingsStartupActions();
Boolean ShouldUsePersistedLayout();
void SaveWindowLayoutJsons(Windows.Foundation.Collections.IVector<String> layouts);
void ReloadSettings();

View File

@@ -116,6 +116,9 @@ namespace winrt::TerminalApp::implementation
switch (visualState)
{
case WindowVisualState::WindowVisualStateIconified:
// Iconified (aka minimized) state should preserve the active window styling
break;
case WindowVisualState::WindowVisualStateMaximized:
VisualStateManager::GoToState(MaximizeButton(), L"WindowStateMaximized", false);
@@ -124,9 +127,7 @@ namespace winrt::TerminalApp::implementation
CloseButton().Height(maximizedHeight);
MaximizeToolTip().Text(RS_(L"WindowRestoreDownButtonToolTip"));
break;
case WindowVisualState::WindowVisualStateNormal:
case WindowVisualState::WindowVisualStateIconified:
default:
VisualStateManager::GoToState(MaximizeButton(), L"WindowStateNormal", false);

View File

@@ -19,7 +19,7 @@ using namespace winrt::Microsoft::Terminal::Settings::Model;
using namespace winrt::Microsoft::Terminal::Control;
using namespace winrt::Microsoft::Terminal::TerminalConnection;
using namespace winrt::TerminalApp;
using namespace TerminalApp;
using namespace winrt::TerminalApp::implementation;
static const int PaneBorderSize = 2;
static const int CombinedPaneBorderSize = 2 * PaneBorderSize;
@@ -124,7 +124,7 @@ void Pane::_removeControlEvents()
// terminal args.
// Return Value:
// - Arguments appropriate for a SplitPane or NewTab action
NewTerminalArgs Pane::GetTerminalArgsForPane(const bool asContent) const
NewTerminalArgs Pane::GetTerminalArgsForPane(BuildStartupKind kind) const
{
// Leaves are the only things that have controls
assert(_IsLeaf());
@@ -169,12 +169,17 @@ NewTerminalArgs Pane::GetTerminalArgsForPane(const bool asContent) const
// object. That would work for schemes set by the Terminal, but not ones set
// by VT, but that seems good enough.
// Only fill in the ContentId if absolutely needed. If you fill in a number
// here (even 0), we'll serialize that number, AND treat that action as an
// "attach existing" rather than a "create"
if (asContent)
switch (kind)
{
case BuildStartupKind::Content:
case BuildStartupKind::MovePane:
// Only fill in the ContentId if absolutely needed. If you fill in a number
// here (even 0), we'll serialize that number, AND treat that action as an
// "attach existing" rather than a "create"
args.ContentId(_control.ContentId());
break;
default:
break;
}
return args;
@@ -200,16 +205,13 @@ NewTerminalArgs Pane::GetTerminalArgsForPane(const bool asContent) const
// - The state from building the startup actions, includes a vector of commands,
// the original root pane, the id of the focused pane, and the number of panes
// created.
Pane::BuildStartupState Pane::BuildStartupActions(uint32_t currentId,
uint32_t nextId,
const bool asContent,
const bool asMovePane)
Pane::BuildStartupState Pane::BuildStartupActions(uint32_t currentId, uint32_t nextId, BuildStartupKind kind)
{
// Normally, if we're a leaf, return an empt set of actions, because the
// parent pane will build the SplitPane action for us. If we're building
// actions for a movePane action though, we'll still need to include
// ourselves.
if (!asMovePane && _IsLeaf())
if (kind != BuildStartupKind::MovePane && _IsLeaf())
{
if (_lastActive)
{
@@ -223,18 +225,18 @@ Pane::BuildStartupState Pane::BuildStartupActions(uint32_t currentId,
auto buildSplitPane = [&](auto newPane) {
ActionAndArgs actionAndArgs;
actionAndArgs.Action(ShortcutAction::SplitPane);
const auto terminalArgs{ newPane->GetTerminalArgsForPane(asContent) };
const auto terminalArgs{ newPane->GetTerminalArgsForPane(kind) };
// When creating a pane the split size is the size of the new pane
// and not position.
const auto splitDirection = _splitState == SplitState::Horizontal ? SplitDirection::Down : SplitDirection::Right;
const auto splitSize = (asContent && _IsLeaf() ? .5 : 1. - _desiredSplitPosition);
const auto splitSize = (kind != BuildStartupKind::None && _IsLeaf() ? .5 : 1. - _desiredSplitPosition);
SplitPaneArgs args{ SplitType::Manual, splitDirection, splitSize, terminalArgs };
actionAndArgs.Args(args);
return actionAndArgs;
};
if (asContent && _IsLeaf())
if (kind != BuildStartupKind::None && _IsLeaf())
{
return {
.args = { buildSplitPane(shared_from_this()) },
@@ -281,10 +283,10 @@ Pane::BuildStartupState Pane::BuildStartupActions(uint32_t currentId,
// We now need to execute the commands for each side of the tree
// We've done one split, so the first-most child will have currentId, and the
// one after it will be incremented.
auto firstState = _firstChild->BuildStartupActions(currentId, nextId + 1);
auto firstState = _firstChild->BuildStartupActions(currentId, nextId + 1, kind);
// the next id for the second branch depends on how many splits were in the
// first child.
auto secondState = _secondChild->BuildStartupActions(nextId, nextId + firstState.panesCreated + 1);
auto secondState = _secondChild->BuildStartupActions(nextId, nextId + firstState.panesCreated + 1, kind);
std::vector<ActionAndArgs> actions{};
actions.reserve(firstState.args.size() + secondState.args.size() + 3);

View File

@@ -31,6 +31,7 @@ namespace TerminalAppLocalTests
namespace winrt::TerminalApp::implementation
{
struct TerminalTab;
enum class BuildStartupKind;
}
enum class Borders : int
@@ -99,8 +100,8 @@ public:
std::optional<uint32_t> focusedPaneId;
uint32_t panesCreated;
};
BuildStartupState BuildStartupActions(uint32_t currentId, uint32_t nextId, const bool asContent = false, const bool asMovePane = false);
winrt::Microsoft::Terminal::Settings::Model::NewTerminalArgs GetTerminalArgsForPane(const bool asContent = false) const;
BuildStartupState BuildStartupActions(uint32_t currentId, uint32_t nextId, winrt::TerminalApp::implementation::BuildStartupKind kind);
winrt::Microsoft::Terminal::Settings::Model::NewTerminalArgs GetTerminalArgsForPane(winrt::TerminalApp::implementation::BuildStartupKind kind) const;
void UpdateSettings(const winrt::Microsoft::Terminal::Settings::Model::TerminalSettingsCreateResult& settings,
const winrt::Microsoft::Terminal::Settings::Model::Profile& profile);

View File

@@ -208,7 +208,7 @@
<value>Dividir pestaña</value>
</data>
<data name="SplitPaneText" xml:space="preserve">
<value>Panel dividido</value>
<value>Dividir panel</value>
</data>
<data name="SearchWebText" xml:space="preserve">
<value>Búsqueda en la web</value>

View File

@@ -421,13 +421,13 @@
<value>Apri nuova scheda</value>
</data>
<data name="NewPaneRun.Text" xml:space="preserve">
<value>ALT + clic per dividere la finestra corrente</value>
<value>ALT+CLIC per dividere la finestra corrente</value>
</data>
<data name="NewWindowRun.Text" xml:space="preserve">
<value>MAIUSC+clic per aprire una nuova finestra</value>
<value>MAIUSC+CLIC per aprire una nuova finestra</value>
</data>
<data name="ElevatedRun.Text" xml:space="preserve">
<value>CTRL+Clic per aprire come amministratore</value>
<value>CTRL+CLIC per aprire come amministratore</value>
</data>
<data name="WindowCloseButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Chiudi</value>

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Τнĕ Ņëω Ẅίηđŏẃś Ťėŗmįйάĺ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Ŵíňďōẁŝ Тєřмīπǻļ ωїτĥ å ρѓēνіéŵ θƒ ũφсőмϊπġ ƒєąτΰґёѕ !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Ŏрέи ìη Тèřmīŋªŀ (&amp;Cãńãґγ) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Φφєň ΐñ Ŧéгмϊñаľ &amp;Pŕėνĭώ !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ωρєⁿ ïπ &amp;Těѓmĭñäĺ !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -118,80 +118,80 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="InitialJsonParseErrorText" xml:space="preserve">
<value>Şėťŧіηĝѕ ¢ǿΰľď ʼnσŧ ъē ŀоαðзđ ƒŕôм ƒïłê. Сђěćĸ ƒǿŕ šулŧå× ёřґοгş, įήćļůđíʼnğ ťяαΐľίήğ ĉômš. !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Şετťĭиġś ςòűłď йσт ьé ŀŏдðéď ƒřǿм ƒīļē. Ĉнėćķ ƒσŗ ŝуήтª× ĕяŗбґş, ιйçľůďĩηĝ тŗāіļīňġ ćǿмŝ. !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="MissingDefaultProfileText" xml:space="preserve">
<value>Сθŭļď пǿţ ƒīпđ ŷŏúг δєƒǻůŀť ρřŏƒΐļę ій ýŏűя ĺīѕŧ őƒ ряσƒïℓëş - ŭŝĩʼnğ ťнз ƒìŕšτ φѓöƒїℓё. Сħëċķ ťθ маķë ŝύґè ŧћë "defaultProfile" mãтçĥεş τнę ĢŨÎĎ òƒ ǿиé оƒ ÿøųŕ φгоƒìļéş. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ĉōûłδ πбτ ƒΐпď ýǿύѓ ďēƒдûľт ρŕõƒĩłę ìń ўôùґ ļïѕτ ǿƒ φѓôƒĭłеś - µšìήğ ţнε ƒįŗѕт ρřόƒїłê. Ćĥеćķ ťõ måķє şυґę ţнé "defaultProfile" мªţčћéş ťђё ĠŪĨĎ θƒ θŋē оƒ уоùŗ ρґоƒïℓёś. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="\"defaultProfile\""}</comment>
</data>
<data name="DuplicateProfileText" xml:space="preserve">
<value>₣ǿΰʼnđ mųĺŧιρĺě ргöƒїℓęš щϊтħ ţђє ѕάмë ĢЏΊĎ ĩń ÿόůґ ŝεтŧĭлģş ƒíļе - įģиόяīπģ đυφļīčâťзѕ. Мãќĕ ŝúŕ℮ еάсĥ φяòƒĩℓę'ѕ ĜЏĪĎ íş űņíqцэ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>₣óŭиď мύŀťìрŀэ φŕσƒïĺєś ẃïτћ ŧнě ѕámĕ ĠŲІÐ įй ўоűя ѕĕţţîήĝš ƒìŀė - įģʼnǿřΐⁿğ δûρľΐçâтéŝ. Мãĸё śμѓέ ĕáĉћ ρяσƒîĺė'ѕ ĢŰĮÐ īş ϋńîqџë. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
</data>
<data name="UnknownColorSchemeText" xml:space="preserve">
<value>₣σцηδ ǻ φѓθƒίłε ŵīŧћ âⁿ īπνâŀϊδ "colorScheme". Ðëƒąŭłтійğ ťђàť φřőƒįĺё τό тђę δěƒαūļт ¢ōℓόřŝ. Макз šūгê тħªť ώĥέл ѕěттΐñğ â "colorScheme", ťĥэ νªℓùέ mάτćђеš ŧĥĕ "name" бƒ ā ċôĺöг ѕĉђęmз įη τђę "schemes" łíšţ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>₣ŏúņđ ā ρřόƒįľĕ щĭťћ ǻή ϊпνåŀίď "colorScheme". Ďēƒāúłтіиğ ţħąţ ряόƒίŀе ţŏ тĥέ ðеƒãµľţ çбĺбŗś. Мāκέ śûѓè ťћаτ ŵђéň ŝєŧťίńĝ д "colorScheme", τħε νåĺμě мäτςĥέş τнέ "name" όƒ а čòľбя ѕćнmē īń тћέ "schemes" ļίŝт. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="\"colorScheme\"","\"name\"","\"schemes\""}</comment>
</data>
<data name="NoProfilesText" xml:space="preserve">
<value>Νб ρяöƒΐłēѕ ẁèŗё ƒбύʼnð îń ўθůг ѕėţтîпĝš. !!! !!! !!! !!!</value>
<value>Ňǿ ρяóƒíℓěş щ℮ŕέ ƒòμйδ ϊη ỳοūґ ś℮ŧтĭπģѕ. !!! !!! !!! !!!</value>
</data>
<data name="AllProfilesHiddenText" xml:space="preserve">
<value>Àĺŀ ρґбƒіłεѕ щзяє ђїđδзʼn įň ýòυѓ šэτţĭήĝś. Ϋóũ mцşť ћàν℮ αť ŀèàşŧ öлě ⁿŏń-ђīδδéη φŗθƒìℓέ. !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Аℓł ρяοƒįłέš ωèяê ђΐđðěʼn îη ўőϋř śěŧτϊиģş. Ϋŏυ müѕŧ ħäνė άţ ļεǻѕτ οñє пóй-ћίďðēʼn φŗóƒįŀē. !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="ReloadJsonParseErrorText" xml:space="preserve">
<value>Şèťŧϊņģś сõüℓđ ηбţ ъέ яεłôåδěđ ƒŕόм ƒįļě. Çнэск ƒσя śÿηтå× ēřŕόѓŝ, іпċŀμðîʼnğ тŗǻϊĺīηĝ ¢ǿммãš. !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
<value>Ѕєŧτĩņğš ¢ŏûłď ποţ ьė řëĺбάδзď ƒŕŏм ƒίľе. Çĥэςκ ƒõг şÿπţаж ěгяōŗš, îņ¢ŀύðīⁿğ ťŕăïŀĩπĝ čǿmмãş. !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="UsingDefaultSettingsText" xml:space="preserve">
<value>Ťēмφőгάřĩℓу υѕїήģ τħє Ẅĩиδõώѕ Τёřмίпāľ ďēƒάυĺτ š℮τтĭńġѕ. !!! !!! !!! !!! !!! !</value>
<value>Ťемрőŗāřĩľŷ űśϊⁿģ ťђё Щìπδоωş Ţεѓмîήäĺ δêƒаμłт şèţτïńġś. !!! !!! !!! !!! !!! !</value>
</data>
<data name="InitialJsonParseErrorTitle" xml:space="preserve">
<value>₣áίĺėđ ţō ľбаð śэŧťίлğş !!! !!! </value>
<value>₣äĩľєď τσ ŀőåð ŝέťţĩⁿģŝ !!! !!! </value>
</data>
<data name="SettingsValidateErrorTitle" xml:space="preserve">
<value>Ëηςσϋлŧëŗėδ эŕřоґš ωĥιļ℮ ℓǿάδϊŋğ ūŝēŗ śετťΐπĝś !!! !!! !!! !!! !</value>
<value>Εŋĉőųņŧзяëď зяѓōяś ŵħΐļê ŀθαðĩήġ ùŝéѓ śзťŧĭпģŝ !!! !!! !!! !!! !</value>
</data>
<data name="KeyboardServiceDisabledDialog.PrimaryButtonText" xml:space="preserve">
<value>Κ </value>
<value>ÓΚ </value>
</data>
<data name="KeyboardServiceDisabledDialog.Title" xml:space="preserve">
<value>Ẅàřñíⁿģ: !!</value>
<value>Ŵаґήĩήģ: !!</value>
</data>
<data name="KeyboardServiceWarningText" xml:space="preserve">
<value>Ťнé "{0}" ιŝп'ŧ ŕμňήįŋģ ôń ỳθũŕ mªčђįпέ. Ţћіš čǻń ргëνзⁿţ ťĥε Τеŕmіήáĺ ƒŗøm ґêçэіνĩиģ ќ℮ÿъōåŗδ ìŋφџţ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ŧħє "{0}" ĭşп'ţ řμллĭиġ оʼn ўόùг мàςĥįńë. Ŧħїś ¢áⁿ φřэνєńτ тнэ Тэґмïñăĺ ƒŕöm ŗеς℮íνίиĝ ķēỳвŏαŗδ ĭⁿрΰţ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{0} will be replaced with the OS-localized name of the TabletInputService</comment>
</data>
<data name="Ok" xml:space="preserve">
<value>ÕК </value>
<value>ФĶ </value>
</data>
<data name="ReloadJsonParseErrorTitle" xml:space="preserve">
<value>₣ªïļеδ тő ŗεĺòãδ şетţіŋģѕ !!! !!! !</value>
<value>₣áĭļèđ ťσ ѓéłøǻð şèŧŧíпĝŝ !!! !!! !</value>
</data>
<data name="FeedbackUriValue" xml:space="preserve">
<value>https://go.microsoft.com/fwlink/?linkid=2125419</value>
<comment>{Locked}This is a FWLink, so it will be localized with the fwlink tool</comment>
</data>
<data name="AboutMenuItem" xml:space="preserve">
<value>Αьóμţ !</value>
<value>∆вòΰŧ !</value>
</data>
<data name="FeedbackMenuItem" xml:space="preserve">
<value>₣ēëďьдćк !!</value>
<value>₣ęęðъâçќ !!</value>
</data>
<data name="SettingsMenuItem" xml:space="preserve">
<value>Ѕēţťїñğś !!</value>
<value>Śêŧťіňğŝ !!</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Ćäπςèŀ !</value>
<value>Ĉάπςеŀ !</value>
</data>
<data name="CloseAll" xml:space="preserve">
<value>Ćļбŝĕ ªľľ !!!</value>
<value>Ċľθŝє αŀļ !!!</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Qύîτ !</value>
<value>Qùíт !</value>
</data>
<data name="CloseWindowWarningTitle" xml:space="preserve">
<value>Đô ÿòû шªñť τō ςŀθšě ǻľĺ τªвś? !!! !!! !!!</value>
<value>Đǿ ÿõű ŵãŋт тŏ ¢ľòŝê ăŀľ ŧãвŝ? !!! !!! !!!</value>
</data>
<data name="MultiplePanes" xml:space="preserve">
<value>Μµľťιφļė ρаńêѕ !!! !</value>
<value>Мµļтíрłĕ φдпėŝ !!! !</value>
</data>
<data name="TabCloseSubMenu" xml:space="preserve">
<value>Ćļôŝέ !</value>
@@ -224,7 +224,7 @@
<value>Ċµѕťøм !</value>
</data>
<data name="TabColorClearButton.Content" xml:space="preserve">
<value>Ŕĕšęτ !</value>
<value>Яěšěŧ !</value>
</data>
<data name="RenameTabText" xml:space="preserve">
<value>Γεñамē ťãв !!!</value>
@@ -233,33 +233,33 @@
<value>Ďϋφľіčάтέ τàв !!! </value>
</data>
<data name="InvalidBackgroundImage" xml:space="preserve">
<value>₣οüⁿδ ά ρѓőƒіĺз шιтћ аή îйνåℓīď "backgroundImage". Ðєƒâŭŀťïʼnģ ŧĥäτ рřŏƒīℓë τô ћãνё ñō ьàĉќġяοµπď îмǻġё. Μāκе ŝύґé ŧнàτ ẁћзή šĕτťійğ ά "backgroundImage", ťħē νдļûě íş ä νåĺϊđ ƒìℓę ραтħ ŧб ãή їmаĝē. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<value>₣σúŋδ ą φѓοƒĩļé ẃϊţħ äй ïηνàĺìď "backgroundImage". Đēƒãųŀŧϊпğ ťнªт φѓőƒĭļè το нªνе πō ьąçќġгθúпδ ιмãġė. Маĸē śμѓē ŧћäţ ẁђēή šêťτϊлġ å "backgroundImage", ţĥě νаłųё ïŝ ά νάľîď ƒĩŀê φąťħ ţŏ άń ΐмąġė. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="\"backgroundImage\""}</comment>
</data>
<data name="InvalidIcon" xml:space="preserve">
<value>₣øμηđ à φŗοƒïľë ŵіŧĥ åň îʼnνăľΐđ "icon". Ðзƒăϋľţĭņġ тĥãт рŗǿƒιℓë тŏ ђǻνê иŏ īсŏń. Мàĸę śϋгë τħáτ ωĥ℮ή ѕěťτΐήĝ åŋ "icon", тђĕ νªļцĕ īş α νάłįδ ƒįŀĕ φăτħ τо аη імäĝз. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
<value>₣ǿũиđ à рřöƒϊℓз ŵĩţн аñ įņνàŀїδ "icon". Ðěƒаúľτīŋğ ţħаτ ρřόƒìŀё тб ђâνє пǿ íčой. Мàĸë ŝùřë ŧĥаţ ωĥĕл ŝеτŧīлĝ ăй "icon", τħε νāłϋë ïŝ ă νàľīđ ƒïŀè рªтн ţő äи ïмäģё. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
<comment>{Locked="\"icon\""} The word "icon" in quotes is locked, the word icon OUTSIDE of quotes should be localized.</comment>
</data>
<data name="AtLeastOneKeybindingWarning" xml:space="preserve">
<value>Ẁâřήîņĝŝ ώёѓè ƒθϋňđ ωђĭĺё φàŕşïпğ γоúг κëўьĭńδįиģš: !!! !!! !!! !!! !!!</value>
<value>Щαѓńΐňģš ώĕřе ƒбŭπδ ώħīļë рăяşìⁿġ ўσυŕ κёỳвĩиðīήġş: !!! !!! !!! !!! !!!</value>
</data>
<data name="TooManyKeysForChord" xml:space="preserve">
<value>• ₣õųŋð α ķęŷьіʼnδіπġ шϊтђ тŏõ мǻлý ŝτŗΐйģŝ ƒог ťĥě "keys" åřгãў. Ťћ℮ŕ℮ ŝћòџℓđ òиļý ъ℮ ǿлέ ѕтѓїńģ νăľūе ιñ тħě "keys" âŗґάÿ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
<value>• ₣бūήð â ķёуьĩńðīⁿģ шĩŧђ τõб mªńÿ ѕťгίńġŝ ƒóř ţћ℮ "keys" åѓгàÿ. Тħėгē ѕĥōμĺđ бñľў вĕ ŏи℮ ѕтřïлģ νăŀůé ĭʼn ţĥė "keys" άřřàγ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! </value>
<comment>{Locked="\"keys\"","•"} This glyph is a bullet, used in a bulleted list.</comment>
</data>
<data name="FailedToParseSubCommands" xml:space="preserve">
<value>• ₣аĭļєδ ţô рąяşё дľĺ šŭвçõммâиðŝ θƒ ηеśŧĕđ ςóммàиď. !!! !!! !!! !!! !!! </value>
<value>• ₣ąìļ℮đ ţŏ ρǻŕşε âłľ śцъċőммåиðѕ ōƒ л℮śť℮ď сömmąπđ. !!! !!! !!! !!! !!! </value>
</data>
<data name="MissingRequiredParameter" xml:space="preserve">
<value>• ₣оûиð α ќěÿъϊηδīпĝ ţћăť ẁâš mîşŝįŋğ ă řëqцїгéδ рäŕªmзťř νǻℓůé. Ŧћιş ќёуъįпđїлģ ώíľľ вê їĝлσŕèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>• ₣оůñð ā κėуьίπðîηĝ тħаŧ ẃáś мįѕśϊňģ д ѓιŗзð рαřǻмęţεř νăľυë. Тнίѕ кεγьĩņđíņģ щìľļ вє įĝлóяеđ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="•"} This glyph is a bullet, used in a bulleted list.</comment>
</data>
<data name="UnknownTheme" xml:space="preserve">
<value>• Ťĥè šφ℮ĉīƒîěð "ťĥèмё" шãѕ ηőţ ƒöυпð ĩń ţнё ŀίѕŧ őƒ ţћęмэś. Ťmрøяâґïŀỳ ƒâŀľįⁿĝ ъà¢ĸ τŏ ťħë δēƒàΰļτ ναļūэ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>• Тћë ѕрèçїƒĭёď "τћ℮мé" ώαѕ ήøţ ƒόûπđ ΐл ťћê ℓíŝť σƒ ťнεmέѕ. Ŧěмрǿŕдѓΐļγ ƒдℓłίńģ вà¢ĸ τő ŧнě đέƒαùŀŧ νǻľΰê. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="•"} This glyph is a bullet, used in a bulleted list.</comment>
</data>
<data name="LegacyGlobalsProperty" xml:space="preserve">
<value>Ţђё "globals" ρŕǿрēřţγ īŝ ð℮рŕêċāţēď - γõűŗ ѕěτŧĩŋĝѕ mīģћτ ηèëδ ϋрđăťіʼnġ. !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Τђз "globals" φѓóрεѓţγ ιŝ δęρѓêсâŧėď - ýбųѓ ŝέтŧїпĝš мìġħţ ηзέď црđªтïйġ. !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="\"globals\""} </comment>
</data>
<data name="LegacyGlobalsPropertyHrefUrl" xml:space="preserve">
@@ -267,208 +267,208 @@
<comment>{Locked}This is a FWLink, so it will be localized with the fwlink tool</comment>
</data>
<data name="LegacyGlobalsPropertyHrefLabel" xml:space="preserve">
<value>₣θř мőřē įňƒо, ŝεê ŧħĩş щēь раĝè. !!! !!! !!! </value>
<value>₣οř мòŕе îήƒθ, şéэ ţħìѕ ŵєь рąġé. !!! !!! !!! </value>
</data>
<data name="FailedToParseCommandJson" xml:space="preserve">
<value>₣ǻįℓέď τǿ зжφáŋδ à ċôмmãŋð щîťħ "iterateOn" šĕŧ. Ţћΐš сбммǻлδ ωĭłľ ьê ĭģήόřèď. !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>₣ăіľέđ ţö ехρåņď ǻ çǿммãηδ ẃìţĥ "iterateOn" şετ. Ťĥīš ćōmмåиď щΐℓĺ ве ĭģňóѓëđ. !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="\"iterateOn\""} </comment>
</data>
<data name="InvalidColorSchemeInCmd" xml:space="preserve">
<value>₣ôūиď ā ćŏmmάиð ωìτн άή ϊńνåľîđ "colorScheme". Ţћìš сомmáņđ щĭļℓ ьє îģπōřęδ. Мдќĕ šųґз тнãŧ шнěñ ŝέţťîñğ â "colorScheme", тħĕ νāłũē màтсђėѕ ŧĥё "name" σƒ д ćθļσř śсђèмè ιņ ťћē "schemes" ľĭśť. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>₣óŭйď ã сóмmаńδ ẁϊţђ дή îⁿναļīð "colorScheme". Тћîŝ ĉǿмmαήδ ωïĺĺ вε íğлŏгëð. Мâķэ ѕϋŗê τĥāţ ẅћэй šěτťîņġ å "colorScheme", ţĥé νаļΰé мªŧçћєѕ ţħє "name" őƒ ă ¢ôℓôř ŝςђзмê įň тнε "schemes" ľïşŧ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="\"colorScheme\"","\"name\"","\"schemes\""}</comment>
</data>
<data name="InvalidSplitSize" xml:space="preserve">
<value>₣õūńđ à "splitPane" ¢бmmåⁿď ώιťĥ ąή ιηνãļіð "size". Ťђΐŝ ċöммдиđ ẁìℓĺ ъė ιğňõřёď. Μάќę ѕųřé τнз śΐźё îѕ ъėτẃĕεń 0 ǻńð 1, εж¢ĺμŝιν℮. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>₣ŏΰπđ ā "splitPane" ¢ǿммäήđ ŵìтћ ăη îŋνąłιđ "size". Ţђíѕ ċǿммªпđ ŵīĺℓ ьė ìĝñōгёđ. Мăќέ šύгз τĥě śιźê įѕ ъèτшέëπ 0 äⁿð 1, εхčļûŝίνз. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="\"splitPane\"","\"size\""}</comment>
</data>
<data name="FailedToParseStartupActions" xml:space="preserve">
<value>₣ªїľéď тο φдгŝз "startupActions". !!! !!! !!! </value>
<value>₣âìľęď ťǿ рαяŝé "startupActions". !!! !!! !!! </value>
<comment>{Locked="\"startupActions\""}</comment>
</data>
<data name="InvalidProfileEnvironmentVariables" xml:space="preserve">
<value>₣бūñð мцļťϊφŀĕ ëňνΐгøñм℮ņт νăřīªьłёѕ ẁιţћ тĥé ŝǻмĕ ňάмĕ îй ð탃èяēπт ċãşêѕøẃεя/υрφёŗ) - όлℓŷ õⁿє νâℓųε ωĭŀļ ъē џş℮δ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>₣öųñđ múтĭφļę èⁿνіŕθлмėňţ ναřίдъľêѕ ẅïτħ ťħз śăмė ήámе їή đїƒƒέřέηт čãşзśóщěг/ůрρеŕ) - óлℓŷ οиę νǻľµě ẁιľľ вё ųşέď. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="CmdCommandArgDesc" xml:space="preserve">
<value>Ǻⁿ öρтîǿήäℓ ĉøммāŋð, ẁіťħ ãŗğúmэлтş, ţõ ьэ ѕρàẃⁿεð ϊη τħ℮ ñ℮ẃ тàв όѓ ρâиз !!! !!! !!! !!! !!! !!! !!! </value>
<value>Åʼn ǿртíоñαŀ ċοmмäηď, ẁίŧћ ãŗĝūměʼnтş, ţô вέ šρªẃйèđ įņ ťђė πεẁ ŧав ŏŗ рªņε !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="CmdFocusTabDesc" xml:space="preserve">
<value>Μσνε ƒθςúš τô аʼnøŧĥëѓ τăв !!! !!! !</value>
<value>Μòνê ƒöčµѕ ŧθ ãņøτнёř τåъ !!! !!! !</value>
</data>
<data name="CmdFocusTabNextArgDesc" xml:space="preserve">
<value>Μōνė ƒøсűš ŧō ŧĥέ ńęхţ τǻв !!! !!! !</value>
<value>Мõνè ƒòćüŝ τθ ťћé пĕ×т ťαъ !!! !!! !</value>
</data>
<data name="CmdFTDesc" xml:space="preserve">
<value>Ап ǻℓìάš ƒøř ŧнё "focus-tab" šũвćőмmąйð. !!! !!! !!! !!!</value>
<value>Дŋ äℓĭάş ƒоř τћę "focus-tab" šųъčǿммáñđ. !!! !!! !!! !!!</value>
<comment>{Locked="\"focus-tab\""}</comment>
</data>
<data name="CmdFocusTabPrevArgDesc" xml:space="preserve">
<value>Мöνё ƒόčŭś тó ťĥę ρřένΐőůš ţåь !!! !!! !!!</value>
<value>Μöνє ƒоćüŝ ŧó ţĥë рřěνĩομѕ тãь !!! !!! !!!</value>
</data>
<data name="CmdFocusTabTargetArgDesc" xml:space="preserve">
<value>Μøνε ƒοĉцś тнę ţаъ ąŧ ťће ġïνєη їлđέж !!! !!! !!! !!</value>
<value>Мονé ƒоćűŝ ťħέ τåь àτ ţĥé ĝįνèň іňďėж !!! !!! !!! !!</value>
</data>
<data name="CmdMovePaneTabArgDesc" xml:space="preserve">
<value>Мõνë ƒøĉύśēđ ρаηз ŧο ţĥз тăь αт ţћę ĝîνёп ĭйďĕж !!! !!! !!! !!! !!</value>
<value>Μόνě ƒôçџś℮ď φąπέ τŏ ţħĕ ŧäв ǻτ тћė ģΐνеņ ĭñðěх !!! !!! !!! !!! !!</value>
</data>
<data name="CmdMovePaneDesc" xml:space="preserve">
<value>Μōνё ƒōςúŝéδ рäйě τό ãňøťнεř τάъ !!! !!! !!! </value>
<value>Μǿνê ƒõćυѕěð φâή℮ ťθ ǻлοτĥёŗ τąв !!! !!! !!! </value>
</data>
<data name="CmdMPDesc" xml:space="preserve">
<value>Ал åľįâѕ ƒоґ ťĥé "move-pane" šύъčοmмäⁿđ. !!! !!! !!! !!!</value>
<value>Ăⁿ āℓíąš ƒбŕ тнĕ "move-pane" šúъćбммàⁿδ. !!! !!! !!! !!!</value>
<comment>{Locked="\"move-pane\""}</comment>
</data>
<data name="CmdSplitPaneSizeArgDesc" xml:space="preserve">
<value>Ѕрεςίƒỳ ţĥέ şìžз ǻŝ ά ρĕгςěйτāğє бƒ ŧђě рāґεŋť φªñέ. Vàŀįđ ναℓüĕŝ ªяє вεтшêзʼn (0,1), єхčĺūşïνę. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Ѕрёċϊƒÿ тђĕ ѕîžĕ αѕ ǻ ρēŕċêйτдģе őƒ ŧħě φǻґзйť φàņē. Vдίδ νǻŀùзş āŗε ьεтщ℮ёň (0,1), е×ςĺúŝινе. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="CmdNewTabDesc" xml:space="preserve">
<value>Ċѓēαťė ă лєщ тдв !!! !</value>
<value>Çґέăťė ã πėш τáв !!! !</value>
</data>
<data name="CmdNTDesc" xml:space="preserve">
<value>Ãņ åļϊåš ƒоř ţĥё "new-tab" şџьĉŏммάňđ. !!! !!! !!! !!</value>
<value>Ăи άℓîªŝ ƒōř τħë "new-tab" śμвċόmмãŋδ. !!! !!! !!! !!</value>
<comment>{Locked="\"new-tab\""}</comment>
</data>
<data name="CmdFocusPaneDesc" xml:space="preserve">
<value>Мσν ƒόčųš тσ äŋσţћєŕ ραηê !!! !!! !</value>
<value>Μǿνé ƒосųŝ тô дπøţћєг рáņė !!! !!! !</value>
</data>
<data name="CmdFPDesc" xml:space="preserve">
<value>∆ń αŀϊäś ƒòř ŧĥе "focus-pane" şüьςømmáⁿð. !!! !!! !!! !!!</value>
<value>Áй áℓįãš ƒòŗ тђĕ "focus-pane" şυъĉöммàńđ. !!! !!! !!! !!!</value>
<comment>{Locked="\"focus-pane\""}</comment>
</data>
<data name="CmdFocusPaneTargetArgDesc" xml:space="preserve">
<value>₣òсüѕ τђĕ рáńэ αţ ŧђē ğįνēñ їñđę× !!! !!! !!! </value>
<value>₣ό¢űѕ тнê φàπĕ аţ тђè ğĭνėй ïŋðεж !!! !!! !!! </value>
</data>
<data name="CmdProfileArgDesc" xml:space="preserve">
<value>Ôφёл ŵĭŧћ ŧĥê ğίνèή рŕσƒįľė. Δςċėрťś єιťнёŗ ťђε ήämз θŗ ĜЦΊÐ őƒ а рřόƒιℓē !!! !!! !!! !!! !!! !!! !!! </value>
<value>Θφêп шĩτћ ťнě ģìνēή ρѓøƒìĺę. Âćĉеφťś ёĩτĥėŗ τђė йάмє øя ĠŮΪÐ õƒ а φŕóƒίℓè !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="CmdSplitPaneDesc" xml:space="preserve">
<value>Ĉŕёåŧë å иèш ѕφℓĭţ φáηě !!! !!! </value>
<value>Ĉґéáŧе д ήэẅ ŝφĺĭτ рãňё !!! !!! </value>
</data>
<data name="CmdSPDesc" xml:space="preserve">
<value>Αŋ ąłįǻś ƒоř тĥě "split-pane" ŝυвćοмmǻņð. !!! !!! !!! !!!</value>
<value>Āл ªļïâś ƒбг ŧћê "split-pane" ŝύвćőммäňδ. !!! !!! !!! !!!</value>
<comment>{Locked="\"split-pane\""}</comment>
</data>
<data name="CmdSplitPaneHorizontalArgDesc" xml:space="preserve">
<value>€řęäţė τђε ⁿëώ ράήê άŝ â ћσŗīźǿⁿťαľ śφłΐт (τħíпќ [-]) !!! !!! !!! !!! !!! </value>
<value>Ċŕéάťё ťћè ⁿеẁ рâлè åś ǻ ħôŕîžőņτąŀ śρļίτ (ŧнїπĸ [-]) !!! !!! !!! !!! !!! </value>
</data>
<data name="CmdSplitPaneVerticalArgDesc" xml:space="preserve">
<value>Ċŕęâτĕ ţħę ŋęω φåиĕ ǻš á νзŕтĭĉáľ ŝρĺíţ (ŧнϊńĸ [|]) !!! !!! !!! !!! !!!</value>
<value>Ċяěªтĕ ŧнέ ⁿèω ρаηе ªš ā νēѓτîčäŀ ѕрĺįť (тĥїπќ [|]) !!! !!! !!! !!! !!!</value>
</data>
<data name="CmdSplitPaneDuplicateArgDesc" xml:space="preserve">
<value>Çґэάтє тĥè иĕẅ ρªήз ъý ďúрłίςάтĭʼnğ τће ρŕσƒîłè øƒ ŧħê ƒōςџѕêđ ρäπē !!! !!! !!! !!! !!! !!! !</value>
<value>Ĉřεâте тħè пέẁ φаńè ъ ďцрłíçăţιηğ ťħе φгоƒíľз оƒ τĥě ƒőċūşëð рāиē !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="CmdStartingDirArgDesc" xml:space="preserve">
<value>Öφéи ΐπ ţћē ğίνęπ ðιŕè¢ťőяγ іпšŧêâð õƒ ţђę φŕόƒΐł℮'ś ѕęţ "startingDirectory" !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Óрεŋ ιŋ τћē ĝіνèή ðіґėсťσŗý ΐńѕţêªđ ôƒ тħ℮ рřоƒĭľė'ŝ şĕŧ "startingDirectory" !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="\"startingDirectory\""}</comment>
</data>
<data name="CmdTitleArgDesc" xml:space="preserve">
<value>Όρěή ŧħē ţёгмĩņªℓ ŵīţĥ ťħέ рřονΐðęđ ťιťľę їńѕŧзàδ óƒ τћé φŕоƒΐŀë'ѕ šετ "title" !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Òрèи ŧћ℮ тεгміņдľ шįтђ τћз рŕσνϊðэđ ţϊťľё їņšτèāď οƒ ŧħз рѓοƒïℓε'š śēт "title" !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="\"title\""}</comment>
</data>
<data name="CmdTabColorArgDesc" xml:space="preserve">
<value>Фφėй τĥě тдв щìŧћ ŧħë şρĕćіƒїéđ ćøĺôґ, ĭⁿ #ŕřğġъв ƒôґмάŧ !!! !!! !!! !!! !!! !</value>
<value>Фрєŋ τћę ťāь ẃĭŧĥ ŧĥē ѕρεçíƒĩĕď ċŏĺőŗ, ίʼn #řґģģьь ƒöřмàŧ !!! !!! !!! !!! !!! !</value>
</data>
<data name="CmdSuppressApplicationTitleDesc" xml:space="preserve">
<value>Òρёп ťђë ŧãь ŵїŧĥ ţάвТїτĺє ōνëгřīďîńĝ đėƒäųĺт ţĭтℓе αήδ šµφφřзśŝïñģ ţįτłè çћªпĝè мêśšǻĝêš ƒřом ťħê àрφľìсåτїöή !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Όрзи тћê тäъ ŵîтн ŧãвŦìтŀέ øνėřѓĩδіиĝ δęƒåυĺŧ тīτłê ǻйď ѕűррŕ℮ѕśìήĝ τĭťℓé ċћаπġё mεśšàğзš ƒŗøм тћê ªрρĺĩčªτĭóņ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="\"tabTitle\""}</comment>
</data>
<data name="CmdInheritEnvDesc" xml:space="preserve">
<value>Ίñћзгíт тħé тзŗмîπâℓ'ŝ оώή зйνїгóⁿměлτ νāŗíαвŀзş ẅĥéʼn сѓ℮äťιηġ ţħè ņ℮ẅ ťάь òѓ рáñę, řãťђег τнаñ ćŕĕâтìʼnġ á ƒřëşђ ëπνїřōпмзлт вℓǿск. Ťћîѕ đ℮ƒāύℓтś ţо śєт шћĕń α "command" įş рąśśėđ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>İηĥегïт ţĥě ťεřmĭʼnǻł'ŝ õώп εņνĩŕόňмěñť νāřĭáьŀĕś ώнēл ĉгėǻтΐʼnġ ţħз πęш ţáь ŏŕ ρäη℮, ŗãŧħёř ťĥªή ¢řēäţіηĝ ǻ ƒŗėśћ èήνιгőŋм℮иť ьļο¢к. Тħїš ďęƒαüłŧŝ τõ ѕёţ ẅħēň ą "command" îş ρãśŝéđ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="\"command\""}</comment>
</data>
<data name="CmdColorSchemeArgDesc" xml:space="preserve">
<value>Öрєή тнè τäь шιţђ τĥέ śφéćīƒįéď çόℓбґ ѕçĥёмė, ίŋşτèàď ǿƒ τћє ρŕòƒïľє'ѕ ŝĕŧ "colorScheme" !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Øρéη ŧĥē ŧаь щïţђ ţнё ѕрě¢ίƒĩеð ¢θℓôя şĉнем℮, īπѕτêåδ òƒ τĥё φřőƒĭľе'ŝ ѕ℮ť "colorScheme" !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="\"colorScheme\""}</comment>
</data>
<data name="CmdVersionDesc" xml:space="preserve">
<value>Ďĩѕρłǻў ţĥє άφφľīçäтϊôň νзяšισŋ !!! !!! !!!</value>
<value>Ďìśрℓàÿ тћē åφφłîςдťίøп νēřšįóń !!! !!! !!!</value>
</data>
<data name="CmdMaximizedDesc" xml:space="preserve">
<value>Ŀдùлçн ţнē ẁίйďσш mα×імїźěδ !!! !!! !!</value>
<value>Ļáūńçн тћё ẅïиďоŵ мåжімĩźęð !!! !!! !!</value>
</data>
<data name="CmdFullscreenDesc" xml:space="preserve">
<value>Ľáυŋĉħ ŧĥè ẁīⁿđοẃ ϊπ ƒџŀļşсŕé℮ń мǿδэ !!! !!! !!! !</value>
<value>£âµńĉн тнė щίπđощ їʼn ƒûℓŀşċŕėēη мøđè !!! !!! !!! !</value>
</data>
<data name="CmdMoveFocusDesc" xml:space="preserve">
<value>Μŏνε ƒǿçùš ťο ţћē âďĵã¢ĕñť рąŋĕ ίʼn ŧћε śφёςϊƒΐеδ ðіŕęčŧïоŋ !!! !!! !!! !!! !!! !!</value>
<value>Мονë ƒόçцŝ τô ţнε дďјαçéʼnţ φáπέ ίņ τнë ѕрéςĩƒїĕδ δіŗéćťïőп !!! !!! !!! !!! !!! !!</value>
</data>
<data name="CmdMFDesc" xml:space="preserve">
<value>Ąπ ăłιªŝ ƒοґ τĥė "move-focus" şûьĉбмmåʼnď. !!! !!! !!! !!!</value>
<value>Åп âℓιāś ƒóř ŧђз "move-focus" šůъçόмmàпð. !!! !!! !!! !!!</value>
<comment>{Locked="\"move-focus\""}</comment>
</data>
<data name="CmdMoveFocusDirectionArgDesc" xml:space="preserve">
<value>Τĥê ðîязĉţіби ťò mōνε ƒбçцѕ ϊп !!! !!! !!!</value>
<value>Тнê đιřèсţïöп ţό мøνĕ ƒŏčúś ìή !!! !!! !!!</value>
</data>
<data name="CmdSwapPaneDesc" xml:space="preserve">
<value>Šẃãρ ťнę ƒóςųşзð φąпё ώīŧђ τĥέ âđĵα¢ёηť рãņε їʼn ŧнē ŝφєςіƒΐĕδ ðĩř℮¢ţïби !!! !!! !!! !!! !!! !!! !!!</value>
<value>Šшдφ ťĥė ƒоčùšěď рдйê ŵīťђ ŧнё ãđĵă¢èņτ φåиé íŋ ťĥē šρêςīƒĭзδ đìѓз¢ţįőñ !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="CmdSwapPaneDirectionArgDesc" xml:space="preserve">
<value>Τĥ℮ δîŕé¢τįòή тθ мõνέ ťћę ƒöċûşêð рãηė їň !!! !!! !!! !!!</value>
<value>Тнě διяèċτîõη ţό mōνе ťћë ƒòčϋš℮δ рαπ℮ īп !!! !!! !!! !!!</value>
</data>
<data name="CmdFocusDesc" xml:space="preserve">
<value>Łäŭпсћ тћё шïήďŏш ίή ƒòćΰş мøδε !!! !!! !!!</value>
<value>Ľãūлçĥ тħέ щíиδσώ ìй ƒô¢ũš мôďз !!! !!! !!!</value>
</data>
<data name="CmdSavedLayoutArgDesc" xml:space="preserve">
<value>Тĥîş φąѓáměтëґ ĭš άή їⁿτĕґηäł їmρĺēмéήťάτįõπ đэţãìł ãʼnđ şђòџĺð ⁿõŧ ъе ùŝзð. !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Ŧћїѕ ρąяáмėŧєѓ ĭş āη їňтεŕήåŀ íмφĺêmёņťдţïòπ ďёŧåĩļ дηð šнŏųļδ ñōţ ьë ųšėð. !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="CmdWindowTargetArgDesc" xml:space="preserve">
<value>Šрёčĭƒý â ťęґмïπăŀ щìňðöώ ŧб яџń ťћě ğïνèή ¢óмmаπđłįπė ìʼn. "0" дļωªўѕ гεƒёřş ţǿ ŧћë ćυŗřěήт ẁіňđŏŵ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Šрêςĩƒγ а ťĕгmìŋаł ẁϊпðõω τσ ґύŋ τнз ģίνĕи ĉömмαпđľįʼnе їй. "0" āℓώąŷš řеƒěŗş ťσ ŧħė çŭґřęπť ẁįʼnđǿω. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="CmdPositionDesc" xml:space="preserve">
<value>Şφзсĩƒŷ ťћē φǿѕĩťїоη ƒóř ţћє тęгmĩňªļ, íп "×,ŷ" ƒøѓmäт. !!! !!! !!! !!! !!! !</value>
<value>Šрëĉίƒў тћε рόŝíŧιòή ƒōя тнě тėřmįηдŀ, ϊп "х,ÿ" ƒθřмάŧ. !!! !!! !!! !!! !!! !</value>
</data>
<data name="CmdSizeDesc" xml:space="preserve">
<value>Ѕρэ¢ϊƒỳ тĥē ήŭмьĕŕ θƒ ċóμmиѕ äлδ řŏẅś ƒōř ťђё τёямιňǻł, ίņ "¢,я" ƒσѓmªτ. !!! !!! !!! !!! !!! !!! !!! </value>
<value>Ѕφёĉĩƒỳ тнэ ņµmъґ øƒ ςòļůmйś ăŋð гøшş ƒöŕ тнε τєѓмϊⁿãŀ, ĩʼn "ċ,ř" ƒθяmãţ. !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="NewTabSplitButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.HelpText" xml:space="preserve">
<value>Ρřėŝš тнε вŭτťôй ťô õрεπ ã ήėŵ τěгмΐпāľ ťąв ẅīťђ ўбµѓ ďэƒāμļť ρґοƒĭłέ. Ōρęи τћз ƒļуőùť τθ šèľēςţ ŵнìςн рřоƒϊĺĕ ŷòυ шăлť τø όφэʼn. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Рґзѕś тђз вůťŧôй ŧǿ ǿφеη ā ʼnéẃ ţєѓmîńąŀ ťâв ωϊŧђ ýθůř đęƒăμℓţ ρŗôƒїĺε. Óρĕп τћё ƒłýбцť ţø śεŀèςŧ шĥïčĥ φřŏƒίļê ўσμ ẁάлτ ţσ όрεй. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
</data>
<data name="NewTabSplitButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Пέщ Τăв !!</value>
<value>Ňèώ Ŧäъ !!</value>
</data>
<data name="NewTabRun.Text" xml:space="preserve">
<value>Öрęп à πéω тªв !!! !</value>
<value>Όрèπ ª йěŵ ταв !!! !</value>
</data>
<data name="NewPaneRun.Text" xml:space="preserve">
<value>Ăļŧ+Сℓιçκ ŧö šρłïť ţĥе ¢ūŕřěŋŧ ẅιńδŏẅ !!! !!! !!! !!</value>
<value>Ǻℓт+Сłĩċк тö šрŀîţ ţћë сцřѓèήŧ ẅїпðбω !!! !!! !!! !!</value>
</data>
<data name="NewWindowRun.Text" xml:space="preserve">
<value>Şћîƒţ+Ċĺїсĸ ţó θρėņ ª ŋėẅ щіņðô !!! !!! !!! </value>
<value>Śħîƒť+Çľιćĸ тō όрзⁿ ª йзώ ẁίπðôш !!! !!! !!! </value>
</data>
<data name="ElevatedRun.Text" xml:space="preserve">
<value>Ċţŕŀìĉκ το бφęи άŝ ªδmίήîŝτґąŧøѓ !!! !!! !!! !</value>
<value>ţŕłℓїčķ τõ ορêņ αŝ аðmìñĩѕτŕăţòг !!! !!! !!! !</value>
</data>
<data name="WindowCloseButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>€ĺôŝè !</value>
<value>Ćℓőŝз !</value>
</data>
<data name="WindowCloseButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>€łǿѕě !</value>
<value>Ĉļøşз !</value>
</data>
<data name="WindowCloseButtonToolTip.Text" xml:space="preserve">
<value>Çŀбѕé !</value>
<value>Ĉļόѕě !</value>
</data>
<data name="WindowMaximizeButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Μǻжїмίżê !!</value>
<value>Μджįmïźэ !!</value>
</data>
<data name="WindowMinimizeButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Мíиΐмĩžè !!</value>
<value>Μïиιmіžё !!</value>
</data>
<data name="WindowMinimizeButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Μìʼnіміžė !!</value>
<value>Μîⁿĩmĩż !!</value>
</data>
<data name="WindowMinimizeButtonToolTip.Text" xml:space="preserve">
<value>Μΐπĩmíźě !!</value>
<value>Мĩиîmĩżє !!</value>
</data>
<data name="AboutDialog.Title" xml:space="preserve">
<value>Ąвοµτ !</value>
<value>Åвōύţ !</value>
</data>
<data name="AboutDialog.PrimaryButtonText" xml:space="preserve">
<value>Ѕеηð ƒę℮đвäçк !!! </value>
</data>
<data name="AboutDialog.CloseButtonText" xml:space="preserve">
<value>ǾЌ </value>
<value>ΦΚ </value>
</data>
<data name="AboutDialog_VersionLabel.Text" xml:space="preserve">
<value>Věŗšίöŋ: !!</value>
<value>Véяšîõп: !!</value>
<comment>This is the heading for a version number label</comment>
</data>
<data name="AboutDialog_GettingStartedLink.Content" xml:space="preserve">
@@ -480,7 +480,7 @@
<comment>A hyperlink name for the Terminal's documentation</comment>
</data>
<data name="AboutDialog_DocumentationLink.Content" xml:space="preserve">
<value>Đőςűмĕņŧãţîǿņ !!! </value>
<value>Đŏĉµмěⁿтатïõñ !!! </value>
<comment>A hyperlink name for user documentation</comment>
</data>
<data name="AboutDialog_ReleaseNotesLink.Content" xml:space="preserve">
@@ -496,87 +496,87 @@
<comment>A hyperlink name for the Terminal's third-party notices</comment>
</data>
<data name="QuitDialog.CloseButtonText" xml:space="preserve">
<value>Çăņсεℓ !</value>
<value>Ċдйĉέł !</value>
</data>
<data name="QuitDialog.PrimaryButtonText" xml:space="preserve">
<value>Ċŀőšè áľ !!!</value>
<value>€ļőşε áļľ !!!</value>
</data>
<data name="QuitDialog.Title" xml:space="preserve">
<value>Ðõ ýοũ ẃαⁿť ţό ¢ľοşέ ǻļĺ ẁïⁿðőẅŝ? !!! !!! !!! </value>
<value>Ďõ γбű ẁāŋţ ťó ςℓσśĕ äℓℓ шîйđбẁś? !!! !!! !!! </value>
</data>
<data name="CloseAllDialog.CloseButtonText" xml:space="preserve">
<value>Ĉǻñсéł !</value>
<value>Ćăʼnċęℓ !</value>
</data>
<data name="CloseAllDialog.PrimaryButtonText" xml:space="preserve">
<value>Сŀőŝé дŀ !!!</value>
<value>Ćļõѕέ аł !!!</value>
</data>
<data name="CloseAllDialog.Title" xml:space="preserve">
<value>Ðо ŷοµ щąʼnţ ţô сļöś℮ дŀŀ ţåвŝ? !!! !!! !!!</value>
<value>Đσ ŷőū шдиŧ тò čļòŝз αŀľ ţâвŝ? !!! !!! !!!</value>
</data>
<data name="CloseReadOnlyDialog.CloseButtonText" xml:space="preserve">
<value>Ċªŋçёĺ !</value>
<value>Čǻñčėŀ !</value>
</data>
<data name="CloseReadOnlyDialog.PrimaryButtonText" xml:space="preserve">
<value>Ćľόѕê āήуẁāŷ !!! </value>
<value>Сłŏѕε άñÿẃåγ !!! </value>
</data>
<data name="CloseReadOnlyDialog.Title" xml:space="preserve">
<value>Ẁāѓŋίⁿġ !!</value>
<value>Ẁαгйïņğ !!</value>
</data>
<data name="CloseReadOnlyDialog.Content" xml:space="preserve">
<value>Υŏυ âѓĕ åьбůт ŧó ćℓоšέ å ŕèάđ-бпĺÿ ŧэѓmїňâł. Ðø ýθŭ ώϊşĥ ţó ĉóņτϊпûë? !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ϋôů ářє дъоϋť ŧо ćľōśέ ª гęаð-öйĺу тêřmĩńäĺ. Đǿ ỳøü ωîśђ ŧő ćőʼnţїñϋέ? !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="LargePasteDialog.CloseButtonText" xml:space="preserve">
<value>Čάʼnčзŀ !</value>
<value>Сâήçеŀ !</value>
</data>
<data name="LargePasteDialog.Content" xml:space="preserve">
<value>¥бů åŕэ αъουŧ τό рαŝťε тëхţ тħαţ ιş ŀθπġêř ŧħâй 5 Кîβ. Ďŏ ýöџ ẁîŝħ ŧô ςσñтíⁿΰэ? !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ўōµ ąřε ăвőüť ţò ρãѕŧĕ ťê×ŧ тħãт ïš ľôʼnğзŗ ŧђąи 5 ЌΐБ. Đθ γŏΰ ẅĩşħ τò ςõиŧĭňūê? !!! !!! !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="LargePasteDialog.PrimaryButtonText" xml:space="preserve">
<value>Ρãŝτē άņŷщāý !!! </value>
<value>Ρâşτз ăπуẅаý !!! </value>
</data>
<data name="LargePasteDialog.Title" xml:space="preserve">
<value>Ŵǻґñΐņģ !!</value>
<value>Ẃâгηïņğ !!</value>
</data>
<data name="MultiLinePasteDialog.CloseButtonText" xml:space="preserve">
<value>€αήċêļ !</value>
<value>Ćªήĉěł !</value>
</data>
<data name="MultiLineWarningText.Text" xml:space="preserve">
<value>Ŷõϋ åяέ âвőџт тō рάşťē τзхŧ ŧħάт çöⁿτāϊлš mµĺťΐрļэ ŀιňэѕ. Іƒ γőú рâšтё ŧћīş тєжŧ íʼnŧŏ ỳŏùř ѕћėłł, ĭτ mâÿ гēŝцℓţ ĩп ŧнέ űпëжφе¢ťęď эх℮ćųŧîθи θƒ çомmàⁿδŝ. Ðō уοϋ ŵīŝђ τǿ čôʼnтїŋűέ? !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Ϋбů áяē авôцţ τŏ ρªѕŧê ťĕхţ ťĥâť ĉοлŧäїлš mųŀťїрŀē ĺΐиέš. Ĭƒ ýŏû рαśτё ťђìš ť℮хŧ îήŧø γõũŗ ѕћêℓļ, íτ mду ŗéśμļт įŋ ţħ℮ цпęхρ℮çťêď з×эćúтϊŏⁿ õƒ ςōмmãⁿðş. Đο убŭ ẃīѕн τõ ċôʼnŧïñûε? !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
</data>
<data name="MultiLinePasteDialog.PrimaryButtonText" xml:space="preserve">
<value>Ρăśťě ăηŷшâγ !!! </value>
<value>Ρªšţє аńŷẁàŷ !!! </value>
</data>
<data name="MultiLinePasteDialog.Title" xml:space="preserve">
<value>Ŵäŗŋĩñĝ !!</value>
<value>Щāŕñιπĝ !!</value>
</data>
<data name="CommandPalette_SearchBox.PlaceholderText" xml:space="preserve">
<value>Тýφë ã ćömmаήδ иăме... !!! !!! </value>
<value>Ťýφě á ĉθmmāņđ йăмē... !!! !!! </value>
</data>
<data name="CommandPalette_NoMatchesText.Text" xml:space="preserve">
<value>Νό мªŧςħϊŋģ ĉőmmâηδš !!! !!!</value>
<value>Ŋό маŧ¢ĥΐŋğ сóмmăлđš !!! !!!</value>
</data>
<data name="CommandPaletteModeAnnouncement_ActionMode" xml:space="preserve">
<value>Àĉťîöŋ śĕãѓсн mθđе !!! !!</value>
<value>∆ćŧìøп şєāяćħ мóδє !!! !!</value>
<comment>This text will be read aloud using assistive technologies when the command palette switches into action (command search) mode.</comment>
</data>
<data name="CommandPaletteModeAnnouncement_TabSearchSwitchMode" xml:space="preserve">
<value>Τáь тįтℓę møδє !!! !</value>
<value>Тàв ťїтłé môðэ !!! !</value>
<comment>This text will be read aloud using assistive technologies when the command palette switches into a mode that filters tab names.</comment>
</data>
<data name="CommandPaletteModeAnnouncement_CommandlineMode" xml:space="preserve">
<value>Сǿммàлđ-ĺĩⁿė mθðе !!! !!</value>
<value>Çοmмăπď-ĺιиé мõđэ !!! !!</value>
<comment>This text will be read aloud using assistive technologies when the command palette switches into the raw commandline parsing mode.</comment>
</data>
<data name="CommandPalette_NestedCommandAnnouncement" xml:space="preserve">
<value>Мθяє ŏрτιóлš ƒôѓ "{}" !!! !!!</value>
<value>Μояē öφтίóπś ƒőř "{}" !!! !!!</value>
<comment>This text will be read aloud using assistive technologies when the user selects a command that has additional options. The {} will be expanded to the name of the command containing more options.</comment>
</data>
<data name="CommandPalette_ParsedCommandLine" xml:space="preserve">
<value>Єжэςūŧĭñģ ĉбmmäήδ ļΐήê ωįℓŀ ĭʼnνõκё ţђė ƒōľľóщίⁿġ ςбмmăпðŝ: !!! !!! !!! !!! !!! !!</value>
<value>Ėжėсùţīпğ ¢ōmмªñð ĺїπĕ ẁíĺł ĭиνокė тħе ƒöĺℓŏщîпġ çõmмāⁿďѕ: !!! !!! !!! !!! !!! !!</value>
<comment>Will be followed by a list of strings describing parsed commands</comment>
</data>
<data name="CommandPalette_FailedParsingCommandLine" xml:space="preserve">
<value>₣дїĺēď рåѓşĭⁿğ çõmмάñð ļîπ℮: !!! !!! !!</value>
<value>₣āіľ℮ď рàгśīпģ ¢бммäⁿδ ĺīñè: !!! !!! !!</value>
</data>
<data name="CommandPaletteControlName" xml:space="preserve">
<value>Ćσmmăηδ ράŀĕтţ℮ !!! !</value>
@@ -585,150 +585,150 @@
<value>Τăь ѕωîťςћêг !!! </value>
</data>
<data name="TabSwitcher_SearchBoxText" xml:space="preserve">
<value>Τýрė à ţǻь иàмє... !!! !!</value>
<value>Ţýρё ă тăъ пâmě... !!! !!</value>
</data>
<data name="TabSwitcher_NoMatchesText" xml:space="preserve">
<value>Ñσ mâτçĥĩйĝ τåъ ńãмĕ !!! !!!</value>
<value>Ńô мατćнìņģ ţдъ пªмĕ !!! !!!</value>
</data>
<data name="CmdPalCommandlinePrompt" xml:space="preserve">
<value>Еñťєŗ à wt çőmмáйđĩńĕ ŧō яцή !!! !!! !!!</value>
<value>Èηŧĕґ ǻ wt ċθmмаʼnđļïʼnė тο ŕūʼn !!! !!! !!!</value>
<comment>{Locked="wt"} </comment>
</data>
<data name="SuggestionsControl_NestedCommandAnnouncement" xml:space="preserve">
<value>Мôяе őρťįŏňś ƒøŕ "{}" !!! !!!</value>
<value>Μōŗè σφŧïθлš ƒόŕ "{}" !!! !!!</value>
<comment>This text will be read aloud using assistive technologies when the user selects a command that has additional options. The {} will be expanded to the name of the command containing more options.</comment>
</data>
<data name="SuggestionsControl_SearchBox.PlaceholderText" xml:space="preserve">
<value>Ŧурě д čōmmáηð пαмë... !!! !!! </value>
<value>Ťÿφė å ċοmмªйđ ηа... !!! !!! </value>
</data>
<data name="SuggestionsControl_NoMatchesText.Text" xml:space="preserve">
<value>ô mâť¢ħįńġ çоmmдпđŝ !!! !!!</value>
<value>Ņô mάťςћίņĝ ċоmмάņďš !!! !!!</value>
</data>
<data name="SuggestionsControlName" xml:space="preserve">
<value>Śūġģęŝţīôⁿś mêήџ !!! !</value>
<value>Šύğġěşţįσпś м℮ʼnμ !!! !</value>
</data>
<data name="SuggestionsControl_MoreOptions.[using:Windows.UI.Xaml.Automation]AutomationProperties.HelpText" xml:space="preserve">
<value>Μоřє ôрŧίöŋŝ !!! </value>
<value>Мόѓė ōφťіŏⁿś !!! </value>
</data>
<data name="SuggestionsControl_MatchesAvailable" xml:space="preserve">
<value>Şųģġëŝŧíόⁿѕ ƒόüлδ: {0} !!! !!! </value>
<value>Śΰġģ℮šτϊθñѕ ƒöüⁿδ: {0} !!! !!! </value>
<comment>{0} will be replaced with a number.</comment>
</data>
<data name="CrimsonColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>€ŕīmşоʼn !!</value>
<value>€яïmşǿń !!</value>
</data>
<data name="SteelBlueColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ŝτэěľ Вłϋĕ !!!</value>
<value>Ѕťéêℓ βľυэ !!!</value>
</data>
<data name="MediumSeaGreenColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Мëδĭűм Ś℮α Ĝґёεň !!! !</value>
<value>Μёδιųm Ѕεд Ğґзēη !!! !</value>
</data>
<data name="DarkOrangeColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ðāřќ Őѓаňġε !!!</value>
<value>Ďäŕќ Õřäňğè !!!</value>
</data>
<data name="MediumVioletRedColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Мεδïυm Vιòľĕţ Γěđ !!! !!</value>
<value>Мęðϊům Vĭõľзт Ѓεð !!! !!</value>
</data>
<data name="DodgerBlueColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ďøðġĕѓ Βĺΰ℮ !!!</value>
<value>Ðôđğēг Βĺϋę !!!</value>
</data>
<data name="LimeGreenColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ŀΐmε Ĝŗęëń !!!</value>
<value>Ĺіmз Ĝґéĕи !!!</value>
</data>
<data name="YellowColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ýеℓŀǿω !</value>
<value>¥ęℓłοẃ !</value>
</data>
<data name="BlueVioletColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ьľυë Vïσłèť !!!</value>
<value>Ьľùе Vΐбŀэτ !!!</value>
</data>
<data name="SlateBlueColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Şĺāťę Βŀųэ !!!</value>
<value>Şŀаťę Βĺûė !!!</value>
</data>
<data name="LimeColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>£įмε !</value>
<value>£ϊмз !</value>
</data>
<data name="TanColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ţαⁿ </value>
<value>Ťåπ </value>
</data>
<data name="MagentaColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Маģĕиŧǻ !!</value>
<value>Μàğэⁿτα !!</value>
</data>
<data name="CyanColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ćŷăл !</value>
<value>Ċуåň !</value>
</data>
<data name="SkyBlueColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ŝќŷ ßℓџë !!</value>
<value>Šќŷ ßľϋ℮ !!</value>
</data>
<data name="DarkGrayColorButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ðàґķ Ģяāý !!!</value>
<value>Ðàŗκ Ğѓáγ !!!</value>
</data>
<data name="InvalidUriText" xml:space="preserve">
<value>Тћĩş ĺĩŋќ īѕ іňνдľĩδ: !!! !!!</value>
<value>Τћїš ŀĩňк іѕ įňνдŀíď: !!! !!!</value>
</data>
<data name="UnsupportedSchemeText" xml:space="preserve">
<value>Тђĩѕ ŀіńк ŧурě іś ĉύřѓéŋтľỳ πθт şùφрõґŧêδ: !!! !!! !!! !!! </value>
<value>Ťђïś łϊηќ ŧурē ιş çũґѓзⁿτľÿ ñστ şΰρρоŕŧĕđ: !!! !!! !!! !!! </value>
</data>
<data name="CouldNotOpenUriDialog.PrimaryButtonText" xml:space="preserve">
<value>Ċâπćєł !</value>
<value>Сąñс℮ł !</value>
</data>
<data name="SettingsTab" xml:space="preserve">
<value>Ѕёŧťĭńġş !!</value>
<value>Śëţťĩпğś !!</value>
</data>
<data name="FailedToWriteToSettings" xml:space="preserve">
<value>Ẅē ĉøůĺď лθτ щяįŧė τб ýσüř şέťťíⁿġŝ ƒĭľє. Čħёсĸ тĥė ρēѓмīŝśĩόⁿŝ θπ ŧħάţ ƒĩłє τо ĕлşύŗе тнáŧ тнĕ řέаδ-óпŀу ƒľåĝ ìš ņøτ ŝεŧ āпď τħдτ ẃґïťě аςсεśş ϊş ĝгâņţεð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Ẃε ςőűℓđ пòт ωяΐτë ŧô γôύг šěťтïπĝŝ ƒīłě. Çђêĉĸ ţђэ φеřмìşŝΐóпѕ õл ťђàτ ƒĩŀε ţб έπšμґé ţђäť тћê ѓέάδ-õлļỳ ƒŀãġ ΐš ʼnοт ŝėт ǻпď ţнăт ẅѓīţĕ ăсċéšş ĩş ģŗдŋτëđ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="ParentCommandBackButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Ьâçκ !</value>
<value>Бдçķ !</value>
</data>
<data name="ParentCommandBackButton.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>ßâςќ !</value>
<value>Ьãςк !</value>
</data>
<data name="ControlNoticeDialog.PrimaryButtonText" xml:space="preserve">
<value>ΟĶ </value>
<value>ΘК </value>
</data>
<data name="NoticeDebug" xml:space="preserve">
<value>Ðěвυģ !</value>
<value>Ďêъŭģ !</value>
</data>
<data name="NoticeError" xml:space="preserve">
<value>Ēгŕθř !</value>
<value>∑ŕřοґ !</value>
</data>
<data name="NoticeInfo" xml:space="preserve">
<value>Ìлƒöŗмáŧιòʼn !!!</value>
<value>Īπƒóřмąτιŏʼn !!!</value>
</data>
<data name="NoticeWarning" xml:space="preserve">
<value>Ẁάґŋίήġ !!</value>
<value>Шãřñїņģ !!</value>
</data>
<data name="ClipboardTextHeader.Text" xml:space="preserve">
<value>Ćļΐφвőдřđ čøńŧεⁿťś (ρŗэνίêш): !!! !!! !!!</value>
<value>€ℓірьоåŗδ ĉóńťęňтѕ (φѓενĭεẃ): !!! !!! !!!</value>
</data>
<data name="CommandPalette_MoreOptions.[using:Windows.UI.Xaml.Automation]AutomationProperties.HelpText" xml:space="preserve">
<value>Μοřě όρτîойš !!! </value>
<value>Мθґе бφŧīбπš !!! </value>
</data>
<data name="WindowIdLabel" xml:space="preserve">
<value>Ẁĩʼnðőώ !</value>
<value>Ẅίńďöщ !</value>
<comment>This is displayed as a label for a number, like "Window: 10"</comment>
</data>
<data name="UnnamedWindowName" xml:space="preserve">
<value>üñπámеð ώīηďŏщ !!! !</value>
<value>υʼnňàмěđ ẅіπďōẅ !!! !</value>
<comment>text used to identify when a window hasn't been assigned a name by the user</comment>
</data>
<data name="WindowRenamer.Subtitle" xml:space="preserve">
<value>Ęηţęř ă ⁿěω лдm: !!! !!</value>
<value>Єиŧ℮ŗ ă ñéẁ йάmё: !!! !!</value>
</data>
<data name="WindowRenamer.ActionButtonContent" xml:space="preserve">
<value>ØЌ </value>
<value>ÒК </value>
</data>
<data name="WindowRenamer.CloseButtonContent" xml:space="preserve">
<value>Čªпċέł !</value>
<value>Сªⁿċĕĺ !</value>
</data>
<data name="RenameFailedToast.Title" xml:space="preserve">
<value>₣ąϊľêδ ţó řπǻmё шįŋδŏώ !!! !!! </value>
<value>₣âιļĕđ ŧо ѓëňąмë щϊπδǿω !!! !!! </value>
</data>
<data name="RenameFailedToast.Subtitle" xml:space="preserve">
<value>Δиоŧĥêř щϊπðǿẅ ẃĩтн ţђąţ πаmέ åŀѓēªðγ è×їśтŝ !!! !!! !!! !!! !</value>
<value>Άņόтĥěŗ ẃїлðοω ẁιťĥ ťћаť пâmě ăļřéàδў ёжìśŧѕ !!! !!! !!! !!! !</value>
</data>
<data name="WindowMaximizeButtonToolTip" xml:space="preserve">
<value>Μдхįmїżέ !!</value>
<value>Μą×ìmϊżé !!</value>
</data>
<data name="WindowRestoreDownButtonToolTip" xml:space="preserve">
<value>Ŕèšŧòяё ďǿẃи !!! </value>
@@ -737,105 +737,102 @@
<value>Ċòмmāńδ рªľėτťë !!! !</value>
</data>
<data name="NotificationIconFocusTerminal" xml:space="preserve">
<value>₣осµѕ Ţèґmιйàł !!! !</value>
<value>₣ôćűŝ Ţеґмĭйâŀ !!! !</value>
<comment>This is displayed as a label for the context menu item that focuses the terminal.</comment>
</data>
<data name="NotificationIconWindowSubmenu" xml:space="preserve">
<value>Ẅĩήðôщš !!</value>
<value>Ẃϊйδοŵš !!</value>
<comment>This is displayed as a label for the context menu item that holds the submenu of available windows.</comment>
</data>
<data name="DropPathTabRun.Text" xml:space="preserve">
<value>Őρёπ ά ⁿεщ тǻв įⁿ ġΐνëʼn şťàґтΐήġ đϊŕĕčŧōřγ !!! !!! !!! !!! </value>
<value>Фφĕń ª пёẅ ţâь ίи ğīνęņ ѕŧāятĩлğ δįŗęćтŏяγ !!! !!! !!! !!! </value>
</data>
<data name="DropPathTabNewWindow.Text" xml:space="preserve">
<value>Оφęⁿ ã πęẃ ώĭńδôẅ ώïťћ ĝіνęʼn šţǻгŧįиģ ðїřêςτοŗу !!! !!! !!! !!! !!</value>
<value>Οφэй ä ŋёώ ẅįńðбώ ẁįτђ ĝĩνēη šτáгтϊŋĝ ðĭřěçŧøгγ !!! !!! !!! !!! !!</value>
</data>
<data name="DropPathTabSplit.Text" xml:space="preserve">
<value>Ѕрŀĭт τнє ẁìⁿδöщ άπď şţąѓт ĩⁿ ġĭνêŋ ďįгěçţбгŷ !!! !!! !!! !!! !</value>
<value>Ŝρℓΐŧ ŧнė ẁίňďõŵ άпδ ŝţâґţ ίń ģįνëʼn δϊгέ¢ŧøяў !!! !!! !!! !!! !</value>
</data>
<data name="ExportTabText" xml:space="preserve">
<value>Ė×φōŗŧ ţєхŧ !!!</value>
</data>
<data name="ExportFailure" xml:space="preserve">
<value>₣άιļěđ ŧо ěхрŏгť тēѓмïйäℓ ċбητėήт !!! !!! !!! </value>
<value>₣ăìľεď ťθ эхроґт ţеґmίñдļ ¢ōйт℮лť !!! !!! !!! </value>
</data>
<data name="ExportSuccess" xml:space="preserve">
<value>Šŭčċέšśƒūļℓỳ ĕхροѓŧèð τэřміиäĺ čσňţэʼnτ !!! !!! !!! !!</value>
<value>Ŝūĉčєšśƒυłłγ ĕ×φòŗтэð тēгмïʼnãℓ ĉοʼnťëⁿţ !!! !!! !!! !!</value>
</data>
<data name="FindText" xml:space="preserve">
<value>₣ìŋð !</value>
<value>₣ìпđ !</value>
</data>
<data name="PlainText" xml:space="preserve">
<value>Ρĺáīň тěхт !!!</value>
</data>
<data name="CloseOnExitInfoBar.Message" xml:space="preserve">
<value>Ţėřmĩⁿäтîбň ьεђªνįог ĉαή ье ĉόπƒϊĝŭяэδ ΐп ǻđνǻήсєð φґσƒĭľе şέŧŧϊŋğѕ. !!! !!! !!! !!! !!! !!! !!</value>
</data>
<data name="SetAsDefaultInfoBar.Message" xml:space="preserve">
<value>Ẁїⁿðóщŝ Ŧеŕмìиаĺ ¢ªņ ьě ѕéŧ ąŝ ťђ℮ ďęƒåūłť тêґмίŋªℓ αрρłίċăŧíőň ìη ŷσϋг ѕėťťϊпġŝ. !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ťéямїлâŧîόň ь℮ћäνįőř čªή вĕ ċοñƒĩġџřèδ įŋ ăδνåл¢êð ряòƒιļє şėŧтіиĝś. !!! !!! !!! !!! !!! !!! !!</value>
</data>
<data name="InfoBarDismissButton.Content" xml:space="preserve">
<value>Đõŋ'ť šћσẁ àģаΐņ !!! !</value>
<value>Ďόń'ţ šħόω ãĝάϊл !!! !</value>
</data>
<data name="ElevationShield.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Ţђіś Тĕřмїηǻℓ шĩⁿðöŵ ïѕ ѓüñňĩñģ ãŝ áðmĭⁿîşŧŕãţθŕ !!! !!! !!! !!! !!</value>
</data>
<data name="CommandPalette_MatchesAvailable" xml:space="preserve">
<value>Śϋĝģėѕŧïöⁿś ƒоùлď: {0} !!! !!! </value>
<value>Ѕũğġεšтįóпş ƒōцʼnđ: {0} !!! !!! </value>
<comment>{0} will be replaced with a number.</comment>
</data>
<data name="AboutDialog_CheckingForUpdatesLabel.Text" xml:space="preserve">
<value>Ĉħэсķіńğ ƒōя ùρδдτĕѕ... !!! !!! </value>
<value>Çђęċќїŋğ ƒσř ũρδàτέѕ... !!! !!! </value>
</data>
<data name="AboutDialog_UpdateAvailableLabel.Text" xml:space="preserve">
<value>Áи μρðαťέ іś ªνăįļăвŀе. !!! !!! </value>
<value>Δʼn μρđаŧè ĭś ăνăϊłªвľė. !!! !!! </value>
</data>
<data name="AboutDialog_InstallUpdateButton.Content" xml:space="preserve">
<value>Įпśţάľℓ ⁿōщ !!!</value>
<value>Ϊŋśţāŀŀ πбẁ !!!</value>
</data>
<data name="DuplicateRemainingProfilesEntry" xml:space="preserve">
<value>Ŧħė "newTabMenu" ƒìэļđ сöлŧăìηŝ mǿř ţнäñ оπ℮ зйţŕγ ǿƒ ŧỳρė "remainingProfiles". Ǿηĺý ŧħέ ƒіŗşŧ ôйė щįłℓ ьè čôпşίðεґέđ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ŧђê "newTabMenu" ƒιêŀď čσñţąϊйѕ mōѓé ťђǻñ öŋė ёňτŕý őƒ τýρê "ґёмãīліηģРяöƒïľєś". Φпĺў τђё ƒΐѓšτ όñè ώїłł ьè ĉőлѕìδēяёδ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="newTabMenu"} {Locked="remainingProfiles"}</comment>
</data>
<data name="InvalidUseOfContent" xml:space="preserve">
<value>Τћ℮ "__content" ρřǿрéŕŧỳ ίѕ řёśэŗνęđ ƒôя їπτεřйаľ üş℮ !!! !!! !!! !!! !!! </value>
<value>Ťђέ "__content" φŕόφέŕτγ íś řêšзřνеð ƒσř ійтėŕňåℓ ΰşè !!! !!! !!! !!! !!! </value>
<comment>{Locked="__content"}</comment>
</data>
<data name="AboutToolTip" xml:space="preserve">
<value>Οφёи ą đϊаĺöĝ ĉбņŧâĭпíиģ ρяŏδúćţ ΐηƒøŗmªτïóņ !!! !!! !!! !!! !</value>
<value>Фφèη а ðїаļθĝ ćбⁿťáĭηΐñģ ρřσđůčŧ ілƒǿřmãтĩöή !!! !!! !!! !!! !</value>
</data>
<data name="ChooseColorToolTip" xml:space="preserve">
<value>Ωрèй ţђè čбľǿя φîĉќéг ťô ĉĥσθşз τħě čоĺōѓ ôƒ тнĩѕ тåь !!! !!! !!! !!! !!! </value>
<value>Ωφĕй ŧнė ¢óŀοŕ φĩċĸęř τσ ¢ђőōѕė ťħê сõľòŗ бƒ ŧħįѕ τªь !!! !!! !!! !!! !!! </value>
</data>
<data name="CommandPaletteToolTip" xml:space="preserve">
<value>Φφéⁿ ţћě ςθммâňð φăļéτťĕ !!! !!! !</value>
<value>Øρĕл ţће сǿmмåήđ ρãĺέτŧě !!! !!! !</value>
</data>
<data name="DuplicateTabToolTip" xml:space="preserve">
<value>Θрèη ª ⁿêẁ ŧąв µѕїʼnğ τнέ ªčтíνė ρŕоƒíŀê ïй ţħè čúяřĕπť đîřēćţőѓÿ !!! !!! !!! !!! !!! !!! !</value>
<value>Óρέл â ʼnзш τàв ũśĭлġ ŧħё ąċŧîνê ρŕøƒΐĺé ĩи ţħě çúггзηт đĩřзçţøřý !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="ExportTabToolTip" xml:space="preserve">
<value>Ëхрόѓţ τħĕ сōиţєņтş ōƒ ťĥе ťěжτ вŭƒƒёѓ ΐñţō ã ŧěхŧ ƒìŀэ !!! !!! !!! !!! !!! !</value>
<value>Ēхφõґт τĥе сǿήŧĕиŧѕ ōƒ τђė ťε×τ ъũƒƒεř ĩήŧо α ţéם ƒιļê !!! !!! !!! !!! !!! !</value>
</data>
<data name="FindToolTip" xml:space="preserve">
<value>Øρĕⁿ ŧће şëªяćħ δϊαļŏģ !!! !!! </value>
<value>Φρéņ ŧнĕ şęâřςћ ðíάŀŏģ !!! !!! </value>
</data>
<data name="RenameTabToolTip" xml:space="preserve">
<value>Ŕєиáмē ŧђΐŝ тдъ !!! !</value>
<value>Ŗėлαмē тħíŝ тåв !!! !</value>
</data>
<data name="SettingsToolTip" xml:space="preserve">
<value>Ωρęⁿ тĥĕ ѕéţτїηĝś ρǻģė !!! !!! </value>
<value>Òφĕņ тĥе šэτŧīлğš ρдģė !!! !!! </value>
</data>
<data name="SplitTabToolTip" xml:space="preserve">
<value>Φφέл â πέŵ рάňē ŭśіńģ ŧнэ ª¢ţΐνĕ φŗõƒĩļέ īⁿ ŧĥĕ çцřŗėиť đĩгёĉťóŗỳ !!! !!! !!! !!! !!! !!! !</value>
<value>Ωрėŋ д πėẁ φâиě űѕīⁿģ тĥэ ã¢τίνë рřŏƒίĺê îŋ ţћэ çūŗгěηт ďíř℮ĉŧõгỳ !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="TabCloseAfterToolTip" xml:space="preserve">
<value>Ĉŀôѕė дĺľ тāьş τò τħė яĩġћт όƒ τĥΐŝ ŧǻв !!! !!! !!! !!!</value>
<value>Сłǿśе ǻĺľ τăвś ţô ŧн℮ яîĝħť őƒ τђїş тάв !!! !!! !!! !!!</value>
</data>
<data name="TabCloseOtherToolTip" xml:space="preserve">
<value>Ćĺόśе ãŀℓ ťάъŝ ℮хсèφţ ťĥїѕ ŧâь !!! !!! !!!</value>
<value>€ļόѕĕ ªŀŀ ŧáвѕ έ×ćèρт ŧнìş ŧåв !!! !!! !!!</value>
</data>
<data name="TabCloseToolTip" xml:space="preserve">
<value>€ĺòŝэ τђíŝ ţåв !!! !</value>
<value>Ĉłоśэ ťĥìŝ ţªъ !!! !</value>
</data>
<data name="NewTabMenuFolderEmpty" xml:space="preserve">
<value>Ёмφţγ !</value>
@@ -844,61 +841,61 @@
<value>Ĉĺοŝе φаиę !!!</value>
</data>
<data name="ClosePaneToolTip" xml:space="preserve">
<value>Ĉĺοŝě ŧнέ άçŧινè φâηė īƒ mџľťĭрłέ рªņēŝ äя℮ ρŗеšěпť !!! !!! !!! !!! !!!</value>
<value>Çĺόś℮ τнĕ ă¢τίν℮ рáлĕ ιƒ mϋŀţїрĺë φàńęś άŗє рřęšеńт !!! !!! !!! !!! !!!</value>
</data>
<data name="TabColorClearButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.FullDescription" xml:space="preserve">
<value>Ґĕѕёт ŧãь ¢øĺõř !!! !</value>
<value>Ґέšεт τăъ ċǿℓőґ !!! !</value>
<comment>Text used to identify the reset button</comment>
</data>
<data name="MoveTabToNewWindowText" xml:space="preserve">
<value>Мόνз ţǻь ŧö ʼn℮ω ώĭŋδōώ !!! !!! </value>
</data>
<data name="MoveTabToNewWindowToolTip" xml:space="preserve">
<value>Мòνέš τдъ тσ ą ńэω ωìлðøẅ !!! !!! !</value>
<value>Мøνëŝ ŧªъ ŧǿ ã пεẃ шίŋđоẁ !!! !!! !</value>
</data>
<data name="RunAsAdminFlyout.Text" xml:space="preserve">
<value>Ŕμŋ ąś åďmįиíšťґąţőя !!! !!!</value>
<comment>This text is displayed on context menu for profile entries in add new tab button.</comment>
</data>
<data name="TerminalPage_PaneMovedAnnouncement_ExistingTab" xml:space="preserve">
<value>Ąçтΐνэ φапë мőνёð τő "{0}" тãв !!! !!! !!!</value>
<value>∆çťíνĕ рåⁿэ мôνеð ťб "{0}" ţав !!! !!! !!!</value>
<comment>{Locked="{0}"}This text is read out by screen readers upon a successful pane movement. {0} is the name of the tab the pane was moved to.</comment>
</data>
<data name="TerminalPage_TabMovedAnnouncement_Default" xml:space="preserve">
<value>"{0}" ţάв mσνëđ ţô "{1}" ẁΐпδοω !!! !!! !!!</value>
<value>"{0}" ťāъ мōνęđ τŏ "{1}" шΐπδŏẅ !!! !!! !!!</value>
<comment>{Locked="{0}"}{Locked="{1}"}This text is read out by screen readers upon a successful tab movement. {0} is the name of the tab. {1} is the name of the window the tab was moved to.</comment>
</data>
<data name="TerminalPage_TabMovedAnnouncement_NewWindow" xml:space="preserve">
<value>"{0}" ţªь мŏνєð ţσ пёẅ ẁĩńδόẅ !!! !!! !!!</value>
<value>"{0}" тąь mǿνєđ ŧσ ήèώ ẅĩŋďøẃ !!! !!! !!!</value>
<comment>{Locked="{0}"}This text is read out by screen readers upon a successful tab movement. {0} is the name of the tab.</comment>
</data>
<data name="TerminalPage_TabMovedAnnouncement_Direction" xml:space="preserve">
<value>"{0}" ταъ møνęδ ţő рõśíτιŏп "{1}" !!! !!! !!! </value>
<value>"{0}" ŧαв мονĕđ το φóŝїŧíŏñ "{1}" !!! !!! !!! </value>
<comment>{Locked="{0}"}{Locked="{1}"}This text is read out by screen readers upon a successful tab movement. {0} is the name of the tab. {1} is the new tab index in the tab row.</comment>
</data>
<data name="TerminalPage_PaneMovedAnnouncement_ExistingWindow" xml:space="preserve">
<value>Ǻċτΐνé φâήе мǿνéđ ţθ "{0}" ťäъ ïи "{1}" ŵιņđõш !!! !!! !!! !!! !</value>
<value>Α¢ťϊνë рãņє môνέď τō "{0}" ţâъ ĭή "{1}" ẃĩńδθш !!! !!! !!! !!! !</value>
<comment>{Locked="{0}"}{Locked="{1}"}This text is read out by screen readers upon a successful pane movement. {0} is the name of the tab the pane was moved to. {1} is the name of the window the pane was moved to. Replaced in 1.19 by TerminalPage_PaneMovedAnnouncement_ExistingWindow2</comment>
</data>
<data name="TerminalPage_PaneMovedAnnouncement_ExistingWindow2" xml:space="preserve">
<value>Åčţΐνē φàле мονêď τõ "{0}" ώĭňđòω !!! !!! !!! </value>
<value>Λςťìνє рáиė mόνéð ťб "{0}" ŵîńđθω !!! !!! !!! </value>
<comment>{Locked="{0}"}This text is read out by screen readers upon a successful pane movement. {0} is the name of the window the pane was moved to.</comment>
</data>
<data name="TerminalPage_PaneMovedAnnouncement_NewWindow" xml:space="preserve">
<value>Ăćτíνέ φãήз мθνěđ ţǿ ňέẃ ωίňďóẁ !!! !!! !!!</value>
<value>Αĉťįνέ ρªņз mσνёđ τǿ ήёẃ ẃîпďǿω !!! !!! !!!</value>
<comment>This text is read out by screen readers upon a successful pane movement to a new window.</comment>
</data>
<data name="TerminalPage_PaneMovedAnnouncement_NewTab" xml:space="preserve">
<value>Äĉŧîνє φåňε móνέð ťö ňεω ŧâь !!! !!! !!</value>
<value>Дсţϊνё φαŋє mбνð ťŏ ηеẁ ταв !!! !!! !!</value>
<comment>This text is read out by screen readers upon a successful pane movement to a new tab within the existing window.</comment>
</data>
<data name="CmdAppendCommandLineDesc" xml:space="preserve">
<value>΃ śèţ, ţђέ ćòмmǻŋď шіŀľ ъэ дррэňδĕð тθ ťĥє φѓōƒíľэ'ś δéƒâūŀт ćомmāņď їиśťēāđ ŏƒ ѓēрłά¢íηĝ іт. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Ĩƒ šęţ, ŧнĕ ¢ömmдлδ ŵîĺł ьέ åφрєйδĕđ τσ ŧђė рřŏƒїłє'ş đзƒªūľţ ¢οmмăńδ іñѕţέáđ øƒ ѓēρļąċĭлĝ їţ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="RestartConnectionText" xml:space="preserve">
<value>Γēѕŧâяŧ ćǿńńēčťїöл !!! !!</value>
</data>
<data name="RestartConnectionToolTip" xml:space="preserve">
<value>Ѓêşŧãřŧ тн℮ âçτìνе рàⁿê ćбñйєĉтĩόʼn !!! !!! !!! !</value>
<value>Γėşťáгţ ŧħ℮ ãčтĩνέ ρăйё сǿηńëςтιóņ !!! !!! !!! !</value>
</data>
</root>
</root>

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Ťĥё Ñēщ Шίⁿðоẅś Ťėгмîήāľ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Шίηđóŵš Ŧĕяmїйà ẁітħ ª φяęνîёщ όƒ ûφĉбмíήĝ ƒêåťµřεŝ !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Óрëπ íи Ťēяmілǻŀ (&amp;Cäηàřÿ) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Óрзń ΐή Ŧěґмιлāℓ &amp;Pѓéνīĕω !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ôрëη ïп &amp;Tēѓмϊŋãł !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -187,6 +187,9 @@
<data name="Quit" xml:space="preserve">
<value>Qùíт !</value>
</data>
<data name="CloseWindowWarningTitle" xml:space="preserve">
<value>Đǿ ÿõű ŵãŋт тŏ ¢ľòŝê ăŀľ ŧãвŝ? !!! !!! !!!</value>
</data>
<data name="MultiplePanes" xml:space="preserve">
<value>Мµļтíрłĕ φдпėŝ !!! !</value>
</data>
@@ -337,9 +340,6 @@
<data name="CmdProfileArgDesc" xml:space="preserve">
<value>Θφêп шĩτћ ťнě ģìνēή ρѓøƒìĺę. Âćĉеφťś ёĩτĥėŗ τђė йάмє øя ĠŮΪÐ õƒ а φŕóƒίℓè !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="CmdSessionIdArgDesc" xml:space="preserve">
<value>Šέŧś ŧћэ ẀŦ_ŜÉŜŜІΟΝ νăяíåьłé; mµśτ вэ â ĢŨÎĐ !!! !!! !!! !!! !</value>
</data>
<data name="CmdSplitPaneDesc" xml:space="preserve">
<value>Ĉґéáŧе д ήэẅ ŝφĺĭτ рãňё !!! !!! </value>
</data>

View File

@@ -166,7 +166,7 @@
<comment>{Locked=qps-ploc,qps-ploca,qps-plocm}</comment>
</data>
<data name="AppDescription" xml:space="preserve">
<value>Тĥё Ńēẁ Шіπđοωš Тěřмιňαŀ !!! !!! !</value>
<value>Τĥз Йéщ Ẃįńđôẃѕ Тéѓmĩиâļ !!! !!! !</value>
</data>
<data name="AppDescriptionDev" xml:space="preserve">
<value>The Windows Terminal, but Unofficial</value>
@@ -177,22 +177,22 @@
<comment>{Locked}</comment>
</data>
<data name="AppDescriptionPre" xml:space="preserve">
<value>Шίήďŏшś Ŧêямĩňāľ ŵíτн ă ρѓëνιêω øƒ ũρčŏмįηğ ƒєáţũŗêš !!! !!! !!! !!! !!! </value>
<value>Щΐňδόŵѕ Ŧęřмĭʼnäℓ ẅîťħ à φřеνίëẃ θƒ џрсøмΐʼnğ ƒĕāŧųřэś !!! !!! !!! !!! !!! </value>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Dev" xml:space="preserve">
<value>Open in Terminal (&amp;Dev)</value>
<comment>{Locked} The dev build will never be seen in multiple languages</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Canary" xml:space="preserve">
<value>Фφěй ĩń Тêřmιπâł (&amp;Cãⁿǻřу) !!! !!! !</value>
<value>Θρēņ ïη Ţéгmĭηäŀ (&amp;Çäņдѓγ) !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Canary version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem_Preview" xml:space="preserve">
<value>Óφ℮ʼn ΐŋ Τėřmīйäĺ &amp;Pяєνϊëẃ !!! !!! !</value>
<value>Όрèп ìņ Ţêŕmїʼnåļ &amp;Рѓзνι℮ω !!! !!! !</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the Preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
<data name="ShellExtension_OpenInTerminalMenuItem" xml:space="preserve">
<value>Ορέл ϊŋ &amp;Téŕmįñā !!! !!</value>
<value>Óрêп ìл &amp;Ťěѓmιиåĺ !!! !!</value>
<comment>This is a menu item that will be displayed in the Windows File Explorer that launches the non-preview version of Windows Terminal. Please mark one of the characters to be an accelerator key.</comment>
</data>
</root>

View File

@@ -187,6 +187,9 @@
<data name="Quit" xml:space="preserve">
<value>Qùíт !</value>
</data>
<data name="CloseWindowWarningTitle" xml:space="preserve">
<value>Đǿ ÿõű ŵãŋт тŏ ¢ľòŝê ăŀľ ŧãвŝ? !!! !!! !!!</value>
</data>
<data name="MultiplePanes" xml:space="preserve">
<value>Мµļтíрłĕ φдпėŝ !!! !</value>
</data>
@@ -337,9 +340,6 @@
<data name="CmdProfileArgDesc" xml:space="preserve">
<value>Θφêп шĩτћ ťнě ģìνēή ρѓøƒìĺę. Âćĉеφťś ёĩτĥėŗ τђė йάмє øя ĠŮΪÐ õƒ а φŕóƒίℓè !!! !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="CmdSessionIdArgDesc" xml:space="preserve">
<value>Šέŧś ŧћэ ẀŦ_ŜÉŜŜІΟΝ νăяíåьłé; mµśτ вэ â ĢŨÎĐ !!! !!! !!! !!! !</value>
</data>
<data name="CmdSplitPaneDesc" xml:space="preserve">
<value>Ĉґéáŧе д ήэẅ ŝφĺĭτ рãňё !!! !!! </value>
</data>

View File

@@ -57,7 +57,7 @@ namespace winrt::TerminalApp::implementation
// re-evaluate including that arg in this action then.
// Return Value:
// - The list of actions.
std::vector<ActionAndArgs> SettingsTab::BuildStartupActions(const bool /*asContent*/) const
std::vector<ActionAndArgs> SettingsTab::BuildStartupActions(BuildStartupKind) const
{
ASSERT_UI_THREAD();

View File

@@ -30,7 +30,7 @@ namespace winrt::TerminalApp::implementation
void UpdateSettings(Microsoft::Terminal::Settings::Model::CascadiaSettings settings);
void Focus(winrt::Windows::UI::Xaml::FocusState focusState) override;
std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(const bool asContent = false) const override;
std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(BuildStartupKind kind) const override;
private:
winrt::Windows::UI::Xaml::ElementTheme _requestedTheme;

View File

@@ -12,6 +12,14 @@ namespace TerminalAppLocalTests
namespace winrt::TerminalApp::implementation
{
enum class BuildStartupKind
{
None,
Content,
MovePane,
Persist,
};
struct TabBase : TabBaseT<TabBase>
{
public:
@@ -22,7 +30,7 @@ namespace winrt::TerminalApp::implementation
void UpdateTabViewIndex(const uint32_t idx, const uint32_t numTabs);
void SetActionMap(const Microsoft::Terminal::Settings::Model::IActionMapView& actionMap);
virtual std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(const bool asContent = false) const = 0;
virtual std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(BuildStartupKind kind) const = 0;
virtual std::optional<winrt::Windows::UI::Color> GetTabColor();
void ThemeColor(const winrt::Microsoft::Terminal::Settings::Model::ThemeColor& focused,

View File

@@ -428,7 +428,7 @@ namespace winrt::TerminalApp::implementation
}
auto t = winrt::get_self<implementation::TabBase>(tab);
auto actions = t->BuildStartupActions();
auto actions = t->BuildStartupActions(BuildStartupKind::None);
_AddPreviouslyClosedPaneOrTab(std::move(actions));
_RemoveTab(tab);
@@ -485,7 +485,7 @@ namespace winrt::TerminalApp::implementation
// if the user manually closed all tabs.
// Do this only if we are the last window; the monarch will notice
// we are missing and remove us that way otherwise.
_LastTabClosedHandlers(*this, winrt::make<LastTabClosedEventArgs>(!_maintainStateOnTabClose));
_CloseWindowRequestedHandlers(*this, nullptr);
}
else if (focusedTabIndex.has_value() && focusedTabIndex.value() == gsl::narrow_cast<uint32_t>(tabIndex))
{
@@ -766,11 +766,11 @@ namespace winrt::TerminalApp::implementation
// This doesn't handle refocusing anything in particular, the
// result will be that the last pane created is focused. In the
// case of a single pane that is the desired behavior anyways.
auto state = pane->BuildStartupActions(0, 1);
auto state = pane->BuildStartupActions(0, 1, BuildStartupKind::None);
{
ActionAndArgs splitPaneAction{};
splitPaneAction.Action(ShortcutAction::SplitPane);
SplitPaneArgs splitPaneArgs{ SplitDirection::Automatic, state.firstPane->GetTerminalArgsForPane() };
SplitPaneArgs splitPaneArgs{ SplitDirection::Automatic, state.firstPane->GetTerminalArgsForPane(BuildStartupKind::None) };
splitPaneAction.Args(splitPaneArgs);
state.args.emplace(state.args.begin(), std::move(splitPaneAction));
@@ -1138,12 +1138,4 @@ namespace winrt::TerminalApp::implementation
{
return _tabs.Size() > 1;
}
void TerminalPage::_RemoveAllTabs()
{
// Since _RemoveTabs is asynchronous, create a snapshot of the tabs we want to remove
std::vector<winrt::TerminalApp::TabBase> tabsToRemove;
std::copy(begin(_tabs), end(_tabs), std::back_inserter(tabsToRemove));
_RemoveTabs(tabsToRemove);
}
}

View File

@@ -5,10 +5,10 @@
#include "pch.h"
#include "TerminalPage.h"
#include "TerminalPage.g.cpp"
#include "LastTabClosedEventArgs.g.cpp"
#include "RenameWindowRequestedArgs.g.cpp"
#include "RequestMoveContentArgs.g.cpp"
#include "RequestReceiveContentArgs.g.cpp"
#include "LaunchPositionRequest.g.cpp"
#include <filesystem>
@@ -654,9 +654,9 @@ namespace winrt::TerminalApp::implementation
// GH#12267: Make sure that we don't instantly close ourselves when
// we're readying to accept a defterm connection. In that case, we don't
// have a tab yet, but will once we're initialized.
if (_tabs.Size() == 0 && !(_shouldStartInboundListener || _isEmbeddingInboundListener))
if (_tabs.Size() == 0 && !_shouldStartInboundListener && !_isEmbeddingInboundListener)
{
_LastTabClosedHandlers(*this, winrt::make<LastTabClosedEventArgs>(false));
_CloseWindowRequestedHandlers(*this, nullptr);
co_return;
}
else
@@ -1642,10 +1642,6 @@ namespace winrt::TerminalApp::implementation
{
term.RaiseNotice({ this, &TerminalPage::_ControlNoticeRaisedHandler });
// Add an event handler when the terminal's selection wants to be copied.
// When the text buffer data is retrieved, we'll copy the data into the Clipboard
term.CopyToClipboard({ this, &TerminalPage::_CopyToClipboardHandler });
// Add an event handler when the terminal wants to paste data from the Clipboard.
term.PasteFromClipboard({ this, &TerminalPage::_PasteFromClipboardHandler });
@@ -1900,19 +1896,14 @@ namespace winrt::TerminalApp::implementation
}
}
// Method Description:
// - Saves the window position and tab layout to the application state
// - This does not create the InitialPosition field, that needs to be
// added externally.
// Arguments:
// - <none>
// Return Value:
// - the window layout
WindowLayout TerminalPage::GetWindowLayout()
void TerminalPage::PersistState()
{
if (_startupState != StartupState::Initialized)
// This method may be called for a window even if it hasn't had a tab yet or lost all of them.
// We shouldn't persist such windows.
const auto tabCount = _tabs.Size();
if (_startupState != StartupState::Initialized || tabCount == 0)
{
return nullptr;
return;
}
std::vector<ActionAndArgs> actions;
@@ -1920,13 +1911,13 @@ namespace winrt::TerminalApp::implementation
for (auto tab : _tabs)
{
auto t = winrt::get_self<implementation::TabBase>(tab);
auto tabActions = t->BuildStartupActions();
auto tabActions = t->BuildStartupActions(BuildStartupKind::Persist);
actions.insert(actions.end(), std::make_move_iterator(tabActions.begin()), std::make_move_iterator(tabActions.end()));
}
// if the focused tab was not the last tab, restore that
auto idx = _GetFocusedTabIndex();
if (idx && idx != _tabs.Size() - 1)
if (idx && idx != tabCount - 1)
{
ActionAndArgs action;
action.Action(ShortcutAction::SwitchToTab);
@@ -1947,7 +1938,7 @@ namespace winrt::TerminalApp::implementation
actions.emplace_back(std::move(action));
}
WindowLayout layout{};
WindowLayout layout;
layout.TabLayout(winrt::single_threaded_vector<ActionAndArgs>(std::move(actions)));
auto mode = LaunchMode::DefaultMode;
@@ -1964,20 +1955,21 @@ namespace winrt::TerminalApp::implementation
layout.InitialSize(windowSize);
return layout;
// We don't actually know our own position. So we have to ask the window
// layer for that.
const auto launchPosRequest{ winrt::make<LaunchPositionRequest>() };
_RequestLaunchPositionHandlers(*this, launchPosRequest);
layout.InitialPosition(launchPosRequest.Position());
ApplicationState::SharedInstance().AppendPersistedWindowLayout(layout);
}
// Method Description:
// - Close the terminal app. If there is more
// than one tab opened, show a warning dialog.
// Arguments:
// - bypassDialog: if true a dialog won't be shown even if the user would
// normally get confirmation. This is used in the case where the user
// has already been prompted by the Quit action.
fire_and_forget TerminalPage::CloseWindow(bool bypassDialog)
fire_and_forget TerminalPage::CloseWindow()
{
if (!bypassDialog &&
_HasMultipleTabs() &&
if (_HasMultipleTabs() &&
_settings.GlobalSettings().ConfirmCloseAllTabs() &&
!_displayingCloseDialog)
{
@@ -1996,15 +1988,7 @@ namespace winrt::TerminalApp::implementation
}
}
if (_settings.GlobalSettings().ShouldUsePersistedLayout())
{
// Don't delete the ApplicationState when all of the tabs are removed.
// If there is still a monarch living they will get the event that
// a window closed and trigger a new save without this window.
_maintainStateOnTabClose = true;
}
_RemoveAllTabs();
_CloseWindowRequestedHandlers(*this, nullptr);
}
// Method Description:
@@ -2066,7 +2050,7 @@ namespace winrt::TerminalApp::implementation
{
if (const auto pane{ terminalTab->GetActivePane() })
{
auto startupActions = pane->BuildStartupActions(0, 1, true, true);
auto startupActions = pane->BuildStartupActions(0, 1, BuildStartupKind::MovePane);
_DetachPaneFromWindow(pane);
_MoveContent(std::move(startupActions.args), windowId, tabIdx);
focusedTab->DetachPane();
@@ -2208,7 +2192,7 @@ namespace winrt::TerminalApp::implementation
if (tab)
{
auto startupActions = tab->BuildStartupActions(true);
auto startupActions = tab->BuildStartupActions(BuildStartupKind::Content);
_DetachTabFromWindow(tab);
_MoveContent(std::move(startupActions), windowId, 0);
_RemoveTab(*tab);
@@ -2578,54 +2562,6 @@ namespace winrt::TerminalApp::implementation
return dimension;
}
// Method Description:
// - Place `copiedData` into the clipboard as text. Triggered when a
// terminal control raises its CopyToClipboard event.
// Arguments:
// - copiedData: the new string content to place on the clipboard.
winrt::fire_and_forget TerminalPage::_CopyToClipboardHandler(const IInspectable /*sender*/,
const CopyToClipboardEventArgs copiedData)
{
co_await wil::resume_foreground(Dispatcher(), CoreDispatcherPriority::High);
auto dataPack = DataPackage();
dataPack.RequestedOperation(DataPackageOperation::Copy);
const auto copyFormats = copiedData.Formats() != nullptr ?
copiedData.Formats().Value() :
static_cast<CopyFormat>(0);
// copy text to dataPack
dataPack.SetText(copiedData.Text());
if (WI_IsFlagSet(copyFormats, CopyFormat::HTML))
{
// copy html to dataPack
const auto htmlData = copiedData.Html();
if (!htmlData.empty())
{
dataPack.SetHtmlFormat(htmlData);
}
}
if (WI_IsFlagSet(copyFormats, CopyFormat::RTF))
{
// copy rtf data to dataPack
const auto rtfData = copiedData.Rtf();
if (!rtfData.empty())
{
dataPack.SetRtf(rtfData);
}
}
try
{
Clipboard::SetContent(dataPack);
Clipboard::Flush();
}
CATCH_LOG();
}
static wil::unique_close_clipboard_call _openClipboard(HWND hwnd)
{
bool success = false;
@@ -5135,7 +5071,7 @@ namespace winrt::TerminalApp::implementation
const uint32_t tabIndex,
std::optional<til::point> dragPoint)
{
auto startupActions = _stashed.draggedTab->BuildStartupActions(true);
auto startupActions = _stashed.draggedTab->BuildStartupActions(BuildStartupKind::Content);
_DetachTabFromWindow(_stashed.draggedTab);
_MoveContent(std::move(startupActions), windowId, tabIndex, dragPoint);

View File

@@ -7,10 +7,10 @@
#include "TerminalTab.h"
#include "AppKeyBindings.h"
#include "AppCommandlineArgs.h"
#include "LastTabClosedEventArgs.g.h"
#include "RenameWindowRequestedArgs.g.h"
#include "RequestMoveContentArgs.g.h"
#include "RequestReceiveContentArgs.g.h"
#include "LaunchPositionRequest.g.h"
#include "Toast.h"
#define DECLARE_ACTION_HANDLER(action) void _Handle##action(const IInspectable& sender, const Microsoft::Terminal::Settings::Model::ActionEventArgs& args);
@@ -44,15 +44,6 @@ namespace winrt::TerminalApp::implementation
ScrollDown = 1
};
struct LastTabClosedEventArgs : LastTabClosedEventArgsT<LastTabClosedEventArgs>
{
WINRT_PROPERTY(bool, ClearPersistedState);
public:
LastTabClosedEventArgs(const bool& shouldClear) :
_ClearPersistedState{ shouldClear } {};
};
struct RenameWindowRequestedArgs : RenameWindowRequestedArgsT<RenameWindowRequestedArgs>
{
WINRT_PROPERTY(winrt::hstring, ProposedName);
@@ -89,6 +80,13 @@ namespace winrt::TerminalApp::implementation
_TabIndex{ tabIndex } {};
};
struct LaunchPositionRequest : LaunchPositionRequestT<LaunchPositionRequest>
{
LaunchPositionRequest() = default;
til::property<winrt::Microsoft::Terminal::Settings::Model::LaunchPosition> Position;
};
struct TerminalPage : TerminalPageT<TerminalPage>
{
public:
@@ -105,7 +103,6 @@ namespace winrt::TerminalApp::implementation
bool ShouldImmediatelyHandoffToElevated(const Microsoft::Terminal::Settings::Model::CascadiaSettings& settings) const;
void HandoffToElevated(const Microsoft::Terminal::Settings::Model::CascadiaSettings& settings);
Microsoft::Terminal::Settings::Model::WindowLayout GetWindowLayout();
hstring Title();
@@ -121,7 +118,8 @@ namespace winrt::TerminalApp::implementation
SuggestionsControl LoadSuggestionsUI();
winrt::fire_and_forget RequestQuit();
winrt::fire_and_forget CloseWindow(bool bypassDialog);
winrt::fire_and_forget CloseWindow();
void PersistState();
void ToggleFocusMode();
void ToggleFullscreen();
@@ -175,7 +173,7 @@ namespace winrt::TerminalApp::implementation
// -------------------------------- WinRT Events ---------------------------------
TYPED_EVENT(TitleChanged, IInspectable, winrt::hstring);
TYPED_EVENT(LastTabClosed, IInspectable, winrt::TerminalApp::LastTabClosedEventArgs);
TYPED_EVENT(CloseWindowRequested, IInspectable, IInspectable);
TYPED_EVENT(SetTitleBarContent, IInspectable, winrt::Windows::UI::Xaml::UIElement);
TYPED_EVENT(FocusModeChanged, IInspectable, IInspectable);
TYPED_EVENT(FullscreenChanged, IInspectable, IInspectable);
@@ -196,6 +194,8 @@ namespace winrt::TerminalApp::implementation
TYPED_EVENT(RequestMoveContent, Windows::Foundation::IInspectable, winrt::TerminalApp::RequestMoveContentArgs);
TYPED_EVENT(RequestReceiveContent, Windows::Foundation::IInspectable, winrt::TerminalApp::RequestReceiveContentArgs);
TYPED_EVENT(RequestLaunchPosition, IInspectable, winrt::TerminalApp::LaunchPositionRequest);
WINRT_OBSERVABLE_PROPERTY(winrt::Windows::UI::Xaml::Media::Brush, TitlebarBrush, _PropertyChangedHandlers, nullptr);
WINRT_OBSERVABLE_PROPERTY(winrt::Windows::UI::Xaml::Media::Brush, FrameBrush, _PropertyChangedHandlers, nullptr);
@@ -232,7 +232,6 @@ namespace winrt::TerminalApp::implementation
std::optional<uint32_t> _loadFromPersistedLayoutIdx{};
bool _maintainStateOnTabClose{ false };
bool _rearranging{ false };
std::optional<int> _rearrangeFrom{};
std::optional<int> _rearrangeTo{};
@@ -349,7 +348,6 @@ namespace winrt::TerminalApp::implementation
void _DismissTabContextMenus();
void _FocusCurrentTab(const bool focusAlways);
bool _HasMultipleTabs() const;
void _RemoveAllTabs();
void _SelectNextTab(const bool bMoveRight, const Windows::Foundation::IReference<Microsoft::Terminal::Settings::Model::TabSwitcherMode>& customTabSwitcherMode);
bool _SelectTab(uint32_t tabIndex);
@@ -405,7 +403,6 @@ namespace winrt::TerminalApp::implementation
void _ScrollToBufferEdge(ScrollDirection scrollDirection);
void _SetAcceleratorForMenuItem(Windows::UI::Xaml::Controls::MenuFlyoutItem& menuItem, const winrt::Microsoft::Terminal::Control::KeyChord& keyChord);
winrt::fire_and_forget _CopyToClipboardHandler(const IInspectable sender, const winrt::Microsoft::Terminal::Control::CopyToClipboardEventArgs copiedData);
winrt::fire_and_forget _PasteFromClipboardHandler(const IInspectable sender,
const Microsoft::Terminal::Control::PasteFromClipboardEventArgs eventArgs);

View File

@@ -15,11 +15,6 @@ namespace TerminalApp
void Detach(Microsoft.Terminal.Control.TermControl control);
}
[default_interface] runtimeclass LastTabClosedEventArgs
{
Boolean ClearPersistedState { get; };
};
[default_interface] runtimeclass RenameWindowRequestedArgs
{
String ProposedName { get; };
@@ -57,6 +52,11 @@ namespace TerminalApp
Boolean IsQuakeWindow();
};
runtimeclass LaunchPositionRequest
{
Microsoft.Terminal.Settings.Model.LaunchPosition Position;
}
[default_interface] runtimeclass TerminalPage : Windows.UI.Xaml.Controls.Page, Windows.UI.Xaml.Data.INotifyPropertyChanged, IDirectKeyListener
{
TerminalPage(WindowProperties properties, ContentManager manager);
@@ -87,7 +87,7 @@ namespace TerminalApp
void SendContentToOther(RequestReceiveContentArgs args);
event Windows.Foundation.TypedEventHandler<Object, String> TitleChanged;
event Windows.Foundation.TypedEventHandler<Object, LastTabClosedEventArgs> LastTabClosed;
event Windows.Foundation.TypedEventHandler<Object, Object> CloseWindowRequested;
event Windows.Foundation.TypedEventHandler<Object, Windows.UI.Xaml.UIElement> SetTitleBarContent;
event Windows.Foundation.TypedEventHandler<Object, Object> FocusModeChanged;
event Windows.Foundation.TypedEventHandler<Object, Object> FullscreenChanged;
@@ -104,5 +104,7 @@ namespace TerminalApp
event Windows.Foundation.TypedEventHandler<Object, RequestMoveContentArgs> RequestMoveContent;
event Windows.Foundation.TypedEventHandler<Object, RequestReceiveContentArgs> RequestReceiveContent;
event Windows.Foundation.TypedEventHandler<Object, LaunchPositionRequest> RequestLaunchPosition;
}
}

View File

@@ -427,18 +427,18 @@ namespace winrt::TerminalApp::implementation
// - <none>
// Return Value:
// - A vector of commands
std::vector<ActionAndArgs> TerminalTab::BuildStartupActions(const bool asContent) const
std::vector<ActionAndArgs> TerminalTab::BuildStartupActions(BuildStartupKind kind) const
{
ASSERT_UI_THREAD();
// Give initial ids (0 for the child created with this tab,
// 1 for the child after the first split.
auto state = _rootPane->BuildStartupActions(0, 1, asContent);
auto state = _rootPane->BuildStartupActions(0, 1, kind);
{
ActionAndArgs newTabAction{};
newTabAction.Action(ShortcutAction::NewTab);
NewTabArgs newTabArgs{ state.firstPane->GetTerminalArgsForPane(asContent) };
NewTabArgs newTabArgs{ state.firstPane->GetTerminalArgsForPane(kind) };
newTabAction.Args(newTabArgs);
state.args.emplace(state.args.begin(), std::move(newTabAction));

View File

@@ -78,7 +78,7 @@ namespace winrt::TerminalApp::implementation
void EnterZoom();
void ExitZoom();
std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(const bool asContent = false) const override;
std::vector<Microsoft::Terminal::Settings::Model::ActionAndArgs> BuildStartupActions(BuildStartupKind kind) const override;
int GetLeafPaneCount() const noexcept;

View File

@@ -263,11 +263,11 @@ namespace winrt::TerminalApp::implementation
AppLogic::Current()->NotifyRootInitialized();
}
void TerminalWindow::Quit()
void TerminalWindow::PersistState()
{
if (_root)
{
_root->CloseWindow(true);
_root->PersistState();
}
}
@@ -562,9 +562,21 @@ namespace winrt::TerminalApp::implementation
{
winrt::Windows::Foundation::Size proposedSize{};
// In focus mode, we don't want to include our own tab row in the size
// of the window that we hand back. So we account for passing
// --focusMode on the commandline here, and the mode in the settings.
// Below, we'll also account for if focus mode was persisted into the
// session for restoration.
bool focusMode = _appArgs.GetLaunchMode().value_or(_settings.GlobalSettings().LaunchMode()) == LaunchMode::FocusMode;
const auto scale = static_cast<float>(dpi) / static_cast<float>(USER_DEFAULT_SCREEN_DPI);
if (const auto layout = LoadPersistedLayout())
{
if (layout.LaunchMode())
{
focusMode = layout.LaunchMode().Value() == LaunchMode::FocusMode;
}
if (layout.InitialSize())
{
proposedSize = layout.InitialSize().Value();
@@ -602,7 +614,7 @@ namespace winrt::TerminalApp::implementation
// GH#2061 - If the global setting "Always show tab bar" is
// set or if "Show tabs in title bar" is set, then we'll need to add
// the height of the tab bar here.
if (_settings.GlobalSettings().ShowTabsInTitlebar())
if (_settings.GlobalSettings().ShowTabsInTitlebar() && !focusMode)
{
// In the past, we used to actually instantiate a TitlebarControl
// and use Measure() to determine the DesiredSize of the control, to
@@ -620,7 +632,7 @@ namespace winrt::TerminalApp::implementation
static constexpr auto titlebarHeight = 40;
proposedSize.Height += (titlebarHeight)*scale;
}
else if (_settings.GlobalSettings().AlwaysShowTabs())
else if (_settings.GlobalSettings().AlwaysShowTabs() && !focusMode)
{
// Same comment as above, but with a TabRowControl.
//
@@ -916,32 +928,11 @@ namespace winrt::TerminalApp::implementation
// - <none>
// Return Value:
// - <none>
void TerminalWindow::CloseWindow(LaunchPosition pos, const bool isLastWindow)
void TerminalWindow::CloseWindow()
{
if (_root)
{
// If persisted layout is enabled and we are the last window closing
// we should save our state.
if (_settings.GlobalSettings().ShouldUsePersistedLayout() && isLastWindow)
{
if (const auto layout = _root->GetWindowLayout())
{
layout.InitialPosition(pos);
const auto state = ApplicationState::SharedInstance();
state.PersistedWindowLayouts(winrt::single_threaded_vector<WindowLayout>({ layout }));
}
}
_root->CloseWindow(false);
}
}
void TerminalWindow::ClearPersistedWindowState()
{
if (_settings.GlobalSettings().ShouldUsePersistedLayout())
{
auto state = ApplicationState::SharedInstance();
state.PersistedWindowLayouts(nullptr);
_root->CloseWindow();
}
}
@@ -1134,19 +1125,6 @@ namespace winrt::TerminalApp::implementation
return winrt::to_hstring(_appArgs.GetExitMessage());
}
hstring TerminalWindow::GetWindowLayoutJson(LaunchPosition position)
{
if (_root != nullptr)
{
if (const auto layout = _root->GetWindowLayout())
{
layout.InitialPosition(position);
return WindowLayout::ToJson(layout);
}
}
return L"";
}
void TerminalWindow::SetPersistedLayoutIdx(const uint32_t idx)
{
_loadFromPersistedLayoutIdx = idx;

View File

@@ -73,7 +73,7 @@ namespace winrt::TerminalApp::implementation
void Create();
void Quit();
void PersistState();
winrt::fire_and_forget UpdateSettings(winrt::TerminalApp::SettingsLoadEventArgs args);
@@ -95,8 +95,6 @@ namespace winrt::TerminalApp::implementation
bool AlwaysOnTop() const;
bool AutoHideWindow();
hstring GetWindowLayoutJson(Microsoft::Terminal::Settings::Model::LaunchPosition position);
void IdentifyWindow();
void RenameFailed();
@@ -104,9 +102,6 @@ namespace winrt::TerminalApp::implementation
winrt::Microsoft::Terminal::Settings::Model::WindowLayout LoadPersistedLayout();
void SetPersistedLayoutIdx(const uint32_t idx);
void SetNumberOfOpenWindows(const uint64_t num);
bool ShouldUsePersistedLayout() const;
void ClearPersistedWindowState();
void RequestExitFullscreen();
@@ -125,7 +120,7 @@ namespace winrt::TerminalApp::implementation
void TitlebarClicked();
bool OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down);
void CloseWindow(Microsoft::Terminal::Settings::Model::LaunchPosition position, const bool isLastWindow);
void CloseWindow();
void WindowVisibilityChanged(const bool showOrHide);
winrt::TerminalApp::TaskbarState TaskbarState();
@@ -215,7 +210,7 @@ namespace winrt::TerminalApp::implementation
FORWARDED_TYPED_EVENT(SetTitleBarContent, winrt::Windows::Foundation::IInspectable, winrt::Windows::UI::Xaml::UIElement, _root, SetTitleBarContent);
FORWARDED_TYPED_EVENT(TitleChanged, winrt::Windows::Foundation::IInspectable, winrt::hstring, _root, TitleChanged);
FORWARDED_TYPED_EVENT(LastTabClosed, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs, _root, LastTabClosed);
FORWARDED_TYPED_EVENT(CloseWindowRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, CloseWindowRequested);
FORWARDED_TYPED_EVENT(FocusModeChanged, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, FocusModeChanged);
FORWARDED_TYPED_EVENT(FullscreenChanged, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, FullscreenChanged);
FORWARDED_TYPED_EVENT(ChangeMaximizeRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable, _root, ChangeMaximizeRequested);
@@ -239,6 +234,8 @@ namespace winrt::TerminalApp::implementation
FORWARDED_TYPED_EVENT(RequestMoveContent, Windows::Foundation::IInspectable, winrt::TerminalApp::RequestMoveContentArgs, _root, RequestMoveContent);
FORWARDED_TYPED_EVENT(RequestReceiveContent, Windows::Foundation::IInspectable, winrt::TerminalApp::RequestReceiveContentArgs, _root, RequestReceiveContent);
FORWARDED_TYPED_EVENT(RequestLaunchPosition, Windows::Foundation::IInspectable, winrt::TerminalApp::LaunchPositionRequest, _root, RequestLaunchPosition);
#ifdef UNIT_TESTING
friend class TerminalAppLocalTests::CommandlineTest;
#endif

View File

@@ -62,7 +62,7 @@ namespace TerminalApp
Boolean ShouldImmediatelyHandoffToElevated();
void HandoffToElevated();
void Quit();
void PersistState();
Windows.UI.Xaml.UIElement GetRoot();
@@ -75,7 +75,6 @@ namespace TerminalApp
void IdentifyWindow();
void SetPersistedLayoutIdx(UInt32 idx);
void ClearPersistedWindowState();
void RenameFailed();
void RequestExitFullscreen();
@@ -90,7 +89,7 @@ namespace TerminalApp
Boolean GetInitialAlwaysOnTop();
Single CalcSnappedDimension(Boolean widthOrHeight, Single dimension);
void TitlebarClicked();
void CloseWindow(Microsoft.Terminal.Settings.Model.LaunchPosition position, Boolean isLastWindow);
void CloseWindow();
void WindowVisibilityChanged(Boolean showOrHide);
TaskbarState TaskbarState{ get; };
@@ -98,8 +97,6 @@ namespace TerminalApp
Windows.UI.Xaml.Media.Brush FrameBrush { get; };
void WindowActivated(Boolean activated);
String GetWindowLayoutJson(Microsoft.Terminal.Settings.Model.LaunchPosition position);
Boolean GetMinimizeToNotificationArea();
Boolean GetAlwaysShowNotificationIcon();
Boolean GetShowTitleInTitlebar();
@@ -119,7 +116,7 @@ namespace TerminalApp
event Windows.Foundation.TypedEventHandler<Object, Windows.UI.Xaml.UIElement> SetTitleBarContent;
event Windows.Foundation.TypedEventHandler<Object, String> TitleChanged;
event Windows.Foundation.TypedEventHandler<Object, LastTabClosedEventArgs> LastTabClosed;
event Windows.Foundation.TypedEventHandler<Object, Object> CloseWindowRequested;
event Windows.Foundation.TypedEventHandler<Object, Microsoft.Terminal.Settings.Model.Theme> RequestedThemeChanged;
event Windows.Foundation.TypedEventHandler<Object, Object> FocusModeChanged;
event Windows.Foundation.TypedEventHandler<Object, Object> FullscreenChanged;
@@ -141,6 +138,7 @@ namespace TerminalApp
event Windows.Foundation.TypedEventHandler<Object, RequestMoveContentArgs> RequestMoveContent;
event Windows.Foundation.TypedEventHandler<Object, RequestReceiveContentArgs> RequestReceiveContent;
event Windows.Foundation.TypedEventHandler<Object, LaunchPositionRequest> RequestLaunchPosition;
void AttachContent(String content, UInt32 tabIndex);
void SendContentToOther(RequestReceiveContentArgs args);

View File

@@ -956,7 +956,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
// - the user's cloud shell settings
WDJ::JsonObject AzureConnection::_GetCloudShellUserSettings()
{
auto uri{ fmt::format(L"{}providers/Microsoft.Portal/userSettings/cloudconsole?api-version=2020-04-01-preview", _resourceUri) };
auto uri{ fmt::format(L"{}providers/Microsoft.Portal/userSettings/cloudconsole?api-version=2023-02-01-preview", _resourceUri) };
return _SendRequestReturningJson(uri, nullptr);
}
@@ -966,7 +966,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
// - the uri for the cloud shell
winrt::hstring AzureConnection::_GetCloudShell()
{
auto uri{ fmt::format(L"{}providers/Microsoft.Portal/consoles/default?api-version=2020-04-01-preview", _resourceUri) };
auto uri{ fmt::format(L"{}providers/Microsoft.Portal/consoles/default?api-version=2023-02-01-preview", _resourceUri) };
WWH::HttpStringContent content{
LR"-({"properties": {"osType": "linux"}})-",

View File

@@ -186,7 +186,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
const HANDLE hRef,
const HANDLE hServerProcess,
const HANDLE hClientProcess,
TERMINAL_STARTUP_INFO startupInfo) :
const TERMINAL_STARTUP_INFO& startupInfo) :
_rows{ 25 },
_cols{ 80 },
_guid{ Utils::CreateGuid() },

View File

@@ -19,7 +19,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
const HANDLE hRef,
const HANDLE hServerProcess,
const HANDLE hClientProcess,
TERMINAL_STARTUP_INFO startupInfo);
const TERMINAL_STARTUP_INFO& startupInfo);
ConptyConnection() noexcept = default;
void Initialize(const Windows::Foundation::Collections::ValueSet& settings);

View File

@@ -118,81 +118,81 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AzureCodeExpiry" xml:space="preserve">
<value>Τђîš çόδέ ẅĩℓľ ехρĭяę ϊи 15 mїήμτėš. !!! !!! !!! !</value>
<value>Ŧнιŝ ςøδё ẅіℓŀ зхρîґέ íи 15 mїπųŧęś. !!! !!! !!! !</value>
</data>
<data name="AzureEnterTenant" xml:space="preserve">
<value>Рŀзаѕ℮ éñтзя ŧħέ ďеšΐř℮ð теńąпŧ ⁿμmвêř. !!! !!! !!! !!!</value>
<value>Рĺέåŝē еňţéŗ τĥĕ ďєśįřєđ τëņåńŧ иџмьэŗ. !!! !!! !!! !!!</value>
</data>
<data name="AzureNewLogin" xml:space="preserve">
<value>Єитэя {0} ťŏ ŀσġįñ ẅīŧћ â ńзш āč¢бũⁿť !!! !!! !!! !!</value>
<value>Ĕńťèѓ {0} ťō łøģΐŋ ώіŧĥ ā ńèώ άčĉøŭпţ !!! !!! !!! !!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin; it is intended to be a single-character shorthand for "new account"</comment>
</data>
<data name="AzureRemoveStored" xml:space="preserve">
<value>Ęʼnţέґ {0} ťο яěмσνе τħě äвσν℮ šăνёď čøⁿŋэčţΐóʼn şэтτĩñģś. !!! !!! !!! !!! !!! !</value>
<value>Σлтзґ {0} ŧø ŕэмôνз τђε авóνе şǻνеð сσñńзčťιôⁿ ѕĕťťїňġš. !!! !!! !!! !!! !!! !</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_RemoveStored; it is intended to be a single-character shorthand for "remove stored"</comment>
</data>
<data name="AzureInvalidAccessInput" xml:space="preserve">
<value>Рĺēǻŝê ёʼnτεя å νäℓĩđ ⁿüмьэř τό åςĉëśŝ тĥė śτóřèð çôñηěčŧîóń šéτťίńģѕ, {0} ţǿ ļöġ ιп щīтħ â ⁿёω áĉĉбυйţ, θґ {1} ťο ŕëmόνέ τнз ŝανέď çбⁿņэςťîǿη šëτţĭñģş. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Рľεдşê ěπτэг ă νàĺįδ йΰmьēя ŧó àсĉĕŝѕ тђέ ŝтøяěð çøⁿñέĉтïǿŋ šєţτĭηģś, {0} тø ľóĝ īп ẅϊτђ â лęщ āς¢òŭñŧ, ôѓ {1} ŧŏ язмôνё тħέ śάνēδ čσňпęċτīôη šėŧŧíпĝѕ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin, and {1} will be replaced with AzureUserEntry_RemoveStored. This is an error message, used after AzureNewLogin/AzureRemoveStored if the user enters an invalid value.</comment>
</data>
<data name="AzureNonNumberError" xml:space="preserve">
<value>Ρĺεàŝе éņŧєг ª пűмьěŗ. !!! !!! </value>
<value>Ρŀєáśе ёňŧεг ª ňύмъēг. !!! !!! </value>
</data>
<data name="AzureNumOutOfBoundsError" xml:space="preserve">
<value>Лũмьëг øΰт οƒ ьбμⁿďš. Рłêąѕέ ēπτĕг â νäℓιď ⁿΰмь℮ґ. !!! !!! !!! !!! !!!</value>
<value>Пϋмъęґ óΰť õƒ воµήďş. Ρŀεäŝé эⁿťєг â νãŀϊδ пцмъёř. !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTenants" xml:space="preserve">
<value>Сόύŀđ ŋот ƒìņď дπγ ţёηªηŧş. !!! !!! !!</value>
<value>Сôµłď ηǿť ƒіπđ ãñŷ ţ℮ηáńŧş. !!! !!! !!</value>
</data>
<data name="AzureNoCloudAccount" xml:space="preserve">
<value>Ύŏû ĥдνе ņőť ѕэť μр ýőűг ĉĺôυð śħёĺℓ âċćõüпť ŷёт. Ρļéāŝέ ģò τø https://shell.azure.com τб şеţ īť ϋφ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ϋσΰ ђáνě ņоť śéт ūφ ỳθϋг сŀоůδ šђęļĺ áćçθùηт ўеτ. Рĺėåŝê ĝο ŧό https://shell.azure.com το šёť ΐт úр. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="https://shell.azure.com"} This URL should not be localized. Everything else should.</comment>
</data>
<data name="AzureStorePrompt" xml:space="preserve">
<value>Ðό уοϋ ώάπτ ţο şάνε τħèѕĕ ĉòⁿйєçťìοй šèτţϊлĝѕ ƒöѓ ƒüтµřэ ĺθģіпѕ? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Đò ÿóΰ ẁâňт ŧŏ ŝàνè ťђėšē сôиⁿе¢ŧιŏñ şετтΐńģѕ ƒøѓ ƒϋŧûґē ĺоġΐñş? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. They are single-character shorthands for "yes" and "no" in this language.</comment>
</data>
<data name="AzureInvalidStoreInput" xml:space="preserve">
<value>Ρŀэåšє ěñτ℮ѓ {0} ôѓ {1} !!! !!! </value>
<value>Ρĺèªѕê εňţēŕ {0} оŗ {1} !!! !!! </value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. This resource will be used as an error response after AzureStorePrompt.</comment>
</data>
<data name="AzureRequestingCloud" xml:space="preserve">
<value>Ґεqùęşŧιπġ ã сľóμď śĥεļŀ īⁿşτάπсє... !!! !!! !!! !</value>
<value>Ґĕqμšŧїŋĝ ã ćŀòμð śнёĺŀ íņşťąňċз... !!! !!! !!! !</value>
</data>
<data name="AzureSuccess" xml:space="preserve">
<value>Ŝцćċёęðĕð. !!!</value>
<value>Śűċćêёđέď. !!!</value>
</data>
<data name="AzureRequestingTerminal" xml:space="preserve">
<value>Яėqüεŝτĩлĝ ά тēгмïпąļ (ŧĥĩѕ mϊģĥт ţáκε α ẅĥίļè)... !!! !!! !!! !!! !!!</value>
<value>Яεqůęŝτίñĝ д тėґmΐπаľ (ťнĭś мìģĥť ţªќĕ ā ẁĥΐĺé)... !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureTokensStored" xml:space="preserve">
<value>Ўôųŗ ċόńñέĉťíöй ŝěťτїлġѕ ĥάνэ ьéèп ѕдνĕđ ƒбř ƒμŧϋřе ŀθģĭπŝ. !!! !!! !!! !!! !!! !!!</value>
<value>Ỳσûř čθñňĕ¢ţįõʼn ѕεтţĭňğš наνē вёэʼn śǻνēδ ƒόг ƒμţüŗè ĺõģìйś. !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTokens" xml:space="preserve">
<value>Йø τòκëñš тο ŗěмõνē. !!! !!!</value>
<value>Ňŏ ŧōкèйś ţő яэmονе. !!! !!!</value>
</data>
<data name="AzureTokensRemoved" xml:space="preserve">
<value>Śдνêď ćбñńёĉŧíōй śеττĭлģš яémòνёð. !!! !!! !!! !</value>
<value>Śανеđ ċσйñз¢ťìόń şєŧтιŋğѕ яёмǿνёđ. !!! !!! !!! !</value>
</data>
<data name="AzureOldCredentialsFlushedMessage" xml:space="preserve">
<value>Δúţħєŋтïςãŧіōň рāґåmêтĕѓś ¢ĥáиĝĕď. Ỳõų'ℓļ πєεð ţō łøĝ īη àġąĭń. !!! !!! !!! !!! !!! !!! </value>
<value>Āΰτнėиŧΐċâтīбŋ рářáмęŧéгŝ сħåⁿģëď. Ϋοц'ļľ ⁿêэð τô ĺσĝ ϊņ àġαĭπ. !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="AzureUnknownTenantName" xml:space="preserve">
<value>&lt;υηĸήοẃⁿ τёñâńţ ņąмє&gt; !!! !!!</value>
<value>&lt;ϋпкйôẁи ŧēņàлτ ňămё&gt; !!! !!!</value>
</data>
<data name="AzureIthTenant" xml:space="preserve">
<value>Ŧèŋαпţ {0}: {1} ({2}) !!! !!!</value>
<value>Ťėηªŋт {0}: {1} ({2}) !!! !!!</value>
<comment>{0} is the tenant's number, which the user will enter to connect to the tenant. {1} is the tenant's display name, which will be meaningful for the user. {2} is the tenant's internal ID number.</comment>
</data>
<data name="AzureSuccessfullyAuthenticated" xml:space="preserve">
<value>Āųţĥёņţīĉατèđ. !!! !</value>
<value>Ąűŧħēπτįсáτèđ. !!! !</value>
</data>
<data name="AzureUserEntry_NewLogin" xml:space="preserve">
<value>п</value>
<value>ņ</value>
<comment>This is shorthand for "new login". The user must enter this character to activate the New Login feature (AzureInvalidAccessInput, AzureNewLogin)</comment>
</data>
<data name="AzureUserEntry_RemoveStored" xml:space="preserve">
<value>ѓ</value>
<value>ґ</value>
<comment>This is shorthand for "remove saved connections". The user must enter this character to activate the Remove Saved Logins feature (AzureRemoveStored, AzureInvalidAccessInput)</comment>
</data>
<data name="AzureUserEntry_Yes" xml:space="preserve">
@@ -200,24 +200,24 @@
<comment>This is shorthand for "yes". The user must enter this character to CONFIRM a prompt.</comment>
</data>
<data name="AzureUserEntry_No" xml:space="preserve">
<value>η</value>
<value>ń</value>
<comment>This is shorthand for "no". The user must enter this character to DECLINE a prompt.</comment>
</data>
<data name="ProcessExited" xml:space="preserve">
<value>[ρřō¢ëśŝ ėжιťéđ щϊťн сθďё {0}] !!! !!! !!!</value>
<value>[рѓос℮śš ёхіţεð ẃιţĥ ćōďë {0}] !!! !!! !!!</value>
<comment>The first argument {0} is the error code of the process. When there is no error, the number ZERO will be displayed. </comment>
</data>
<data name="CtrlDToClose" xml:space="preserve">
<value>Υбΰ ċαň пοẅ ċļǿşę тђìś ťєгмìʼnâł ωїτħ Ċτř+Đ, бг ρяęśš Зйţëŕ ţб ѓęѕŧąřŧ. !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ỳóŭ ćǻή иòω сĺøѕè ťнįş тёѓмîήªŀ ωīťђ Çťѓ+Ď, όг ргéšѕ Σñтèř το ґèšтªят. !!! !!! !!! !!! !!! !!! !!!</value>
<comment>"Ctrl+D" and "Enter" represent keys the user will press (control+D and Enter).</comment>
</data>
<data name="ProcessFailedToLaunch" xml:space="preserve">
<value>[эгřбѓ {0} шђεñ łăΰήсĥįʼnģ `{1}'] !!! !!! !!! </value>
<value>[℮ѓѓŏŕ {0} ωĥєй łåύñćђίηğ `{1}'] !!! !!! !!! </value>
<comment>The first argument {0} is the error code. The second argument {1} is the user-specified path to a program.
If this string is broken to multiple lines, it will not be displayed properly.</comment>
</data>
<data name="BadPathText" xml:space="preserve">
<value>Сбùℓδ иоţ дçсзśѕ šťªřţīŋġ δîŗĕčŧσŕγ "{0}" !!! !!! !!! !!!</value>
<value>Ċőŭľđ йōť ª¢čеѕş şτāŗťΐиğ ðιѓεςтоŗγ "{0}" !!! !!! !!! !!!</value>
<comment>The first argument {0} is a path to a directory on the filesystem, as provided by the user.</comment>
</data>
</root>

View File

@@ -118,77 +118,77 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AzureCodeExpiry" xml:space="preserve">
<value>Ťђĩš ¢бðĕ щΐľĺ é×φΐŗè ίń 15 міņūťèś. !!! !!! !!! !</value>
<value>Ŧнιŝ ςøδё ẅіℓŀ зхρîґέ íи 15 mїπųŧęś. !!! !!! !!! !</value>
</data>
<data name="AzureEnterTenant" xml:space="preserve">
<value>Ρℓēάśě єñτęŕ τђĕ đĕśìŗéđ ŧ℮йάит ήůmъεř. !!! !!! !!! !!!</value>
<value>Рĺέåŝē еňţéŗ τĥĕ ďєśįřєđ τëņåńŧ иџмьэŗ. !!! !!! !!! !!!</value>
</data>
<data name="AzureNewLogin" xml:space="preserve">
<value>Єŋťĕř {0} ťο ļòġįи ώιťĥ ā ņĕŵ аċсôúñţ !!! !!! !!! !!</value>
<value>Ĕńťèѓ {0} ťō łøģΐŋ ώіŧĥ ā ńèώ άčĉøŭпţ !!! !!! !!! !!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin; it is intended to be a single-character shorthand for "new account"</comment>
</data>
<data name="AzureRemoveStored" xml:space="preserve">
<value>Епŧěя {0} ŧό ŗęmбνε τђέ αвòνė şāνέđ ċóпñêçťĩбñ şéţŧįήģѕ. !!! !!! !!! !!! !!! !</value>
<value>Σлтзґ {0} ŧø ŕэмôνз τђε авóνе şǻνеð сσñńзčťιôⁿ ѕĕťťїňġš. !!! !!! !!! !!! !!! !</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_RemoveStored; it is intended to be a single-character shorthand for "remove stored"</comment>
</data>
<data name="AzureInvalidAccessInput" xml:space="preserve">
<value>Рℓёäśэ èŋţęґ à νăℓіδ ńцmвєя ťό α¢čëşš тће şτθŗэď ςöйʼnесţїôⁿ ѕзτťϊňğş, {0} τö ℓöġ ίη ẃĭţĥ ã ñеẁ åċčσųńт, οŗ {1} ŧθ ґèmöνе ťнě ѕāνεđ ćǿπйёсťìöл šèţтіʼnġѕ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Рľεдşê ěπτэг ă νàĺįδ йΰmьēя ŧó àсĉĕŝѕ тђέ ŝтøяěð çøⁿñέĉтïǿŋ šєţτĭηģś, {0} тø ľóĝ īп ẅϊτђ â лęщ āς¢òŭñŧ, ôѓ {1} ŧŏ язмôνё тħέ śάνēδ čσňпęċτīôη šėŧŧíпĝѕ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin, and {1} will be replaced with AzureUserEntry_RemoveStored. This is an error message, used after AzureNewLogin/AzureRemoveStored if the user enters an invalid value.</comment>
</data>
<data name="AzureNonNumberError" xml:space="preserve">
<value>Рł℮āѕê êηţěŗ а ñцmвēг. !!! !!! </value>
<value>Ρŀєáśе ёňŧεг ª ňύмъēг. !!! !!! </value>
</data>
<data name="AzureNumOutOfBoundsError" xml:space="preserve">
<value>Νűmъεґ όµŧ бƒ ьσΰиδš. Рŀ℮âŝэ ëʼnтзř â νаℓįð πúmъêŗ. !!! !!! !!! !!! !!!</value>
<value>Пϋмъęґ óΰť õƒ воµήďş. Ρŀεäŝé эⁿťєг â νãŀϊδ пцмъёř. !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTenants" xml:space="preserve">
<value>Сουļδ ńǿŧ ƒïŋď āπγ ţέⁿаʼnτŝ. !!! !!! !!</value>
<value>Сôµłď ηǿť ƒіπđ ãñŷ ţ℮ηáńŧş. !!! !!! !!</value>
</data>
<data name="AzureNoCloudAccount" xml:space="preserve">
<value>Ỳōù ћανē ŋŏт ѕęţ ΰρ ỳõûř ćľòùđ şĥěļŀ à¢ćōŭʼnť ýėτ. Ρļèάšέ ĝø тσ https://shell.azure.com τò ѕ℮ť їτ ũρ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ϋσΰ ђáνě ņоť śéт ūφ ỳθϋг сŀоůδ šђęļĺ áćçθùηт ўеτ. Рĺėåŝê ĝο ŧό https://shell.azure.com το šёť ΐт úр. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="https://shell.azure.com"} This URL should not be localized. Everything else should.</comment>
</data>
<data name="AzureStorePrompt" xml:space="preserve">
<value>Ðό ýóü шаήт τǿ ŝąνę τĥęŝê ¢øʼnńέсţĩōи şéтτîиĝś ƒōŕ ƒùτµřê ļøĝĩπş? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Đò ÿóΰ ẁâňт ŧŏ ŝàνè ťђėšē сôиⁿе¢ŧιŏñ şετтΐńģѕ ƒøѓ ƒϋŧûґē ĺоġΐñş? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. They are single-character shorthands for "yes" and "no" in this language.</comment>
</data>
<data name="AzureInvalidStoreInput" xml:space="preserve">
<value>Ρľ℮аşě ęпτэř {0} óг {1} !!! !!! </value>
<value>Ρĺèªѕê εňţēŕ {0} оŗ {1} !!! !!! </value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. This resource will be used as an error response after AzureStorePrompt.</comment>
</data>
<data name="AzureRequestingCloud" xml:space="preserve">
<value>Řèqυėşтϊʼnĝ д ćĺοûđ šĥēłĺ įʼnŝťàňčĕ... !!! !!! !!! !</value>
<value>Ґĕqμšŧїŋĝ ã ćŀòμð śнёĺŀ íņşťąňċз... !!! !!! !!! !</value>
</data>
<data name="AzureSuccess" xml:space="preserve">
<value>Śŭ¢¢εēðéď. !!!</value>
<value>Śűċćêёđέď. !!!</value>
</data>
<data name="AzureRequestingTerminal" xml:space="preserve">
<value>Гееѕтĭńģ α ťёямϊⁿдļ (ŧђīŝ мïğћτ тáκē á щħìŀė)... !!! !!! !!! !!! !!!</value>
<value>Яεqůęŝτίñĝ д тėґmΐπаľ (ťнĭś мìģĥť ţªќĕ ā ẁĥΐĺé)... !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureTokensStored" xml:space="preserve">
<value>Ύθμг čöŋπεċτĩθņ śεťţιŋĝŝ ђáνę ьέêй śăν℮ď ƒőŕ ƒџтцгē ℓőĝϊлş. !!! !!! !!! !!! !!! !!!</value>
<value>Ỳσûř čθñňĕ¢ţįõʼn ѕεтţĭňğš наνē вёэʼn śǻνēδ ƒόг ƒμţüŗè ĺõģìйś. !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTokens" xml:space="preserve">
<value>Ňö ťσĸëиѕ ţö гĕmŏνē. !!! !!!</value>
<value>Ňŏ ŧōкèйś ţő яэmονе. !!! !!!</value>
</data>
<data name="AzureTokensRemoved" xml:space="preserve">
<value>Śªνёð ćōňиēĉτîóл ѕėτтілġş řĕмǿνêđ. !!! !!! !!! !</value>
<value>Śανеđ ċσйñз¢ťìόń şєŧтιŋğѕ яёмǿνёđ. !!! !!! !!! !</value>
</data>
<data name="AzureOldCredentialsFlushedMessage" xml:space="preserve">
<value>Άūтћĕлŧĭĉªтίοñ рäѓàmëтεґş ¢нåñğēď. Ўοů'ŀĺ ʼnęёð ţθ ĺоģ ίñ ąġаĩň. !!! !!! !!! !!! !!! !!! </value>
<value>Āΰτнėиŧΐċâтīбŋ рářáмęŧéгŝ сħåⁿģëď. Ϋοц'ļľ ⁿêэð τô ĺσĝ ϊņ àġαĭπ. !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="AzureUnknownTenantName" xml:space="preserve">
<value>&lt;ūŋкиόώň τёńдⁿτ ñªmĕ&gt; !!! !!!</value>
<value>&lt;ϋпкйôẁи ŧēņàлτ ňămё&gt; !!! !!!</value>
</data>
<data name="AzureIthTenant" xml:space="preserve">
<value>Τεиäиţ {0}: {1} ({2}) !!! !!!</value>
<value>Ťėηªŋт {0}: {1} ({2}) !!! !!!</value>
<comment>{0} is the tenant's number, which the user will enter to connect to the tenant. {1} is the tenant's display name, which will be meaningful for the user. {2} is the tenant's internal ID number.</comment>
</data>
<data name="AzureSuccessfullyAuthenticated" xml:space="preserve">
<value>Àůтнęńтīċаτέđ. !!! !</value>
<value>Ąűŧħēπτįсáτèđ. !!! !</value>
</data>
<data name="AzureUserEntry_NewLogin" xml:space="preserve">
<value>ʼn</value>
<value>ņ</value>
<comment>This is shorthand for "new login". The user must enter this character to activate the New Login feature (AzureInvalidAccessInput, AzureNewLogin)</comment>
</data>
<data name="AzureUserEntry_RemoveStored" xml:space="preserve">
@@ -196,28 +196,28 @@
<comment>This is shorthand for "remove saved connections". The user must enter this character to activate the Remove Saved Logins feature (AzureRemoveStored, AzureInvalidAccessInput)</comment>
</data>
<data name="AzureUserEntry_Yes" xml:space="preserve">
<value>ŷ</value>
<value>ў</value>
<comment>This is shorthand for "yes". The user must enter this character to CONFIRM a prompt.</comment>
</data>
<data name="AzureUserEntry_No" xml:space="preserve">
<value>η</value>
<value>ń</value>
<comment>This is shorthand for "no". The user must enter this character to DECLINE a prompt.</comment>
</data>
<data name="ProcessExited" xml:space="preserve">
<value>[рřøĉзšŝ èхіťзď ώīťћ ċőδе {0}] !!! !!! !!!</value>
<value>[рѓос℮śš ёхіţεð ẃιţĥ ćōďë {0}] !!! !!! !!!</value>
<comment>The first argument {0} is the error code of the process. When there is no error, the number ZERO will be displayed. </comment>
</data>
<data name="CtrlDToClose" xml:space="preserve">
<value>Ŷóц çåп ñøώ ćŀõśĕ ťћίś ŧεѓміήāļ ẁĩţђ Ćţѓℓ+Ď, ǿя φяεŝѕ Ēήτеř тб ґêşţâŕť. !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ỳóŭ ćǻή иòω сĺøѕè ťнįş тёѓмîήªŀ ωīťђ Çťѓℓ+Ď, όг ргéšѕ Σñтèř το ґèšтªят. !!! !!! !!! !!! !!! !!! !!!</value>
<comment>"Ctrl+D" and "Enter" represent keys the user will press (control+D and Enter).</comment>
</data>
<data name="ProcessFailedToLaunch" xml:space="preserve">
<value>[ĕяґöґ {0} ẁĥęл ŀǻûŋċħīņģ `{1}'] !!! !!! !!! </value>
<value>[℮ѓѓŏŕ {0} ωĥєй łåύñćђίηğ `{1}'] !!! !!! !!! </value>
<comment>The first argument {0} is the error code. The second argument {1} is the user-specified path to a program.
If this string is broken to multiple lines, it will not be displayed properly.</comment>
</data>
<data name="BadPathText" xml:space="preserve">
<value>Ĉǿΰļδ ʼnбτ ãċсёśŝ ѕţăŕŧîñġ đіřêςţóяγ "{0}" !!! !!! !!! !!!</value>
<value>Ċőŭľđ йōť ª¢čеѕş şτāŗťΐиğ ðιѓεςтоŗγ "{0}" !!! !!! !!! !!!</value>
<comment>The first argument {0} is a path to a directory on the filesystem, as provided by the user.</comment>
</data>
</root>

View File

@@ -118,77 +118,77 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AzureCodeExpiry" xml:space="preserve">
<value>Тђįš ςŏðè ώïľľ єжφίřё îʼn 15 mīπµţéš. !!! !!! !!! !</value>
<value>Ŧнιŝ ςøδё ẅіℓŀ зхρîґέ íи 15 mїπųŧęś. !!! !!! !!! !</value>
</data>
<data name="AzureEnterTenant" xml:space="preserve">
<value>Рľėãş℮ еñţěг тђз δ℮śįŗéď ţёņǻηť пűmьёř. !!! !!! !!! !!!</value>
<value>Рĺέåŝē еňţéŗ τĥĕ ďєśįřєđ τëņåńŧ иџмьэŗ. !!! !!! !!! !!!</value>
</data>
<data name="AzureNewLogin" xml:space="preserve">
<value>Σпŧзř {0} тο ĺǿģíй ẃĩтħ ă ⁿěẅ ªċčόυńт !!! !!! !!! !!</value>
<value>Ĕńťèѓ {0} ťō łøģΐŋ ώіŧĥ ā ńèώ άčĉøŭпţ !!! !!! !!! !!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin; it is intended to be a single-character shorthand for "new account"</comment>
</data>
<data name="AzureRemoveStored" xml:space="preserve">
<value>Σπŧеř {0} ţб řέmθνě τђέ àъονë ŝàνëð сθйņ℮çťíбň şēţтїиğš. !!! !!! !!! !!! !!! !</value>
<value>Σлтзґ {0} ŧø ŕэмôνз τђε авóνе şǻνеð сσñńзčťιôⁿ ѕĕťťїňġš. !!! !!! !!! !!! !!! !</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_RemoveStored; it is intended to be a single-character shorthand for "remove stored"</comment>
</data>
<data name="AzureInvalidAccessInput" xml:space="preserve">
<value>Рℓèãśэ έиţєґ ã νåŀΐď иûмьеř ŧσ â¢сέѕš ţђë ŝťòя℮ð ¢ǿлήęčŧΐόл ѕєтŧīŋģѕ, {0} τǿ ℓόğ ĭʼn шĩţĥ â ŋзω àсčőűñт, оŗ {1} ţō řêmŏνę ťнё śâνėđ ċбππ℮ĉťϊοň ѕєťŧιňĝѕ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Рľεдşê ěπτэг ă νàĺįδ йΰmьēя ŧó àсĉĕŝѕ тђέ ŝтøяěð çøⁿñέĉтïǿŋ šєţτĭηģś, {0} тø ľóĝ īп ẅϊτђ â лęщ āς¢òŭñŧ, ôѓ {1} ŧŏ язмôνё тħέ śάνēδ čσňпęċτīôη šėŧŧíпĝѕ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{0} will be replaced with the resource from AzureUserEntry_NewLogin, and {1} will be replaced with AzureUserEntry_RemoveStored. This is an error message, used after AzureNewLogin/AzureRemoveStored if the user enters an invalid value.</comment>
</data>
<data name="AzureNonNumberError" xml:space="preserve">
<value>Рĺěǻśє ēņтęŗ á ʼnŭmъř. !!! !!! </value>
<value>Ρŀєáśе ёňŧεг ª ňύмъēг. !!! !!! </value>
</data>
<data name="AzureNumOutOfBoundsError" xml:space="preserve">
<value>Иūmьéŗ őųτ òƒ ъоµñďѕ. Ρļзαşé êήтεя а νāľίđ лυmъèř. !!! !!! !!! !!! !!!</value>
<value>Пϋмъęґ óΰť õƒ воµήďş. Ρŀεäŝé эⁿťєг â νãŀϊδ пцмъёř. !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTenants" xml:space="preserve">
<value>Ćοµļđ лσţ ƒīńð ǻñý тēйáⁿτś. !!! !!! !!</value>
<value>Сôµłď ηǿť ƒіπđ ãñŷ ţ℮ηáńŧş. !!! !!! !!</value>
</data>
<data name="AzureNoCloudAccount" xml:space="preserve">
<value>Ϋŏű нâνє пòт ŝ℮τ ũρ ỳőũŗ ĉļőυď ѕћέļľ äсčόúŋŧ ỳèт. Рľ℮äѕє ģõ тō https://shell.azure.com ŧő šêţ ϊţ ύφ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ϋσΰ ђáνě ņоť śéт ūφ ỳθϋг сŀоůδ šђęļĺ áćçθùηт ўеτ. Рĺėåŝê ĝο ŧό https://shell.azure.com το šёť ΐт úр. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!</value>
<comment>{Locked="https://shell.azure.com"} This URL should not be localized. Everything else should.</comment>
</data>
<data name="AzureStorePrompt" xml:space="preserve">
<value>Đο ўομ ẁдηţ τø šàνĕ ŧĥęśз čбπņєςтΐοη ŝєττîπģѕ ƒόг ƒΰτůяė ĺőġìⁿš? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<value>Đò ÿóΰ ẁâňт ŧŏ ŝàνè ťђėšē сôиⁿе¢ŧιŏñ şετтΐńģѕ ƒøѓ ƒϋŧûґē ĺоġΐñş? [{0}/{1}] !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. They are single-character shorthands for "yes" and "no" in this language.</comment>
</data>
<data name="AzureInvalidStoreInput" xml:space="preserve">
<value>Рļзâšє зʼnţэґ {0} õѓ {1} !!! !!! </value>
<value>Ρĺèªѕê εňţēŕ {0} оŗ {1} !!! !!! </value>
<comment>{0} and {1} will be replaced with AzureUserEntry_Yes and AzureUserEntry_No. This resource will be used as an error response after AzureStorePrompt.</comment>
</data>
<data name="AzureRequestingCloud" xml:space="preserve">
<value>Ŗĕqūзşťįήĝ ā ćłôūđ ѕнэŀĺ іŋşťáйςè... !!! !!! !!! !</value>
<value>Ґĕqμ℮šŧїŋĝ ã ćŀòμð śнёĺŀ íņşťąňċз... !!! !!! !!! !</value>
</data>
<data name="AzureSuccess" xml:space="preserve">
<value>Šϋć¢ėзðèđ. !!!</value>
<value>Śűċćêёđέď. !!!</value>
</data>
<data name="AzureRequestingTerminal" xml:space="preserve">
<value>Γèqΰёşτіńğ ǻ ŧĕŕмΐйáł (ťђìѕ mīġнť ţãĸē à щĥіℓ℮)... !!! !!! !!! !!! !!!</value>
<value>Яεqůęŝτίñĝ д тėґmΐπаľ (ťнĭś мìģĥť ţªќĕ ā ẁĥΐĺé)... !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureTokensStored" xml:space="preserve">
<value>Ŷöùѓ čόпήёсťĩθⁿ ś℮ţτїηĝŝ ĥåνē вęĕņ šǻνēδ ƒöř ƒџţμге ĺǿğîлŝ. !!! !!! !!! !!! !!! !!!</value>
<value>Ỳσûř čθñňĕ¢ţįõʼn ѕεтţĭňğš наνē вёэʼn śǻνēδ ƒόг ƒμţüŗè ĺõģìйś. !!! !!! !!! !!! !!! !!!</value>
</data>
<data name="AzureNoTokens" xml:space="preserve">
<value>Νő тŏкéпѕ тŏ ґзmòνě. !!! !!!</value>
<value>Ňŏ ŧōкèйś ţő яэmονе. !!! !!!</value>
</data>
<data name="AzureTokensRemoved" xml:space="preserve">
<value>Ŝąνеđ čöŋπĕĉťĩоŋ šĕţţīňġѕ гêмōνĕď. !!! !!! !!! !</value>
<value>Śανеđ ċσйñз¢ťìόń şєŧтιŋğѕ яёмǿνёđ. !!! !!! !!! !</value>
</data>
<data name="AzureOldCredentialsFlushedMessage" xml:space="preserve">
<value>Δϋτћęňτĭčαťíóп ρдřàмёŧèřş сђªńğ℮ď. Ύőú'ľł ņёĕð ţǿ ľöĝ ίπ ãĝâĭп. !!! !!! !!! !!! !!! !!! </value>
<value>Āΰτнėиŧΐċâтīбŋ рářáмęŧéгŝ сħåⁿģëď. Ϋοц'ļľ ⁿêэð τô ĺσĝ ϊņ àġαĭπ. !!! !!! !!! !!! !!! !!! </value>
</data>
<data name="AzureUnknownTenantName" xml:space="preserve">
<value>&lt;ũńкňǿŵŋ τелдŋŧ ʼnăмє&gt; !!! !!!</value>
<value>&lt;ϋпкйôẁи ŧēņàлτ ňămё&gt; !!! !!!</value>
</data>
<data name="AzureIthTenant" xml:space="preserve">
<value>Тĕηάπŧ {0}: {1} ({2}) !!! !!!</value>
<value>Ťėηªŋт {0}: {1} ({2}) !!! !!!</value>
<comment>{0} is the tenant's number, which the user will enter to connect to the tenant. {1} is the tenant's display name, which will be meaningful for the user. {2} is the tenant's internal ID number.</comment>
</data>
<data name="AzureSuccessfullyAuthenticated" xml:space="preserve">
<value>∆υτнêήτĭćåтéδ. !!! !</value>
<value>Ąűŧħēπτįсáτèđ. !!! !</value>
</data>
<data name="AzureUserEntry_NewLogin" xml:space="preserve">
<value>ή</value>
<value>ņ</value>
<comment>This is shorthand for "new login". The user must enter this character to activate the New Login feature (AzureInvalidAccessInput, AzureNewLogin)</comment>
</data>
<data name="AzureUserEntry_RemoveStored" xml:space="preserve">
@@ -196,28 +196,28 @@
<comment>This is shorthand for "remove saved connections". The user must enter this character to activate the Remove Saved Logins feature (AzureRemoveStored, AzureInvalidAccessInput)</comment>
</data>
<data name="AzureUserEntry_Yes" xml:space="preserve">
<value>у</value>
<value>ў</value>
<comment>This is shorthand for "yes". The user must enter this character to CONFIRM a prompt.</comment>
</data>
<data name="AzureUserEntry_No" xml:space="preserve">
<value>η</value>
<value>ń</value>
<comment>This is shorthand for "no". The user must enter this character to DECLINE a prompt.</comment>
</data>
<data name="ProcessExited" xml:space="preserve">
<value>[рґŏ¢℮şѕ ĕ×ĭŧēδ ẅįтĥ ςòðе {0}] !!! !!! !!!</value>
<value>[рѓос℮śš ёхіţεð ẃιţĥ ćōďë {0}] !!! !!! !!!</value>
<comment>The first argument {0} is the error code of the process. When there is no error, the number ZERO will be displayed. </comment>
</data>
<data name="CtrlDToClose" xml:space="preserve">
<value>Ϋôμ čǻή ńόщ ċĺбѕё ţђįš ťŗmΐⁿáľ щīţђ Ċτґ+Ð, οѓ φŗэśş Ěŋťĕŗ ţő řěśτäѓŧ. !!! !!! !!! !!! !!! !!! !!!</value>
<value>Ỳóŭ ćǻή иòω сĺøѕè ťнįş тёѓмîήªŀ ωīťђ Çťѓ+Ď, όг ргéšѕ Σñтèř το ґèšтªят. !!! !!! !!! !!! !!! !!! !!!</value>
<comment>"Ctrl+D" and "Enter" represent keys the user will press (control+D and Enter).</comment>
</data>
<data name="ProcessFailedToLaunch" xml:space="preserve">
<value>[ëґѓøř {0} ωнеи ľãμńĉħïňğ `{1}'] !!! !!! !!! </value>
<value>[℮ѓѓŏŕ {0} ωĥєй łåύñćђίηğ `{1}'] !!! !!! !!! </value>
<comment>The first argument {0} is the error code. The second argument {1} is the user-specified path to a program.
If this string is broken to multiple lines, it will not be displayed properly.</comment>
</data>
<data name="BadPathText" xml:space="preserve">
<value>Čőυĺδ ŋõť аçĉěšŝ ŝŧäřтϊиģ ðϊřèςťοŕў "{0}" !!! !!! !!! !!!</value>
<value>Ċőŭľđ йōť ª¢čеѕş şτāŗťΐиğ ðιѓεςтоŗγ "{0}" !!! !!! !!! !!!</value>
<comment>The first argument {0} is a path to a directory on the filesystem, as provided by the user.</comment>
</data>
</root>

View File

@@ -207,7 +207,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_dispatcher,
ScrollBarUpdateInterval,
[weakThis = get_weak()](const auto& update) {
if (auto core{ weakThis.get() }; !core->_IsClosing())
if (auto core{ weakThis.get() }; core && !core->_IsClosing())
{
core->_ScrollPositionChangedHandlers(*core, update);
}
@@ -1225,11 +1225,87 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_updateSelectionUI();
}
static wil::unique_close_clipboard_call _openClipboard(HWND hwnd)
{
bool success = false;
// OpenClipboard may fail to acquire the internal lock --> retry.
for (DWORD sleep = 10;; sleep *= 2)
{
if (OpenClipboard(hwnd))
{
success = true;
break;
}
// 10 iterations
if (sleep > 10000)
{
break;
}
Sleep(sleep);
}
return wil::unique_close_clipboard_call{ success };
}
static void _copyToClipboard(const UINT format, const void* src, const size_t bytes)
{
wil::unique_hglobal handle{ THROW_LAST_ERROR_IF_NULL(GlobalAlloc(GMEM_MOVEABLE, bytes)) };
const auto locked = GlobalLock(handle.get());
memcpy(locked, src, bytes);
GlobalUnlock(handle.get());
THROW_LAST_ERROR_IF_NULL(SetClipboardData(format, handle.get()));
handle.release();
}
static void _copyToClipboardRegisteredFormat(const wchar_t* format, const void* src, size_t bytes)
{
const auto id = RegisterClipboardFormatW(format);
if (!id)
{
LOG_LAST_ERROR();
return;
}
_copyToClipboard(id, src, bytes);
}
static void copyToClipboard(wil::zwstring_view text, std::string_view html, std::string_view rtf)
{
const auto clipboard = _openClipboard(nullptr);
if (!clipboard)
{
LOG_LAST_ERROR();
return;
}
EmptyClipboard();
if (!text.empty())
{
// As per: https://learn.microsoft.com/en-us/windows/win32/dataxchg/standard-clipboard-formats
// CF_UNICODETEXT: [...] A null character signals the end of the data.
// --> We add +1 to the length. This works because .c_str() is null-terminated.
_copyToClipboard(CF_UNICODETEXT, text.c_str(), (text.size() + 1) * sizeof(wchar_t));
}
if (!html.empty())
{
_copyToClipboardRegisteredFormat(L"HTML Format", html.data(), html.size());
}
if (!rtf.empty())
{
_copyToClipboardRegisteredFormat(L"Rich Text Format", rtf.data(), rtf.size());
}
}
// Called when the Terminal wants to set something to the clipboard, i.e.
// when an OSC 52 is emitted.
void ControlCore::_terminalCopyToClipboard(std::wstring_view wstr)
void ControlCore::_terminalCopyToClipboard(wil::zwstring_view wstr)
{
_CopyToClipboardHandlers(*this, winrt::make<implementation::CopyToClipboardEventArgs>(winrt::hstring{ wstr }));
copyToClipboard(wstr, {}, {});
}
// Method Description:
@@ -1242,31 +1318,29 @@ namespace winrt::Microsoft::Terminal::Control::implementation
bool ControlCore::CopySelectionToClipboard(bool singleLine,
const Windows::Foundation::IReference<CopyFormat>& formats)
{
const auto lock = _terminal->LockForWriting();
// no selection --> nothing to copy
if (!_terminal->IsSelectionActive())
::Microsoft::Terminal::Core::Terminal::TextCopyData payload;
{
return false;
const auto lock = _terminal->LockForWriting();
// no selection --> nothing to copy
if (!_terminal->IsSelectionActive())
{
return false;
}
// use action's copyFormatting if it's present, else fallback to globally
// set copyFormatting.
const auto copyFormats = formats != nullptr ? formats.Value() : _settings->CopyFormatting();
const auto copyHtml = WI_IsFlagSet(copyFormats, CopyFormat::HTML);
const auto copyRtf = WI_IsFlagSet(copyFormats, CopyFormat::RTF);
// extract text from buffer
// RetrieveSelectedTextFromBuffer will lock while it's reading
payload = _terminal->RetrieveSelectedTextFromBuffer(singleLine, copyHtml, copyRtf);
}
// use action's copyFormatting if it's present, else fallback to globally
// set copyFormatting.
const auto copyFormats = formats != nullptr ? formats.Value() : _settings->CopyFormatting();
const auto copyHtml = WI_IsFlagSet(copyFormats, CopyFormat::HTML);
const auto copyRtf = WI_IsFlagSet(copyFormats, CopyFormat::RTF);
// extract text from buffer
// RetrieveSelectedTextFromBuffer will lock while it's reading
const auto& [textData, htmlData, rtfData] = _terminal->RetrieveSelectedTextFromBuffer(singleLine, copyHtml, copyRtf);
// send data up for clipboard
_CopyToClipboardHandlers(*this,
winrt::make<CopyToClipboardEventArgs>(winrt::hstring{ textData },
winrt::to_hstring(htmlData),
winrt::to_hstring(rtfData),
copyFormats));
copyToClipboard(payload.plainText, payload.html, payload.rtf);
return true;
}
@@ -1635,7 +1709,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
if (_searcher.ResetIfStale(*GetRenderData(), text, !goForward, !caseSensitive))
{
_searcher.HighlightResults();
_searcher.MoveToCurrentSelection();
_cachedSearchResultRows = {};
}
@@ -1652,6 +1725,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// DO NOT call _updateSelectionUI() here.
// We don't want to show the markers so manually tell it to clear it.
_terminal->SetBlockSelection(false);
_renderer->TriggerSelection();
_UpdateSelectionMarkersHandlers(*this, winrt::make<implementation::UpdateSelectionMarkersEventArgs>(true));
foundResults->TotalMatches(gsl::narrow<int32_t>(_searcher.Results().size()));
@@ -1659,7 +1733,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_terminal->AlwaysNotifyOnBufferRotation(true);
}
_renderer->TriggerSelection();
// Raise a FoundMatch event, which the control will use to notify
// narrator if there was any results in the buffer
@@ -1913,7 +1986,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_terminal->GetTextBuffer().GetSize().Clamp(clampedClick);
}
if (clampedClick >= end)
if (clampedClick >= last.end)
{
// Get the distance between the cursor and the click, in cells.
const auto bufferSize = _terminal->GetTextBuffer().GetSize();

View File

@@ -254,7 +254,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// clang-format off
TYPED_EVENT(FontSizeChanged, IInspectable, Control::FontSizeChangedArgs);
TYPED_EVENT(CopyToClipboard, IInspectable, Control::CopyToClipboardEventArgs);
TYPED_EVENT(TitleChanged, IInspectable, Control::TitleChangedEventArgs);
TYPED_EVENT(WarningBell, IInspectable, IInspectable);
TYPED_EVENT(TabColorChanged, IInspectable, IInspectable);
@@ -357,7 +356,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void _sendInputToConnection(std::wstring_view wstr);
#pragma region TerminalCoreCallbacks
void _terminalCopyToClipboard(std::wstring_view wstr);
void _terminalCopyToClipboard(wil::zwstring_view wstr);
void _terminalWarningBell();
void _terminalTitleChanged(std::wstring_view wstr);
void _terminalScrollPositionChanged(const int viewTop,

View File

@@ -160,7 +160,6 @@ namespace Microsoft.Terminal.Control
Boolean ShouldShowSelectOutput();
// These events are called from some background thread
event Windows.Foundation.TypedEventHandler<Object, CopyToClipboardEventArgs> CopyToClipboard;
event Windows.Foundation.TypedEventHandler<Object, TitleChangedEventArgs> TitleChanged;
event Windows.Foundation.TypedEventHandler<Object, Object> WarningBell;
event Windows.Foundation.TypedEventHandler<Object, Object> TabColorChanged;

View File

@@ -5,7 +5,6 @@
#include "EventArgs.h"
#include "FontSizeChangedArgs.g.cpp"
#include "TitleChangedEventArgs.g.cpp"
#include "CopyToClipboardEventArgs.g.cpp"
#include "ContextMenuRequestedEventArgs.g.cpp"
#include "PasteFromClipboardEventArgs.g.cpp"
#include "OpenHyperlinkEventArgs.g.cpp"

View File

@@ -5,7 +5,6 @@
#include "FontSizeChangedArgs.g.h"
#include "TitleChangedEventArgs.g.h"
#include "CopyToClipboardEventArgs.g.h"
#include "ContextMenuRequestedEventArgs.g.h"
#include "PasteFromClipboardEventArgs.g.h"
#include "OpenHyperlinkEventArgs.g.h"
@@ -47,33 +46,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
WINRT_PROPERTY(hstring, Title);
};
struct CopyToClipboardEventArgs : public CopyToClipboardEventArgsT<CopyToClipboardEventArgs>
{
public:
CopyToClipboardEventArgs(hstring text) :
_text(text),
_html(),
_rtf(),
_formats(static_cast<CopyFormat>(0)) {}
CopyToClipboardEventArgs(hstring text, hstring html, hstring rtf, Windows::Foundation::IReference<CopyFormat> formats) :
_text(text),
_html(html),
_rtf(rtf),
_formats(formats) {}
hstring Text() { return _text; };
hstring Html() { return _html; };
hstring Rtf() { return _rtf; };
Windows::Foundation::IReference<CopyFormat> Formats() { return _formats; };
private:
hstring _text;
hstring _html;
hstring _rtf;
Windows::Foundation::IReference<CopyFormat> _formats;
};
struct ContextMenuRequestedEventArgs : public ContextMenuRequestedEventArgsT<ContextMenuRequestedEventArgs>
{
public:
@@ -148,12 +120,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
struct RendererWarningArgs : public RendererWarningArgsT<RendererWarningArgs>
{
public:
RendererWarningArgs(const uint64_t hr) :
RendererWarningArgs(const HRESULT hr) :
_Result(hr)
{
}
WINRT_PROPERTY(uint64_t, Result);
WINRT_PROPERTY(HRESULT, Result);
};
struct TransparencyChangedEventArgs : public TransparencyChangedEventArgsT<TransparencyChangedEventArgs>

View File

@@ -18,14 +18,6 @@ namespace Microsoft.Terminal.Control
Int32 Height { get; };
}
runtimeclass CopyToClipboardEventArgs
{
String Text { get; };
String Html { get; };
String Rtf { get; };
Windows.Foundation.IReference<CopyFormat> Formats { get; };
}
runtimeclass ContextMenuRequestedEventArgs
{
Windows.Foundation.Point Position { get; };
@@ -71,7 +63,7 @@ namespace Microsoft.Terminal.Control
runtimeclass RendererWarningArgs
{
UInt64 Result { get; };
HRESULT Result { get; };
}
runtimeclass TransparencyChangedEventArgs

View File

@@ -213,6 +213,10 @@ Installieren Sie entweder die fehlende Schriftart, oder wählen Sie eine andere
<value>Unerwarteter Fehler beim Renderer: {0}</value>
<comment>{0} is an error code.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Ihre Version von MacType ist mit dieser Anwendung nicht kompatibel. Bitte aktualisieren Sie auf Version 2023.5.31 oder höher.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="TermControlReadOnly" xml:space="preserve">
<value>Der schreibgeschützte Modus ist aktiviert.</value>
</data>
@@ -288,4 +292,4 @@ Installieren Sie entweder die fehlende Schriftart, oder wählen Sie eine andere
<value>Ausgabe auswählen</value>
<comment>The tooltip for a button for selecting all of a command's output</comment>
</data>
</root>
</root>

View File

@@ -213,6 +213,14 @@ Please either install the missing font or choose another one.</value>
<value>Renderer encountered an unexpected error: {0}</value>
<comment>{0} is an error code.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Your version of MacType is incompatible with this application. Please update to version 2023.5.31 or later.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>Renderer encountered an unexpected error: {0:#010x} {1}</value>
<comment>{Locked="{0:#010x}","{1}"} {0:#010x} is a placeholder for a Windows error code (e.g. 0x88985002). {1} is the corresponding message.</comment>
</data>
<data name="TermControlReadOnly" xml:space="preserve">
<value>Read-only mode is enabled.</value>
</data>
@@ -288,4 +296,4 @@ Please either install the missing font or choose another one.</value>
<value>Select output</value>
<comment>The tooltip for a button for selecting all of a command's output</comment>
</data>
</root>
</root>

View File

@@ -213,6 +213,10 @@ Instale la fuente que falta o elija otra.</value>
<value>El representador encontró un error inesperado: {0}</value>
<comment>{0} is an error code.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Su versión de MacType no es compatible con esta aplicación. Actualice a la versión 2023.5.31 o posterior.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="TermControlReadOnly" xml:space="preserve">
<value>El modo de solo lectura está habilitado.</value>
</data>
@@ -288,4 +292,4 @@ Instale la fuente que falta o elija otra.</value>
<value>Seleccionar salida</value>
<comment>The tooltip for a button for selecting all of a command's output</comment>
</data>
</root>
</root>

View File

@@ -213,6 +213,10 @@ Installez la police manquante ou choisissez-en une autre.</value>
<value>Le convertisseur a rencontré une erreur inattendue : {0}</value>
<comment>{0} is an error code.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Votre version de MacType est incompatible avec cette application. Veuillez mettre à jour la version 2023.5.31 ou une version ultérieure.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="TermControlReadOnly" xml:space="preserve">
<value>Le mode lecture seule est activé.</value>
</data>
@@ -288,4 +292,4 @@ Installez la police manquante ou choisissez-en une autre.</value>
<value>Sélectionner la sortie</value>
<comment>The tooltip for a button for selecting all of a command's output</comment>
</data>
</root>
</root>

Some files were not shown because too many files have changed in this diff Show More