Compare commits

...

62 Commits

Author SHA1 Message Date
Dustin L. Howett
e8c15683a7 Reapply "nuget: move to shine-oss tenant rather than ms tenant (#17451)"
This reverts commit 67d2636c81.

(cherry picked from commit 955b1d2683)
2024-08-23 15:11:49 -05:00
Windows Console Service Bot
6d4ff2e5a7 Localization Updates - main - 08/22/2024 03:06:16 (#17767)
(cherry picked from commit 0a91023df8)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSK_vc
Service-Version: 1.21
2024-08-23 14:35:09 -05:00
Leonard Hecker
e60afb6f4e Improve reliability of VT responses (#17786)
* Repurposes `_sendInputToConnection` to send output to the connection
  no matter whether the terminal is read-only or not.
  Now `SendInput` is the function responsible for the UI handling.
* Buffers responses in a VT string into a single string
  before sending it as a response all at once.

This reduces the chances for the UI thread to insert cursor positions
and similar into the input pipe, because we're not constantly unlocking
the terminal lock anymore for every response. The only way now that
unrelated inputs are inserted into the input pipe is because the VT
requests (e.g. DA1, DSR, etc.) are broken up across >1 reads.

This also fixes VT responses in read-only panes.

Closes #17775

* Repeatedly run `echo ^[[c` in cmd.
  DA1 responses don't stack & always stay the same 
* Run nvim in WSL. Doesn't deadlock when pasting 1MB. 
* Run the repro from #17775, which requests a ton of OSC 4
  (color palette) responses. Jiggle the cursor on top of the window.
  Responses never get split up. 

(cherry picked from commit b07589e7a8)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSK_Dw
Service-Version: 1.21
2024-08-23 14:35:08 -05:00
Dustin L. Howett
1519b6feb2 During Alt+Numpad composition, stash keys in case we bail out (#17774)
We were erroneously eating Alt followed by VK_ADD. This change makes
sure we cache key presses and releases that happen once a numpad
composition is active so that we can send them when you release Alt.

Right now, we only send them when you release Alt after composing Alt
and VK_ADD (entering hex mode) and only if you haven't inserted an
actual hex numpad code. This does mean that `Alt VK_ADD 0 0 H I` will
result in an input of "+hi". That... seems like a small price to pay for
Alt VK_ADD working again.

Closes #17762

(cherry picked from commit e006f75f6c)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSF50M
Service-Version: 1.21
2024-08-23 14:31:20 -05:00
Leonard Hecker
6d9fb78bfc Implement Alt-Numpad handling (#17637)
This adds an indirection for `_KeyHandler` so that `OnDirectKeyEvent`
can call `_KeyHandler`. This allows us to consistently handle
Alt-key-up events. Then I added custom handling for Alt+ddd (OEM),
Alt+0ddd (ANSI), and Alt+'+'+xxxx (Unicode) sequences, due to the
absence of Alt-key events with xaml islands and our TSF control.

Closes #17327

## Validation Steps Performed
* Tested it according to https://conemu.github.io/en/AltNumpad.html
* Unbind Alt+Space
* Run `showkey -a`
* Alt+Space generates `^[ `
* F7 generates `^[[18~`

(cherry picked from commit 2fab9866b2)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSCpCg
Service-Version: 1.21
2024-08-23 14:31:18 -05:00
Dustin L. Howett
102181f109 build: switch back to the "latest" OneBranch build image (#17630)
Thanks to a string of compiler bugs, we had to use an older container
image that shipped with VS 17.9.

Unfortunately, that container image is falling further and further out
of date. The build agents don't cache it any longer, so they spend 30-45
minutes of every build pulling it from the registry.

With the changes to ConPTY in #17510 removing the need for til::bitmap,
we no longer need to work around the compiler bugs it exposed.

Furthermore, 17.10.6+ has a much more robust and presumably "working"
compiler.

(cherry picked from commit 39108a7a1b)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSI7RU
Service-Version: 1.21
2024-08-22 20:21:11 -05:00
Dustin L. Howett
b028a5764b onebranch: allow publish/package to run in :latest container (#17514)
We have to run in an older OneBranch Windows container image due to
compiler bugs.

This change prevents us from having to wait for the container image to
download for build legs that _aren't_ using the compiler.

(cherry picked from commit bc20225b08)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSI7Rw
Service-Version: 1.21
2024-08-22 20:21:10 -05:00
Dustin L. Howett
cf7a6617ab Guard Control UpdateAppearance/Settings against UAF (#17770)
When you close a window, it naturally loses focus.

We were trying to use members of the control to update its appearance on
focus loss after it got torn down.

Closes #17520

(cherry picked from commit eabebc4cb2)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSIM6I
Service-Version: 1.21
2024-08-22 18:00:25 -05:00
Carlos Zamora
f2e9041aa0 Log action dispatch occurrence (#17718)
Some simple logic to report whenever an action has successfully occurred
(and what ShortcutAction was used).

Note, there will be some false positives here from startup. I noticed we
get a `newTab` on launch. This is probably a result of restoring the
window layout of the previous session since we're using ActionAndArgs
for that.

(cherry picked from commit 56cfb77c6d)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSCpCo
Service-Version: 1.21
2024-08-22 11:33:18 -05:00
Dustin L. Howett
8e7137dbde Disable PGO for Release builds (#17765)
Same justification as #17749.

We will revert this when either OneBranch Custom Pools become
fit-for-purpose or they upgrade to VS 17.11. Or the heat death of the
universe.

(cherry picked from commit 628e99f5d2)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSGCaA
Service-Version: 1.21
2024-08-21 18:21:23 -05:00
Leonard Hecker
0cbe706f48 Fix pane event handlers being unbound (#17750)
I don't know what has changed between #17450 and now, but that fix
doesn't seem necessary anymore. If you add this action:
```json
{
    "keys": "ctrl+a",
    "command":
    {
        "action": "splitPane",
        "commandline": "cmd /c exit"
    }
}
```

and repeatedly spam Ctrl-A it used to lead to crashes. That doesn't
happen anymore, because some other PR must've fixed that.

Reverting #17450 fixes the issue found in #17578: Because the content
pointer didn't get reset to null anymore it meant that the root
pane retained the pointer after a split. After closing the split off
pane, it would assign the remaining one back to the root, which would
cause the still existing content pointer to be closed. That pointer
is potentially the same as the remaining pane and so no close events
would get received anymore.

Closes #17578

## Validation Steps Performed
* Add the above action and spam it 
* Start with an empty window, split pane, type `exit` in the new pane
  then type it in the original pane. It closes the window 

(cherry picked from commit 056af83994)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSGCfE
Service-Version: 1.21
2024-08-21 18:21:22 -05:00
Leonard Hecker
8c2c88e44f Fix session persistence when the session ends (#17714)
Once all applications that have received a `WM_ENDSESSION` message
have returned from processing said message, windows will terminate
all processes. This forces us to process the message synchronously.
This meant that this issue was timing dependent. If Windows Terminal
was quick at persisting buffers and you had some other application that
was slow to shut down (e.g. Steam), you would never see this issue.

Closes #17179
Closes #17250

## Validation Steps Performed
* Set up a lean Hyper-V VM for fast reboots
* `Set-VMComPort <vm> 1 \\.pipe\\<pipe>`
* Hook up WIL to write to COM1
* Add a ton of debug prints all over the place
* Read COM output with Putty for hours
* RTFM, and notice that the `WM_ENDSESSION` documentation states
  "the session can end any time after all applications
  have returned from processing this message"
* Be very very sad 
* Fix it
* Rebooting now shows on COM1 that persistence runs 
* Windows get restored after reboot 

(cherry picked from commit b439925acc)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSGCik
Service-Version: 1.21
2024-08-21 18:21:20 -05:00
Leonard Hecker
1742dc03ff Align the OSS ConPTY API with Windows 11 24H2 (#17704)
(cherry picked from commit 7fd9c5c789)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSGCkE
Service-Version: 1.21
2024-08-21 18:21:16 -05:00
Leonard Hecker
42ab9bbd69 Fix a crash during settings update (#17751)
* Adds a check whether the thread dispatcher is already null.
  (See code comments.)
* Moves the `_settings` to only happen on the UI thread.
  Anything else wouldn't be thread safe.

Closes #17620

## Validation Steps Performed
Not reproducible. 🚫

(cherry picked from commit e0dae59f38)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSGBis
Service-Version: 1.21
2024-08-21 18:17:50 -05:00
PankajBhojwani
cb8a3f6ef1 Fix overwrite key binding warning in the SUI (#17763)
Fixes a regression from the actions MVVM change in #14292 - attempting
to overwrite a keybinding was displaying a warning but propagating the
change before the user acknowledged it.

The overwrite key binding warning in the SUI works like before

Closes #17754

(cherry picked from commit ce92b18507)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSF01Y
Service-Version: 1.21
2024-08-21 18:12:26 -05:00
Dustin L. Howett
ed08108e32 Port ServicingPipeline.ps1 to ProjectsV2 (#17756)
(cherry picked from commit 516ade54cb)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSF-7E
Service-Version: 1.21
2024-08-21 18:12:25 -05:00
Carlos Zamora
8aa56c25f4 Add ellipses back in to some command names (#17715)
In #16886, the key for the nested action got renamed from `Split
Pane...` to `Split pane`. This accidentally caused a collision because
now there's two actions with the same name! The settings model then
prefers the user's action over the one defined in defaults.json, thus
completely hiding the nested version.

I tried to balance the stylistic recommendations from #16846 (mainly
[this
comment](https://github.com/microsoft/terminal/issues/16846#issuecomment-2005007519)
since it gave some excellent examples) while trying to maintain muscle
memory as much as possible (with similar substring sequences). There was
also one case where we still used "the tab" so I removed the "the" for
consistency.

Side effect of #16886 which closed #16846
Closes #17294
Closes #17684

(cherry picked from commit 0a7c2585a2)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSFdXc
Service-Version: 1.21
2024-08-21 13:17:57 -05:00
Carlos Zamora
e866a6c66f Fix UIA RangeFromPoint API (#17695)
## Summary of the Pull Request
Fixes the `RangeFromPoint` API such that we're now properly locking when
we attempt to retrieve the viewport data. This also corrects the
conversion from `UiaPoint` (screen position) to buffer coordinates
(buffer cell).

Closes #17579

## Detailed Description of the Pull Request / Additional comments
- `UiaTextRangeBase::Initialize(UiaPoint)`:
- reordered logic to clamp to client area first, then begin conversion
to buffer coordinates
   - properly lock when retrieving the viewport data
- updated `_TranslatePointToScreen` and `_TranslatePointFromScreen` to
use `&` instead of `*`
   - we weren't properly updating the parameter before
- `TermControlUiaTextRange::_TranslatePointFromScreen()`
- `includeOffsets` was basically copied over from
`_TranslatePointToScreen`. The math itself was straight up wrong since
we had to do it backwards.

## Validation Steps Performed
 Moved WT to top-left of monitor, then used inspect.exe to call
`RangeFromPoint` API when mouse cursor is on top-left buffer cell (also
meticulously stepped through the two functions ensuring everything was
correct).

(cherry picked from commit 7b39d24913)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgSC930 PVTI_lADOAF3p4s4AmhmszgSCpCs
Service-Version: 1.21
2024-08-20 21:13:55 -05:00
Mike Griese
2890e8a3d4 Log when WindowsTerminal.exe starts (#17745)
as discussed in team sync

(cherry picked from commit 60ac45c239)
Service-Card-Id: 93750273
Service-Version: 1.21
2024-08-20 11:44:32 -05:00
Dustin L. Howett
6b6167ec2b Restore the ability to disable checking for URLs (#17731)
Fixes #17727

(cherry picked from commit 735ef2823e)
Service-Card-Id: 93736213
Service-Version: 1.21
2024-08-20 11:44:31 -05:00
Carlos Zamora
5d1638f187 schema: add reloadEnvironmentVariables to newTerminalArgs (#17696)
(cherry picked from commit 1511d2c2ad)
Service-Card-Id: 93522519
Service-Version: 1.21
2024-08-20 11:44:29 -05:00
Dustin L. Howett
2befaa1669 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: 93531229
Service-Version: 1.21
2024-08-20 11:44:28 -05:00
Leonard Hecker
83a9baa797 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: 92972720
Service-Version: 1.21
2024-08-13 17:26:56 -05:00
Leonard Hecker
5a99621856 AtlasEngine: Curly line redux (#17508)
See #17501.

(cherry picked from commit 7f2249c810)
Service-Card-Id: 92942980
Service-Version: 1.21
2024-08-13 17:26:56 -05:00
Leonard Hecker
09aa541d56 AtlasEngine: Improve appearance of curly underlines (#17501)
We'd previously subtract one underline-height from the curly line
offset, even though we already had subtracted its complete height.

Additionally, the pixel shader received some fine tuning:
* Shrink the stroke width so that the anti-aliasing can be seen
  all the way up to the horizontal edges of the bounding box.
* Add a phase shift to break apart the symmetry of the curve.

Closes #17482

Co-authored-by: Carlos Zamora <carlos.zamora@microsoft.com>
(cherry picked from commit ad3797ace9)
Service-Card-Id: 92942049
Service-Version: 1.21
2024-08-13 17:26:56 -05:00
Dustin L. Howett
4040e4c654 atlas,d2d: overdraw background bitmap by one cell on all sides (#17674)
BackendD2D will now draw one extra cell on all sides when rendering the
background, filled with the expected background color, starting at (-1,
-1) to ensure that cell backgrounds do not bleed over the edges of the
viewport where the is swapchain but no content.

Fixes #17672

(cherry picked from commit 9007fc2894)
Service-Card-Id: 93494324
Service-Version: 1.21
2024-08-13 16:22:03 -05:00
Carlos Zamora
8f4775df96 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: 93498660
Service-Version: 1.21
2024-08-13 16:20:00 -05:00
Leonard Hecker
3ab8921aa7 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: 93441137
Service-Version: 1.21
2024-08-13 16:19:59 -05:00
Windows Console Service Bot
2a15717f69 Localization Updates - builtin glyphs (ONLY) (#17458)
(partially cherry picked from commit 9f7032afd8)
Service-Card-Id: 92889853
Service-Version: 1.21
2024-06-24 15:05:00 -05:00
Leonard Hecker
846a8aa7a6 Fix builtin glyph corruption in the D2D renderer (#17464)
The initial contents of a texture are undefined. That's not good.
Now they are. That's good.

(cherry picked from commit 8c14a34263)
Service-Card-Id: 92788897
Service-Version: 1.21
2024-06-24 15:02:59 -05:00
Dustin L. Howett
9cccef7224 Remove the D2D warning from the Builtin Glyphs setting (#17454)
(cherry picked from commit 34d4dc5a5f)
Service-Card-Id: 92777925
Service-Version: 1.21
2024-06-24 15:02:58 -05:00
Leonard Hecker
196a60c7c2 AtlasEngine: Implement remaining underlines and builtin glyphs for D2D (#17278)
This implements builtin glyphs for our Direct2D renderer, as well as
dashed and curly underlines. With this in place the only two features
it doesn't support are inverted cursors and VT soft fonts.
This allows us to remove the `_hack*` members introduced in a6a0e44.

The implementation of dashed underlines is trivial, while curly
underlines use quadratic bezier curves. Caching the curve as a sprite
is possible, however I feel like that can be done in the future.

Builtin glyphs on the other hand require a cache, because otherwise
filling the entire viewport with shaded glyphs would result in poor
performance. This is why it's built on top of `ID2D1SpriteBatch`.
Unfortunately the API causes an eager flush of other pending graphics
instructions, which is why there's still a decent perf hit.

Finally, as a little extra, this fixes the rounded powerline glyph
shapes being slightly cut off. The fix is to simply don't round the
position and radius of the ellipsis/semi-circle.

Closes #17224

## Validation Steps Performed
* RenderingTests.exe updated 
* All supported builtin glyphs look sorta right at different sizes 

(cherry picked from commit 3486111722)
Service-Card-Id: 92572076
Service-Version: 1.21
2024-06-24 15:02:57 -05:00
flyingcat
aff77650e4 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: 92715122
Service-Version: 1.21
2024-06-20 14:25:40 -05:00
PankajBhojwani
8f3b38fb81 Fix crash when closing panes very quickly (#17450)
#17358 introduced a bug where if you open/close panes very rapidly
Terminal will crash. This was because `_content` was being set to `null`
and then a `Close` event was being emitted, but several functions
attempt to access the pane's `_content` as part of the close routine.
For example, `TerminalTab` tries to update the `TaskbarProgress` every
time a pane is closed and as part of that update sequence it queries the
pane - which has `null` content now - for the taskbar progress,
resulting in a crash. This PR fixes that crash.

Refs #17358

(cherry picked from commit 5d46e317b2)
Service-Card-Id: 92776947
Service-Version: 1.21
2024-06-20 14:13:30 -05:00
Tushar Singh
d960c89634 Fix some search highlights scenarios (#17352)
Fixes:
- Snapping the current match to the current selection doesn't work.
- Fast closing and re-opening SearchBox would leave search highlights in
an inconsistent state. The highlights would be active even when SB is
not on the screen, and results are not updated as more text is added to
the buffer.
- Search highlights scroll marks are not cleared when the search box is
closed.

(cherry picked from commit 7c1e2298f8)
Service-Card-Id: 92736967
Service-Version: 1.21
2024-06-20 14:13:29 -05:00
Windows Console Service Bot
332c5ad937 Localization Updates for #17369 (#17380)
(cherry picked from commit 5359e71ca1)
Service-Card-Id: 92701124
Service-Version: 1.21
2024-06-20 14:12:18 -05:00
Leonard Hecker
5f6783b01f 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

## Validation Steps Performed
* 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: 92687129
Service-Version: 1.21
2024-06-07 18:01:29 -05:00
Leonard Hecker
334335fd43 Fix spurious clear-to-end sequence in buffer dumps (#17374)
I think I forgot to complete that section of the code...
The parentheses were missing and `beg` was repeated twice. The last
line in the comment above this explains what I intended it to be.

Closes #17365

## Validation Steps Performed
* In a new PowerShell tab
* Run ``"`e[999C`e[2D`e[42mfoo`e[m"``
* Newline until it scrolls
* Run it again
* Close and reopen
* The green "foo" is still green 

(cherry picked from commit 640424e03f)
Service-Card-Id: 92687334
Service-Version: 1.21
2024-06-07 18:01:28 -05:00
Leonard Hecker
30df31fd9b 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: 92678596
Service-Version: 1.21
2024-06-07 18:01:26 -05:00
Leonard Hecker
0030a1d52e Fix two panes being closed when just one is (#17358)
#17333 introduced a regression: While it fixes a recursion *into*
`Pane::Close()` that doesn't fix the recursion outside of it.
In this case, `Close()` raises the `Closed` event which results
in another tab being closed because it's bound to `_RemoveTab`.
The recursion is now obvious, because I made the entire process
synchronous. Previously, it would (hopefully) just be scheduled
after the pane and its content are already gone.

The issue can be fixed by moving the recursion check from
`Pane::Close()` to `TerminalTab::Shutdown()` but I felt like
it would better to fix the issue a bit more thoroughly.

`IPaneContent` can raise a `CloseRequested` event to indicate it wants
to be closed. However, that also contained recursion, because the
content would call its own `Close()` to raise the event, which the
tab catches, calls `Close()` on the `Pane` which calls `Close()` on
the content which raises the event again and so on. That's what was
fixed in #17333 among others. We can do this better by not raising
the event from `IPaneContent::Close()`. Instead, that method will now
be exclusively called by `Pane`. The `CloseRequested` event will now
truly be just a request and nothing more. Furthermore, the ownership
of the event handling was moved from the `TerminalTab` to the `Pane`.

To make all of this a bit simpler and more robust, two new methods
were added to `Pane`: `_takePaneContent` and `_setPaneContent`.
These methods ensure that `Close()` is called on the content,
that the event handlers are always added and revoked
and that the ownership transfers cleanly between panes.

## Validation Steps Performed
* Open 3 tabs, close the middle one 
* Open 3 vertical panes, close the middle one 
* Drag tabs with multiple panes between windows 

(cherry picked from commit ce0f8d6db2)
Service-Card-Id: 92678790
Service-Version: 1.21
2024-06-07 18:01:25 -05:00
Leonard Hecker
082d166ac6 Fix a crash when closing panes (#17333)
Calling Close() from within WalkPanes is not safe. Simply using
_FindPane is enough to fix this.

This PR also fixes another potential source of infinite recursion, and
fixes panes being passed by-value into the callbacks.

Closes #17305

## Validation Steps Performed
* Split panes vertically 3 times
* `exit` the middle, the bottom and final one, in that order
* Doesn't crash 

(cherry picked from commit baba406a07)
Service-Card-Id: 92643006
Service-Version: 1.21
2024-06-07 18:01:24 -05:00
Windows Console Service Bot
3e661bfad2 Localization Updates - fix issues in Korean, Italian, Spanish (#17304)
Closes #12665
Closes #12712
Closes #16867

(cherry picked from commit 13de7c6685)
Service-Card-Id: 92614020
Service-Version: 1.21
2024-06-07 18:01:23 -05:00
Tushar Singh
7b59a9eafb Fix hyperlinks using an extra character at the end (#17326)
Closes: #17323

## Validation Steps Performed
- 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: 92637505
Service-Version: 1.21
2024-06-07 18:01:22 -05:00
Mike Griese
8038dc67cd Clean up command history context passed to suggestions UI (#17245)
This is fallout from #16937.

* Typing a command then backspacing the chars then asking for
suggestions would think the current commandline ended with spaces,
making filtering very hard.
* The currently typed command would _also_ appear in the command
history, which isn't useful.

I actually did TDD for this and wrote the test first, then confirmed
again running through the build script, I wasn't hitting any of the
earlier issues.

Closes #17241
Closes #17243

(cherry picked from commit bf8a647788)
Service-Card-Id: 92638413
Service-Version: 1.21
2024-06-07 18:01:21 -05:00
Windows Console Service Bot
bc365c9542 Localization Updates - main - associated with #17259 (#17272)
(cherry picked from commit 26cc5da7f1)
Service-Card-Id: 92577949
Service-Version: 1.21
2024-05-17 12:44:25 -05:00
Leonard Hecker
0d8e43c697 Improve font related help text (#17259)
A few minor changes to better guide people along new features in 1.21.
The font face box gets a sub-text that explains how to add multiple
fonts and the builtin glyph toggle now explains its dependence to D3D.

(cherry picked from commit 0d39c008cb)
Service-Card-Id: 92546504
Service-Version: 1.21
2024-05-17 12:44:23 -05:00
Dustin L. Howett
967dcfc5b0 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: 92577955
Service-Version: 1.21
2024-05-17 12:44:21 -05:00
Leonard Hecker
e56a557c93 Fix persistence of handoff'd tabs (#17268)
As it turns out, for handoff'd connections `Initialize` isn't called
and this meant the `_sessionId` was always null.
After this PR we still don't have a `_profileGuid` but that's probably
not a critical issue, since that's an inherent flaw with handoff.
It can only be solved in a robust manner if WT gets launched before the
console app is launched, but it's unlikely for that to ever happen.

## Validation Steps Performed
* Launch
* Register that version of WT as the default
* Close all tabs (Ctrl+Shift+W)
* `persistedWindowLayouts` is empty 
* Launch cmd/pwsh via handoff
* You get 1 window 
* Close the window (= press the X button)
* Launch
* You get 2 windows 

(cherry picked from commit 9054c81934)
Service-Card-Id: 92556178
Service-Version: 1.21
2024-05-16 19:00:48 -05:00
Leonard Hecker
52eba74316 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: 92546470
Service-Version: 1.21
2024-05-16 19:00:48 -05:00
Dustin L. Howett
27de22d0e5 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: 92546838
Service-Version: 1.21
2024-05-16 19:00:48 -05:00
Leonard Hecker
52ab4c467a 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: 92546408
Service-Version: 1.21
2024-05-13 12:34:05 -05:00
Mike Griese
ece2ef7f84 Remove the animations from the suggestions UI (#17247)
gotta go fast, and these animations are not fast

noted in #15845

(cherry picked from commit 46526bc00c)
Service-Card-Id: 92546875
Service-Version: 1.21
2024-05-13 12:34:04 -05:00
Tushar Singh
ef283da5cb 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: 92546869
Service-Version: 1.21
2024-05-13 12:34:03 -05:00
krzysdz
18c3f72fe0 PowerShell menu completion parser thread-safety fix (#17221)
Fix Terminal crashing when experimental PowerShell menu completion is
very quickly invoked multiple times.

`Command::ParsePowerShellMenuComplete` can be called from multiple
threads, but it uses a `static` `Json::CharReader`, which cannot safely
parse data from multiple threads at the same time. Removing `static`
fixes the problem, since every function call gets its own `reader`.

Validation: Pressed Ctrl+Space quickly a few times with hardcoded huge
JSON as the completion payload. Also shown at the end of the second
video in #17220.

Closes #17220

(cherry picked from commit 44516ad7cf)
Service-Card-Id: 92524217
Service-Version: 1.21
2024-05-13 11:32:09 -05:00
Leonard Hecker
4d1b543a9e Fix session being persisted even when disabled (#17211)
This fixes 2 bugs:
* `PersistState` being called when the window is closed
  (as opposed to closing the tab). The settings check was missing.
* Session cleanup running depending on whether the feature is
  currently enabled as opposed to whether it was enabled on launch.

Closes #17206
Closes #17207

## Validation Steps Performed
* Create a bunch of leftover buffer_*.txt files by running
  the current Dev version off of main
* Build this branch, then open and close a window
* All buffer_*.txt are gone and state.json is cleaned up 

(cherry picked from commit dbac3a1fa3)
Service-Card-Id: 92515454
Service-Version: 1.21
2024-05-13 11:32:08 -05:00
Leonard Hecker
d838ce5e67 Fix !_noFlushOnEnd not flushing (#17212)
This simply copies a bit more from `VtEngine::EndPaint`'s
`_noFlushOnEnd` handling which already seems to fix the linked issue.

Closes #17204

(cherry picked from commit 0b76c51ba1)
Service-Card-Id: 92516193
Service-Version: 1.21
2024-05-13 11:32:06 -05:00
Leonard Hecker
1f54562f04 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: 92509288
Service-Version: 1.21
2024-05-07 17:14:56 -05:00
James Holderness
f0fc1b5701 Make sure DCS strings are flushed to conpty without delay (#17195)
When the `DCS` passthrough code was first implemented, it relied on the
`ActionPassThroughString` method flushing the given string immediately.
However, that has since stopped being the case, so `DCS` operations end
up being delayed until the entire sequence has been parsed.

This PR fixes the issue by introducing a `flush` parameter to force an
immediate flush on the `ActionPassThroughString` method, as well as the
`XtermEngine::WriteTerminalW` method that it calls.

## Validation Steps Performed

I've confirmed that the test case in issue #17111 now updates the color
table as soon as each color entry is parsed, instead of delaying the
updates until the end of the sequence.

Closes #17111

(cherry picked from commit 9c16c5ca82)
Service-Card-Id: 92501226
Service-Version: 1.21
2024-05-06 16:02:40 -05:00
Windows Console Service Bot
a6819c5384 Localization Updates - 05/03/2024 19:01:37 (#17188)
(cherry picked from commit 80d2e58944)
Service-Card-Id: 92501389
Service-Version: 1.21
2024-05-06 16:02:38 -05:00
James Holderness
3c6b2af578 Prevent the VT engine painting unnecessarily (#17194)
When the VT render engine starts a paint operation, it first checks to
see whether there is actually something to do, and if not it can end the
frame early. However, the result of that check was being ignored, which
could sometimes result in an unwanted `SGR` reset being written to the
conpty pipe.

This was particular concerning when passing through `DCS` sequences,
because an unexpected `SGR` in the middle of the `DCS` string would
cause it to abort early.

This PR addresses the problem by making sure the `VtEngine::StartPaint`
return value is appropriately handled in the `XtermEngine` class.

## Detailed Description of the Pull Request / Additional comments

To make this work, I also needed to correct the `_cursorMoved` flag,
because that is one of things that determines whether a paint is needed
or not, but it was being set in the `InvalidateCursor` method at the
start of ever frame, regardless of whether the cursor had actually
moved.

I also took this opportunity to get rid of the `_WillWriteSingleChar`
method and the `_quickReturn` flag, which have been mostly obsolete for
a long time now. The only place the flag was still used was to optimize
single char writes when line renditions are active. But that could more
easily be handled by testing the `_invalidMap` directly.

## Validation Steps Performed

I've confirmed that the test case in issue #17117 is no longer aborting
the `DCS` color table sequence early.

Closes #17117

(cherry picked from commit 432dfcc490)
Service-Card-Id: 92501130
Service-Version: 1.21
2024-05-06 16:02:37 -05:00
Leonard Hecker
fe237afc25 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.

## Validation Steps Performed
* 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: 92492429
Service-Version: 1.21
2024-05-06 16:02:36 -05:00
Dustin L. Howett
3600ee42f0 PGO: train 1.21 separately 2024-05-06 16:02:22 -05:00
155 changed files with 2057 additions and 1031 deletions

View File

@@ -4,7 +4,7 @@
<clear />
<!-- Dependencies that we can turn on to force override for testing purposes before uploading. -->
<!--<add key="Static Package Dependencies" value="dep\packages" />-->
<add key="TerminalDependencies" value="https://pkgs.dev.azure.com/ms/terminal/_packaging/TerminalDependencies/nuget/v3/index.json" />
<add key="TerminalDependencies" value="https://pkgs.dev.azure.com/shine-oss/terminal/_packaging/TerminalDependencies/nuget/v3/index.json" />
</packageSources>
<disabledPackageSources>
<clear />

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.21</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

@@ -27,7 +27,7 @@ parameters:
- name: pgoBuildMode
displayName: "PGO Build Mode"
type: string
default: Optimize
default: None # BODGY - OneBranch is on VS 17.10, which is known to be the worst
values:
- Optimize
- Instrument

View File

@@ -100,36 +100,32 @@ jobs:
flattenFolders: true
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@5
displayName: Submit *.nupkg to ESRP for code signing
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 }}
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

@@ -242,18 +242,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@5
displayName: Submit Signing Request
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 }}
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

@@ -97,45 +97,41 @@ jobs:
displayName: Create msixbundle
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@5
displayName: Submit *.msixbundle to ESRP for code signing
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 }}
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

@@ -85,36 +85,32 @@ jobs:
versionEnvVar: XES_PACKAGEVERSIONNUMBER
- ${{ if eq(parameters.codeSign, true) }}:
- task: EsrpCodeSigning@5
displayName: Submit *.nupkg to ESRP for code signing
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 }}
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

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

@@ -1,2 +1,7 @@
parameters:
- name: containerVersion
type: string
default: latest
variables:
WindowsContainerImage: 'onebranch.azurecr.io/windows/ltsc2022/vse2022:1.0.02566.28'
WindowsContainerImage: 'onebranch.azurecr.io/windows/ltsc2022/vse2022:${{ parameters.containerVersion }}'

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"

View File

@@ -186,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--;
@@ -199,10 +196,12 @@ try
const auto& textBuffer = *static_cast<const TextBuffer*>(ut->context);
const auto range = accessRowRange(ut);
auto start = ut->chunkNativeStart;
auto limit = ut->chunkNativeLimit;
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;
@@ -215,8 +214,7 @@ try
--y;
if (y < range.begin)
{
assert(false);
return false;
break;
}
const auto& row = textBuffer.GetRowByOffset(y);
@@ -235,8 +233,7 @@ try
++y;
if (y >= range.end)
{
assert(false);
return false;
break;
}
const auto& row = textBuffer.GetRowByOffset(y);
@@ -249,38 +246,50 @@ try
} while (neededIndex >= limit);
}
if (!wasWrapForced)
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)
{
const auto newSize = text.size() + 1;
const auto buffer = RefcountBuffer::EnsureCapacityForOverwrite(accessBuffer(ut), newSize);
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';
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;
}
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());
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 (...)
{

View File

@@ -2789,7 +2789,7 @@ void TextBuffer::Serialize(const wchar_t* destination) const
// In other words, we can only skip \x1b[K = Erase in Line, if both the first/last attribute are the default attribute.
static constexpr TextAttribute defaultAttr;
const auto trimTrailingWhitespaces = it == last && lastCharX < newX;
const auto clearToEndOfLine = trimTrailingWhitespaces && beg->value != defaultAttr || beg->value != defaultAttr;
const auto clearToEndOfLine = trimTrailingWhitespaces && (beg->value != defaultAttr || last->value != defaultAttr);
if (trimTrailingWhitespaces)
{
@@ -3040,6 +3040,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

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

@@ -96,7 +96,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
peasant.ShowNotificationIconRequested([this](auto&&, auto&&) { ShowNotificationIconRequested.raise(*this, nullptr); });
peasant.HideNotificationIconRequested([this](auto&&, auto&&) { HideNotificationIconRequested.raise(*this, nullptr); });
peasant.QuitAllRequested({ this, &Monarch::_handleQuitAll });
{
std::unique_lock lock{ _peasantsMutex };
@@ -134,7 +133,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
// - <none> used
// Return Value:
// - <none>
void Monarch::_handleQuitAll(const winrt::Windows::Foundation::IInspectable& /*sender*/, const winrt::Windows::Foundation::IInspectable& /*args*/)
void Monarch::QuitAll()
{
if (_quitting.exchange(true, std::memory_order_relaxed))
{
@@ -166,12 +165,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
{
peasantSearch->second.Quit();
}
else
{
// Somehow we don't have our own peasant, this should never happen.
// We are trying to quit anyways so just fail here.
assert(peasantSearch != _peasants.end());
}
}
}

View File

@@ -86,6 +86,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
uint64_t AddPeasant(winrt::Microsoft::Terminal::Remoting::IPeasant peasant);
void SignalClose(const uint64_t peasantId);
void QuitAll();
uint64_t GetNumberOfPeasants();

View File

@@ -63,6 +63,7 @@ namespace Microsoft.Terminal.Remoting
void HandleActivatePeasant(WindowActivatedArgs args);
void SummonWindow(SummonWindowSelectionArgs args);
void SignalClose(UInt64 peasantId);
void QuitAll();
void SummonAllWindows();
Boolean DoesQuakeWindowExist();

View File

@@ -260,22 +260,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
TraceLoggingKeyword(TIL_KEYWORD_TRACE));
}
void Peasant::RequestQuitAll()
{
try
{
QuitAllRequested.raise(*this, nullptr);
}
catch (...)
{
LOG_CAUGHT_EXCEPTION();
}
TraceLoggingWrite(g_hRemotingProvider,
"Peasant_RequestQuit",
TraceLoggingLevel(WINEVENT_LEVEL_VERBOSE),
TraceLoggingKeyword(TIL_KEYWORD_TRACE));
}
void Peasant::AttachContentToWindow(Remoting::AttachRequest request)
{
try

View File

@@ -56,7 +56,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
void RequestRename(const winrt::Microsoft::Terminal::Remoting::RenameRequestArgs& args);
void RequestShowNotificationIcon();
void RequestHideNotificationIcon();
void RequestQuitAll();
void Quit();
void AttachContentToWindow(Remoting::AttachRequest request);
@@ -76,7 +75,6 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
til::typed_event<> ShowNotificationIconRequested;
til::typed_event<> HideNotificationIconRequested;
til::typed_event<> QuitAllRequested;
til::typed_event<> QuitRequested;
til::typed_event<winrt::Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Remoting::AttachRequest> AttachRequested;

View File

@@ -80,7 +80,6 @@ namespace Microsoft.Terminal.Remoting
void RequestShowNotificationIcon();
void RequestHideNotificationIcon();
void RequestQuitAll();
void Quit();
void AttachContentToWindow(AttachRequest request);
@@ -95,7 +94,6 @@ namespace Microsoft.Terminal.Remoting
event Windows.Foundation.TypedEventHandler<Object, Object> ShowNotificationIconRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> HideNotificationIconRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> QuitAllRequested;
event Windows.Foundation.TypedEventHandler<Object, Object> QuitRequested;
event Windows.Foundation.TypedEventHandler<Object, AttachRequest> AttachRequested;

View File

@@ -130,6 +130,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))
{
@@ -373,6 +375,18 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
WindowClosed.raise(s, e);
}
void WindowManager::QuitAll()
{
if (_monarch)
{
try
{
_monarch.QuitAll();
}
CATCH_LOG()
}
}
void WindowManager::SignalClose(const Remoting::Peasant& peasant)
{
if (_monarch)

View File

@@ -32,6 +32,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation
Remoting::Peasant CreatePeasant(const Remoting::WindowRequestedArgs& args);
void SignalClose(const Remoting::Peasant& peasant);
void QuitAll();
void SummonWindow(const Remoting::SummonWindowSelectionArgs& args);
void SummonAllWindows();
Windows::Foundation::Collections::IVectorView<winrt::Microsoft::Terminal::Remoting::PeasantInfo> GetPeasantInfos();

View File

@@ -12,6 +12,7 @@ namespace Microsoft.Terminal.Remoting
Peasant CreatePeasant(WindowRequestedArgs args);
void SignalClose(Peasant p);
void QuitAll();
void UpdateActiveTabTitle(String title, Peasant p);

View File

@@ -27,10 +27,10 @@ static const int CombinedPaneBorderSize = 2 * PaneBorderSize;
static const int AnimationDurationInMilliseconds = 200;
static const Duration AnimationDuration = DurationHelper::FromTimeSpan(winrt::Windows::Foundation::TimeSpan(std::chrono::milliseconds(AnimationDurationInMilliseconds)));
Pane::Pane(const IPaneContent& content, const bool lastFocused) :
_content{ content },
Pane::Pane(IPaneContent content, const bool lastFocused) :
_lastActive{ lastFocused }
{
_setPaneContent(std::move(content));
_root.Children().Append(_borderFirst);
const auto& control{ _content.GetRoot() };
@@ -467,7 +467,7 @@ std::shared_ptr<Pane> Pane::NextPane(const std::shared_ptr<Pane> targetPane)
std::shared_ptr<Pane> nextPane = nullptr;
auto foundTarget = false;
auto foundNext = WalkTree([&](auto pane) {
auto foundNext = WalkTree([&](const auto& pane) {
// If we are a parent pane we don't want to move to one of our children
if (foundTarget && targetPane->_HasChild(pane))
{
@@ -985,6 +985,7 @@ void Pane::_ContentLostFocusHandler(const winrt::Windows::Foundation::IInspectab
// - <none>
void Pane::Close()
{
_setPaneContent(nullptr);
// Fire our Closed event to tell our parent that we should be removed.
Closed.raise(nullptr, nullptr);
}
@@ -996,7 +997,7 @@ void Pane::Shutdown()
{
if (_IsLeaf())
{
_content.Close();
_setPaneContent(nullptr);
}
else
{
@@ -1341,7 +1342,7 @@ std::shared_ptr<Pane> Pane::DetachPane(std::shared_ptr<Pane> pane)
detached->_ApplySplitDefinitions();
// Trigger the detached event on each child
detached->WalkTree([](auto pane) {
detached->WalkTree([](const auto& pane) {
pane->Detached.raise(pane);
});
@@ -1400,7 +1401,7 @@ void Pane::_CloseChild(const bool closeFirst)
_borders = _GetCommonBorders();
// take the control, profile, id and isDefTermSession of the pane that _wasn't_ closed.
_content = remainingChild->_content;
_setPaneContent(remainingChild->_takePaneContent());
_id = remainingChild->Id();
// Revoke the old event handlers. Remove both the handlers for the panes
@@ -1542,7 +1543,7 @@ void Pane::_CloseChild(const bool closeFirst)
{
// update our path to our first remaining leaf
_parentChildPath = _firstChild;
_firstChild->WalkTree([](auto p) {
_firstChild->WalkTree([](const auto& p) {
if (p->_IsLeaf())
{
return true;
@@ -1705,6 +1706,33 @@ void Pane::_SetupChildCloseHandlers()
});
}
// With this method you take ownership of the control from this Pane.
// Assign it to another Pane with _setPaneContent() or Close() it.
IPaneContent Pane::_takePaneContent()
{
_closeRequestedRevoker.revoke();
return std::move(_content);
}
// This method safely sets the content of the Pane. It'll ensure to revoke and
// assign event handlers, and to Close() the existing content if there's any.
// The new content can be nullptr to remove any content.
void Pane::_setPaneContent(IPaneContent content)
{
// The IPaneContent::Close() implementation may be buggy and raise the CloseRequested event again.
// _takePaneContent() avoids this as it revokes the event handler.
if (const auto c = _takePaneContent())
{
c.Close();
}
if (content)
{
_content = std::move(content);
_closeRequestedRevoker = _content.CloseRequested(winrt::auto_revoke, [this](auto&&, auto&&) { Close(); });
}
}
// Method Description:
// - Sets up row/column definitions for this pane. There are three total
// row/cols. The middle one is for the separator. The first and third are for
@@ -2255,8 +2283,7 @@ std::pair<std::shared_ptr<Pane>, std::shared_ptr<Pane>> Pane::_Split(SplitDirect
else
{
// Move our control, guid, isDefTermSession into the first one.
_firstChild = std::make_shared<Pane>(_content);
_content = nullptr;
_firstChild = std::make_shared<Pane>(_takePaneContent());
_firstChild->_broadcastEnabled = _broadcastEnabled;
}
@@ -2398,7 +2425,7 @@ void Pane::Id(uint32_t id) noexcept
bool Pane::FocusPane(const uint32_t id)
{
// Always clear the parent child path if we are focusing a leaf
return WalkTree([=](auto p) {
return WalkTree([=](const auto& p) {
p->_parentChildPath.reset();
if (p->_id == id)
{
@@ -2421,7 +2448,7 @@ bool Pane::FocusPane(const uint32_t id)
// - true if focus was set
bool Pane::FocusPane(const std::shared_ptr<Pane> pane)
{
return WalkTree([&](auto p) {
return WalkTree([&](const auto& p) {
if (p == pane)
{
p->_Focus();
@@ -2451,6 +2478,11 @@ bool Pane::_HasChild(const std::shared_ptr<Pane> child)
});
}
winrt::TerminalApp::TerminalPaneContent Pane::_getTerminalContent() const
{
return _IsLeaf() ? _content.try_as<winrt::TerminalApp::TerminalPaneContent>() : nullptr;
}
// Method Description:
// - Recursive function that finds a pane with the given ID
// Arguments:

View File

@@ -62,7 +62,7 @@ struct PaneResources
class Pane : public std::enable_shared_from_this<Pane>
{
public:
Pane(const winrt::TerminalApp::IPaneContent& content,
Pane(winrt::TerminalApp::IPaneContent content,
const bool lastFocused = false);
Pane(std::shared_ptr<Pane> first,
@@ -248,13 +248,13 @@ private:
std::optional<uint32_t> _id;
std::weak_ptr<Pane> _parentChildPath{};
bool _lastActive{ false };
winrt::event_token _firstClosedToken{ 0 };
winrt::event_token _secondClosedToken{ 0 };
winrt::Windows::UI::Xaml::UIElement::GotFocus_revoker _gotFocusRevoker;
winrt::Windows::UI::Xaml::UIElement::LostFocus_revoker _lostFocusRevoker;
winrt::TerminalApp::IPaneContent::CloseRequested_revoker _closeRequestedRevoker;
Borders _borders{ Borders::None };
@@ -264,11 +264,10 @@ private:
bool _IsLeaf() const noexcept;
bool _HasFocusedChild() const noexcept;
void _SetupChildCloseHandlers();
winrt::TerminalApp::IPaneContent _takePaneContent();
void _setPaneContent(winrt::TerminalApp::IPaneContent content);
bool _HasChild(const std::shared_ptr<Pane> child);
winrt::TerminalApp::TerminalPaneContent _getTerminalContent() const
{
return _IsLeaf() ? _content.try_as<winrt::TerminalApp::TerminalPaneContent>() : nullptr;
}
winrt::TerminalApp::TerminalPaneContent _getTerminalContent() const;
std::pair<std::shared_ptr<Pane>, std::shared_ptr<Pane>> _Split(winrt::Microsoft::Terminal::Settings::Model::SplitDirection splitType,
const float splitSize,

View File

@@ -205,7 +205,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

@@ -45,7 +45,6 @@ namespace winrt::TerminalApp::implementation
}
void ScratchpadContent::Close()
{
CloseRequested.raise(*this, nullptr);
}
INewContentArgs ScratchpadContent::GetNewTerminalArgs(const BuildStartupKind /* kind */) const

View File

@@ -47,7 +47,6 @@ namespace winrt::TerminalApp::implementation
}
void SettingsPaneContent::Close()
{
CloseRequested.raise(*this, nullptr);
}
INewContentArgs SettingsPaneContent::GetNewTerminalArgs(const BuildStartupKind /*kind*/) const

View File

@@ -48,7 +48,20 @@ namespace winrt::TerminalApp::implementation
default:
return false;
}
return eventArgs.Handled();
const auto handled = eventArgs.Handled();
if (handled)
{
TraceLoggingWrite(
g_hTerminalAppProvider,
"ActionDispatched",
TraceLoggingDescription("Event emitted when an action was successfully performed"),
TraceLoggingValue(static_cast<int>(actionAndArgs.Action()), "Action"),
TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),
TelemetryPrivacyDataTag(PDT_ProductAndServiceUsage));
}
return handled;
}
bool ShortcutActionDispatch::DoAction(const ActionAndArgs& actionAndArgs)

View File

@@ -12,6 +12,7 @@
xmlns:model="using:Microsoft.Terminal.Settings.Model"
xmlns:mtu="using:Microsoft.Terminal.UI"
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
MinWidth="256"
AllowFocusOnInteraction="True"
AutomationProperties.Name="{x:Bind ControlName, Mode=OneWay}"
IsTabStop="True"
@@ -99,6 +100,24 @@
GeneralItemTemplate="{StaticResource GeneralItemTemplate}"
NestedItemTemplate="{StaticResource NestedItemTemplate}" />
<!--
Remove all item animations from the suggestions UI. They're
entirely too slow to let that UI be usable.
-->
<Style x:Key="NoAnimationsPlease"
TargetType="ListView">
<Setter Property="ItemContainerTransitions">
<Setter.Value>
<TransitionCollection>
<!-- (deleted transitions are left for reference for what we removed) -->
<ContentThemeTransition />
<!--<AddDeleteThemeTransition/>-->
<!--<ReorderThemeTransition/>-->
<!--<EntranceThemeTransition IsStaggeringEnabled="False"/>-->
</TransitionCollection>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</UserControl.Resources>
@@ -203,7 +222,8 @@
ItemClick="_listItemClicked"
ItemsSource="{x:Bind FilteredActions}"
SelectionChanged="_listItemSelectionChanged"
SelectionMode="Single" />
SelectionMode="Single"
Style="{StaticResource NoAnimationsPlease}" />
</Grid>

View File

@@ -739,7 +739,7 @@ namespace winrt::TerminalApp::implementation
}
// Clean read-only mode to prevent additional prompt if closing the pane triggers closing of a hosting tab
pane->WalkTree([](auto p) {
pane->WalkTree([](const auto& p) {
if (const auto control{ p->GetTerminalControl() })
{
if (control.ReadOnly())

View File

@@ -1899,7 +1899,10 @@ namespace winrt::TerminalApp::implementation
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;
}
@@ -1915,7 +1918,7 @@ namespace winrt::TerminalApp::implementation
// 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);
@@ -3807,7 +3810,7 @@ namespace winrt::TerminalApp::implementation
// recipe for disaster. We won't ever open up a tab in this window.
newTerminalArgs.Elevate(false);
const auto newPane = _MakePane(newTerminalArgs, nullptr, connection);
newPane->WalkTree([](auto pane) {
newPane->WalkTree([](const auto& pane) {
pane->FinalizeConfigurationGivenDefault();
});
_CreateNewTabFromPane(newPane);

View File

@@ -78,8 +78,6 @@ namespace winrt::TerminalApp::implementation
_bellPlayer = nullptr;
_bellPlayerCreated = false;
}
CloseRequested.raise(*this, nullptr);
}
winrt::hstring TerminalPaneContent::Icon() const
@@ -239,19 +237,20 @@ namespace winrt::TerminalApp::implementation
if (_profile)
{
if (_isDefTermSession && _profile.CloseOnExit() == CloseOnExitMode::Automatic)
{
// For 'automatic', we only care about the connection state if we were launched by Terminal
// Since we were launched via defterm, ignore the connection state (i.e. we treat the
// close on exit mode as 'always', see GH #13325 for discussion)
Close();
}
const auto mode = _profile.CloseOnExit();
if ((mode == CloseOnExitMode::Always) ||
((mode == CloseOnExitMode::Graceful || mode == CloseOnExitMode::Automatic) && newConnectionState == ConnectionState::Closed))
if (
// This one is obvious: If the user asked for "always" we do just that.
(mode == CloseOnExitMode::Always) ||
// Otherwise, and unless the user asked for the opposite of "always",
// close the pane when the connection closed gracefully (not failed).
(mode != CloseOnExitMode::Never && newConnectionState == ConnectionState::Closed) ||
// However, defterm handoff can result in Windows Terminal randomly opening which may be annoying,
// so by default we should at least always close the pane, even if the command failed.
// See GH #13325 for discussion.
(mode == CloseOnExitMode::Automatic && _isDefTermSession))
{
Close();
CloseRequested.raise(nullptr, nullptr);
}
}
}
@@ -331,7 +330,7 @@ namespace winrt::TerminalApp::implementation
void TerminalPaneContent::_closeTerminalRequestedHandler(const winrt::Windows::Foundation::IInspectable& /*sender*/,
const winrt::Windows::Foundation::IInspectable& /*args*/)
{
Close();
CloseRequested.raise(nullptr, nullptr);
}
void TerminalPaneContent::_restartTerminalRequestedHandler(const winrt::Windows::Foundation::IInspectable& /*sender*/,

View File

@@ -41,7 +41,7 @@ namespace winrt::TerminalApp::implementation
auto firstId = _nextPaneId;
_rootPane->WalkTree([&](std::shared_ptr<Pane> pane) {
_rootPane->WalkTree([&](const auto& pane) {
// update the IDs on each pane
if (pane->_IsLeaf())
{
@@ -203,7 +203,7 @@ namespace winrt::TerminalApp::implementation
{
ASSERT_UI_THREAD();
_rootPane->WalkTree([&](std::shared_ptr<Pane> pane) {
_rootPane->WalkTree([&](const auto& pane) {
// Attach event handlers to each new pane
_AttachEventHandlersToPane(pane);
if (auto content = pane->GetContent())
@@ -275,7 +275,7 @@ namespace winrt::TerminalApp::implementation
_UpdateHeaderControlMaxWidth();
// Update the settings on all our panes.
_rootPane->WalkTree([&](auto pane) {
_rootPane->WalkTree([&](const auto& pane) {
pane->UpdateSettings(settings);
return false;
});
@@ -534,7 +534,7 @@ namespace winrt::TerminalApp::implementation
// Add the new event handlers to the new pane(s)
// and update their ids.
pane->WalkTree([&](auto p) {
pane->WalkTree([&](const auto& p) {
_AttachEventHandlersToPane(p);
if (p->_IsLeaf())
{
@@ -624,7 +624,7 @@ namespace winrt::TerminalApp::implementation
// manually.
_rootPane->Closed(_rootClosedToken);
auto p = _rootPane;
p->WalkTree([](auto pane) {
p->WalkTree([](const auto& pane) {
pane->Detached.raise(pane);
});
@@ -650,7 +650,7 @@ namespace winrt::TerminalApp::implementation
// Add the new event handlers to the new pane(s)
// and update their ids.
pane->WalkTree([&](auto p) {
pane->WalkTree([&](const auto& p) {
_AttachEventHandlersToPane(p);
if (p->_IsLeaf())
{
@@ -947,32 +947,6 @@ namespace winrt::TerminalApp::implementation
auto dispatcher = TabViewItem().Dispatcher();
ContentEventTokens events{};
events.CloseRequested = content.CloseRequested(
winrt::auto_revoke,
[dispatcher, weakThis](auto sender, auto&&) -> winrt::fire_and_forget {
// Don't forget! this ^^^^^^^^ sender can't be a reference, this is a async callback.
// The lambda lives in the `std::function`-style container owned by `control`. That is, when the
// `control` gets destroyed the lambda struct also gets destroyed. In other words, we need to
// copy `weakThis` onto the stack, because that's the only thing that gets captured in coroutines.
// See: https://devblogs.microsoft.com/oldnewthing/20211103-00/?p=105870
const auto weakThisCopy = weakThis;
co_await wil::resume_foreground(dispatcher);
// Check if Tab's lifetime has expired
if (auto tab{ weakThisCopy.get() })
{
if (const auto content{ sender.try_as<TerminalApp::IPaneContent>() })
{
tab->_rootPane->WalkTree([content](std::shared_ptr<Pane> pane) {
if (pane->GetContent() == content)
{
pane->Close();
}
});
}
}
});
events.TitleChanged = content.TitleChanged(
winrt::auto_revoke,
[dispatcher, weakThis](auto&&, auto&&) -> winrt::fire_and_forget {

View File

@@ -134,7 +134,6 @@ namespace winrt::TerminalApp::implementation
winrt::TerminalApp::IPaneContent::ConnectionStateChanged_revoker ConnectionStateChanged;
winrt::TerminalApp::IPaneContent::ReadOnlyChanged_revoker ReadOnlyChanged;
winrt::TerminalApp::IPaneContent::FocusRequested_revoker FocusRequested;
winrt::TerminalApp::IPaneContent::CloseRequested_revoker CloseRequested;
// These events literally only apply if the content is a TermControl.
winrt::Microsoft::Terminal::Control::TermControl::KeySent_revoker KeySent;

View File

@@ -263,7 +263,7 @@ namespace winrt::TerminalApp::implementation
AppLogic::Current()->NotifyRootInitialized();
}
void TerminalWindow::Quit()
void TerminalWindow::PersistState()
{
if (_root)
{
@@ -767,13 +767,22 @@ namespace winrt::TerminalApp::implementation
// definitely not on OUR UI thread.
winrt::fire_and_forget TerminalWindow::UpdateSettings(winrt::TerminalApp::SettingsLoadEventArgs args)
{
_settings = args.NewSettings();
// GH#17620: We have a bug somewhere where a window doesn't get unregistered from the window list.
// This causes UpdateSettings calls where the thread dispatcher is already null.
const auto dispatcher = _root->Dispatcher();
if (!dispatcher)
{
co_return;
}
const auto weakThis{ get_weak() };
co_await wil::resume_foreground(_root->Dispatcher());
co_await wil::resume_foreground(dispatcher);
// Back on our UI thread...
if (auto logic{ weakThis.get() })
{
_settings = args.NewSettings();
// Update the settings in TerminalPage
// We're on our UI thread right now, so this is safe
_root->SetSettings(_settings, true);

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);

View File

@@ -61,7 +61,7 @@ namespace TerminalApp
Boolean ShouldImmediatelyHandoffToElevated();
void HandoffToElevated();
void Quit();
void PersistState();
Windows.UI.Xaml.UIElement GetRoot();

View File

@@ -180,12 +180,14 @@ 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 },
_inPipe{ hIn },
_outPipe{ hOut }
{
_sessionId = Utils::CreateGuid();
THROW_IF_FAILED(ConptyPackPseudoConsole(hServerProcess, hRef, hSig, &_hPC));
_piClient.hProcess = hClientProcess;
@@ -429,12 +431,10 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
try
{
// GH#11556 - make sure to format the error code to this string as an UNSIGNED int
winrt::hstring exitText{ fmt::format(std::wstring_view{ RS_(L"ProcessExited") }, fmt::format(_errorFormat, status)) };
TerminalOutput.raise(L"\r\n");
TerminalOutput.raise(exitText);
TerminalOutput.raise(L"\r\n");
TerminalOutput.raise(RS_(L"CtrlDToClose"));
TerminalOutput.raise(L"\r\n");
const auto msg1 = fmt::format(std::wstring_view{ RS_(L"ProcessExited") }, fmt::format(_errorFormat, status));
const auto msg2 = RS_(L"CtrlDToClose");
const auto msg = fmt::format(FMT_COMPILE(L"\r\n{}\r\n{}\r\n"), msg1, msg2);
TerminalOutput.raise(msg);
}
CATCH_LOG();
}
@@ -677,7 +677,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation
void ConptyConnection::closePseudoConsoleAsync(HPCON hPC) noexcept
{
::ConptyClosePseudoConsoleTimeout(hPC, 0);
::ConptyClosePseudoConsole(hPC);
}
HRESULT ConptyConnection::NewHandoff(HANDLE in, HANDLE out, HANDLE signal, HANDLE ref, HANDLE server, HANDLE client, TERMINAL_STARTUP_INFO startupInfo) noexcept

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

@@ -80,7 +80,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
Connection(connection);
_terminal->SetWriteInputCallback([this](std::wstring_view wstr) {
_sendInputToConnection(wstr);
_pendingResponses.append(wstr);
});
// GH#8969: pre-seed working directory to prevent potential races
@@ -161,7 +161,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
std::chrono::milliseconds{ 100 },
[weakTerminal = std::weak_ptr{ _terminal }, weakThis = get_weak(), dispatcher = _dispatcher]() {
dispatcher.TryEnqueue(DispatcherQueuePriority::Normal, [weakThis]() {
if (const auto self = weakThis.get(); !self->_IsClosing())
if (const auto self = weakThis.get(); self && !self->_IsClosing())
{
self->OutputIdle.raise(*self, nullptr);
}
@@ -179,7 +179,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_dispatcher,
std::chrono::milliseconds{ 8 },
[weakThis = get_weak()](const auto& update) {
if (auto core{ weakThis.get() }; !core->_IsClosing())
if (auto core{ weakThis.get() }; core && !core->_IsClosing())
{
core->ScrollPositionChanged.raise(*core, update);
}
@@ -398,6 +398,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// Return Value:
// - <none>
void ControlCore::_sendInputToConnection(std::wstring_view wstr)
{
_connection.WriteInput(wstr);
}
// Method Description:
// - Writes the given sequence as input to the active terminal connection,
// Arguments:
// - wstr: the string of characters to write to the terminal connection.
// Return Value:
// - <none>
void ControlCore::SendInput(const std::wstring_view wstr)
{
if (wstr.empty())
{
@@ -414,21 +425,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
else
{
_connection.WriteInput(wstr);
_sendInputToConnection(wstr);
}
}
// Method Description:
// - Writes the given sequence as input to the active terminal connection,
// Arguments:
// - wstr: the string of characters to write to the terminal connection.
// Return Value:
// - <none>
void ControlCore::SendInput(const std::wstring_view wstr)
{
_sendInputToConnection(wstr);
}
bool ControlCore::SendCharEvent(const wchar_t ch,
const WORD scanCode,
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers)
@@ -464,7 +464,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
if (out)
{
_sendInputToConnection(*out);
SendInput(*out);
return true;
}
return false;
@@ -622,7 +622,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
if (out)
{
_sendInputToConnection(*out);
SendInput(*out);
return true;
}
return false;
@@ -641,7 +641,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
if (out)
{
_sendInputToConnection(*out);
SendInput(*out);
return true;
}
return false;
@@ -1392,7 +1392,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
// It's important to not hold the terminal lock while calling this function as sending the data may take a long time.
_sendInputToConnection(filtered);
SendInput(filtered);
const auto lock = _terminal->LockForWriting();
_terminal->ClearSelection();
@@ -2083,7 +2083,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// Sending input requires that we're unlocked, because
// writing the input pipe may block indefinitely.
const auto suspension = _terminal->SuspendLock();
_sendInputToConnection(buffer);
SendInput(buffer);
}
}
}
@@ -2140,6 +2140,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_terminal->Write(hstr);
}
if (!_pendingResponses.empty())
{
_sendInputToConnection(_pendingResponses);
_pendingResponses.clear();
}
// Start the throttled update of where our hyperlinks are.
const auto shared = _shared.lock_shared();
if (shared->outputIdle)
@@ -2235,20 +2241,39 @@ namespace winrt::Microsoft::Terminal::Control::implementation
std::vector<winrt::hstring> commands;
const auto bufferCommands{ textBuffer.Commands() };
for (const auto& commandInBuffer : bufferCommands)
{
const auto strEnd = commandInBuffer.find_last_not_of(UNICODE_SPACE);
auto trimToHstring = [](const auto& s) -> winrt::hstring {
const auto strEnd = s.find_last_not_of(UNICODE_SPACE);
if (strEnd != std::string::npos)
{
const auto trimmed = commandInBuffer.substr(0, strEnd + 1);
const auto trimmed = s.substr(0, strEnd + 1);
return winrt::hstring{ trimmed };
}
return winrt::hstring{ L"" };
};
commands.push_back(winrt::hstring{ trimmed });
const auto currentCommand = _terminal->CurrentCommand();
const auto trimmedCurrentCommand = trimToHstring(currentCommand);
for (const auto& commandInBuffer : bufferCommands)
{
if (const auto hstr{ trimToHstring(commandInBuffer) };
(!hstr.empty() && hstr != trimmedCurrentCommand))
{
commands.push_back(hstr);
}
}
auto context = winrt::make_self<CommandHistoryContext>(std::move(commands));
context->CurrentCommandline(winrt::hstring{ _terminal->CurrentCommand() });
// If the very last thing in the list of recent commands, is exactly the
// same as the current command, then let's not include it in the
// history. It's literally the thing the user has typed, RIGHT now.
if (!commands.empty() && commands.back() == trimmedCurrentCommand)
{
commands.pop_back();
}
auto context = winrt::make_self<CommandHistoryContext>(std::move(commands));
context->CurrentCommandline(trimmedCurrentCommand);
return *context;
}
@@ -2424,7 +2449,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
{
// _sendInputToConnection() asserts that we aren't in focus mode,
// but window focus events are always fine to send.
_connection.WriteInput(*out);
_sendInputToConnection(*out);
}
}

View File

@@ -307,6 +307,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
winrt::com_ptr<ControlSettings> _settings{ nullptr };
std::shared_ptr<::Microsoft::Terminal::Core::Terminal> _terminal{ nullptr };
std::wstring _pendingResponses;
// NOTE: _renderEngine must be ordered before _renderer.
//

View File

@@ -217,6 +217,10 @@ Installieren Sie entweder die fehlende Schriftart, oder wählen Sie eine andere
<value>Die folgenden Schriftarten wurden nicht gefunden: {0}. Installieren Sie sie, oder wählen Sie andere Schriftarten aus.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</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="RendererErrorOther" xml:space="preserve">
<value>Unerwarteter Rendererfehler: {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>

View File

@@ -217,6 +217,10 @@ Please either install the missing font or choose another one.</value>
<value>Unable to find the following fonts: {0}. Please either install them or choose different fonts.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</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>

View File

@@ -217,6 +217,10 @@ Instale la fuente que falta o elija otra.</value>
<value>No se pueden encontrar las siguientes fuentes: {0}. Instálelas o elija fuentes diferentes.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</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="RendererErrorOther" xml:space="preserve">
<value>El representador encontró un error inesperado: {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>

View File

@@ -217,6 +217,10 @@ Installez la police manquante ou choisissez-en une autre.</value>
<value>Impossible de trouver les polices suivantes : {0}. Installez-les ou choisissez dautres polices.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</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="RendererErrorOther" xml:space="preserve">
<value>Le convertisseur a rencontré une erreur inattendue : {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>

View File

@@ -176,7 +176,7 @@
<value>Riprendi</value>
</data>
<data name="HowToOpenRun.Text" xml:space="preserve">
<value>CTRL+clic per aprire il collegamento</value>
<value>CTRL+CLIC per aprire il collegamento</value>
</data>
<data name="TermControl_NoMatch" xml:space="preserve">
<value>Nessun risultato</value>
@@ -217,6 +217,10 @@ Installare il tipo di carattere mancante o sceglierne un altro.</value>
<value>Impossibile trovare i tipi di carattere seguenti: {0}. Installarli o scegliere tipi di carattere diversi.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>La versione di MacType è incompatibile con questa applicazione. Aggiornare alla versione 2023.5.31 o successiva.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>Errore imprevisto del renderer: {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>

View File

@@ -217,6 +217,10 @@
<value>次のフォントが見つかりません: {0}。インストールするか、別のフォントを選択してください。</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>お使いのバージョンの MacType は、このアプリケーションと互換性がありません。バージョン 2023.5.31 以降に更新してください。</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>レンダラーで予期しないエラーが発生しました: {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>

View File

@@ -217,6 +217,10 @@
<value>다음 글꼴을 찾을 수 없습니다. {0}. 설치하거나 다른 글꼴을 선택하세요.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>MacType 버전이 이 애플리케이션과 호환되지 않습니다. 버전 2023.5.31 이상으로 업데이트하세요.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>렌더러에서 예기치 않은 오류가 발생했습니다. {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>

View File

@@ -217,6 +217,10 @@ Instale a fonte ausente ou escolha outra.</value>
<value>Não é possível localizar as seguintes fontes: {0}. Instale-os ou escolha fontes diferentes.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Sua versão do MacType é incompatível com este aplicativo. Atualize para a versão 2023.5.31 ou posterior.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>O renderizador encontrou um erro inesperado: {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>

View File

@@ -217,6 +217,10 @@
<value>Цйǻьľė ŧò ƒіņð τнė ƒσℓľоŵíпğ ƒŏптš: {0}. Рĺёąšė èìťђėг ïŋŝţăĺℓ тħēm ôѓ ςђоōѕз ðįƒƒеřęʼnţ ƒóπţś. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Ύοϋг νέяšîǿŋ бƒ MacType їš ìⁿçомрāţΐвŀè шιťћ тĥĩѕ ªрφℓíċąţіōņ. Рĺэаşέ űφđаτє τő νзřѕíбʼn 2023.5.31 бŗ ℓâţëґ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>Гêʼnďěѓēŗ эήçομήťєřĕď åń µŋέхρэсťèð ęґяöя: {0:#010×} {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>

View File

@@ -217,6 +217,10 @@
<value>Цйǻьľė ŧò ƒіņð τнė ƒσℓľоŵíпğ ƒŏптš: {0}. Рĺёąšė èìťђėг ïŋŝţăĺℓ тħēm ôѓ ςђоōѕз ðįƒƒеřęʼnţ ƒóπţś. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Ύοϋг νέяšîǿŋ бƒ MacType їš ìⁿçомрāţΐвŀè шιťћ тĥĩѕ ªрφℓíċąţіōņ. Рĺэаşέ űφđаτє τő νзřѕíбʼn 2023.5.31 бŗ ℓâţëґ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>Гêʼnďěѓēŗ эήçομήťєřĕď åń µŋέхρэсťèð ęґяöя: {0:#010×} {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>

View File

@@ -217,6 +217,10 @@
<value>Цйǻьľė ŧò ƒіņð τнė ƒσℓľоŵíпğ ƒŏптš: {0}. Рĺёąšė èìťђėг ïŋŝţăĺℓ тħēm ôѓ ςђоōѕз ðįƒƒеřęʼnţ ƒóπţś. !!! !!! !!! !!! !!! !!! !!! !!! !!! !</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Ύοϋг νέяšîǿŋ бƒ MacType їš ìⁿçомрāţΐвŀè шιťћ тĥĩѕ ªрφℓíċąţіōņ. Рĺэаşέ űφđаτє τő νзřѕíбʼn 2023.5.31 бŗ ℓâţëґ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>Гêʼnďěѓēŗ эήçομήťєřĕď åń µŋέхρэсťèð ęґяöя: {0:#010×} {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>

View File

@@ -217,6 +217,10 @@
<value>Не удалось найти следующие шрифты: {0}. Установите их или выберите другие шрифты.</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>Эта версия MacType несовместима с этим приложением. Обновите версию до 2023.5.31 или более поздней.</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>В обработчике произошла непредвиденная ошибка: {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>

View File

@@ -217,6 +217,10 @@
<value>找不到以下字体: {0}。请安装它们或选择其他字体。</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>你的 MacType 版本与此应用程序不兼容。请更新到版本 2023.5.31 或更高版本。</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>呈现器遇到错误: {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>

View File

@@ -217,6 +217,10 @@
<value>找不到下列字型: {0}。請安裝它們,或選擇其他字型。</value>
<comment>{Locked="{0}"} This is a warning dialog shown when the user selects a font that isn't installed.</comment>
</data>
<data name="RendererErrorMacType" xml:space="preserve">
<value>您的 MacType 版本與此應用程式不相容。請更新至 2023.5.31 版或更新版本。</value>
<comment>{Locked="2023.5.31","MacType"}</comment>
</data>
<data name="RendererErrorOther" xml:space="preserve">
<value>轉譯器發生意外的錯誤: {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>

View File

@@ -154,12 +154,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// search box remains in Visible state (though not really *visible*) during the
// first load. So, we only need to apply this check here (after checking that
// we're done initializing).
if (Visibility() == Visibility::Visible)
if (IsOpen())
{
callback();
return;
}
// Stop ongoing close animation if any
if (CloseAnimation().GetCurrentState() == Media::Animation::ClockState::Active)
{
CloseAnimation().Stop();
}
VisualStateManager::GoToState(*this, L"Opened", false);
// Call the callback only after we're in Opened state. Setting focus
@@ -195,6 +201,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
}
bool SearchBoxControl::IsOpen()
{
return Visibility() == Visibility::Visible && CloseAnimation().GetCurrentState() != Media::Animation::ClockState::Active;
}
winrt::hstring SearchBoxControl::Text()
{
return TextBox().Text();

View File

@@ -34,6 +34,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void TextBoxKeyDown(const winrt::Windows::Foundation::IInspectable& /*sender*/, const winrt::Windows::UI::Xaml::Input::KeyRoutedEventArgs& e);
void Open(std::function<void()> callback);
void Close();
bool IsOpen();
winrt::hstring Text();
bool GoForward();

View File

@@ -248,7 +248,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
dispatcher,
TerminalWarningBellInterval,
[weakThis = get_weak()]() {
if (auto control{ weakThis.get() }; !control->_IsClosing())
if (auto control{ weakThis.get() }; control && !control->_IsClosing())
{
control->WarningBell.raise(*control, nullptr);
}
@@ -258,7 +258,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
dispatcher,
ScrollBarUpdateInterval,
[weakThis = get_weak()](const auto& update) {
if (auto control{ weakThis.get() }; !control->_IsClosing())
if (auto control{ weakThis.get() }; control && !control->_IsClosing())
{
control->_throttledUpdateScrollbar(update);
}
@@ -301,7 +301,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_originalSelectedSecondaryElements.Append(e);
}
ContextMenu().Closed([weakThis = get_weak()](auto&&, auto&&) {
if (auto control{ weakThis.get() }; !control->_IsClosing())
if (auto control{ weakThis.get() }; control && !control->_IsClosing())
{
const auto& menu{ control->ContextMenu() };
menu.PrimaryCommands().Clear();
@@ -317,7 +317,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
});
SelectionContextMenu().Closed([weakThis = get_weak()](auto&&, auto&&) {
if (auto control{ weakThis.get() }; !control->_IsClosing())
if (auto control{ weakThis.get() }; control && !control->_IsClosing())
{
const auto& menu{ control->SelectionContextMenu() };
menu.PrimaryCommands().Clear();
@@ -493,7 +493,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
}
if (_searchBox && _searchBox->Visibility() == Visibility::Visible)
if (_searchBox && _searchBox->IsOpen())
{
const auto core = winrt::get_self<ControlCore>(_core);
const auto& searchMatches = core->SearchResultRows();
@@ -538,13 +538,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// but since code paths differ, extra work is required to ensure correctness.
if (!_core.HasMultiLineSelection())
{
_core.SnapSearchResultToSelection(true);
const auto selectedLine{ _core.SelectedText(true) };
_searchBox->PopulateTextbox(selectedLine);
}
}
_searchBox->Open([weakThis = get_weak()]() {
if (const auto self = weakThis.get(); !self->_IsClosing())
if (const auto self = weakThis.get(); self && !self->_IsClosing())
{
self->_searchBox->SetFocusOnTextbox();
self->_refreshSearch();
@@ -554,13 +555,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
}
}
// This is called when a Find Next/Previous Match action is triggered.
void TermControl::SearchMatch(const bool goForward)
{
if (_IsClosing())
{
return;
}
if (!_searchBox || _searchBox->Visibility() != Visibility::Visible)
if (!_searchBox || !_searchBox->IsOpen())
{
CreateSearchBoxControl();
}
@@ -597,11 +599,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
const bool goForward,
const bool caseSensitive)
{
_handleSearchResults(_core.Search(text, goForward, caseSensitive, false));
if (_searchBox && _searchBox->IsOpen())
{
_handleSearchResults(_core.Search(text, goForward, caseSensitive, false));
}
}
// Method Description:
// - The handler for the "search criteria changed" event. Clears selection and initiates a new search.
// - The handler for the "search criteria changed" event. Initiates a new search.
// Arguments:
// - text: the text to search
// - goForward: indicates whether the search should be performed forward (if set to true) or backward
@@ -612,9 +617,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
const bool goForward,
const bool caseSensitive)
{
if (_searchBox && _searchBox->Visibility() == Visibility::Visible)
if (_searchBox && _searchBox->IsOpen())
{
_handleSearchResults(_core.Search(text, goForward, caseSensitive, false));
// We only want to update the search results based on the new text. Set
// `resetOnly` to true so we don't accidentally update the current match index.
const auto result = _core.Search(text, goForward, caseSensitive, true);
_handleSearchResults(result);
}
}
@@ -632,6 +640,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_searchBox->Close();
_core.ClearSearch();
// Clear search highlights scroll marks (by triggering an update after closing the search box)
if (_showMarksInScrollbar)
{
const auto scrollBar = ScrollBar();
ScrollBarUpdate update{
.newValue = scrollBar.Value(),
.newMaximum = scrollBar.Maximum(),
.newMinimum = scrollBar.Minimum(),
.newViewportSize = scrollBar.ViewportSize(),
};
_updateScrollBar->Run(update);
}
// Set focus back to terminal control
this->Focus(FocusState::Programmatic);
}
@@ -653,11 +674,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// terminal.
co_await wil::resume_foreground(Dispatcher());
_core.UpdateSettings(settings, unfocusedAppearance);
if (auto strongThis{ weakThis.get() })
{
_core.UpdateSettings(settings, unfocusedAppearance);
_UpdateSettingsFromUIThread();
_UpdateSettingsFromUIThread();
_UpdateAppearanceFromUIThread(_focused ? _core.FocusedAppearance() : _core.UnfocusedAppearance());
_UpdateAppearanceFromUIThread(_focused ? _core.FocusedAppearance() : _core.UnfocusedAppearance());
}
}
// Method Description:
@@ -666,10 +690,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// - newAppearance: the new appearance to set
winrt::fire_and_forget TermControl::UpdateAppearance(IControlAppearance newAppearance)
{
auto weakThis{ get_weak() };
// Dispatch a call to the UI thread
co_await wil::resume_foreground(Dispatcher());
_UpdateAppearanceFromUIThread(newAppearance);
if (auto strongThis{ weakThis.get() })
{
_UpdateAppearanceFromUIThread(newAppearance);
}
}
// Method Description:
@@ -1055,8 +1084,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// MSFT 33353327: We're purposefully not using _initializedTerminal to ensure we're fully initialized.
// Doing so makes us return nullptr when XAML requests an automation peer.
// Instead, we need to give XAML an automation peer, then fix it later.
if (!_IsClosing())
if (!_IsClosing() && !_detached)
{
// It's unexpected that interactivity is null even when we're not closing or in detached state.
THROW_HR_IF_NULL(E_UNEXPECTED, _interactivity);
// create a custom automation peer with this code pattern:
// (https://docs.microsoft.com/en-us/windows/uwp/design/accessibility/custom-automation-peers)
if (const auto& interactivityAutoPeer{ _interactivity.OnCreateAutomationPeer() })
@@ -1120,7 +1152,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
co_return;
}
const auto hr = args.Result();
// HRESULT is a signed 32-bit integer which would result in a hex output like "-0x7766FFF4",
// but canonically HRESULTs are displayed unsigned as "0x8899000C". See GH#11556.
const auto hr = std::bit_cast<uint32_t>(args.Result());
const auto parameter = args.Parameter();
winrt::hstring message;
@@ -1136,6 +1170,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
case DWRITE_E_NOFONT:
message = winrt::hstring{ fmt::format(std::wstring_view{ RS_(L"RendererErrorFontNotFound") }, parameter) };
break;
case ATLAS_ENGINE_ERROR_MAC_TYPE:
message = RS_(L"RendererErrorMacType");
break;
default:
{
wchar_t buf[512];
@@ -1373,61 +1410,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// - Whether the key was handled.
bool TermControl::OnDirectKeyEvent(const uint32_t vkey, const uint8_t scanCode, const bool down)
{
// Short-circuit isReadOnly check to avoid warning dialog
if (_core.IsInReadOnlyMode())
{
return false;
}
const auto modifiers{ _GetPressedModifierKeys() };
auto handled = false;
if (vkey == VK_MENU && !down)
{
// Manually generate an Alt KeyUp event into the key bindings or terminal.
// This is required as part of GH#6421.
(void)_TrySendKeyEvent(VK_MENU, scanCode, modifiers, false);
handled = true;
}
else if ((vkey == VK_F7 || vkey == VK_SPACE) && down)
{
// Manually generate an F7 event into the key bindings or terminal.
// This is required as part of GH#638.
// Or do so for alt+space; only send to terminal when explicitly unbound
// That is part of #GH7125
auto bindings{ _core.Settings().KeyBindings() };
auto isUnbound = false;
const KeyChord kc = {
modifiers.IsCtrlPressed(),
modifiers.IsAltPressed(),
modifiers.IsShiftPressed(),
modifiers.IsWinPressed(),
gsl::narrow_cast<WORD>(vkey),
0
};
if (bindings)
{
handled = bindings.TryKeyChord(kc);
if (!handled)
{
isUnbound = bindings.IsKeyChordExplicitlyUnbound(kc);
}
}
const auto sendToTerminal = vkey == VK_F7 || (vkey == VK_SPACE && isUnbound);
if (!handled && sendToTerminal)
{
// _TrySendKeyEvent pretends it didn't handle F7 for some unknown reason.
(void)_TrySendKeyEvent(gsl::narrow_cast<WORD>(vkey), scanCode, modifiers, true);
// GH#6438: Note that we're _not_ sending the key up here - that'll
// get passed through XAML to our KeyUp handler normally.
handled = true;
}
}
return handled;
return _KeyHandler(gsl::narrow_cast<WORD>(vkey), gsl::narrow_cast<WORD>(scanCode), modifiers, down);
}
void TermControl::_KeyDownHandler(const winrt::Windows::Foundation::IInspectable& /*sender*/,
@@ -1444,13 +1428,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void TermControl::_KeyHandler(const Input::KeyRoutedEventArgs& e, const bool keyDown)
{
// If the current focused element is a child element of searchbox,
// we do not send this event up to terminal
if (_searchBox && _searchBox->ContainsFocus())
{
return;
}
const auto keyStatus = e.KeyStatus();
const auto vkey = gsl::narrow_cast<WORD>(e.OriginalKey());
const auto scanCode = gsl::narrow_cast<WORD>(keyStatus.ScanCode);
@@ -1461,6 +1438,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation
modifiers |= ControlKeyStates::EnhancedKey;
}
e.Handled(_KeyHandler(vkey, scanCode, modifiers, keyDown));
}
bool TermControl::_KeyHandler(WORD vkey, WORD scanCode, ControlKeyStates modifiers, bool keyDown)
{
// If the current focused element is a child element of searchbox,
// we do not send this event up to terminal
if (_searchBox && _searchBox->ContainsFocus())
{
return false;
}
// GH#11076:
// For some weird reason we sometimes receive a WM_KEYDOWN
// message without vkey or scanCode if a user drags a tab.
@@ -1469,8 +1458,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// accidental insertion of invalid KeyChords into classes like ActionMap.
if (!vkey && !scanCode)
{
e.Handled(true);
return;
return true;
}
// Mark the event as handled and do nothing if we're closing, or the key
@@ -1483,26 +1471,169 @@ namespace winrt::Microsoft::Terminal::Control::implementation
// about.
if (_IsClosing() || vkey == VK_LWIN || vkey == VK_RWIN)
{
e.Handled(true);
return;
return true;
}
// Short-circuit isReadOnly check to avoid warning dialog
if (_core.IsInReadOnlyMode())
{
e.Handled(!keyDown || _TryHandleKeyBinding(vkey, scanCode, modifiers));
return;
return !keyDown || _TryHandleKeyBinding(vkey, scanCode, modifiers);
}
// Alt-Numpad# input will send us a character once the user releases
// Alt, so we should be ignoring the individual keydowns. The character
// will be sent through the TSFInputControl. See GH#1401 for more
// details
if (modifiers.IsAltPressed() && !modifiers.IsCtrlPressed() &&
(vkey >= VK_NUMPAD0 && vkey <= VK_NUMPAD9))
// Our custom TSF input control doesn't receive Alt+Numpad inputs,
// and we don't receive any via WM_CHAR as a xaml island app either.
// So, we simply implement our own Alt-Numpad handling here.
//
// This handles the case where the Alt key is released.
// We'll flush any ongoing composition in that case.
if (vkey == VK_MENU && !keyDown && _altNumpadState.active)
{
e.Handled(true);
return;
auto& s = _altNumpadState;
auto encoding = s.encoding;
wchar_t buf[4]{};
size_t buf_len = 0;
bool handled = true;
if (encoding == AltNumpadEncoding::Unicode)
{
// UTF-32 -> UTF-16
if (s.accumulator == 0)
{
// If the user pressed Alt + VK_ADD, then released Alt, they probably didn't intend to insert a numpad character at all.
// Send any accumulated key events instead.
for (auto&& e : _altNumpadState.cachedKeyEvents)
{
handled = handled && _TrySendKeyEvent(e.vkey, e.scanCode, e.modifiers, e.keyDown);
}
// Send the alt keyup we are currently processing
handled = handled && _TrySendKeyEvent(vkey, scanCode, modifiers, keyDown);
// do not accumulate into the buffer
}
else if (s.accumulator <= 0xffff)
{
buf[buf_len++] = static_cast<uint16_t>(s.accumulator);
}
else
{
buf[buf_len++] = static_cast<uint16_t>((s.accumulator >> 10) + 0xd7c0);
buf[buf_len++] = static_cast<uint16_t>((s.accumulator & 0x3ff) | 0xdc00);
}
}
else
{
const auto ansi = encoding == AltNumpadEncoding::ANSI;
const auto acp = GetACP();
auto codepage = ansi ? acp : CP_OEMCP;
// Alt+Numpad inputs are always a single codepoint, be it UTF-32 or ANSI.
// Since DBCS code pages by definition are >1 codepoint, we can't encode those.
// Traditionally, the OS uses the Latin1 or IBM code page instead.
if (acp == CP_JAPANESE ||
acp == CP_CHINESE_SIMPLIFIED ||
acp == CP_KOREAN ||
acp == CP_CHINESE_TRADITIONAL ||
acp == CP_UTF8)
{
codepage = ansi ? 1252 : 437;
}
// The OS code seemed to also simply cut off the last byte in the accumulator.
const auto ch = gsl::narrow_cast<char>(s.accumulator & 0xff);
const auto len = MultiByteToWideChar(codepage, 0, &ch, 1, &buf[0], 2);
buf_len = gsl::narrow_cast<size_t>(std::max(0, len));
}
if (buf_len != 0)
{
// WinRT always needs null-terminated strings, because HSTRING is dumb.
// If it encounters a string that isn't, cppwinrt will abort().
// It should already be null-terminated, but let's make sure to not crash.
buf[buf_len] = L'\0';
_core.SendInput(std::wstring_view{ &buf[0], buf_len });
}
s = {};
return handled;
}
// As a continuation of the above, this handles the key-down case.
if (modifiers.IsAltPressed())
{
// The OS code seems to reset the composition if shift is pressed, but I couldn't
// figure out how exactly it worked. We'll simply ignore any such inputs.
static constexpr DWORD permittedModifiers =
RIGHT_ALT_PRESSED |
LEFT_ALT_PRESSED |
NUMLOCK_ON |
SCROLLLOCK_ON |
CAPSLOCK_ON;
if ((modifiers.Value() & ~permittedModifiers) == 0)
{
auto& s = _altNumpadState;
if (keyDown)
{
if (vkey == VK_ADD)
{
// Alt '+' <number> is used to input Unicode code points.
// Every time you press + it resets the entire state
// in the original OS implementation as well.
s.encoding = AltNumpadEncoding::Unicode;
s.accumulator = 0;
s.active = true;
}
else if (vkey == VK_NUMPAD0 && s.encoding == AltNumpadEncoding::OEM && s.accumulator == 0)
{
// Alt '0' <number> is used to input ANSI code points.
// Otherwise, they're OEM codepoints.
s.encoding = AltNumpadEncoding::ANSI;
s.active = true;
}
else
{
// Otherwise, append the pressed key to the accumulator.
const uint32_t base = s.encoding == AltNumpadEncoding::Unicode ? 16 : 10;
uint32_t add = 0xffffff;
if (vkey >= VK_NUMPAD0 && vkey <= VK_NUMPAD9)
{
add = vkey - VK_NUMPAD0;
}
else if (vkey >= 'A' && vkey <= 'F')
{
add = vkey - 'A' + 10;
}
// Pressing Alt + <not a number> should not activate the Alt+Numpad input, however.
if (add < base)
{
s.accumulator = std::min(s.accumulator * base + add, 0x10FFFFu);
s.active = true;
}
}
}
// If someone pressed Alt + <not a number>, we'll skip the early
// return and send the Alt key combination as per usual.
if (s.active)
{
// Cache it in case we have to emit it after alt is released
_altNumpadState.cachedKeyEvents.emplace_back(vkey, scanCode, modifiers, keyDown);
return true;
}
// Unless I didn't code the above correctly, active == false should imply
// that _altNumpadState is in the (default constructed) base state.
assert(s.encoding == AltNumpadEncoding::OEM);
assert(s.accumulator == 0);
}
}
else if (_altNumpadState.active)
{
// If the user Alt+Tabbed in the middle of an Alt+Numpad sequence, we'll not receive a key-up event for
// the Alt key. There are several ways to detect this. Here, we simply check if the user typed another
// character, it's not an alt-up event, and we still have an ongoing composition.
_altNumpadState = {};
}
// GH#2235: Terminal::Settings hasn't been modified to differentiate
@@ -1518,20 +1649,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation
keyDown &&
_TryHandleKeyBinding(vkey, scanCode, modifiers))
{
e.Handled(true);
return;
return true;
}
if (_TrySendKeyEvent(vkey, scanCode, modifiers, keyDown))
{
e.Handled(true);
return;
return true;
}
// Manually prevent keyboard navigation with tab. We want to send tab to
// the terminal, and we don't want to be able to escape focus of the
// control with tab.
e.Handled(vkey == VK_TAB);
return vkey == VK_TAB;
}
// Method Description:
@@ -3588,7 +3717,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void TermControl::_refreshSearch()
{
if (!_searchBox || _searchBox->Visibility() != Visibility::Visible)
if (!_searchBox || !_searchBox->IsOpen())
{
return;
}
@@ -3611,7 +3740,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
return;
}
_searchBox->SetStatus(results.TotalMatches, results.CurrentMatch);
// Only show status when we have a search term
if (_searchBox->Text().empty())
{
_searchBox->ClearStatus();
}
else
{
_searchBox->SetStatus(results.TotalMatches, results.CurrentMatch);
}
if (results.SearchInvalidated)
{

View File

@@ -239,6 +239,31 @@ namespace winrt::Microsoft::Terminal::Control::implementation
TsfDataProvider _tsfDataProvider{ this };
winrt::com_ptr<SearchBoxControl> _searchBox;
enum class AltNumpadEncoding
{
OEM,
ANSI,
Unicode,
};
struct AltNumpadState
{
struct CachedKey
{
WORD vkey;
WORD scanCode;
::Microsoft::Terminal::Core::ControlKeyStates modifiers;
bool keyDown;
};
AltNumpadEncoding encoding = AltNumpadEncoding::OEM;
uint32_t accumulator = 0;
// Checking for accumulator != 0 to see if we have an ongoing Alt+Numpad composition is insufficient.
// The state can be active, while the accumulator is 0, if the user pressed Alt+Numpad0 which enabled
// the OEM encoding mode (= active), and then pressed Numpad0 again (= accumulator is still 0).
bool active = false;
til::small_vector<CachedKey, 4> cachedKeyEvents;
};
AltNumpadState _altNumpadState;
bool _closing{ false };
bool _focused{ false };
bool _initializedTerminal{ false };
@@ -361,6 +386,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
void _UpdateAutoScroll(const Windows::Foundation::IInspectable& sender, const Windows::Foundation::IInspectable& e);
void _KeyHandler(const Windows::UI::Xaml::Input::KeyRoutedEventArgs& e, const bool keyDown);
bool _KeyHandler(WORD vkey, WORD scanCode, ::Microsoft::Terminal::Core::ControlKeyStates modifiers, bool keyDown);
static ::Microsoft::Terminal::Core::ControlKeyStates _GetPressedModifierKeys() noexcept;
bool _TryHandleKeyBinding(const WORD vkey, const WORD scanCode, ::Microsoft::Terminal::Core::ControlKeyStates modifiers) const;
static void _ClearKeyboardState(const WORD vkey, const WORD scanCode) noexcept;

View File

@@ -497,6 +497,10 @@ std::wstring Terminal::GetHyperlinkAtBufferPosition(const til::point bufferPos)
result = GetHyperlinkIntervalFromViewportPosition(viewportPos);
if (result.has_value())
{
// GetPlainText and _ConvertToBufferCell work with inclusive coordinates, but interval's
// stop point is (horizontally) exclusive, so let's just update it.
result->stop.x--;
result->start = _ConvertToBufferCell(result->start);
result->stop = _ConvertToBufferCell(result->stop);
}
@@ -1405,6 +1409,11 @@ PointTree Terminal::_getPatterns(til::CoordType beg, til::CoordType end) const
LR"(\b(?:https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|$!:,.;]*[A-Za-z0-9+&@#/%=~_|$])",
};
if (!_detectURLs)
{
return {};
}
auto text = ICU::UTextFromTextBuffer(_activeBuffer(), beg, end + 1);
UErrorCode status = U_ZERO_ERROR;
PointTree::interval_vector intervals;

View File

@@ -278,11 +278,13 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
// Check for this special case:
// we're changing the key chord,
// but the new key chord is already in use
bool conflictFound{ false };
if (isNewAction || args.OldKeys().Modifiers() != args.NewKeys().Modifiers() || args.OldKeys().Vkey() != args.NewKeys().Vkey())
{
const auto& conflictingCmd{ _Settings.ActionMap().GetActionByKeyChord(args.NewKeys()) };
if (conflictingCmd)
{
conflictFound = true;
// We're about to overwrite another key chord.
// Display a confirmation dialog.
TextBlock errorMessageTB{};
@@ -324,13 +326,18 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
}
}
// update settings model and view model
applyChangesToSettingsModel();
// if there was a conflict, the flyout we created will handle whether changes need to be propagated
// otherwise, go ahead and apply the changes
if (!conflictFound)
{
// update settings model and view model
applyChangesToSettingsModel();
// We NEED to toggle the edit mode here,
// so that if nothing changed, we still exit
// edit mode.
senderVM.ToggleEditMode();
// We NEED to toggle the edit mode here,
// so that if nothing changed, we still exit
// edit mode.
senderVM.ToggleEditMode();
}
}
void ActionsViewModel::_KeyBindingViewModelDeleteNewlyAddedKeyBindingHandler(const Editor::KeyBindingViewModel& senderVM, const IInspectable& /*args*/)

View File

@@ -895,6 +895,9 @@
<value>Schriftart</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Sie können mehrere Schriftarten verwenden, indem Sie sie durch ein ASCII-Komma voneinander trennen.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Schriftgrad</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Wenn diese Option aktiviert ist, zeichnet das Terminal benutzerdefinierte Glyphen für Blockelement- und Feldzeichnungszeichen, anstatt die Schriftart zu verwenden. Dieses Feature funktioniert nur, wenn GPU-Beschleunigung verfügbar ist.</value>
<value>Wenn diese Option aktiviert ist, zeichnet das Terminal benutzerdefinierte Glyphen für Blockelement- und Rahmenelementzeichen, anstatt die Schriftart zu verwenden.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>Font face</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>You can use multiple fonts by separating them with an ASCII comma.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Font size</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>When enabled, the terminal draws custom glyphs for block element and box drawing characters instead of using the font. This feature only works when GPU Acceleration is available.</value>
<value>When enabled, the terminal draws custom glyphs for block element and box drawing characters instead of using the font.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -733,10 +733,16 @@
<value>Examinar...</value>
<comment>Button label that opens a file picker in a new window. The "..." is standard to mean it will open a new window.</comment>
</data>
<data name="Profile_AddFontAxisButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Agregar nuevo eje de fuente</value>
</data>
<data name="Profile_AddNewFontAxis.Text" xml:space="preserve">
<value>Agregar nuevo</value>
<comment>Button label that adds a new font axis for the current font.</comment>
</data>
<data name="Profile_AddFontFeatureButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Agregar nueva característica de fuente</value>
</data>
<data name="Profile_AddNewFontFeature.Text" xml:space="preserve">
<value>Agregar nuevo</value>
<comment>Button label that adds a new font feature for the current font.</comment>
@@ -889,6 +895,9 @@
<value>Tipo de fuente</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Puede usar varias fuentes separándolas con una coma ASCII.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Tamaño de la fuente</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -922,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Cuando está habilitado, el terminal dibuja glifos personalizados para los caracteres de dibujo de elementos de bloque y cuadros, en lugar de usar la fuente. Esta característica solo funciona cuando la aceleración de GPU está disponible.</value>
<value>Cuando está habilitado, el terminal dibuja glifos personalizados para los caracteres de dibujo de elementos de bloque y cuadros, en lugar de usar la fuente.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>Type de police</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Vous pouvez utiliser plusieurs polices en les séparant par une virgule ASCII.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Taille de police</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Lorsque cette option est activée, le terminal dessine des glyphes personnalisés pour les éléments de bloc et les caractères de dessin de boîte au lieu dutiliser la police. Cette fonctionnalité ne fonctionne que lorsque laccélération GPU est disponible.</value>
<value>Lorsque cette option est activée, le terminal trace des glyphes personnalisés pour les éléments de bloc et pour les caractères de dessin de boîte au lieu d'utiliser la police de caractère.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -733,10 +733,16 @@
<value>Sfoglia...</value>
<comment>Button label that opens a file picker in a new window. The "..." is standard to mean it will open a new window.</comment>
</data>
<data name="Profile_AddFontAxisButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Aggiungi nuovo asse dei tipi di carattere</value>
</data>
<data name="Profile_AddNewFontAxis.Text" xml:space="preserve">
<value>Aggiungi nuovo</value>
<comment>Button label that adds a new font axis for the current font.</comment>
</data>
<data name="Profile_AddFontFeatureButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Aggiungi nuova funzionalità dei tipi di carattere</value>
</data>
<data name="Profile_AddNewFontFeature.Text" xml:space="preserve">
<value>Aggiungi nuovo</value>
<comment>Button label that adds a new font feature for the current font.</comment>
@@ -889,6 +895,9 @@
<value>Tipo di carattere</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Puoi usare più tipi di carattere separandoli con una virgola ASCII.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Dimensioni del carattere</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -922,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Se abilitata, il terminale disegna glifi personalizzati per i caratteri di disegno a blocchi di elementi e caselle anziché usare il tipo di carattere. Questa funzionalità funziona solo quando è disponibile l'accelerazione GPU.</value>
<value>Se abilitato, il terminale disegna glifi personalizzati per i caratteri di disegno a blocchi di elementi e caselle anziché usare il tipo di carattere.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -733,10 +733,16 @@
<value>参照...</value>
<comment>Button label that opens a file picker in a new window. The "..." is standard to mean it will open a new window.</comment>
</data>
<data name="Profile_AddFontAxisButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>新しいフォント軸の追加</value>
</data>
<data name="Profile_AddNewFontAxis.Text" xml:space="preserve">
<value>新規追加</value>
<comment>Button label that adds a new font axis for the current font.</comment>
</data>
<data name="Profile_AddFontFeatureButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>新しいフォント機能の追加</value>
</data>
<data name="Profile_AddNewFontFeature.Text" xml:space="preserve">
<value>新規追加</value>
<comment>Button label that adds a new font feature for the current font.</comment>
@@ -889,6 +895,9 @@
<value>フォント フェイス</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>複数のフォントを使用するには、複数のフォントを ASCII コンマで区切ります。</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>フォント サイズ</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -922,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>有効にすると、ターミナルは、フォントを使用する代わりに、ブロック要素とボックス描画文字のカスタム グリフを描画します。この機能は、GPU アクセラレーションが使用可能な場合にのみ機能します。</value>
<value>有効にすると、ターミナルは、フォントを使用する代わりに、ブロック要素とボックス描画文字のカスタム グリフを描画します。</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -733,10 +733,16 @@
<value>찾아보기...</value>
<comment>Button label that opens a file picker in a new window. The "..." is standard to mean it will open a new window.</comment>
</data>
<data name="Profile_AddFontAxisButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>새 글꼴 추가 축</value>
</data>
<data name="Profile_AddNewFontAxis.Text" xml:space="preserve">
<value>새로 추가</value>
<comment>Button label that adds a new font axis for the current font.</comment>
</data>
<data name="Profile_AddFontFeatureButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>새 글꼴 추가 기능</value>
</data>
<data name="Profile_AddNewFontFeature.Text" xml:space="preserve">
<value>새로 추가</value>
<comment>Button label that adds a new font feature for the current font.</comment>
@@ -889,6 +895,9 @@
<value>글꼴</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>여러 글꼴을 ASCII 쉼표로 구분하여 사용할 수 있습니다.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>글꼴 크기</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -922,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>사용하도록 설정하면 터미널은 글꼴을 사용하는 대신 블록 요소 및 상자 그리기 문자에 대한 사용자 지정 문자 모양을 그립니다. 이 기능은 GPU 가속을 사용할 수 있는 경우에만 작동합니다.</value>
<value>사용하도록 설정하면 터미널은 글꼴을 사용하는 대신 블록 요소 및 상자 그리기 문자에 대한 사용자 지정 문자 모양을 그립니다.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">
@@ -1294,7 +1303,7 @@
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontWeightLight.Content" xml:space="preserve">
<value>게</value>
<value>가늘게</value>
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontWeightMedium.Content" xml:space="preserve">
@@ -1306,7 +1315,7 @@
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontWeightSemi-bold.Content" xml:space="preserve">
<value>약간 굵</value>
<value>약간 굵</value>
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontWeightSemi-light.Content" xml:space="preserve">
@@ -1314,7 +1323,7 @@
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontWeightThin.Content" xml:space="preserve">
<value>얇</value>
<value>얇</value>
<comment>This is the formal name for a font weight.</comment>
</data>
<data name="Profile_FontFeature_rlig" xml:space="preserve">

View File

@@ -733,10 +733,16 @@
<value>Procurar...</value>
<comment>Button label that opens a file picker in a new window. The "..." is standard to mean it will open a new window.</comment>
</data>
<data name="Profile_AddFontAxisButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Adicionar novo eixo de fonte</value>
</data>
<data name="Profile_AddNewFontAxis.Text" xml:space="preserve">
<value>Adicionar novo</value>
<comment>Button label that adds a new font axis for the current font.</comment>
</data>
<data name="Profile_AddFontFeatureButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name" xml:space="preserve">
<value>Adicionar novo recurso de fonte</value>
</data>
<data name="Profile_AddNewFontFeature.Text" xml:space="preserve">
<value>Adicionar novo</value>
<comment>Button label that adds a new font feature for the current font.</comment>
@@ -889,6 +895,9 @@
<value>Tipo de fonte</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Pode utilizar vários tipos de letra separando-os com uma vírgula ASCII.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Tamanho da fonte</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -922,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Quando habilitado, o terminal desenha glifos personalizados para caracteres de desenho de elemento de bloco e caixa em vez de usar a fonte. Esse recurso só funciona quando a Aceleração de GPU está disponível.</value>
<value>Quando habilitado, o terminal desenha glifos personalizados para elementos de bloco e caracteres de desenho de caixa em vez de usar a fonte.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>₣øñŧ ƒдсέ !!!</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Ýоύ ĉąи ύŝè мύŀŧΐρļĕ ƒőйτš ъý ѕéραгдŧĭʼnğ ţнэm щїţђ áп ∆ŚČĨĨ çőмmа. !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>₣ŏňτ şίźε !!!</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. Ţћιş ƒзаτџŕè οʼnĺŷ ωóгκŝ ẁĥéŋ ĢΡŬ Àςĉеŀèѓдτισñ ĩѕ ǻνãîļåвłę. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>₣øñŧ ƒдсέ !!!</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Ýоύ ĉąи ύŝè мύŀŧΐρļĕ ƒőйτš ъý ѕéραгдŧĭʼnğ ţнэm щїţђ áп ∆ŚČĨĨ çőмmа. !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>₣ŏňτ şίźε !!!</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. Ţћιş ƒзаτџŕè οʼnĺŷ ωóгκŝ ẁĥéŋ ĢΡŬ Àςĉеŀèѓдτισñ ĩѕ ǻνãîļåвłę. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>₣øñŧ ƒдсέ !!!</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Ýоύ ĉąи ύŝè мύŀŧΐρļĕ ƒőйτš ъý ѕéραгдŧĭʼnğ ţнэm щїţђ áп ∆ŚČĨĨ çőмmа. !!! !!! !!! !!! !!! !!! !</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>₣ŏňτ şίźε !!!</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. Ţћιş ƒзаτџŕè οʼnĺŷ ωóгκŝ ẁĥéŋ ĢΡŬ Àςĉеŀèѓдτισñ ĩѕ ǻνãîļåвłę. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<value>Ẅħĕň еņªъℓёð, тћз τēгмïπдℓ ðѓáшş çύšτом ģļўφħѕ ƒǿя ъĺôсĸ éêmήŧ àñð ъο× ðгдωΐπĝ čћдŗąςŧέѓś ìπŝţėãđ ŏƒ ũŝіⁿğ ťћę ƒбηŧ. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>Начертание шрифта</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>Вы можете использовать несколько шрифтов, разделив их запятой ASCII.</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>Размер шрифта</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>Если этот параметр включен, терминал рисует собственные глифы для элементов блока и символов рисования прямоугольников вместо использования шрифта. Эта функция работает только тогда, когда доступно ускорение графического процессора.</value>
<value>Если этот параметр включен, терминал рисует собственные глифы для элементов блока и символов рисования прямоугольников вместо использования шрифта.</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>字体</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>通过使用 ASCII 逗号分隔多个字体,可以使用这些字体。</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>字号</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>启用后,终端将为块元素和制表符绘制自定义标志符号,而不是使用字体。仅当 GPU 加速可用时,此功能才有效。</value>
<value>启用后,终端会使用自定义字形来绘制块元素和框线绘图字符,而不是使用字体。</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -895,6 +895,9 @@
<value>字體</value>
<comment>Name for a control to select the font for text in the app.</comment>
</data>
<data name="Profile_FontFace.HelpText" xml:space="preserve">
<value>您可以使用 ASCII 逗號分隔多個字型。</value>
</data>
<data name="Profile_FontSize.Header" xml:space="preserve">
<value>字型大小</value>
<comment>Header for a control to determine the size of the text in the app.</comment>
@@ -928,7 +931,7 @@
<comment>The main label of a toggle. When enabled, certain characters (glyphs) are replaced with better looking ones.</comment>
</data>
<data name="Profile_EnableBuiltinGlyphs.HelpText" xml:space="preserve">
<value>啟用時,終端機會為區塊元素和方塊繪圖字元繪製自訂字符,而非使用字型。此功能僅在可使用 GPU 加速時作用。</value>
<value>啟用時,終端機會為區塊元素和方塊繪圖字元繪製自訂字符,而非使用字型。</value>
<comment>A longer description of the "Profile_EnableBuiltinGlyphs" toggle. "glyphs", "block element" and "box drawing characters" are technical terms from the Unicode specification.</comment>
</data>
<data name="Profile_EnableColorGlyphs.Header" xml:space="preserve">

View File

@@ -18,9 +18,6 @@
#include "SshHostGenerator.h"
#endif
// userDefault.h is like the above, but with a default template for the user's settings.json.
#include <LegacyProfileGeneratorNamespaces.h>
#include "ApplicationState.h"
#include "DefaultTerminal.h"
#include "FileUtils.h"
@@ -460,6 +457,11 @@ bool SettingsLoader::FixupUserSettings()
CommandlinePatch{ DEFAULT_WINDOWS_POWERSHELL_GUID, L"powershell.exe", L"%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" },
};
static constexpr std::array iconsToClearFromVisualStudioProfiles{
std::wstring_view{ L"ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png" },
std::wstring_view{ L"ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png" },
};
auto fixedUp = userSettings.fixupsAppliedDuringLoad;
fixedUp = RemapColorSchemeForProfile(userSettings.baseLayerProfile) || fixedUp;
@@ -467,28 +469,39 @@ bool SettingsLoader::FixupUserSettings()
{
fixedUp = RemapColorSchemeForProfile(profile) || fixedUp;
if (!profile->HasCommandline())
if (profile->HasCommandline())
{
continue;
for (const auto& patch : commandlinePatches)
{
if (profile->Guid() == patch.guid && til::equals_insensitive_ascii(profile->Commandline(), patch.before))
{
profile->ClearCommandline();
// GH#12842:
// With the commandline field on the user profile gone, it's actually unknown what
// commandline it'll inherit, since a user profile can have multiple parents. We have to
// make sure we restore the correct commandline in case we don't inherit the expected one.
if (profile->Commandline() != patch.after)
{
profile->Commandline(winrt::hstring{ patch.after });
}
fixedUp = true;
break;
}
}
}
for (const auto& patch : commandlinePatches)
if (profile->HasIcon() && profile->HasSource() && profile->Source() == VisualStudioGenerator::Namespace)
{
if (profile->Guid() == patch.guid && til::equals_insensitive_ascii(profile->Commandline(), patch.before))
for (auto&& icon : iconsToClearFromVisualStudioProfiles)
{
profile->ClearCommandline();
// GH#12842:
// With the commandline field on the user profile gone, it's actually unknown what
// commandline it'll inherit, since a user profile can have multiple parents. We have to
// make sure we restore the correct commandline in case we don't inherit the expected one.
if (profile->Commandline() != patch.after)
if (profile->Icon() == icon)
{
profile->Commandline(winrt::hstring{ patch.after });
profile->ClearIcon();
fixedUp = true;
break;
}
fixedUp = true;
break;
}
}
}

View File

@@ -690,7 +690,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
auto data = winrt::to_string(json);
std::string errs;
static std::unique_ptr<Json::CharReader> reader{ Json::CharReaderBuilder{}.newCharReader() };
std::unique_ptr<Json::CharReader> reader{ Json::CharReaderBuilder{}.newCharReader() };
Json::Value root;
if (!reader->parse(data.data(), data.data() + data.size(), &root, &errs))
{

View File

@@ -329,7 +329,7 @@ Json::Value Profile::ToJson() const
// Recall: Icon isn't actually a setting in the MTSM_PROFILE_SETTINGS. We
// defined it manually in Profile, so make sure we only serialize the Icon
// if the user actually changed it here.
JsonUtils::SetValueForKey(json, IconKey, (writeBasicSettings && HasIcon()) ? Icon() : _Icon);
JsonUtils::SetValueForKey(json, IconKey, _Icon);
// PermissiveStringConverter is unnecessary for serialization
JsonUtils::SetValueForKey(json, PaddingKey, _Padding);

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Farbschema auswählen</value>
<value>Farbschema auswählen...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Neue Registerkarte</value>
<value>Neue Registerkarte...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Bereich teilen</value>
<value>Bereich teilen...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminal (portierbar)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Registerkartenfarbe festlegen</value>
<value>Registerkartenfarbe festlegen...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Einfügen</value>
@@ -347,7 +347,7 @@
<value>Den Titel der Registerkarte zurücksetzen</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Registerkartentitel umbenennen</value>
<value>Registerkarte umbenennen</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Bereich skalieren</value>
@@ -441,7 +441,7 @@
<value>Zur letzten Registerkarte wechseln</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Registerkarte suchen</value>
<value>Registerkarte suchen...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Modus "Immer im Vordergrund" umschalten</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Befehlspalette ein/aus</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Zuletzt verwendete Befehle</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Vorschläge öffnen</value>
</data>
@@ -515,7 +512,7 @@
<value>Fensternamen zurücksetzen</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Fenster umbenennen</value>
<value>Fenster umbenennen...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Aktuelles Arbeitsverzeichnis des Terminals anzeigen</value>
@@ -566,7 +563,7 @@
<value>Terminal beenden</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Hintergrunddeckkraft festlegen</value>
<value>Hintergrunddeckkraft festlegen...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Hintergrunddeckkraft um {0} % erhöhen</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Select color scheme</value>
<value>Select color scheme...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>New tab</value>
<value>New tab...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Split pane</value>
<value>Split pane...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminal (Portable)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Set the tab color</value>
<value>Set tab color...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Paste</value>
@@ -347,7 +347,7 @@
<value>Reset tab title</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Rename tab title</value>
<value>Rename tab</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Resize pane</value>
@@ -441,7 +441,7 @@
<value>Switch to the last tab</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Search for tab</value>
<value>Search for tab...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Toggle always on top mode</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Toggle command palette</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Recent commands</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Open suggestions</value>
</data>
@@ -515,7 +512,7 @@
<value>Reset window name</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Rename window</value>
<value>Rename window...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Display Terminal's current working directory</value>
@@ -566,7 +563,7 @@
<value>Quit the Terminal</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Set background opacity</value>
<value>Set background opacity...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Increase background opacity by {0}%</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Seleccionar combinación de colores</value>
<value>Seleccionar combinación de colores...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Nueva pestaña</value>
<value>Nueva pestaña...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Panel dividido</value>
<value>Dividir panel...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminal (portátil)</value>
@@ -187,7 +187,7 @@
<value>Cerrar todas las pestañas después de la pestaña actual</value>
</data>
<data name="CloseWindowCommandKey" xml:space="preserve">
<value>Cierre la ventana</value>
<value>Cerrar ventana</value>
</data>
<data name="OpenSystemMenuCommandKey" xml:space="preserve">
<value>Abrir menú del sistema</value>
@@ -276,10 +276,10 @@
<value>Mover el foco al panel menor</value>
</data>
<data name="SwapPaneCommandKey" xml:space="preserve">
<value>Panel de intercambio</value>
<value>Intercambiar panel</value>
</data>
<data name="SwapPaneWithArgCommandKey" xml:space="preserve">
<value>{0} panel de intercambio</value>
<value>Intercambiar panel hacia {0}</value>
<comment>{0} will be replaced with one of the four directions "DirectionLeft", "DirectionRight", "DirectionUp", "DirectionDown"</comment>
</data>
<data name="SwapPaneToLastUsedPane" xml:space="preserve">
@@ -307,7 +307,7 @@
<value>Identificar ventanas</value>
</data>
<data name="NextTabCommandKey" xml:space="preserve">
<value>Siguiente pestaña</value>
<value>Pestaña siguiente</value>
</data>
<data name="OpenBothSettingsFilesCommandKey" xml:space="preserve">
<value>Abrir archivos de configuración y configuración predeterminada (JSON)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Establecer el color de la pestaña</value>
<value>Establecer color de pestaña...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Pegar</value>
@@ -347,7 +347,7 @@
<value>Restablecer título de la pestaña</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Cambiar título de la pestaña</value>
<value>Cambiar el nombre de la pestaña</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Cambiar el tamaño del panel</value>
@@ -357,24 +357,24 @@
<comment>{0} will be replaced with one of the four directions "DirectionLeft", "DirectionRight", "DirectionUp", or "DirectionDown"</comment>
</data>
<data name="ScrollDownCommandKey" xml:space="preserve">
<value>Desplazar hacia abajo</value>
<value>Desplazarse hacia abajo</value>
</data>
<data name="ScrollDownSeveralRowsCommandKey" xml:space="preserve">
<value>Desplazar hacia abajo {0} línea(s)</value>
<value>Desplazarse hacia abajo {0} línea(s)</value>
<comment>{0} will be replaced with the number of lines to scroll"</comment>
</data>
<data name="ScrollDownPageCommandKey" xml:space="preserve">
<value>Desplácese hacia abajo una página</value>
<value>Desplazarse hacia abajo una página</value>
</data>
<data name="ScrollUpCommandKey" xml:space="preserve">
<value>Desplazar hacia arriba</value>
<value>Desplazarse hacia arriba</value>
</data>
<data name="ScrollUpSeveralRowsCommandKey" xml:space="preserve">
<value>Desplazar hacia arriba {0} línea(s)</value>
<value>Desplazarse hacia arriba {0} línea(s)</value>
<comment>{0} will be replaced with the number of lines to scroll"</comment>
</data>
<data name="ScrollUpPageCommandKey" xml:space="preserve">
<value>Desplácese hacia arriba una página</value>
<value>Desplazarse hacia arriba una página</value>
</data>
<data name="ScrollToTopCommandKey" xml:space="preserve">
<value>Desplazarse a la parte superior del historial</value>
@@ -429,7 +429,7 @@
<value>Mover el panel a una nueva ventana</value>
</data>
<data name="SplitPaneCommandKey" xml:space="preserve">
<value>Panel dividido</value>
<value>Dividir panel</value>
</data>
<data name="SplitVerticalCommandKey" xml:space="preserve">
<value>Dividir el panel verticalmente</value>
@@ -441,7 +441,7 @@
<value>Cambiar a la última pestaña</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Buscar pestaña</value>
<value>Buscar pestañas...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Alternar siempre en el modo superior</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Alternar paleta de comandos</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Comandos recientes</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Abrir sugerencias</value>
</data>
@@ -487,7 +484,7 @@
<value>Alternar la orientación de la división del panel</value>
</data>
<data name="TogglePaneZoomCommandKey" xml:space="preserve">
<value>Zoom de panel de alternancia</value>
<value>Alternar zoom del panel</value>
</data>
<data name="TogglePaneReadOnlyCommandKey" xml:space="preserve">
<value>Activar o desactivar el modo de solo lectura del panel</value>
@@ -524,7 +521,7 @@
<value>Mostrar u ocultar la ventana de terminal</value>
</data>
<data name="QuakeModeCommandKey" xml:space="preserve">
<value>Mostrar u ocultar ventana Desastre</value>
<value>Mostrar u ocultar ventana Quake</value>
<comment>Quake is a well-known computer game and isn't related to earthquakes, etc. See https://en.wikipedia.org/wiki/Quake_(video_game)</comment>
</data>
<data name="FocusPaneCommandKey" xml:space="preserve">
@@ -566,7 +563,7 @@
<value>Salir del terminal</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Establecer la opacidad del fondo</value>
<value>Establecer la opacidad del fondo...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Aumentar la opacidad del fondo en un {0} %</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Sélectionner un modèle de couleurs</value>
<value>Sélectionner le modèle de couleurs...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Nouvel onglet</value>
<value>Nouvel onglet...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Fractionner le volet</value>
<value>Fractionner le volet...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminal (portable)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Définir la couleur de longlet</value>
<value>Définir la couleur de longlet...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Coller</value>
@@ -347,7 +347,7 @@
<value>Rétablir le titre de longlet</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Renommer le titre de l'onglet</value>
<value>Renommer l'onglet</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Redimensionner le volet</value>
@@ -441,7 +441,7 @@
<value>Basculer vers le dernier onglet</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Recherche de longlet</value>
<value>Rechercher longlet...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Activer le mode Toujours visible</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Activer/désactiver la palette de commandes</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Commandes récentes</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Ouvrir les suggestions</value>
</data>
@@ -515,7 +512,7 @@
<value>Réinitialiser le nom de la fenêtre</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Fenêtre pour renommer</value>
<value>Renommer la fenêtre...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Afficher le répertoire de travail actuel du terminal</value>
@@ -566,7 +563,7 @@
<value>Quitter le terminal</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Définir lopacité de larrière-plan</value>
<value>Définir lopacité de larrière-plan...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Augmenter lopacité de larrière-plan de {0} %</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Seleziona combinazione colori</value>
<value>Seleziona combinazione colori...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Nuova scheda</value>
<value>Nuova scheda...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Suddividi riquadro</value>
<value>Suddividi riquadro...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminale (portatile)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Imposta il colore della scheda</value>
<value>Imposta il colore della scheda...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Incolla</value>
@@ -347,7 +347,7 @@
<value>Reimposta il titolo della scheda</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Rinomina il titolo della scheda</value>
<value>Rinomina scheda</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Ridimensiona riquadro</value>
@@ -441,7 +441,7 @@
<value>Passa all'ultima scheda</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Cerca scheda</value>
<value>Cerca scheda...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Modalità attiva/disattiva sempre in alto</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Attiva/disattiva riquadro dei comandi</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Comandi recenti</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Apri i suggerimenti</value>
</data>
@@ -515,7 +512,7 @@
<value>Reimposta nome finestra</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Rinomina finestra</value>
<value>Rinomina finestra...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Visualizza la directory di lavoro corrente del terminale</value>
@@ -566,7 +563,7 @@
<value>Esci da Terminale</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Imposta l'opacità di sfondo</value>
<value>Imposta l'opacità di sfondo...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Aumenta l'opacità di sfondo del {0}%</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>配色パターンの選択</value>
<value>配色を選択...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>新しいタブ</value>
<value>新しいタブ...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>ウィンドウ分割する</value>
<value>ウィンドウ分割...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>ターミナル (ポータブル)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>タブの色設定</value>
<value>タブの色設定...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>貼り付け</value>
@@ -347,7 +347,7 @@
<value>タブのタイトルをリセット</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>タブ タイトル名の変更</value>
<value>[名前の変更] タブ</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>ウィンドウのサイズの変更する</value>
@@ -441,7 +441,7 @@
<value>最後のタブに切り替える</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>タブ検索</value>
<value>タブ検索...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>常に手前に表示するモードに切り替える</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>コマンド パレットに切り替える</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>最近使ったコマンド</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>候補を開く</value>
</data>
@@ -566,7 +563,7 @@
<value>ターミナルの終了</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>背景の不透明度設定</value>
<value>背景の不透明度設定...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>背景の不透明度を {0}% 上げる</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>색 구성표 선택</value>
<value>색 구성표 선택...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>새 탭</value>
<value>새 탭...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>분할 창</value>
<value>분할 창...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>터미널(이식 가능)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>탭 색 설정</value>
<value>탭 색 설정...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>붙여넣기</value>
@@ -347,7 +347,7 @@
<value>탭 제목 재설정</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>탭 제목 이름 바꾸기</value>
<value>탭 이름 바꾸기</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>창 크기 조정</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>토글 명령 팔레트</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>최근 명령</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>제안 사항 열기</value>
</data>
@@ -566,7 +563,7 @@
<value>터미널 종료</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>배경 불투명도 설정</value>
<value>배경 불투명도 설정...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>배경 불투명도를 {0}% 증가</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Selecionar esquema de cores</value>
<value>Selecionar esquema de cores...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Nova guia</value>
<value>Nova guia...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Dividir painel</value>
<value>Dividir painel...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Terminal (Portátil)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Definir a cor da guia</value>
<value>Definir cor da guia...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Colar</value>
@@ -347,7 +347,7 @@
<value>Redefinir título da guia</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Renomear título da guia</value>
<value>Renomear guia</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Redimensionar painel</value>
@@ -441,7 +441,7 @@
<value>Alternar para a última guia</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Pesquisar guia</value>
<value>Buscar guia...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Alternar sempre no modo superior</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Ativar/desativar paleta de comandos</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Comandos recentes</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Abrir sugestões</value>
</data>
@@ -515,7 +512,7 @@
<value>Definir nome da janela</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Renomear janela</value>
<value>Renomear janela...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Exibir o diretório de trabalho atual do Terminal</value>
@@ -566,7 +563,7 @@
<value>Saia do Terminal</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Definir opacidade da tela de fundo</value>
<value>Definir a opacidade da tela de fundo...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Aumentar a opacidade da tela de fundo em {0}%</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē !!! !!!</value>
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē... !!! !!! </value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Ŋéŵ тάъ !!</value>
<value>Ŋéŵ тάъ... !!!</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Śрĺíŧ ρāлë !!!</value>
<value>Śрĺíŧ ρāлë... !!! </value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Ţèѓmĩŋąĺ (Ρθŗτаьℓ℮) !!! !!!</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Şėŧ ŧнę ťáь ċσŀőґ !!! !!</value>
<value>Şėŧ ŧăь ĉõľοґ... !!! !</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Ρášτé !</value>
@@ -347,7 +347,7 @@
<value>Řėś℮ŧ тαв τįтℓę !!! !</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Гęйªm тåъ ŧīτļĕ !!! !</value>
<value>Гęйªm тåъ !!!</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Ґëśîžє рãле !!!</value>
@@ -441,7 +441,7 @@
<value>Ѕẃітčћ ţõ ťħέ ľάšť ţаь !!! !!! </value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Ѕėàřĉħ ƒôґ ŧâь !!! !</value>
<value>Ѕėàřĉħ ƒôґ ŧâь... !!! !!</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Ŧōĝġļě αŀώªÿŝ òⁿ тοр мöðέ !!! !!! !</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Ţōĝğļė čσmmάήđ рåŀęŧŧз !!! !!! </value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Γë¢єйť ćøмmåηđŝ !!! !</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Ǿрέʼn şµġġеšŧìŏπѕ !!! !</value>
</data>
@@ -515,7 +512,7 @@
<value>Ŗεšзť ωĩйδōẁ ñâмé !!! !!</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Ґёʼnάmë шϊйďθŵ !!! </value>
<value>Ґёʼnάmë шϊйďθŵ... !!! !</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Ďіŝρłάỳ Τѓmìйаĺ'š čûŗяēʼnτ ώоřκìņĝ ďιяęĉтσґỳ !!! !!! !!! !!! !</value>
@@ -566,7 +563,7 @@
<value>Qυϊτ ŧħз Τέяmίŋăŀ !!! !!</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў !!! !!! </value>
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў... !!! !!! !</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Ĭñçŕ℮àŝę ваċкġřŏųлď ǿφāςíτу ьỳ {0}% !!! !!! !!! !</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē !!! !!!</value>
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē... !!! !!! </value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Ŋéŵ тάъ !!</value>
<value>Ŋéŵ тάъ... !!!</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Śрĺíŧ ρāлë !!!</value>
<value>Śрĺíŧ ρāлë... !!! </value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Ţèѓmĩŋąĺ (Ρθŗτаьℓ℮) !!! !!!</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Şėŧ ŧнę ťáь ċσŀőґ !!! !!</value>
<value>Şėŧ ŧăь ĉõľοґ... !!! !</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Ρášτé !</value>
@@ -347,7 +347,7 @@
<value>Řėś℮ŧ тαв τįтℓę !!! !</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Гęйªm тåъ ŧīτļĕ !!! !</value>
<value>Гęйªm тåъ !!!</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Ґëśîžє рãле !!!</value>
@@ -441,7 +441,7 @@
<value>Ѕẃітčћ ţõ ťħέ ľάšť ţаь !!! !!! </value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Ѕėàřĉħ ƒôґ ŧâь !!! !</value>
<value>Ѕėàřĉħ ƒôґ ŧâь... !!! !!</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Ŧōĝġļě αŀώªÿŝ òⁿ тοр мöðέ !!! !!! !</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Ţōĝğļė čσmmάήđ рåŀęŧŧз !!! !!! </value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Γë¢єйť ćøмmåηđŝ !!! !</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Ǿрέʼn şµġġеšŧìŏπѕ !!! !</value>
</data>
@@ -515,7 +512,7 @@
<value>Ŗεšзť ωĩйδōẁ ñâмé !!! !!</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Ґёʼnάmë шϊйďθŵ !!! </value>
<value>Ґёʼnάmë шϊйďθŵ... !!! !</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Ďіŝρłάỳ Τѓmìйаĺ'š čûŗяēʼnτ ώоřκìņĝ ďιяęĉтσґỳ !!! !!! !!! !!! !</value>
@@ -566,7 +563,7 @@
<value>Qυϊτ ŧħз Τέяmίŋăŀ !!! !!</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў !!! !!! </value>
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў... !!! !!! !</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Ĭñçŕ℮àŝę ваċкġřŏųлď ǿφāςíτу ьỳ {0}% !!! !!! !!! !</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē !!! !!!</value>
<value>Ŝêĺĕćţ ćŏĺбŕ ѕćнêmē... !!! !!! </value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Ŋéŵ тάъ !!</value>
<value>Ŋéŵ тάъ... !!!</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Śрĺíŧ ρāлë !!!</value>
<value>Śрĺíŧ ρāлë... !!! </value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Ţèѓmĩŋąĺ (Ρθŗτаьℓ℮) !!! !!!</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Şėŧ ŧнę ťáь ċσŀőґ !!! !!</value>
<value>Şėŧ ŧăь ĉõľοґ... !!! !</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Ρášτé !</value>
@@ -347,7 +347,7 @@
<value>Řėś℮ŧ тαв τįтℓę !!! !</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Гęйªm тåъ ŧīτļĕ !!! !</value>
<value>Гęйªm тåъ !!!</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Ґëśîžє рãле !!!</value>
@@ -441,7 +441,7 @@
<value>Ѕẃітčћ ţõ ťħέ ľάšť ţаь !!! !!! </value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Ѕėàřĉħ ƒôґ ŧâь !!! !</value>
<value>Ѕėàřĉħ ƒôґ ŧâь... !!! !!</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Ŧōĝġļě αŀώªÿŝ òⁿ тοр мöðέ !!! !!! !</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Ţōĝğļė čσmmάήđ рåŀęŧŧз !!! !!! </value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Γë¢єйť ćøмmåηđŝ !!! !</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Ǿрέʼn şµġġеšŧìŏπѕ !!! !</value>
</data>
@@ -515,7 +512,7 @@
<value>Ŗεšзť ωĩйδōẁ ñâмé !!! !!</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Ґёʼnάmë шϊйďθŵ !!! </value>
<value>Ґёʼnάmë шϊйďθŵ... !!! !</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Ďіŝρłάỳ Τѓmìйаĺ'š čûŗяēʼnτ ώоřκìņĝ ďιяęĉтσґỳ !!! !!! !!! !!! !</value>
@@ -566,7 +563,7 @@
<value>Qυϊτ ŧħз Τέяmίŋăŀ !!! !!</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў !!! !!! </value>
<value>Ѕěт ьªċķĝґøūņð óφǻĉїτў... !!! !!! !</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Ĭñçŕ℮àŝę ваċкġřŏųлď ǿφāςíτу ьỳ {0}% !!! !!! !!! !</value>

View File

@@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="SetColorSchemeParentCommandName" xml:space="preserve">
<value>Выбрать цветовую схему</value>
<value>Выбрать цветовую схему...</value>
</data>
<data name="NewTabParentCommandName" xml:space="preserve">
<value>Новая вкладка</value>
<value>Новая вкладка...</value>
</data>
<data name="SplitPaneParentCommandName" xml:space="preserve">
<value>Разделить область</value>
<value>Разделить область...</value>
</data>
<data name="ApplicationDisplayNamePortable" xml:space="preserve">
<value>Терминал (переносной)</value>
@@ -325,7 +325,7 @@
<comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
</data>
<data name="OpenTabColorPickerCommandKey" xml:space="preserve">
<value>Задать цвет вкладки</value>
<value>Установить цвет вкладки...</value>
</data>
<data name="PasteTextCommandKey" xml:space="preserve">
<value>Вставить</value>
@@ -347,7 +347,7 @@
<value>Сбросить заголовок вкладки</value>
</data>
<data name="OpenTabRenamerCommandKey" xml:space="preserve">
<value>Переименовать заголовок вкладки</value>
<value>Переименовать вкладку</value>
</data>
<data name="ResizePaneCommandKey" xml:space="preserve">
<value>Изменить размер области</value>
@@ -441,7 +441,7 @@
<value>Переключиться на последнюю вкладку</value>
</data>
<data name="TabSearchCommandKey" xml:space="preserve">
<value>Поиск вкладки</value>
<value>Поиск вкладки...</value>
</data>
<data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
<value>Режим "поверх других окон"</value>
@@ -449,9 +449,6 @@
<data name="ToggleCommandPaletteCommandKey" xml:space="preserve">
<value>Показать или скрыть палитру команд</value>
</data>
<data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
<value>Последние команды</value>
</data>
<data name="SuggestionsCommandKey" xml:space="preserve">
<value>Открыть предложения</value>
</data>
@@ -515,7 +512,7 @@
<value>Сбросить имя окна</value>
</data>
<data name="OpenWindowRenamerCommandKey" xml:space="preserve">
<value>Переименовать окно</value>
<value>Переименовать окно...</value>
</data>
<data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
<value>Отобразить текущий рабочий каталог Терминала</value>
@@ -566,7 +563,7 @@
<value>Выйти из терминала</value>
</data>
<data name="SetOpacityParentCommandName" xml:space="preserve">
<value>Установить непрозрачность фона</value>
<value>Установить непрозрачность фона...</value>
</data>
<data name="IncreaseOpacityCommandKey" xml:space="preserve">
<value>Увеличить непрозрачность фона на {0}%</value>

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