Commit graph

2720 commits

Author SHA1 Message Date
Mike Griese d675fd824a figure this out 2021-11-16 06:35:31 -06:00
Mike Griese b421ee6ca0 Merge remote-tracking branch 'origin/main' into dev/migrie/oop/ragnarok 2021-11-16 06:22:35 -06:00
Mike Griese c79334ffbb
Add a file for storing elevated-only state (#11222)
## Summary of the Pull Request

This creates an `elevated-state.json` that lives in `%LOCALAPPDATA%` next to `state.json`, that's only writable when elevated. It doesn't _use_ this file for anything, it just puts the framework down for use later.

It's _just like `ApplicationState`_. We'll use it the same way. 

It's readable when unelevated, which is nice, but not writable. If you're dumb and try to write to the file when unelevated, it'll just silently do nothing.

If we try opening the file and find out the permissions are different, we'll _blow the file away entirely_. This is to prevent someone from renaming the original file (which they can do unelevated), then slapping a new file that's writable by them down in it's place. 

## References
* We're going to use this in #11096, but these PRs need to be broken up.

## PR Checklist
* [x] Closes nothing
* [x] I work here
* [x] Tests added/passed
* [ ] Requires documentation to be updated - maybe? not sure we have docs on `state.json` at all yet

## Validation Steps Performed
I've played with this much more in `dev/migrie/f/non-terminal-content-elevation-warning`

###### followed by #11308, #11310
2021-11-13 01:58:43 +01:00
Leonard Hecker 2353349fe5
Introduce AtlasEngine - A new text rendering prototype (#11623)
This commit introduces "AtlasEngine", a new text renderer based on DxEngine.
But unlike it, DirectWrite and Direct2D are only used to rasterize glyphs.
Blending and placing these glyphs into the target view is being done using
Direct3D and a simple HLSL shader. Since this new renderer more aggressively
assumes that the text is monospace, it simplifies the implementation:
The viewport is divided into cells, and its data is stored as a simple matrix.
Modifications to this matrix involve only simple pointer arithmetic and is easy
to understand. But just like with DxEngine however, DirectWrite
related code remains extremely complex and hard to understand.

Supported features:
* Basic text rendering with grayscale AA
* Foreground and background colors
* Emojis, including zero width joiners
* Underline, dotted underline, strikethrough
* Custom font axes and features
* Selections
* All cursor styles
* Full alpha support for all colors
* _Should_ work with Windows 7

Unsupported features:
* A more conservative GPU memory usage
  The backing texture atlas for glyphs is grow-only and will not shrink.
  After 256MB of memory is used up (~20k glyphs) text output
  will be broken until the renderer is restarted.
* ClearType
* Remaining gridlines (left, right, top, bottom, double underline)
* Hyperlinks don't get full underlines if hovered in WT
* Softfonts
* Non-default line renditions

Performance:
* Runs at up to native display refresh rate
  Unfortunately the frame rate often drops below refresh rate, due us
  fighting over the buffer lock with other parts of the application.
* CPU consumption is up to halved compared to DxEngine
  AtlasEngine is still highly unoptimized. Glyph hashing
  consumes up to a third of the current CPU time.
* No regressions in WT performance
  VT parsing and related buffer management takes up most of the CPU time (~85%),
  due to which the AtlasEngine can't show any further improvements.
* ~2x improvement in raw text throughput in OpenConsole
  compared to DxEngine running at 144 FPS
* ≥10x improvement in colored VT output in WT/OpenConsole
  compared to DxEngine running at 144 FPS
2021-11-13 00:10:06 +00:00
Mike Griese a1bfa332f3 this was a nit 2021-11-11 16:33:05 -06:00
Mike Griese 8313987490 tests are hard 2021-11-11 16:32:26 -06:00
Mike Griese efdc0909e8 fix the tests 2021-11-11 12:52:08 -06:00
Mike Griese 7bb8975953 more todos 2021-11-11 11:40:15 -06:00
Mike Griese 8532dd692e fix conflicts with #11625 2021-11-11 11:38:50 -06:00
Mike Griese a338ca168c Merge remote-tracking branch 'origin/main' into dev/migrie/oop/ragnarok 2021-11-11 11:08:54 -06:00
Mike Griese 5adb327703 rename this one too 2021-11-11 10:34:25 -06:00
Mike Griese 1a7649ce21 turns out this _was_ overkill 2021-11-11 10:24:09 -06:00
Mike Griese a9e706c573 fix previewing, again 2021-11-11 09:58:06 -06:00
Mike Griese 2a18d7dae3 This is a checkpoint
* Dismissing a preview with an unfocused appearance is what's really broken here. That's never going to be able to go back to the original table, because the original table will be replaced with the unfocused appearance's table on the dismiss.
    - Going to fix that by using the focused appearance's table by default for the scheme when there's an unfocused appearance.
  * This is a little janky still, we flash the old schemes through on dismiss, which is probably wrong.
2021-11-11 08:28:53 -06:00
Mike Griese ae833a77bd notes, because it's 5pm here 2021-11-10 16:54:31 -06:00
Mike Griese 88f2e64bb3 Transparency is hard 2021-11-10 16:51:09 -06:00
Dustin Howett f6965aeb53 Merge remote-tracking branch 'openconsole/inbox' 2021-11-10 16:30:41 -06:00
Mike Griese 6e8a2adbd9 MIKE YOU HAVE TEST CASES HERE
This works for opacity for all Terminal cases. Need to still fix conhost.

```json
    "persistedWindowLayouts" :
    [
        {
            "initialPosition" : "149,43",
            "initialSize" :
            {
                "height" : 901.0,
                "width" : 1499.0
            },
            "tabLayout" :
            [
                {
                    "action" : "newTab",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + cleartype + acrylic",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + cleartype + acrylic"
                },
                {
                    "action" : "splitPane",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + cleartype + vintage",
                    "size" : 0.5,
                    "split" : "right",
                    "splitMode" : "manual",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + cleartype + vintage"
                },
                {
                    "action" : "moveFocus",
                    "direction" : "previousInOrder"
                },
                {
                    "action" : "splitPane",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + grayscale + acrylic",
                    "size" : 0.70000004768371582,
                    "split" : "down",
                    "splitMode" : "manual",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + grayscale + acrylic"
                },
                {
                    "action" : "splitPane",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + cleartype + acrylic(100)",
                    "size" : 0.5,
                    "split" : "down",
                    "splitMode" : "manual",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + cleartype + acrylic(100)"
                },
                {
                    "action" : "moveFocus",
                    "direction" : "nextInOrder"
                },
                {
                    "action" : "splitPane",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + grayscale + vintage",
                    "size" : 0.70000004768371582,
                    "split" : "down",
                    "splitMode" : "manual",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + grayscale + vintage"
                },
                {
                    "action" : "splitPane",
                    "commandline" : "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                    "profile" : "One Half Light + cleartype + vintage(100)",
                    "size" : 0.5,
                    "split" : "down",
                    "splitMode" : "manual",
                    "startingDirectory" : null,
                    "suppressApplicationTitle" : false,
                    "tabTitle" : "One Half Light + cleartype + vintage(100)"
                },
                {
                    "action" : "focusPane",
                    "id" : 5
                },
            ]
        }
    ]
```

    with the following profiles:

    ```json
            {
                "antialiasingMode": "cleartype",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "guid": "{e7f732da-f5c2-5f52-afd2-82518887a012}",
                "name": "One Half Light + cleartype + acrylic",
                "opacity": 50,
                "useAcrylic": true
            },
            {
                "antialiasingMode": "cleartype",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "guid": "{e52bc30c-4fa8-5650-9c00-b619544efa5e}",
                "name": "One Half Light + cleartype + vintage",
                "opacity": 50,
                "useAcrylic": false
            },
            {
                "antialiasingMode": "grayscale",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "guid": "{a870263b-0a3f-561f-82d2-bafc1163f1fc}",
                "name": "One Half Light + grayscale + acrylic",
                "opacity": 50,
                "useAcrylic": true
            },
            {
                "antialiasingMode": "grayscale",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "guid": "{58a6ffb9-ead3-53ae-a696-c3eb27292578}",
                "name": "One Half Light + grayscale + vintage",
                "opacity": 50,
                "useAcrylic": false
            },
            {
                "antialiasingMode": "cleartype",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "name": "One Half Light + cleartype + acrylic(100)",
                "opacity": 100,
                "useAcrylic": true
            },
            {
                "antialiasingMode": "cleartype",
                "colorScheme": "One Half Light",
                "commandline": "c:\\windows\\system32\\cmd.exe /k colortool.exe -c",
                "font":
                {
                    "size": 8
                },
                "name": "One Half Light + cleartype + vintage(100)",
                "opacity": 100,
                "useAcrylic": false
            },

    ```
2021-11-10 16:20:13 -06:00
Mike Griese 59c193c22a okay, so it's just vintage(100)+cleartype that doesn't work. Everything else gracefully falls back to grayscale 2021-11-10 15:54:32 -06:00
Mike Griese 713f72e1e5 5/6 transparency cases seem to work. Previewing with unfocused apprearance is broken again. 2021-11-10 15:42:10 -06:00
Matt Peterson d5974f4c91
Automatically convert paths dropped on WSL instances (#11625)
Drag and drop does not work for WSL because paths are pasted as windows
paths having incorrect path separator and path root.  This PR adds code
to correct the path in TerminalControl before pasting to WSL terminals.

One problem with this approach is that it assumes the default WSL
automount root of "/mnt". It would be possible to add a setting like
"WslDragAndDropMountRoot"... but I decided it if someone wants to change
automount location it would be simple enough just to create the "/mnt"
symlink in WSL.

## Validation
Couldn't find an obvious place to add a test.  Manually tested
cut-n-paste from following paths:
- "c:\"
- "c:\subdir"
- "c:\subdir\subdir"
- "\\wsl.localhost\<distro>"
- \\wsl.localhost\<distro>\subdir"

Closes #331
2021-11-10 21:19:52 +00:00
Dustin Howett 3fc82c2d4b Migrate OSS up to 305255c65 2021-11-10 15:07:17 -06:00
Leonard Hecker 305255c658
Fix a conhost binary size regression due to fmt (#11727)
6140fd9 causes a binary size regression in conhost.
This PR fixes most if not all of the regression, by replacing `FMT_STRING`
with `FMT_COMPILE` allowing us to drop most of the formatters built
into fmt during linking (for instance floating point formatters).

Additionally `std::wstring` was replaced with `fmt::basic_memory_buffer`
in the same vein as was done for VtEngine. Stack is
cheap and this prevents any unnecessary allocations.

## PR Checklist
* [x] I work here
* [x] Tests added/passed

## Validation Steps Performed
* vttest 11.2.5.3.6.7 and .8 (DECSTBM and SGR) complete successfully 
2021-11-10 21:03:47 +00:00
Mike Griese 5cd8096d42 Revert 5173ea30f5
> yes, but also, no. I tried doing that in 5173ea3, but alas, that doesn't work. There's a lot of places that assumes `IControlSettings requires IControlAppearance`. If you make `ControlSettings` only implement `IControlSettings` and `ICoreSettings`, and not the Appearances as well, then there are various places in UpdateSettings that will crash. (Those could likely be re-written as well, with some pain.)
>
> In almost all cases where we're using a `IControlSettings` as an Appearance, we're only interested in the `FocusedAppearance`'s value.
2021-11-10 12:54:45 -06:00
Mike Griese 147101f833 Whoops, needed this earlier 2021-11-10 12:40:40 -06:00
Mike Griese 5173ea30f5 much of this appearance code was unneeded 2021-11-10 12:29:34 -06:00
Mike Griese 9eeea4a9d0 The simple PR feedback 2021-11-10 11:32:31 -06:00
Mike Griese d51c2cff35 Merge remote-tracking branch 'origin/main' into dev/migrie/oop/ragnarok 2021-11-10 10:27:35 -06:00
Dustin Howett 7db7ba1ac9 ci: fix spelling for inbox merge 2021-11-09 17:22:55 -06:00
Dustin Howett 89c2b6d580 Merge remote-tracking branch 'openconsole/inbox' 2021-11-09 17:16:59 -06:00
Dustin Howett 92643c1d34 Merged PR 6654362: [Git2Git] OS build fixes for f9b97c488
Retrieved from https://microsoft.visualstudio.com os.2020 OS official/rs_wdx_dxp_windev 063b86ac10af16cade5c0754adcbf27e7e9ae266

Related work items: MSFT-34534216, MSFT-36986009, MSFT-36986203
2021-11-09 23:16:26 +00:00
Dustin Howett e591d29000 Migrate OSS up to f9b97c488 2021-11-09 13:39:28 -06:00
Dustin Howett 88d58d313a Migrate OSS up to 3f1befb06 (Touch Keyboard Invocation) 2021-11-09 13:39:23 -06:00
Dustin Howett 87182554c8 Migrate OSS up to e5180fe88 2021-11-09 13:39:09 -06:00
Dustin Howett 5ff412fe6e Migrate OSS up to 5deb33260 (A11y Degenerate Word Movement) 2021-11-09 13:33:49 -06:00
Dustin Howett 30f7f2082b Migrate OSS up to 168d28b03 2021-11-09 13:33:29 -06:00
Dustin Howett e6b871da47 Migrate OSS up to d08afc4e8 (A11y End Of Buffer) 2021-11-09 13:32:34 -06:00
Dustin Howett f9c0f86705 Migrate OSS up to 4793541c 2021-11-09 13:32:14 -06:00
Dustin Howett 86da0e041f Migrate OSS up to c53fe1c2b (A11y End Of Buffer) 2021-11-09 13:26:44 -06:00
Dustin Howett a89b66f770 Merged PR 6598109: [Git2Git] Pull Request 6508625: Update TAEF to vPack 10.63 (latest)
A change required significant changes in TAEF published headers. This PR consumes those changes.

Related work items: #20301352
2021-11-09 19:21:35 +00:00
Ikko Ashimine f9b97c4880
doc: Fix typo in #885 - Terminal Settings Model.md (#11657)
Fixed typo: ocurred -> occurred

* [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA
2021-11-08 12:18:50 -08:00
Mike Griese a74c37bbcd
Don't crash if we fail to BeginBufferedPaint (#11674)
Fixes MSFT:34673647, at least I'm pretty sure. That's only ever hit a few
times externally, and internally it's hitting a lot on 1.9.1942 builds, which
doesn't really make any sense.
2021-11-05 19:26:59 +00:00
Sergey 55dbda02a5
fix build error at 74d21af (#11691)
#11404 and #11653 both added WM_SYSCOMMAND which prevents build. This fixes it.
2021-11-05 19:26:03 +00:00
Sergey 7aae2e9100
Fix missing window border when use "win+arrow down" in fullscreen mode in Terminal (#11653)
Window sends an event that requests exit from fullscreen then SC_RESTORE messages is sent and it is in fullscreen mode.
Closes #10607

## Validation Steps Performed
Border and tabbar now appear after exiting fullscreen via "win+arrow down".
2021-11-04 23:46:57 +00:00
Kai 74d21afacf
README.md: HTTP => HTTPS (#11671)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
## Summary of the Pull Request
Checked the link, skipping the redirect HTTP => HTTPS this way 0:-)

This one
http://azuredevopspodcast.clear-measure.com/kayla-cinnamon-and-rich-turner-on-devops-on-the-windows-terminal-team-episode-54
is still only available via HTTP, sadly.

<!-- Other than the issue solved, is this relevant to any other issues/existing PRs? --> 
## References
<http://www.runasradio.com/Shows/Show/645> is being redirected to <https://www.runasradio.com/Shows/Show/645>

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
* N/A Closes #xxx
* [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA
* N/A Tests added/passed
* N/A Documentation updated. If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/terminal) and link it here: #xxx
* N/A Schema updated.
* [ ] I've discussed this with core contributors already. If not checked, I'm ready to accept this work might be rejected in favor of a different grand plan. Issue number where discussion took place: #xxx

<!-- Provide a more detailed description of the PR, other things fixed or any additional comments/features here -->
## ~~Detailed Description of the Pull Request / Additional comments~~

<!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
Opened the link.
2021-11-04 22:45:19 +00:00
PankajBhojwani 52b4bb760f
Unify splitting panes and creating new tabs (#11305)
Implements `_MakePane` in `TerminalPage`, which creates a pane that then can be used to pass into another pane to split or to create a new tab with. Places where we split pane or create a new tab now use `_MakePane`. 

## PR Checklist
* [x] Closes #11021
* [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA
* [x] I work here

## Validation Steps Performed
Stands up to manual testing with multiple new pane/new tab commands as well as startup actions
2021-11-04 22:29:58 +00:00
James Holderness b604117421
Standardize the color table order (#11602)
## Summary of the Pull Request

In the original implementation, we used two different orderings for the color tables. The WT color table used ANSI order, while the conhost color table used a Windows-specific order. This PR standardizes on the ANSI color order everywhere, so the usage of indexed colors is consistent across both parts of the code base, which will hopefully allow more of the code to be shared one day.

## References

This is another small step towards de-duplicating `AdaptDispatch` and `TerminalDispatch` for issue #3849, and is essentially a followup to the SGR dispatch refactoring in PR #6728.

## PR Checklist
* [x] Closes #11461
* [x] CLA signed.
* [x] Tests added/passed
* [ ] Documentation updated.
* [ ] Schema updated.
* [x] I've discussed this with core contributors already. Issue number where discussion took place: #11461

## Detailed Description of the Pull Request / Additional comments

Conhost still needs to deal with legacy attributes using Windows color order, so those values now need to be transposed to ANSI colors order when creating a `TextAttribute` object. This is done with a simple mapping table, which also handles the translation of the default color entries, so it's actually slightly faster than the original code.

And when converting `TextAttribute` values back to legacy console attributes, we were already using a mapping table to handle the narrowing of 256-color values down to 16 colors, so we just needed to adjust that table to account for the translation from ANSI to Windows, and then could make use of the same table for both 256-color and 16-color values.

There are also a few places in conhost that read from or write to the color tables, and those now need to transpose the index values. I've addressed this by creating separate `SetLegacyColorTableEntry` and `GetLegacyColorTableEntry` methods in the `Settings` class which take care of the mapping, so it's now clearer in which cases the code is dealing with legacy values, and which are ANSI values.

These methods are used in the `SetConsoleScreenBufferInfoEx` and `GetConsoleScreenBufferInfoEx` APIs, as well as a few place where color preferences are handled (the registry, shortcut links, and the properties dialog), none of which are particularly sensitive to performance. However, we also use the legacy table when looking up the default colors for rendering (which happens a lot), so I've refactored that code so the default color calculations now only occur once per frame.

The plus side of all of this is that the VT code doesn't need to do the index translation anymore, so we can finally get rid of all the calls to `XTermToWindowsIndex`, and we no longer need a separate color table initialization method for conhost, so I was able to merge a number of color initialization methods into one. We also no longer need to translate from legacy values to ANSI when generating VT sequences for conpty.

The one exception to that is the 16-color VT renderer, which uses the `TextColor::GetLegacyIndex` method to approximate 16-color equivalents for RGB and 256-color values. Since that method returns a legacy index, it still needs to be translated to ANSI before it can be used in a VT sequence. But this should be no worse than it was before.

One more special case is conhost's secret _Color Selection_ feature. That uses `Ctrl`+Number and `Alt`+Number key sequences to highlight parts of the buffer, and the mapping from number to color is based on the Windows color order. So that mapping now needs to be transposed, but that's also not performance sensitive.

The only thing that I haven't bothered to update is the trace logging code in the `Telemetry` class, which logs the first 16 entries in the color table. Those entries are now going to be in a different order, but I didn't think that would be of great concern to anyone.

## Validation Steps Performed

A lot of unit tests needed to be updated to use ANSI color constants when setting indexed colors, where before they might have been expecting values in Windows order. But this replaced a wild mix of different constants, sometimes having to use bit shifting, as well as values mapped with `XTermToWindowsIndex`, so I think the tests are a whole lot clearer now. Only a few cases have been left with literal numbers where that seemed more appropriate.

In addition to getting the unit tests working, I've also manually tested the behaviour of all the console APIs which I thought could be affected by these changes, and confirmed that they produced the same results in the new code as they did in the original implementation.

This includes:
- `WriteConsoleOutput`
- `ReadConsoleOutput`
- `SetConsoleTextAttribute` with `WriteConsoleOutputCharacter`
- `FillConsoleOutputAttribute` and `FillConsoleOutputCharacter` 
- `ScrollConsoleScreenBuffer`
- `GetConsoleScreenBufferInfo`
- `GetConsoleScreenBufferInfoEx`
- `SetConsoleScreenBufferInfoEx`

I've also manually tested changing colors via the console properties menu, the registry, and shortcut links, including setting default colors and popup colors. And I've tested that the "Quirks Mode" is still working as expected in PowerShell.

In terms of performance, I wrote a little test app that filled a 80x9999 buffer with random color combinations using `WriteConsoleOutput`, which I figured was likely to be the most performance sensitive call, and I think it now actually performs slightly better than the original implementation.

I've also tested similar code - just filling the visible window - with SGR VT sequences of various types, and the performance seems about the same as it was before.
2021-11-04 22:13:22 +00:00
PankajBhojwani 761203d95e
Remove unused rendering settings from profile (#11685)
The `ForceFullRepaintRendering` and `SoftwareRendering` are global only and for some reason were in profile. This commit removes them.

Reference: https://github.com/microsoft/terminal/pull/11416#discussion_r742030103
2021-11-04 14:50:59 -05:00
PankajBhojwani 4241d1c19e
Update _OpenSettingsUI to OpenSettingsUI (#11686)
#11404 changed `_OpenSettingsUI` to `OpenSettingsUI` in `TerminalPage`, but there is still one leftover reference to `_OpenSettingsUI`. This commit fixes that.
2021-11-04 14:49:22 -05:00
Sergey ab6ba9bdbb
Add settings entry into titlebar context menu (#11404)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
## Summary of the Pull Request
Adds ability for app to change system context menu

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
* [x] Closes #9666 
* [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA
* [ ] Tests added/passed
* [ ] Documentation updated. If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/terminal) and link it here: #xxx
* [ ] Schema updated.
* [ ] I've discussed this with core contributors already. If not checked, I'm ready to accept this work might be rejected in favor of a different grand plan. Issue number where discussion took place: #xxx

<!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
2021-11-04 16:47:58 +00:00