Compare commits

..

33 Commits

Author SHA1 Message Date
Clint Rutkas
8564f9d864 Update code.txt 2026-05-25 08:11:54 -07:00
Clint Rutkas
d8a7fe5913 Merge branch 'crutkas/dev/fixcoroutine' of https://github.com/microsoft/powertoys into crutkas/dev/fixcoroutine 2026-05-24 21:36:34 -07:00
Clint Rutkas
e627f1755b Eliminate VS 2026 build warnings: IIDOptimizer, AutoInitializer dupe, CsWinRT projection race fallback
- Common.Dotnet.CsWinRT.props: opt out of CsWinRT 2.2 IIDOptimizer which exits with code -1 on .NET 10 (MSB3073). Add DeleteStaleCsWinRTRspAfterPrepare second-pass target so projects that override CsWinRTGeneratedFilesDir to OutDir (e.g. PowerToys.Settings, PowerAccent.Common.UnitTests) also have stale cswinrt.rsp deleted after the value is resolved.

- PowerRenameUI.vcxproj: add Microsoft.WindowsAppSDK.Foundation PackageReference and FixWinAppSDKAutoInitializer target (same pattern as runner.vcxproj) so WindowsAppRuntimeAutoInitializer.cpp is only added once, eliminating MSB8027 and LNK4042.
2026-05-24 20:51:48 -07:00
copilot-swe-agent[bot]
e503ccfd89 Allow cswinrt and rsp in spell check 2026-05-25 01:04:37 +00:00
Clint Rutkas
2084992f42 getting most stood up and functional again 2026-05-24 09:37:31 -07:00
Clint Rutkas
6ecb06c8cb WIP: spdlog 1.17 / fmt 12 compile fixes
- Add FMT_UNICODE=0 to logging.vcxproj, spdlog.props, UnitTests-CommonUtils (Microsoft codebase isn't /utf-8 by default)
- Rename spdlog's fmt.cpp -> bundled_fmtlib_format.cpp in logging.vcxproj (renamed upstream)
- Add SPDLOG_WCHAR_TO_UTF8_SUPPORT to logging.vcxproj so wstr_to_utf8buf is compiled
- Wrap Logger:: format strings with fmt::runtime() (fmt 11+ requires consteval format strings)
- Bump CalculatorEngineCommon to C++20 to drop dependency on <experimental/coroutine>
2026-05-23 22:08:58 -07:00
Clint Rutkas
a3cad81295 Bump spdlog submodule to v1.17.0 (bundled fmt 12.1); remove MSVC 14.51 checked_array_iterator shim 2026-05-23 21:37:50 -07:00
Mike Griese
f998c38ac8 cmdpal: fix an AOT-only crash loading the extension page (#48065)
Okay I'll admit this is a clanker fix. 

There's currently a crash when you navigate to an individual extension
page, that only repro's in Release/AOT. And because of
release&trimming&AOT reasons, that's very very difficult to diagnose.
But the clanker added a shitload of logging, and was able to figure out
that:

We were binding to this `Screenshots` collection. Problem is that we
can't safely bind to an `IReadOnlyList` in trimmed scenarios. C#/AOT is
a wonderful world of horrors.

Fixing this is as simple as swapping it for a `ObservableCollection`.
2026-05-23 05:56:14 -05:00
Mike Griese
11083c9fb2 CmdPal: Successfully open when opened on other displays (#48061)
When we were docked on a screen other than the primary display, then
clicking on a dock item that was a `IPage` would result in the palette
window just not showing up at all.

The fix is to make sure that we use the actual position of the current
monitor in the calculation of the final position of the palette HWND.
2026-05-23 05:55:51 -05:00
Boliang Zhang
809601a33c [CmdPal] Add stable AutomationIds across XAML for UI testing (#48033)
## Summary

Adds **77 explicit `AutomationProperties.AutomationId`** declarations (4
→ 81, ~20x) to Command Palette XAML so UI-testing tools (WinAppDriver,
FlaUI, winappCli, Appium) can address controls deterministically instead
of falling back to runtime slugs that change every session. Also covers
the `DataTemplate`-generated long tail (search results, file results,
every extension item, every monitor in Dock settings) by binding
`AutomationId` to existing stable model identifiers via `{x:Bind}`.

Headline: a one-line addition to the four CmdPal `ListItem`
`DataTemplate`s now exposes each instance's underlying `Command.Id`
(e.g. `com.microsoft.cmdpal.builtin.calculator`) as its `AutomationId`.
This is the same pattern as web's `<li data-testid={item.id}>`.

## Why

CmdPal today ships with only **4** explicit
`AutomationProperties.AutomationId` declarations across **44** XAML
files (~303 interactive controls). UI tests are forced to fall back to:

- runtime-generated slugs like `itm-12-9dda` that change every CmdPal
restart, or
- regex-parsing the text output of `winappCli ui inspect`, or
- walking the UIA tree client-side and matching by `Name` (localized,
ambiguous when several controls share a label).

## What changed

### Source changes
- **`Microsoft.CmdPal.UI/ExtViews/ListItemsView.xaml`** — bind
`AutomationProperties.AutomationId="{x:Bind Command.Id, Mode=OneWay}"`
on the root of all 4 `ListItem` `DataTemplate`s (single-row, small-grid,
medium-grid, gallery). Covers **every** runtime list item across all
built-in and third-party providers.
- **`Microsoft.CmdPal.UI/Settings/GeneralPage.xaml`** — 14 IDs on
activation hotkey controls, auto-go-home combo, behaviour toggles,
about-section hyperlinks.
- **`Microsoft.CmdPal.UI/Settings/AppearancePage.xaml`** — 19 IDs on
theme/backdrop/colorization, background image controls, 5 sliders,
behaviour toggles.
- **`Microsoft.CmdPal.UI/Settings/DockSettingsPage.xaml`** — 14 IDs on
enable toggle, theme/colorization/backdrop, background image controls,
plus per-monitor data-bound ID using `DisplayName`.
- **`Microsoft.CmdPal.UI/Settings/ExtensionsPage.xaml`** — 4 IDs on
banner/store hyperlinks plus the per-provider `SettingsCard` (data-bound
to the provider's `Id`, e.g. `com.microsoft.cmdpal.builtin.calculator`).
- **`Microsoft.CmdPal.UI/Settings/ExtensionPage.xaml`** — 5 IDs on
provider enable toggle, alias text/activation, fallback rank link.
- **`Microsoft.CmdPal.UI/Settings/ExtensionGalleryItemPage.xaml`** — 5
IDs on install/cancel/copy-command buttons and author/repo/uninstall
links.
- **`Microsoft.CmdPal.UI/Settings/InternalPage.xaml`** — 7 IDs on the
dev-only "Throw exception" and folder/log-opening buttons.
- **`Microsoft.CmdPal.UI/Pages/ShellPage.xaml`** — 1 data-bound ID on
the `CommandTemplate` button (binds to `CommandViewModel.Id`).
- **`Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs`** —
single-line addition exposing the underlying `CommandProviderWrapper.Id`
so the ExtensionsPage template can bind to it.

### Naming convention applied

`CmdPal_<Page>_<Semantic>` PascalCase, with the existing well-known IDs
left untouched to avoid breaking the `modules/cmdpal/*` checklist tests
already referencing them. `Id` / `TestId` suffixes deliberately omitted
(the attribute is already `AutomationId`); control-type suffixes
(`Toggle` / `Button` / `ComboBox`) omitted because the type lives on the
UIA `type` field already.

### Files NOT touched (deferred)

About 5–7 secondary files (`SettingsWindow.xaml`,
`ExtensionGalleryPage.xaml`, `DockControl.xaml`, `DevRibbon.xaml`, deep
style/viewer XAML) — their interactive controls already carry `x:Name`,
which WinUI auto-promotes to `AutomationId` at runtime, so practical
testability is mostly already there. Can be tightened up in a follow-up
PR.

## Risk

-  Zero runtime cost (`AutomationProperties.AutomationId` is metadata
only)
-  Does not affect localization (`AutomationId` is non-localized by
design)
-  Does not affect user-facing accessibility (screen readers consume
`Name` / `AutomationProperties.Name`, untouched)
-  Does not rename any existing ID; `modules/cmdpal/*` tests
referencing `MainSearchBox` / `PrimaryCommandButton` / `ItemsList` /
etc. remain valid
-  All 51 CmdPal XAML files parse as valid XML (PowerShell `[xml]`
round-trip)
-  All `x:Bind` paths verified against the relevant ViewModel types
(`CommandViewModel.Id`, `DockMonitorConfigViewModel.DisplayName`,
`ProviderSettingsViewModel.Id`)

## Validation requested before merge

XAML compilation was attempted locally but blocked by a missing native
NuGet package (`Microsoft.Windows.ImplementationLibrary`) — needs
`tools\build\build-essentials.cmd` to fully restore first. **Reviewer
please run a clean local build of `Microsoft.CmdPal.UI` (or rely on CI)
to confirm the XAML compiler is happy.**

Once built, a quick smoke check:

```powershell
# After CmdPal restart with the new bits installed:
winapp ui search 'CmdPal_'           -w <hwnd> --json  # should list all the new IDs
winapp ui invoke 'CmdPal_AppearancePage_OpenCommandPalette' -w <hwnd>
winapp ui invoke 'com.microsoft.cmdpal.builtin.calculator' -w <hwnd>   # ListItem template binding
```

## Why this matters beyond our tools

This is the same pattern Microsoft's accessibility and WinUI teams
already recommend for any XAML app intended to be automated. It's the
WinUI equivalent of adding `data-testid` in a web app — universally
accepted as low-risk, high-leverage. WinAppDriver, FlaUI, Appium and any
future automation framework all benefit from the same change.
2026-05-22 21:42:19 -05:00
Mike Griese
2c9481e69a cmdpal: update template project to 0.11 SDK (#48066)
title
2026-05-22 21:09:06 -05:00
Boliang Zhang
1d0917d06f [CI] Sign YamlDotNet.dll (ShortcutGuide V2 dependency) (#48050)
## Summary

Fixes the **stable** signed release pipeline failure (Dart build
[`147590319`](https://microsoft.visualstudio.com/Dart/_build/results?buildId=147590319))
at the *"Verify all binaries are signed and versioned"* task on both
`Build Release_x64` and `Build Release_arm64`:

```
Not Signed: + …\extractedMachineMsi\File\WinUI3ApplicationsFiles_File_YamlDotNet.dll
```

## Root cause

PR #40834 (*Shortcut Guide V2*) added a `YamlDotNet` `PackageReference`
to:

- `src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuide.Ui.csproj`
-
`src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/ShortcutGuide.IndexYmlGenerator.csproj`

Both projects publish into `WinUI3Apps\`, so `YamlDotNet.dll` is
harvested into the MSI by
`installer/PowerToysSetupVNext/generateAllFileComponents.ps1`. The PR
updated `ESRPSigning_core.json` for its own new binaries but missed this
3rd-party transitive dependency, so ESRP never signs it and
`.pipelines/versionAndSignCheck.ps1` correctly fails the build.

## Fix

One additive line to `.pipelines/ESRPSigning_core.json`, placing
`WinUI3Apps\YamlDotNet.dll` next to the other 3rd-party `WinUI3Apps\`
entries (`Google.Apis.*`, `Google.GenAI.dll`, `ReverseMarkdown.dll`,
`SharpCompress.dll`, …).

## Validation

- `git diff` shows exactly one additive line.
- File still parses as valid JSON (`ConvertFrom-Json` round-trip OK).
- Both ShortcutGuide csprojs target
`$(Platform)\$(Configuration)\WinUI3Apps`, so a single
`WinUI3Apps\YamlDotNet.dll` entry covers all uses.

## Follow-up

After merge to `main`, cherry-pick / merge into `stable` so build
`147590319` can be re-queued and the 0.100 release pipeline can proceed.

Co-authored-by: Copilot <Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-22 15:43:42 +00:00
moooyo
4edfcee87e [Power Display] Built-in monitor blacklist to mitigate DDC/CI BSOD (#47556, #47968) (#48051)
<!-- 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 a built-in monitor blacklist that skips known-bad monitor models at
the DDC/CI discovery stage — before PowerDisplay sends any capabilities
request to the firmware. Matches by EdidId (the PnP manufacturer +
product code from EDID). Two entries pre-populated from existing crash
reports:

| EdidId | Reported in | Notes |

|-----------|-------------|------------------------------------------------------------------------|
| `LTM2C02` | #47556 | Counterfeit-EDID LG 27MR400 (PnP claims Litemax
40" 2011, actual hw is LG 27" 2024) |
| `GSM7714` | #47968 | LG UltraWide HDR WFHD |

Also logs `[EdidId=…] [FriendlyName=…] [DevicePath=…]` immediately
before each `GetCapabilitiesString*` syscall in `DdcCiController`. If
the kernel call BSODs (`win32kfull` stack-cookie overrun), that is the
last log line that survives — adding a new blacklist entry then takes
one PR to `BuiltInMonitorBlacklist.json` instead of a memory-dump
triage.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Mitigates: #47556
- [x] Mitigates: #47968
- [x] **Communication:** This is the "Add blacklist and prevent the API
call on broken monitor" mitigation outlined in [#47556
(comment)](https://github.com/microsoft/PowerToys/issues/47556#issuecomment-4505498427).
The underlying `win32kfull!DdcciGetCapabilitiesStringFromMonitor` stack
overrun is tracked separately by the Windows team.
- [x] **Tests:** 6 new MSTest unit tests under
`PowerDisplay.Lib.UnitTests`. All 120 PowerDisplay tests pass on x64
Debug.
- [ ] **Localization:** N/A — this PR ships no end-user-facing strings
(no UI surface).
- [ ] **Dev docs:** N/A.
- [ ] **New binaries:** N/A. Data ships as an `<EmbeddedResource>`
inside the existing `PowerDisplay.Models.dll`; no new .dll, no installer
change.
- [ ] **Documentation updated:** N/A.

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

### Threat model

Some retail monitor firmwares ship non-conformant DDC/CI capabilities
strings — typically oversized, not NUL-terminated, or otherwise
malformed. When PowerDisplay calls `GetCapabilitiesStringLength` /
`CapabilitiesRequestAndCapabilitiesReply` on these monitors, the request
flows into
`win32kfull!CPhysicalMonitorHandle::DdcciGetCapabilitiesStringFromMonitor`,
which copies the reply into a stack buffer without bounding the length.
The kernel detects its own stack cookie corruption on the epilogue check
and `__fastfail`s with `BUGCHECK 0x139 / 2
(STACK_COOKIE_CHECK_FAILURE)`.

The kernel-side overrun is a Windows defect, not PowerDisplay's, but
PowerDisplay is currently the most widely deployed consumer of this API
on hot-plug. Until the Windows team fixes the kernel, the only safe
mitigation in user space is to **never call** the capabilities API on
monitor models known to trigger it.

### Architecture

| File | Role |
|---|---|
| `PowerDisplay.Models/MonitorBlacklistEntry.cs` | POCO: `{ edidId,
comments }` |
| `PowerDisplay.Models/BuiltInMonitorBlacklist.json` | Data file
(embedded resource) |
| `PowerDisplay.Models/BuiltInMonitorBlacklist.cs` | Lazy-loaded reader,
AOT-safe (source-gen `JsonSerializerContext`); silent fallback to empty
list on any IO/parse failure |
| `PowerDisplay.Lib/Services/MonitorBlacklistService.cs` |
`IsBlocked(monitorId)` — extracts EdidId via
`MonitorIdentity.EdidIdFromMonitorId`, checks a `HashSet<string>` with
`OrdinalIgnoreCase` |
| `PowerDisplay/Helpers/MonitorManager.cs` | Filters QueryDisplayConfig
inventory by EdidId **before** any controller (DDC/CI or WMI) is
dispatched; logs each skip with `[MonitorBlacklist] Skipping ...` |
| `PowerDisplay.Lib/Drivers/DDC/DdcCiController.cs` | Logs EdidId +
FriendlyName + DevicePath immediately before the first capabilities
syscall per-monitor |

Matching is **model-level granularity** (EdidId, e.g. `GSM7714`) rather
than device-level (full DevicePath). One entry covers every physical
port and every machine with the same monitor model.

### Adding new entries

Once the kernel overrun is fixed this list can shrink. Until then, when
a new BSOD surfaces:

1. User reports BSOD, attaches PowerDisplay log
2. The last line before the crash now reads `DDC: probing capabilities
[EdidId=XXXXXX] [FriendlyName='...'] [DevicePath=...]`
3. Add `{ "edidId": "XXXXXX", "comments": "See #issue" }` to
`BuiltInMonitorBlacklist.json`
4. Submit PR, ship in next release

### Scoped out (deliberate)

A user-customized blacklist surface (Settings UI dialog) was prototyped
and hit multiple WinUI 3 dialog parse / measure crashes inside a
`ContentDialog`. The custom-list code path was reverted in favor of
"built-in only" for v1 reliability. UI can be re-added later on top of
this foundation if needed — the data model and service already support
it.

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

1. **Unit tests:** `dotnet test` on `PowerDisplay.Lib.UnitTests` →
**120/120 pass** (including 6 new tests for loader + service: built-in
JSON loads, EdidIds are normalized to upper-case, no blank entries,
`Lazy<>` cache returns same instance, `IsBlocked` returns `false` for
empty built-in list and for unidentifiable monitor IDs).
2. **Clean x64 Debug build** via `tools\build\build-essentials.cmd` +
per-project `tools\build\build.cmd`:
   - `PowerDisplay.Models` — 0 warning, 0 error
   - `PowerDisplay.Lib` — 0 warning, 0 error
   - `PowerDisplay` (app) — 0 warning, 0 error
3. **Smoke test (manual):** launched PowerDisplay, confirmed every
connected monitor produces a `DDC: probing capabilities [EdidId=…]
[FriendlyName=…] [DevicePath=…]` log line right before its caps request.
4. **Empty-list case:** `BuiltInMonitorBlacklist.json` with no entries →
`IsBlocked` returns `false` for any input (verified via unit test).
5. **Non-empty case (manual):** temporarily added a connected monitor's
EdidId to the built-in JSON → that monitor disappears from
`MonitorManager.Monitors` and `[MonitorBlacklist] Skipping ...` log line
appears; removed the entry → monitor reappears, all per-monitor settings
intact.

---------

Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
2026-05-22 23:18:13 +08:00
Boliang Zhang
33cf6995fc [Settings UI] Remove duplicate QuickAccent_SelectedLanguage_Greek_Polytonic resource (#48054)
## Summary

Fixes the **"Build PowerToys main project"** failure on every PR/CI
build off current `main` (e.g. Dart build
[`147597426`](https://microsoft.visualstudio.com/Dart/_build/results?buildId=147597426)):

```
WINAPPSDKGENERATEPROJECTPRIFILE: Error PRI175: Processing Resources failed with error: Duplicate Entry.
WINAPPSDKGENERATEPROJECTPRIFILE: Error PRI277: Conflicting values for resource
                                  'Resources/QuickAccent_SelectedLanguage_Greek_Polytonic'
```

## Root cause

`src/settings-ui/Settings.UI/Strings/en-us/Resources.resw` contained two
`<data name="QuickAccent_SelectedLanguage_Greek_Polytonic">` entries:

- Line 3597 — original, added by #47021 (*"[PowerAccent] adding greek
polytonic"*), placed in the alphabetized QuickAccent block.
- Line 6175 — duplicate, appended at the file tail by #47211 (*"[Quick
Accent] Move language data to PowerAccent.Common library, refactor"*).

The two entries are byte-identical (same value `Greek Polytonic`, same
`xml:space="preserve"`). The WinAppSDK PRI generator (`MakePri`) rejects
duplicates, so every build off current `main` fails before reaching the
compile step.

## Fix

Remove the tail duplicate (3-line block right before `</root>`). Keeps
the original entry in its alphabetized location.

## Validation

- `git diff` shows exactly 3 deleted lines.
- `[xml](Get-Content … -Raw)` round-trip succeeds — file is still
well-formed XML.
- `Select-String` count of
`QuickAccent_SelectedLanguage_Greek_Polytonic` in the file is now **1**
(was 2).
- Only `en-us` has this key (other localized `.resw` files are populated
later via Touchdown), so no other file needs touching.

## Note

Discovered while investigating a CI failure unrelated to my other PR
#48050 (signing of `WinUI3Apps\YamlDotNet.dll`). Both fixes are needed
for the 0.100 release pipeline; this PR unblocks PR builds off `main`,
and #48050 unblocks the signed release pipeline once both are merged to
`main` and the next `main → stable` sync happens.

Co-authored-by: Copilot <Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-22 15:42:56 +02:00
Dave Rayment
81e251c2de [Quick Accent] Move language data to PowerAccent.Common library, refactor (#47211)
<!-- 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
Language data for Quick Accent was previously defined in
**PowerAccent.Core/Languages.cs**, internal to the Quick Accent
application itself. The Settings application had no access to the list
and had to maintain a parallel, manually-synchronised list of the
language names and groups, and there was no single place to look up the
complete set of languages.

This PR resolves this and extracts the language data into a new
**PowerAccent.Common** project with no external or UI dependencies,
making it the single source of truth for both the character popup and
Settings UI.

The implicit and non-obvious ordering of the old **Languages.cs** has
been replaced with explicit ordering of the language groups and
languages list.

A new unit test project for the application has also been added.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #47159
- [x] Closes: #30000
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [x] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

The following changes and additions have been made:

New project **PowerAccent.Common** contains:

- **Language.cs** - an enum of Quick Accent's pseudo-ISO identifiers for
each of the supported languages
- **LetterKey.cs** - mirrors the LetterKey enum defined in the
KeyboardListener.idl, and must be kept in sync with that. This exposes
the VK_* data to the Settings UI without it having to reference the
PowerAccentKeyboardService project
- **LanguageGroup.cs** - classifies languages as `Language` (for spoken
languages), `Special` (for sets like Currency and International Phonetic
Alphabet), or `UserDefined` (reserved for future work)
- **LanguageInfo.cs** - a record which combines a language's identity,
group, resource identifier, and character mappings
- **CharacterMappings.cs** - a new version of the old **Languages.cs**,
providing:
    - `All` - the canonical registry of every `LanguageInfo` entry
- `DisplayOrder` - the explicit within-group ordering for languages, for
the default popup ordering, i.e. when the user has not got
frequency-based ordering enabled. This is a culturally-neutral
alphabetical ordering by our pseudo-ISO language IDs, and close to the
previous order, minimising any impact to users' muscle memory
- `GroupDisplayOrder` - the explicit ordering of language groups for
both the popup and the Settings UI
- `LanguageLookup` - new _O(1)_ `Language` to `LanguageInfo` dictionary
- `GetCharacters(LetterKey, Language[])` - a deduplicating character
collector and sorter

A significant improvement over the old **Languages.cs** is that language
ordering is now explicit and in one place. Previously, popup ordering
was an implicit side-effect of a large Union chain across all language
mappings, with the enum, the language mapping declarations and the union
all carrying different orderings. This was a source of confusion and
made adding new languages fragile.

The original **Languages.cs** has been deleted. There's now a thin
`CharacterMappings` adapter that casts the `LetterKey` to the managed
equivalent by numeric value. This is another effort to decouple the
Settings UI and Quick Accent and only share the required elements.

In Settings, the `PowerAccentViewModel` class has been updated. It now
derives the language list directly from `CharacterMappings.All`; the
`InitializeLanguages()` call handles localisation, sorting and grouping
in a single place using `GroupDisplayOrder`.

A new unit test project covers `CharacterMappings`, the `LetterKey`
IDL-to-managed code bridge and general language declaration checks. The
application is now much more robust against changes which alter the
declared order, introduce empty/null elements, and so on. It is now
impossible to add a new language and forget a constituent part (the enum
entry, its place in the display order, the character mappings
themselves) without a test failing.

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

See new unit test project for comprehensive tests.

Manually confirmed:

- Triggering Quick Accent with no language selected does not report an
error
- Language order is consistent in the popup, no matter what order the
languages are selected in Settings
- The order of languages in Settings is consistent, alphabetically by
localised name
- All declared languages are present in Settings and no resource IDs
were missed

---------

Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-22 15:24:26 +08:00
Clint Rutkas
f02b66c88d Fix auto-update relaunch, add config backup, enable auto-download by default (#46889)
## Summary

Addresses three critical issues with the PowerToys update experience
that cause user fragmentation across old versions.

### Changes

**1. Fix relaunch after update (Fixes #42004, #43011, #44071)**
- Stage 1 now passes the PowerToys install directory to Stage 2 as an
argument
- After successful install, Stage 2 relaunches `PowerToys.exe` with
`-report_update_success`
- Users will see a 'successfully updated' toast and PT resumes
automatically

**2. Config backup/restore (Fixes #46179)**
- `BackupConfigFiles()` snapshots all JSON configs to `ConfigBackup/`
before update begins
- `RestoreCorruptedConfigs()` checks for null-byte corruption after
install and auto-restores
- Protects Workspaces, FancyZones, Keyboard Manager, and all other
module settings

**3. Enable auto-download by default**
- New installations default `AutoDownloadUpdates` to `true` (was
`false`)
- Existing users' preferences are preserved — this only affects
first-run defaults
- The runner already defaulted to `true`; this aligns the C# settings
model

### Why this matters

The current updater kills all PowerToys processes, runs the installer,
then **exits without relaunching**. Users lose keyboard remappings,
FancyZones layouts, and Awake settings with no indication why. Combined
with auto-download being off by default, most users are multiple
versions behind.

### Testing

- Verified update flow: Stage 1 → Stage 2 → PT relaunches with success
toast
- Config backup creates mirror of all JSON settings before update
- Corruption detection catches null-byte pattern from #46179
- Graceful fallback: if install dir not provided (old Stage 1), logs
warning but doesn't crash

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
2026-05-22 14:01:56 +08:00
Copilot
386fdcb1e9 [Shortcut Guide] Render key names instead of raw numeric key codes (#48037)
## Summary of the Pull Request

Shortcut Guide was rendering raw numeric key codes in key visuals for
some shortcuts (notably generated PowerToys shortcuts), showing numbers
where key characters/names were expected. This change normalizes numeric
key handling so display output matches actual key labels.

## PR Checklist

- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx

## Detailed Description of the Pull Request / Additional comments

- **Scope**
- Updated `ShortcutDescriptionToKeysConverter` in `ShortcutGuide.Ui`
only.

- **Behavior change**
- Numeric key codes are no longer passed through as raw integers by
default.
- Arrow keys (`37/38/39/40`) remain numeric to preserve existing glyph
rendering behavior.
- All other numeric key codes are converted to display names via
`Helper.GetKeyName(...)`.

- **Result**
- Shortcut Guide key caps now show expected characters/key names instead
of numeric values for manifest-provided numeric keys.

```csharp
if (int.TryParse(key, out int keyCode))
{
    switch (keyCode)
    {
        case 38:
        case 40:
        case 37:
        case 39:
            shortcutList.Add(keyCode); // keep glyph path
            break;
        default:
            shortcutList.Add(Helper.GetKeyName((uint)keyCode)); // show key label
            break;
    }
}
```

## Validation Steps Performed

No additional validation details are included in this description.

> [!WARNING]
>
> <details>
> <summary>Firewall rules blocked me from connecting to one or more
addresses (expand for details)</summary>
>
> #### I tried to connect to the following addresses, but was blocked by
firewall rules:
>
> - `o3svsblobprodcus318.vsblob.vsassets.io`
> - Triggering command: `/usr/bin/dotnet dotnet build
/home/REDACTED/work/PowerToys/PowerToys/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuide.Ui.csproj
-v minimal` (dns block)
>
> If you need me to access, download, or install something from one of
these locations, you can either:
>
> - Configure [Actions setup
steps](https://gh.io/copilot/actions-setup-steps) to set up my
environment, which run before the firewall is enabled
> - Add the appropriate URLs or hosts to the custom allowlist in this
repository's [Copilot coding agent
settings](https://github.com/microsoft/PowerToys/settings/copilot/coding_agent)
(admins only)
>
> </details>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
Co-authored-by: Noraa Junker <noraa.junker@outlook.com>
2026-05-22 11:08:32 +08:00
Niels Laute
8af6a99136 Settings UX tweaks (#48024)
This PR:

- Adds a MaxWidth to the SCOOBE and OOBE pages, inline with Fluent
design guidance
- Updates the imagery for PowerToys
- Tweaks some small nits in the General settings page: re-ordering,
adding icons, replacing a ToggleSwitch with a CheckBox

<img width="1774" height="1325" alt="image"
src="https://github.com/user-attachments/assets/d825047a-27be-4e8b-a6ce-7f1a71f39dfe"
/>
2026-05-21 17:28:40 +02:00
Noraa Junker
9699d8a802 Shortcut Guide V2 (#40834)
## Summary of the Pull Request


https://github.com/user-attachments/assets/f4afdaf8-2830-4993-82ea-1ee9a6978e4c


<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: Status: #890 #15405 #179 #129 #22419 #31289 #47297 #47464
#44816
- [x] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [x] **Localization:** All end-user-facing strings can be localized
- [x] **Dev docs:** Added/updated
- [x] **New binaries:** Added on the required places
- [x] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [x] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [x] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here:
https://github.com/MicrosoftDocs/windows-dev-docs/pull/5717

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

Work for future PRs:

- [ ] Localization of built-in shortcut files
- [ ] Further customization (we can wait on user feedback for that)
- [ ] Reimplement holding windows key
- [ ] Search bar

<details>
<summary>Images</summary>


https://github.com/user-attachments/assets/f923daa4-d713-463b-ba33-ede72b986c12

<img width="726" height="1388" alt="image"
src="https://github.com/user-attachments/assets/781eff9a-2863-44be-bbe2-25371ef8838e"
/>
<img width="624" height="351" alt="image"
src="https://github.com/user-attachments/assets/ec8a44db-afbc-4e28-8285-ba2a9e345fb9"
/>
<img width="712" height="1086" alt="image"
src="https://github.com/user-attachments/assets/5a3775fc-36e9-4971-8d3f-491e8f8da45a"
/>
<img width="726" height="134" alt="image"
src="https://github.com/user-attachments/assets/7d0a8b1f-d10e-4466-820c-b3efdc5f3c84"
/>


</details>




<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

---------

Co-authored-by: Gordon Lam (SH) <yeelam@microsoft.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Muyuan Li <116717757+MuyuanMS@users.noreply.github.com>
Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
2026-05-21 17:27:52 +02:00
moooyo
5b16a8c945 fix(PowerDisplay): close window on Escape key (#48016) (#48026)
The PowerDisplay flyout had no keyboard close path: pressing Tab kept
focus inside the window so it never deactivated, and there was no
KeyDown / KeyboardAccelerator wired up. Handle Escape on RootGrid to
hide the window, matching the behavior of other PowerToys flyouts.

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

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #48016
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 12:59:07 +02:00
Muyuan Li
fa2b7f6e5f Fix VALID_LABELS mismatches in auto-label-issues workflow (#48027)
## Summary

Corrects four label names in the \VALID_LABELS\ allow-list of the
\uto-label-issues.yml\ workflow to match existing repository labels
exactly.

## Root Cause

The GitHub Actions \ddLabels\ API creates a brand-new label when the
name doesn't exactly match an existing one. The hardcoded list had
typos/mismatches:

| Workflow had | Repo actually has |
|---|---|
| \Product-Power Display\ | \Product-PowerDisplay\ |
| \Product-ColorPicker\ | \Product-Color Picker\ |
| \Product-Command Not Found\ | \Product-CommandNotFound\ |
| \Product-Hosts\ | \Product-Hosts File Editor\ |

## Changes

- Fixed all 4 label strings in \VALID_LABELS\ array
- Deleted the spurious \Product-Power Display\ label that was created by
the mismatch

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:58:46 +02:00
moooyo
f117bfc64e feat(PowerDisplay): migrate legacy "{Source}_{EdidId}_{N}" Ids to new stable ID (#47977)
Carry per-monitor user preferences from the pre-#47712 Id format onto
the current DevicePath-based Ids by matching on EdidId. Without this,
every upgrade silently resets Enable* toggles (input source, color
temperature, power state) for monitors users had already opted in on,
because the direct-Id lookup in ApplyPreservedUserSettings can never
match the old "DDC_DELD1A8_1" / "WMI_BOE0900_2" keys.

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

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [ ] Closes: #xxx
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

---------

Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:21:20 +08:00
Niels Laute
52bf042df2 [Workspaces] Move to WPF Fluent and tweak overall UX (#46172)
<!-- 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

This PR includes the following changes:
- Remove the dependency of ControlzEx and ModernWpf, and instead uses
the default WPF Fluent theming. No more third-party packages.
- A lot of UI design refinements: using the proper fontweights, spacing,
Mica background, and default Fluent styles.
- Usability improvements: action buttons are at the top, full width
scrolling.

Related: #46220

<img width="1209" height="879" alt="image"
src="https://github.com/user-attachments/assets/132cdb9a-aa73-4aa2-88b0-c36031b4aea3"
/>


<img width="1060" height="980" alt="image"
src="https://github.com/user-attachments/assets/a04f83d4-74d3-466c-9d5c-f193f436337b"
/>



<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [ ] Closes: #xxx
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

---------

Co-authored-by: Jay <65828559+Jay-o-Way@users.noreply.github.com>
Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
2026-05-21 07:54:19 +02:00
Mike Griese
2fc27b13b6 CmdPal: Fix opening a IPage from a context menu on a dock item (#47991)
Currently, if the user clicks on a dock item which is a Page command,
then we'll attempt to show the cmdpal where the user clicked on a dock
item. This works great. However, if the user right-clicks a dock item to
invoke the context menu, then from that menu clicks on a Page command,
then nothing happens - we don't show the cmdpal window.

Similarly - IInvokableCommand's that return a CommandResult.Confirm - we
never show the cmdpal window so that the confirmation ContentDialog is
shown to the user.

Yes in the long run, these will make more sense to have a better UI for
the "dock flyout" (see #45861). But until then, this fixes these
scenarios.

Closes #45963

very relevant for #47989
2026-05-20 16:03:07 -05:00
Dave Rayment
94b7e3eea2 [Image Resizer] Automatically reload settings changes (#45266)
## Summary of the Pull Request

This PR introduces real-time settings synchronisation for Image Resizer.
External changes to `settings.json` (via the Settings application or
manual edits to the file) are detected and reloaded immediately without
requiring a restart.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #36943
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [x] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

### Reload updates
The reload detection is via an `IFileSystemWatcher` (as file system
operations are abstracted in Image Resizer), which monitors the
`settings.json` file for creation and changes. There is a half second
debounce for changes, as the settings file can rapidly change when the
user is editing the preset name field.

Hot reloading of the properties required refactoring `ReloadCore`, which
replaces the `Sizes` preset collection and updates the Custom and AI
presets, in addition to the application-wide properties like compression
options and the fallback encoder choice.

I changed the combo box data binding from the `SelectedSize` object to
the int `SelectedSizeIndex`. This was required to resolve a specific WPF
issue where reloading the `Sizes` collection would cause issues with
restoring the current combo box selection to the prior value. Binding to
the index decouples the selection state from the object lifecycle during
the reload process.

Selection preservation is based on the preset ID (for user presets) and
preset type (for Custom and AI presets). This ensures that matches are
robust even if the user is in the process of renaming an entry in the
Settings application. If the preset cannot be matched (for example, if
the user deletes the item or changes the ID manually in the file), the
Custom preset is selected.

Selection range checks are maintained from the old code, and additional
checks have been added to ensure that Custom and AI presets will be
present even if they're deleted from the settings file.

The AI preset check from before has been inlined; this guarantees that
the AI resize option will not display if the facility is unavailable on
the current PC, even if it's present in the settings file.

The reload routine is dispatched to the UI thread, as changes involve
updates to the combo box.

### ID recovery
Preset IDs are key to preserving the combo box selection between
reloads, and a couple of changes were necessary to ensure round-tripping
changes were robust.

1. IDs are not reused. The old code could reuse IDs under certain
circumstances, for example if a preset was deleted and re-added via
Settings.
2. The ID Recovery Helper routine sorted the supplied presets by ID
before performing duplicate conflict resolution. This is not required
and it is more natural to assume that the order in the settings file and
the client UI is the source of truth.

New ID assignment is now based on a monotonically increasing ID (seeded
at application start) rather than `Current Maximum ID + 1`. This means
that IDs cannot be reused in the same Settings application session. This
makes the matching process in the client application more reliable.

A small update was made to the ID Recovery Helper to use `HashSet.Add()`
instead of splitting up the check and addition steps (`Add` will return
false if the value already exists), which saves a massive one line of
code.

There were comments about the ID Recovery Helper resolving "empty" or
"invalid" entries; this was inaccurate, as IDs are ints, which must by
definition always have a valid value. The routine only guards against
duplicates, so the comments have been updated to reflect this.

### Miscellaneous
The `Default` Settings property getter previously called `Reload` every
time it was accessed. This is fine when the file is only read at
application startup, but I changed this to lazily instantiate and call
`Reload` a single time.

I refactored duplicate code related to settings file/folder strings, and
also the creation of the Custom and AI size instances.

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

Manual testing:
1. Add new preset in the Settings application. The new entry is
reflected in the client application as it is running.
2. Delete new preset. The entry is removed in the client application
list.
3. Edit an existing preset. The property change is reflected in the
client application.
4. Add new preset in the Settings application. Select the new preset in
the client application. Edit the properties of the new preset in the
Settings application and confirm that the updates appear in the client
application.
5. Add new preset in the Settings application. Select the new preset in
the client application. Delete the new preset in Settings. Confirm that
the current preset is removed and the selection changes to the default
in the client application.
6. Change one or more application-wide properties in the settings file
which are represented in the client application, too, e.g. "Make
pictures smaller but not larger" (`imageresizer_shrinkOnly`) or
"Overwrite files" (`imageresizer_replace`). Upon saving, confirm the
checkbox changes immediately in the client application.
7. Edit the `settings.json` file manually by e.g. adding a new Size
preset or editing the width or height property of an existing preset.
Upon saving, the change(s) should be reflected in the client
application.
8. Make a change to an existing or new preset which affects the resize
operation itself, e.g. the dimensions or the "Make pictures smaller but
not larger" setting. Proceed with the resize operation and confirm that
the new changes have been applied.

14 new unit tests have been added to `SetingsTests.cs` to exercise the
`Settings` and `IDRecoveryHelper` functionality.

---------

Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 12:18:12 +00:00
Gordon Lam
c334f1d997 [CI] Sign Google.Apis.* and Google.GenAI DLLs (AdvancedPaste Gemini deps) (#48001)
## Summary

Adds the four Google.* DLLs shipped by AdvancedPaste (via
`Microsoft.SemanticKernel.Connectors.Google` for Gemini support) to the
ESRP sign list.

## Problem

The `Verify all binaries are signed and versioned` pipeline step
(`.pipelines/versionAndSignCheck.ps1`) was failing with:

```
Not Signed:  + ...\extractedMachineMsi\File\WinUI3ApplicationsFiles_File_Google.Apis.Auth.dll
Not Signed:  + ...\extractedMachineMsi\File\WinUI3ApplicationsFiles_File_Google.Apis.Core.dll
Not Signed:  + ...\extractedMachineMsi\File\WinUI3ApplicationsFiles_File_Google.Apis.dll
Not Signed:  + ...\extractedMachineMsi\File\WinUI3ApplicationsFiles_File_Google.GenAI.dll
```

These DLLs are transitive NuGet dependencies of
`Microsoft.SemanticKernel.Connectors.Google` (referenced by
`src/modules/AdvancedPaste/AdvancedPaste/AdvancedPaste.csproj`) and
deploy to `WinUI3Apps\`, but were never added to
`.pipelines/ESRPSigning_core.json`.

## Fix

Added the four DLLs to the second `SignBatch` (`CP-231522`, the
third-party / OSS-library identity) — same batch used for other
connector DLLs like `OpenAI.dll`, `OllamaSharp.dll` and
`Microsoft.SemanticKernel.Connectors.Ollama.dll`.

## Validation

- `ConvertFrom-Json` on the modified file confirms valid JSON.
- Sign-list entries match the actual deploy paths flagged by
`versionAndSignCheck.ps1`.
- The next ESRP signing run will pick them up; the verify step should
pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 17:45:56 +08:00
moooyo
8e74eb2ba8 [PowerDisplay] Auto-disable on detected DDC/CI capability fetch crash (#47556) (#47734)
<!-- 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

Mitigation for issue #47556 — `KERNEL_SECURITY_CHECK_FAILURE` BSOD
originating in `win32kfull!DdcciGetCapabilitiesStringFromMonitor` when
PowerDisplay calls DDC/CI capability APIs against monitors with
malformed capability strings.

After a detected crash, PowerDisplay auto-disables itself via
`settings.json`, shows an error InfoBar at the top of the PowerDisplay
settings page (page is locked except the Ignore button), so users can
avoid getting stuck in an infinite reboot loop after a crash. And the
user must explicitly dismiss the warning before re-enabling the module.

The actual kernel-side fix is the Windows team's responsibility — this
PR only prevents users from BSOD-ing repeatedly on the same monitor
without warning.

settings page:
<img width="1743" height="1475" alt="image"
src="https://github.com/user-attachments/assets/8cf1b72f-c51a-4955-82d7-213cae49fd4e"
/>


## Mechanism

1. `CrashDetectionScope` IDisposable wraps Phase 2 capability fetch in
`DdcCiController.DiscoverMonitorsAsync`, writing `discovery.lock`
(`WriteThrough` + `Flush(flushToDisk: true)`) before, deleting it on
Dispose.
2. If the process is killed externally (BSOD, FailFast), the lock
survives.
3. On next PowerDisplay.exe startup (Phase 0), `CrashRecovery` detects
the orphan lock and runs a strict fail-fast sequence: write
`crash_detected.flag` → set `enabled.PowerDisplay=false` in global
`settings.json` → signal the new `POWER_DISPLAY_AUTO_DISABLE_EVENT` →
delete the lock (commit point).
4. The runner-loaded `PowerDisplayModuleInterface.dll` runs a one-shot
listener thread that wakes on the event and calls `disable()` to sync
`m_enabled`.
5. `PowerDisplayViewModel` reads the flag at construction and binds
`IsCrashLockActive` to lock the page.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #47556 
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

---------

Co-authored-by: Yu Leng <yuleng@microsoft.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 16:13:16 +08:00
Mike Griese
da9a08aa92 CmdPal: Add support for drag-drop bookmarking to the dock (#47989)
This allows users to drag files & URLS to the dock, to immediately
create a bookmark, and pin that bookmark to the dock.

It also updates the bookmark provider's dock bands. If you bookmark a
folder, then pin that to the dock, when you click it on the dock, we'll
default to the "browse" experience, which will open the list of files in
cmdpal, rather than open in explorer.

Had to make miscellaneous changes to make this all a bit faster:
* DirectoryPage didn't load icons smartly, like we do for bookmarks
* I added a different "observable" collection for dock top-level items,
because it caused a flippin CollectionChanged cascade any time a single
provider had more than one item pinned in the dock. Each item from each
provider would cause us to recreate all the dock view models (???) crazy
* I alas had to make `IBookmarksManager` public, so that the UI could
use it. I hate it, but I couldn't figure out a better way. Bookmarks are
a pretty built-in part, so it's _fine i guess_

re: #45584
2026-05-19 16:49:33 -05:00
Jessica Dene Earley-Cha
b893d633d9 [TEST Version] Event PR Check (#47889)
<!-- 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

This PR checks if future PRs has added or refines telemetry events, if
so, the bot will add a message to the PR about the needed steps
depending on the PR.

**NOTE**: This PR is submitting a test version, which is only manually
triggered, once tested and confirmed then will move to it being
automatic


<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [ ] Closes: #xxx
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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
2026-05-19 17:28:57 +00:00
Dave Rayment
a7bc09a87a [QuickAccent] Fix UI glitches, DPI-related issues, selection bugs, and add hardware shift key state fallback (#46593)
## Summary of the Pull Request
This PR fixes several issues around the popup selection window's size
and position, selection-related issues which result in flashing or
glitching, and includes more reliable detection of the Shift key.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #44332
- [x] Closes: #44980
- [x] Closes: #35094 
- [x] Closes: #40498
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #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

This PR includes fixes for the Quick Accent's selection window position,
its width measurement, and letter selection-related issues. In addition,
glitches such as the window flashing the selection colour and the window
appearing blank should be reduced or eliminated entirely.

### Popup width bug

When opening Quick Accent from a letter with many mappings, it would
appear too wide for the display. Even though letters could be selected,
they may be entirely off-screen:

<img width="1578" height="134" alt="image"
src="https://github.com/user-attachments/assets/cfcb2ddb-3cf3-47d5-9386-133a2fc70550"
/>

This was because of this flaw in `GetDisplayMaxWidth`, which is used
directly by the popup to set the maximum width of the characters area:

```csharp
    // In Selector.xaml.cs
    private void SetWindowsSize()
    {
        this.characters.MaxWidth = _powerAccent.GetDisplayMaxWidth();
    }

...
    // In PowerAccent.cs
    public double GetDisplayMaxWidth()
    {
        return WindowsFunctions.GetActiveDisplay().Size.Width - ScreenMinPadding;
    }
```

`GetActiveDisplay` uses the `GetMonitorInfo` API, which exposes the
working area of the display. It returns its values in _raw unscaled
pixel_ values:

```csharp
    public static (Point Location, Size Size, double Dpi) GetActiveDisplay()
    {
        ...
        var res = PInvoke.MonitorFromWindow(guiInfo.hwndActive, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
        MONITORINFO monitorInfo = default;
        monitorInfo.cbSize = (uint)Marshal.SizeOf(monitorInfo);
        PInvoke.GetMonitorInfo(res, ref monitorInfo);

        ...

        return (location, monitorInfo.rcWork.Size, dpi);
    }
```

However, the `MaxWidth` property must be a _pre-scaled_ value, i.e. in
logical WPF units not physical pixels. The fix is straightforward:

```csharp
    public double GetDisplayMaxWidth()
    {
        var activeDisplay = WindowsFunctions.GetActiveDisplay();
        return (activeDisplay.Size.Width / activeDisplay.Dpi) - ScreenMinPadding;
    }
```

### Popup positioning bug

This is related to a subtle DPI issue in `GetActiveDisplay()`:

```csharp
    public static (Point Location, Size Size, double Dpi) GetActiveDisplay()
    {
        GUITHREADINFO guiInfo = default;
        guiInfo.cbSize = (uint)Marshal.SizeOf(guiInfo);
        PInvoke.GetGUIThreadInfo(0, ref guiInfo);
        var res = PInvoke.MonitorFromWindow(guiInfo.hwndActive, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);

        MONITORINFO monitorInfo = default;
        monitorInfo.cbSize = (uint)Marshal.SizeOf(monitorInfo);
        PInvoke.GetMonitorInfo(res, ref monitorInfo);

        double dpi = PInvoke.GetDpiForWindow(guiInfo.hwndActive) / 96d;
        var location = new Point(monitorInfo.rcWork.left, monitorInfo.rcWork.top);
        return (location, monitorInfo.rcWork.Size, dpi);
    }
```

Here, the application window's DPI is returned. Unfortunately, the
window may report a value which is different from the monitor's own DPI
value. This will consistently happen if the application is not
Per-Monitor DPI-Aware, and the monitor is not at 100% Scale. The effects
are that the Quick Accent popup can appear misaligned or even off-screen
entirely. Quick Accent can still be used, but the user may not be able
to see what they are selecting.

As Quick Accent is using monitor coordinates for setting its location,
the solution is to use the monitor's own DPI value. The fix is to add
this in place of the `GetDpiForWindow` line:

```csharp
        uint dpiRaw = 96; // Safe default
        if (PInvoke.GetDpiForMonitor(res, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out uint dpiX, out _) == 0)
        {
            dpiRaw = dpiX;
        }

        double dpi = dpiRaw / 96d;
```

### Selection bugs

After dismissing the Quick Accent window, the `_selectedIndex` state was
not properly reset. The next time the window opened, it could attempt to
scroll to or highlight an index that was out-of-bounds for the new
character set. This could result in glitching, such as the window
flashing the selection colour or the initial selection being incorrect.
In this fix, I:

1. Explicitly set `_selectedIndex` to `-1` when the UI hides.
2. Reset the `SelectedIndex` inside Selector.xaml.cs before updating the
`ItemsSource`.

### Shift key activation

In certain cases, a quick press of Shift could fail to move back through
the character list. In this fix, I:

1. Added a native fallback usign GetAsyncKeyState(VK_SHIFT).
2. Updated `ProcessNextChar()` to evaluate `shiftPressed ||
WindowsFunctions.IsShiftState()`.
3. Updated the multiple `if`s in `ProcessNextChar` to be an if/else
structure, to prevent bugs when more than one trigger key is pressed.

### Support added for multi-codepoint graphemes

The current code loops through each `char` of a mapping, calling
`SendInput` multiple times for multi-char sequences. This will fail for
multi-codepoint graphemes, i.e. where the mapping 'letter' is more than
one UTF-16 codepoint. Those characters may appear as `[]`. The amended
`Insert()` in `WindowsFunctions` appends all characters before calling
`SendInput`.

### Miscelleneous

- Added an `OnDpiChanged` handler for the Selector control, so changing
the DPI of the screen should be picked up automatically. (It's
questionable whether this is essential, as the DPI would have to change
while the control was displayed, but it's worth having for robustness.)
- Now using `SetWindowPos` instead of setting the `Left` and `Top` of
the popup control. Also now initialising the popup offscreen to attempt
to reduce flicker and the occurrence of blank window flashes.
- Changed the `Focusable` property of the characters `ListBox` to
`False`, to attempt to reduce flicker and the window flashing the
selector colour.
- Removed `Width` and added `MinWidth` to the letter control in
Selector.xaml. This allows for wider letters or longer multi-letter
mappings.
- Changed the `VirtualizingStackPanel` to a regular `StackPanel`. We do
not have mappings with enough entries for a virtual control to be
necessary, and using StackPanel seemed to have a positive effect on the
appearance of blank window glitches.
- Added `TextTrimming`, `TextWrapping` and `MaxHeight` to the unicode
description `TextBlock`. This helps support extremely long unicode
descriptions. Again, this will enable us to support longer
multi-character mappings in the future.
- Added CsWin32 to the PowerAccent.UI project, to support the
`SetWindowPos` call.

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

See separate doc for full test details:


https://docs.google.com/document/d/19uClcUiv7RUDRlbFhazG-Cmu46oNmrAVoJf9bHSjSJU/edit?usp=sharing

---------

Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
2026-05-20 00:20:03 +08:00
Marco Guido
6e9b3b1536 [PowerAccent] adding greek polytonic (#47021)
Adds Greek Polytonic characters set to power accent, based on
https://github.com/microsoft/PowerToys/pull/29709
### PR Checklist

- [x]  Closes #46941
- [x] Communication: I've discussed this with core contributors already.
- [ ] Tests: Not sure if there are specific tests for this
- [ ] Documentation updated: Power accent docs

### Detailed Description of the Pull Request / Additional comments
Added all greek polytonic letters to their corresponding english letter
(some duplicated)
(if you wondered about GRC -> ISO 639-3)

### Validation Steps Performed
Compiled and Observed Power Accent

---------

Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Dave Rayment <dave.rayment@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 00:19:06 +08:00
Gordon Lam
d973bcbcaa Update Microsoft.SemanticKernel packages from 1.66.0 to 1.71.0 (#47819)
## Summary

Updates the `Microsoft.SemanticKernel` package family from 1.66.0 to
1.71.0 to pick up upstream improvements and bug fixes from the Semantic
Kernel project.

> Note: the `Connectors.AzureAIInference` (`-beta`), `Connectors.Google`
/ `Connectors.MistralAI` / `Connectors.Ollama` (`-alpha`) packages have
no stable upstream release yet, but are required to keep the existing
Advanced Paste AI provider options working.


## Packages updated

**SemanticKernel family:**

| Package | From | To |
|---------|------|----|
| `Microsoft.SemanticKernel` | 1.66.0 | 1.71.0 |
| `Microsoft.SemanticKernel.Connectors.OpenAI` | 1.66.0 | 1.71.0 |
| `Microsoft.SemanticKernel.Connectors.AzureAIInference` | 1.66.0-beta |
1.71.0-beta |
| `Microsoft.SemanticKernel.Connectors.Google` | 1.66.0-alpha |
1.71.0-alpha |
| `Microsoft.SemanticKernel.Connectors.MistralAI` | 1.66.0-alpha |
1.71.0-alpha |
| `Microsoft.SemanticKernel.Connectors.Ollama` | 1.66.0-alpha |
1.71.0-alpha |

**Transitive dependencies bumped to satisfy SK 1.71's resolution
constraints:**

| Package | From | To |
|---------|------|----|
| `Microsoft.Extensions.AI` | 9.9.1 | 10.2.0 |
| `Microsoft.Extensions.AI.OpenAI` | 9.9.1-preview.1.25474.6 |
10.0.1-preview.1.25571.5 |
| `System.Numerics.Tensors` | 9.0.11 | 10.0.2 |
| `Newtonsoft.Json` | 13.0.3 | 13.0.4 |
| `OpenAI` | 2.5.0 | 2.7.0 |
| `System.ClientModel` | 1.7.0 | 1.8.0 |

These transitive bumps were required to avoid `NU1109` package-downgrade
errors after the SK upgrade.

## Scope

- `Directory.Packages.props` only  central package version bumps.
- No source-code changes.

## Consumers

- AdvancedPaste uses the SK `Kernel` / `IChatCompletionService` /
connector surfaces unchanged.
- `LanguageModelProvider` and `FoundryLocalPasteProvider` use the stable
`Microsoft.Extensions.AI` `IChatClient` / `ChatMessage` / `ChatRole` /
`ChatResponse` / `AsIChatClient()` types unchanged across 9.x to 10.x.

## Validation

- Static API-surface review of all SK / `Microsoft.Extensions.AI` call
sites only stable types in use.
- CI build pipeline will provide the full restore + compile verification
across the solution.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 10:25:41 +02:00
Niels Laute
02fbb916a7 [Quick Accent] Remove wpfui (#46604)
## Summary of the Pull Request

<img
src="https://github.com/user-attachments/assets/8756671f-642a-4bbd-a174-eb13b02cfe59">

This PR removes the dependency on the WpfUI library and uses plain WPF.

## PR Checklist

- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx

## Detailed Description of the Pull Request / Additional comments

- Replaced `ui:FluentWindow` with a standard WPF `Window` and removed
the `xmlns:ui` WpfUI namespace
- Replaced `<Rectangle.Fill><SolidColorBrush /></Rectangle.Fill>` with
an inline `Fill=` attribute on the selection indicator rectangle
- Simplified `App.xaml` by removing WpfUI theme/controls resource
dictionaries and using `ThemeMode="System"` instead
- Fixed XAML formatting: converted empty `<Application>` to a
self-closing tag, removed extra blank lines in `Window.Resources` and
inside `ControlTemplate`

## Validation Steps Performed

- Manually verified the Quick Accent overlay renders correctly with
accent character selection and character name display

<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/microsoft/PowerToys/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 08:13:00 +00:00
338 changed files with 36108 additions and 7234 deletions

View File

@@ -51,6 +51,7 @@ resw
resx
srt
Stereolithography
taskmgr
terabyte
UYVY
xbf
@@ -307,8 +308,11 @@ pwa
AOT
Aot
cswinrt
ify
rsp
TFM
RTIID
# YML
onefuzz
@@ -336,6 +340,10 @@ MRUCMPPROC
MRUINFO
REGSTR
#Xaml
NVI
Storyboards
# Misc Win32 APIs and PInvokes
DEFAULTTONEAREST
INVOKEIDLIST
@@ -360,7 +368,10 @@ FILESYSONLY
URLIS
WAITTIMEOUT
DEFAULTTONEAREST
DWRITE
LWIN
VCENTER
VREDRAW
# COM/WinRT interface prefixes and type fragments
BAlt

View File

@@ -1,6 +1,7 @@
AAAAs
abcdefghjkmnpqrstuvxyz
abgr
ABlocked
ABORTIFHUNG
ABOUTBOX
Abug
@@ -10,13 +11,18 @@ ACCESSDENIED
ACCESSTOKEN
acfs
ACIE
AClient
AColumn
ACR
acrt
ACTIVATEAPP
ACTIVATEOPTIONS
activationaction
adaptivecards
ADate
ADDSTRING
ADDUNDORECORD
ADifferent
ADMINS
adml
admx
@@ -25,12 +31,15 @@ advapi
advfirewall
AFeature
affordances
afterfx
AFX
agentskills
AGGREGATABLE
AHK
AHybrid
AIUI
akv
ALarger
ALIGNRIGHT
ALLAPPS
ALLCHILDREN
@@ -42,13 +51,17 @@ ALLOWUNDO
ALLVIEW
ALPHATYPE
altkey
AModifier
amr
ANDSCANS
animatedvisuals
Animnate
ANull
AOC
aocfnapldcnfbofgmbbllojgocaelgdd
AOklab
aot
APeriod
apicontract
apidl
APIENTRY
@@ -74,19 +87,24 @@ appxpackage
APSTUDIO
AQS
Aquadrant
ARandom
ARCHITEW
ARemapped
ARPINSTALLLOCATION
ARPPRODUCTICON
ARRAYSIZE
ARROWKEYS
arrowshape
artboard
ARTIFACTSTAGINGDIRECTORY
asf
Ashcraft
AShortcut
ASingle
ASSOCCHANGED
ASSOCF
ASSOCSTR
ASUS
ASYNCWINDOWPLACEMENT
ASYNCWINDOWPOS
atl
@@ -144,7 +162,9 @@ bluelightreductionstate
BLURBEHIND
BLURREGION
bmi
BNumber
BODGY
BOklab
BOOTSTRAPPERINSTALLFOLDER
Bootstrappers
BOTTOMALIGN
@@ -156,6 +176,7 @@ breadcrumb
Browsable
BROWSEINFO
bsd
BSOD
bthprops
bti
BTNFACE
@@ -166,6 +187,8 @@ BUILDNUMBER
buildtransitive
builttoroam
BUNDLEINFO
BVal
BValue
byapp
BYCOMMAND
BYPOSITION
@@ -181,13 +204,18 @@ CAPTURECHANGED
CARETBLINKING
carlos
Carlseibert
CAtl
caub
CBN
cch
CCHDEVICENAME
CCHFORMNAME
CCom
CContext
CDeclaration
CDPX
Cds
CElems
CENTERALIGN
cer
certlm
@@ -200,10 +228,13 @@ checkmarks
CHILDACTIVATE
CHILDWINDOW
CHOOSEFONT
chu
Chunghwa
CIBUILD
cidl
CIELCh
cim
CImage
cla
CLASSDC
classguid
@@ -222,6 +253,7 @@ CLIPSIBLINGS
closesocket
clp
CLSCTX
CLSIDs
clsids
Clusion
cmder
@@ -231,6 +263,7 @@ CMIC
CMINVOKECOMMANDINFO
CMINVOKECOMMANDINFOEX
CMN
CMock
CMONITORS
cmph
CNF
@@ -287,6 +320,7 @@ Cowait
cpcontrols
cph
cplusplus
CPower
cpptools
cppvsdbg
cppwinrt
@@ -305,9 +339,14 @@ CROPTOSQUARE
Crossdevice
crt
csdevkit
CSearch
CSettings
cso
CSOT
CSRW
CStyle
cswin
CTest
CTEXT
CTLCOLORSTATIC
CURRENTDIR
@@ -318,7 +357,9 @@ cursorwrap
customaction
CUSTOMACTIONTEST
CUSTOMFORMATPLACEHOLDER
CVal
cvd
CVirtual
CWMO
CXSCREEN
CXSMICON
@@ -331,7 +372,9 @@ Dac
dacl
DAffine
DAFFINETRANSFORM
DArchitectures
datareader
Datasheet
datatracker
Dayof
dbcc
@@ -345,6 +388,7 @@ DBT
DCapabilities
DCBA
DCOM
DComposition
DCR
ddc
DDEIf
@@ -361,6 +405,7 @@ DEFAULTICON
defaultlib
DEFAULTONLY
DEFAULTSIZE
defaulttonearest
DEFAULTTONULL
DEFAULTTOPRIMARY
DEFERERASE
@@ -368,6 +413,7 @@ DEFPUSHBUTTON
deinitialization
DELA
DELD
deld
DELETEDKEYIMAGE
DELETESCANS
DEMOTYPE
@@ -408,6 +454,7 @@ DISPLAYFREQUENCY
displayname
DISPLAYORIENTATION
DISPLAYPORT
diu
divyan
DLGFRAME
dlgmodalframe
@@ -463,10 +510,12 @@ DWMWINDOWATTRIBUTE
DWMWINDOWMAXIMIZEDCHANGE
DWORDLONG
dworigin
dwrite
DWRITE
dxgi
Dxva
eab
EAccess
easeofaccess
ecount
edid
@@ -474,6 +523,8 @@ EDITKEYBOARD
EDITSHORTCUTS
EDITTEXT
eep
EFile
EInvalid
eku
emojis
ENABLEDELAYEDEXPANSION
@@ -483,18 +534,21 @@ ENABLETEMPLATE
encodedlaunch
encryptor
ENDSESSION
ENot
ENSUREVISIBLE
ENTERSIZEMOVE
ENTRYW
ENU
environmentvariables
EPO
EProvider
epu
ERASEBKGND
EREOF
EResize
ERRORIMAGE
ERRORTITLE
ESettings
esrp
etd
ETDT
@@ -537,11 +591,13 @@ FANCYZONESEDITOR
FARPROC
fdw
fdx
FErase
fesf
FFFF
fffffffzzz
FFh
Figma
figma
FILEEXPLORER
fileexploreraddons
fileexplorerpreview
@@ -562,13 +618,16 @@ FILESYSPATH
Filetime
FILEVERSION
FILTERMODE
FInc
findfast
findmymouse
FIXEDFILEINFO
FIXEDSYS
flac
flyouts
FMask
fmtid
FNumber
FOF
FOFX
FOLDERID
@@ -581,6 +640,7 @@ formatetc
FORPARSING
foundrylocal
framechanged
FRestore
frm
FROMTOUCH
fsanitize
@@ -620,6 +680,7 @@ gfx
GHND
gitmodules
GMEM
GNumber
googleai
googlegemini
Gotchas
@@ -631,17 +692,21 @@ gpu
grabandmove
GRABANDMOVEMODULEINTERFACE
gradians
GRC
grctlext
GRGX
Gridcustomlayout
gridlines
GSM
gtm
guiddata
GUITHREADINFO
GValue
gwl
GWLP
GWLSTYLE
hangeul
Hann
Hantai
Hanzi
Hardlines
@@ -674,6 +739,7 @@ hgdiobj
HGFE
hglobal
hhk
HHmmssfff
hhx
Hiber
Hiberboot
@@ -713,6 +779,7 @@ HORZSIZE
Hostbackdropbrush
hostfxr
hostsfileeditor
Hostx
hotfixes
hotkeycontrol
HOTKEYF
@@ -720,6 +787,8 @@ hotkeys
hotlight
hotspot
HPAINTBUFFER
HPhysical
HPS
HRAWINPUT
HREDRAW
hres
@@ -729,11 +798,15 @@ HROW
hsb
HSCROLL
hsi
HSpeed
HSync
HTCLIENT
hthumbnail
HTOUCHINPUT
HTTRANSPARENT
hutchinsoniana
HVal
HValue
Hvci
hwb
HWHEEL
@@ -744,6 +817,7 @@ HWNDLAST
HWNDNEXT
HWNDPARENT
HWNDPREV
HWP
hyjiacan
IAI
icf
@@ -783,6 +857,7 @@ imgflip
inapp
inbox
INCONTACT
indesign
Indo
inetcpl
Infobar
@@ -793,6 +868,7 @@ INITDIALOG
INITGUID
initialfile
INITTOLOGFONTSTRUCT
inkscape
INLINEPREFIX
inlines
Inno
@@ -823,6 +899,7 @@ INVALIDARG
invalidoperatioexception
invokecommand
ipcmanager
IPREVIEW
ipreviewhandlervisualssetfont
IPTC
irow
@@ -836,13 +913,17 @@ issecret
ISSEPARATOR
issuecomment
istep
Italicise
ith
ITHUMBNAIL
IUI
IUWP
IVO
IWIC
jeli
jfif
jgeosdfsdsgmkedfgdfgdfgbkmhcgcflmi
JIDEA
jjw
jobject
JOBOBJECT
@@ -854,6 +935,8 @@ Jsons
jsonval
jxr
Kantai
KBSC
kdc
keybd
KEYBDDATA
KEYBDINPUT
@@ -871,6 +954,7 @@ keynum
keyremaps
keyring
keyvault
kfull
KILLFOCUS
killrunner
kmph
@@ -897,6 +981,7 @@ LEFTTEXT
Lenovo
LError
LEVELID
LExit
LFU
LGD
lhwnd
@@ -936,6 +1021,7 @@ lowlevel
LOWORD
lparam
LPBITMAPINFOHEADER
LPCFHOOKPROC
lpch
LPCITEMIDLIST
LPCLSID
@@ -954,6 +1040,7 @@ LPMONITORINFO
LPOSVERSIONINFOEXW
LPQUERY
lprc
LPrivate
LPSAFEARRAY
lpstr
lpsz
@@ -967,6 +1054,7 @@ LPW
lpwcx
lpwndpl
lquadrant
LReader
LRESULT
LSTATUS
lstrcmp
@@ -974,11 +1062,15 @@ lstrcmpi
lstrcpyn
lstrlen
LTEXT
LTM
LTRREADING
luid
LUMA
lusrmgr
LVal
LVDS
LWA
lwin
LWIN
LZero
MAGTRANSFORM
@@ -1029,6 +1121,7 @@ Mgmt
Microwaved
middleclickaction
midl
midtones
mii
MIIM
mikeclayton
@@ -1042,11 +1135,12 @@ MINMAXINFO
minwindef
Mip
Miracast
MIRACAST
miracast
mkdn
mlcfg
mmc
mmcexe
MMdd
mmi
mmsys
mobileredirect
@@ -1072,7 +1166,9 @@ mouseutils
MOVESIZEEND
MOVESIZESTART
MRM
MRT
mru
msaccess
MSAL
msc
mscorlib
@@ -1092,13 +1188,16 @@ msixbundle
MSIXCA
MSLLHOOKSTRUCT
Mso
mspub
msrc
msstore
mstsc
msvcp
mswhql
MT
MTND
multimonitor
Multiplayer
MULTIPLEUSE
multizone
muxc
@@ -1116,6 +1215,7 @@ myorg
myrepo
NAMECHANGE
namespaceanddescendants
Nanjing
nao
NCACTIVATE
ncc
@@ -1154,6 +1254,7 @@ newrow
nicksnettravels
NIF
nightlight
NLog
NLSTEXT
NMAKE
NNN
@@ -1202,6 +1303,7 @@ NORMALDISPLAY
NORMALUSER
NOSEARCH
NOSENDCHANGING
NOSIZE
nosize
notdefault
NOTHOUSANDS
@@ -1273,6 +1375,7 @@ OUTOFCONTEXT
Outptr
outputtype
outsettings
outsourced
OVERLAPPEDWINDOW
Oversampling
OVERWRITEPROMPT
@@ -1299,6 +1402,7 @@ PATINVERT
PATPAINT
pbc
pbi
PBlob
PBP
pbrush
pcb
@@ -1320,6 +1424,7 @@ pdto
pdtobj
pdw
Peb
PElems
Pels
PELSHEIGHT
PELSWIDTH
@@ -1336,12 +1441,15 @@ pguid
phbm
phbmp
phicon
PHL
Photoshop
photoshop
phwnd
pici
pidl
PIDLIST
pii
pinboard
pinfo
pinvoke
pipename
@@ -1364,7 +1472,6 @@ POINTERID
POINTERUPDATE
Pokedex
Pomodoro
Popups
popups
POPUPWINDOW
POSITIONITEM
@@ -1372,6 +1479,7 @@ POWERBROADCAST
powerdisplay
POWERDISPLAYMODULEINTERFACE
powerocr
powerpnt
POWERRENAMECONTEXTMENU
powerrenameinput
POWERRENAMETEST
@@ -1427,6 +1535,7 @@ projectname
PROPERTYKEY
PROPVARIANT
prot
Prt
PRTL
prvpane
psapi
@@ -1441,6 +1550,7 @@ psrm
psrree
pstatstg
pstm
PStr
pstream
pstrm
PSYSTEM
@@ -1451,6 +1561,7 @@ PTCHAR
ptcontrols
ptd
PTOKEN
PToy
ptstr
ptsym
pui
@@ -1461,6 +1572,7 @@ PWSTR
pwsz
pwtd
qdc
QDS
qit
QITAB
QITABENT
@@ -1472,9 +1584,12 @@ QUERYOPEN
QUEUESYNC
quickaccent
quicklinks
quickmask
QUNS
RAII
RAlt
randi
RAquadrant
rasterization
Rasterize
rasterizing
@@ -1551,6 +1666,8 @@ RIDEV
RIGHTBUTTON
RIGHTSCROLLBAR
riid
RKey
RNumber
rollups
rop
ROUNDSMALL
@@ -1588,6 +1705,7 @@ SCREENFONTS
screenruler
screensaver
screenshots
Scrollback
scrollviewer
sddl
SDKDDK
@@ -1787,6 +1905,7 @@ sublang
SUBMODULEUPDATE
subresource
sug
suntimes
Superbar
SUPPRESSMSGBOXES
sut
@@ -1862,6 +1981,7 @@ thickframe
THISCOMPONENT
threadpool
throughs
Tianma
TILEDWINDOW
TILLSON
timedate
@@ -1911,11 +2031,16 @@ UACUI
UAL
uap
UBR
UBreak
ubrk
UCallback
ucrt
ucrtd
uefi
UError
uesc
UFlags
UHash
UIA
UIDs
UIEx
@@ -1924,10 +2049,13 @@ uitests
UITo
ULONGLONG
Ultrawide
UMax
UMin
ums
uncompilable
UNCPRIORITY
UNDNAME
ungroup
UNICODETEXT
unins
uninsdeletekey
@@ -1940,10 +2068,13 @@ UNLEN
UNORM
unparsable
unremapped
Unsend
unsubscribes
untriaged
unvirtualized
unwide
unzoom
UOffset
UOI
UPDATENOW
updown
@@ -1959,6 +2090,7 @@ USEINSTALLERFORTEST
USESHOWWINDOW
USESTDHANDLES
USRDLL
UType
uuidv
uwp
uxt
@@ -1969,6 +2101,7 @@ valuegenerator
VARTYPE
vbcscompiler
vcamp
vcenter
VCENTER
vcgtq
VCINSTALLDIR
@@ -1978,6 +2111,7 @@ vcpname
VCRT
vcruntime
vcvars
VDesktop
vdupq
VERBSONLY
VERBW
@@ -1996,6 +2130,7 @@ VIRTKEY
VIRTUALDESK
VISEGRADRELAY
visiblecolorformats
visio
visualeffects
vkey
vmovl
@@ -2005,6 +2140,7 @@ vorrq
VOS
vpaddlq
vqsubq
vredraw
VREDRAW
vreinterpretq
VSC
@@ -2017,20 +2153,24 @@ VSINSTALLDIR
VSM
vso
vsonline
VSpeed
vstemplate
vstest
VSTHRD
vstprintf
VSTT
vswhere
VSync
Vtbl
WANTNUKEWARNING
WANTPALM
WASDK
wbem
WBounds
Wca
WCE
wcex
WClass
WCRAPI
wcsicmp
wcsncpy
@@ -2080,13 +2220,16 @@ winlogon
winmd
winml
WINNT
winproj
winres
winrt
winsdk
winsta
WINTHRESHOLD
WINVER
winword
winxamlmanager
wireframes
withinrafael
Withscript
wixproj
@@ -2110,6 +2253,7 @@ WNDCLASSW
wndproc
wnode
wom
workerw
WORKSPACESEDITOR
WORKSPACESLAUNCHER
WORKSPACESSNAPSHOTTOOL
@@ -2124,6 +2268,7 @@ wpr
wprp
wql
wregex
WReserved
WResize
WRITEOBJECTS
Wrk
@@ -2141,22 +2286,49 @@ Wubi
WUX
Wwanpp
xap
XAxis
XButton
Xbuttondown
xclip
xcopy
XDeployment
xdf
XDimension
XDocument
XElement
xfd
XFile
XIncrement
XLoc
xmp
XNamespace
Xoshiro
XPels
XPixel
XPos
XResource
xsi
XSpeed
XStr
xstyler
XTimer
XUP
XVIRTUALSCREEN
XXL
xxxxxx
YAxis
ycombinator
YDimension
YIncrement
yinle
yinyue
yoko
YPels
YPos
YResolution
YSpeed
YStr
YTimer
YVIRTUALSCREEN
zamora
Zenbook

View File

@@ -18,6 +18,13 @@ MIcrosoftEdgeLauncherCsharp
# marker for ignoring a comment to the end of the line
// #no-spell-check.*$
# JavaScript regex literals that start with \b can be reported as "b..." words.
# Example: /\bclass\s+.../
^\s*/\\[b].{3,}?/[gim]*\s*(?:\)(?:;|$)|,$)
# GitHub API header token used in code (not natural language).
\bx-ratelimit-reset\b
# Gaelic
Gàidhlig

324
.github/scripts/telemetry-pr-check.js vendored Normal file
View File

@@ -0,0 +1,324 @@
#!/usr/bin/env node
/**
* Detects telemetry-event additions/modifications in a pull request and
* posts (or updates) a PR comment when telemetry-related changes are found.
*
* This script is executed by .github/workflows/telemetry-pr-check.yml.
* Keep both files aligned when changing trigger behavior, env usage, or messaging.
*/
const fs = require('node:fs');
const COMMENT_MARKER = '<!-- telemetry-event-check -->';
const COMMENT_BODY_WITH_PRIVACY_UPDATE = `${COMMENT_MARKER}
THIS IS A TEST | @chatasweetie is testing this functionality
Thanks for contributing to PowerToys. This change might include a new or modified telemetry event, and we want to help make sure you can get your data end to end.
1. Reach out to Jessica (@chatasweetie) to follow up on the next steps to add these telemetry events to our pipelines.`;
const COMMENT_BODY_WITHOUT_PRIVACY_UPDATE = `${COMMENT_MARKER}
THIS IS A TEST | @chatasweetie is testing this functionality
Thanks for contributing to PowerToys. This change might include a new or modified telemetry event, and we want to help make sure you can get your data end to end.
1. Make sure to add your telemetry events to DATA_AND_PRIVACY.md.
2. Reach out to Jessica (@chatasweetie) to follow up on the next steps to add these telemetry events to our pipelines.`;
const TELEMETRY_PATH_PATTERNS = [
/(^|\/)trace\.(h|hpp|cpp|cs)$/i,
/(^|\/)telemetry\//i,
/(^|\/)events\/.+event\.cs$/i,
/^src\/common\/Telemetry\//i,
/^src\/common\/ManagedTelemetry\//i,
/^src\/runner\/trace\.(h|cpp)$/i,
/^src\/settings-ui\/.+\/Telemetry\//i,
];
const TELEMETRY_LINE_PATTERNS = [
/TraceLoggingWriteWrapper\s*\(/,
/\bTraceLoggingWrite\s*\(/,
/\bTRACELOGGING_DEFINE_PROVIDER\b/,
/\bTraceLoggingOptionProjectTelemetry\b/,
/\bProjectTelemetryPrivacyDataTag\b/,
/\bPROJECT_KEYWORD_MEASURE\b/,
/\bRegisterProvider\s*\(/,
/\bUnregisterProvider\s*\(/,
/\bPowerToysTelemetry\.Log\.WriteEvent\s*\(/,
/\bclass\s+\w+\s*:\s*EventBase\s*,\s*IEvent\b/,
/\bclass\s+\w+\s*:\s*TelemetryBase\b/,
/\bPartA_PrivTags\b/,
/\[EventData\]/,
/\bEventName\b/,
];
function requireEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`Missing required environment variable: ${name}`);
}
return value;
}
function validateRepository(repository) {
if (!/^[^/]+\/[^/]+$/.test(repository)) {
throw new Error(
`GITHUB_REPOSITORY must be in owner/repo format, received: ${JSON.stringify(repository)}`
);
}
}
function readEventPayload(eventPath) {
let raw;
try {
raw = fs.readFileSync(eventPath, 'utf8');
} catch (error) {
throw new Error(`Failed to read event payload at ${eventPath}: ${error.message}`);
}
try {
return JSON.parse(raw);
} catch (error) {
throw new Error(`Failed to parse JSON from ${eventPath}: ${error.message}`);
}
}
function resolvePullNumber(event) {
const fromPullRequest = event?.pull_request?.number;
const fromWorkflowDispatch = event?.inputs?.pr_number;
const rawPullNumber = fromPullRequest ?? fromWorkflowDispatch;
if (rawPullNumber === undefined || rawPullNumber === null || rawPullNumber === '') {
throw new Error(
'Unable to determine pull request number from event payload. Expected pull_request.number or inputs.pr_number.'
);
}
const pullNumber = Number.parseInt(String(rawPullNumber), 10);
if (!Number.isInteger(pullNumber) || pullNumber <= 0) {
throw new Error(`Invalid pull request number: ${JSON.stringify(rawPullNumber)}`);
}
return pullNumber;
}
function isTelemetryPath(filePath) {
return TELEMETRY_PATH_PATTERNS.some((pattern) => pattern.test(filePath));
}
function changedLinesFromPatch(patch) {
if (!patch) {
return [];
}
return patch
.split('\n')
.filter((line) => {
if (line.startsWith('+++') || line.startsWith('---')) {
return false;
}
return line.startsWith('+') || line.startsWith('-');
})
.map((line) => line.slice(1));
}
function hasTelemetryLineSignal(lines) {
return lines.some((line) => TELEMETRY_LINE_PATTERNS.some((pattern) => pattern.test(line)));
}
async function apiRequest(url, method = 'GET', body) {
const token = requireEnv('GITHUB_TOKEN');
let response;
try {
response = await fetch(url, {
method,
headers: {
Authorization: `Bearer ${token}`,
Accept: 'application/vnd.github+json',
'Content-Type': 'application/json',
},
body: body ? JSON.stringify(body) : undefined,
});
} catch (error) {
throw new Error(`Network error during ${method} ${url}: ${error.message}`);
}
if (!response.ok) {
const text = await response.text();
const rateLimitReset = response.headers.get('x-ratelimit-reset');
const rateLimitHint =
response.status === 403 && rateLimitReset
? ` (rate limit reset at epoch ${rateLimitReset})`
: '';
throw new Error(`${method} ${url} failed (${response.status})${rateLimitHint}: ${text}`);
}
if (response.status === 204) {
return null;
}
try {
return await response.json();
} catch (error) {
throw new Error(`Failed to parse JSON response for ${method} ${url}: ${error.message}`);
}
}
async function getAllPullFiles(apiBaseUrl, repository, pullNumber) {
const files = [];
let page = 1;
while (true) {
const url = `${apiBaseUrl}/repos/${repository}/pulls/${pullNumber}/files?per_page=100&page=${page}`;
const batch = await apiRequest(url);
if (!Array.isArray(batch)) {
throw new Error(`Unexpected response while listing PR files on page ${page}.`);
}
if (batch.length === 0) {
break;
}
files.push(...batch);
if (batch.length < 100) {
break;
}
page += 1;
}
return files;
}
async function findExistingTelemetryComment(apiBaseUrl, repository, pullNumber) {
let page = 1;
while (true) {
const commentsUrl = `${apiBaseUrl}/repos/${repository}/issues/${pullNumber}/comments?per_page=100&page=${page}`;
const comments = await apiRequest(commentsUrl);
if (!Array.isArray(comments)) {
throw new Error(`Unexpected response while listing issue comments on page ${page}.`);
}
const existing = comments.find(
(comment) => typeof comment.body === 'string' && comment.body.includes(COMMENT_MARKER)
);
if (existing) {
return existing;
}
if (comments.length < 100) {
return null;
}
page += 1;
}
}
function detectTelemetryChanges(files) {
const matches = [];
for (const file of files) {
const filename = file.filename || '';
const telemetryPath = isTelemetryPath(filename);
const changedLines = changedLinesFromPatch(file.patch);
const telemetryLineSignal = hasTelemetryLineSignal(changedLines);
// Some large diffs omit patch content. If the file path is telemetry-centric,
// treat it as a telemetry modification to avoid false negatives.
const patchUnavailable = !file.patch && telemetryPath;
if (telemetryPath || telemetryLineSignal || patchUnavailable) {
matches.push({
filename,
telemetryPath,
telemetryLineSignal,
patchUnavailable,
});
}
}
return matches;
}
function hasDataAndPrivacyChange(files) {
return files.some((file) => {
const filename = (file.filename || '').toLowerCase();
return filename === 'data_and_privacy.md';
});
}
async function upsertPrComment(apiBaseUrl, repository, pullNumber, body) {
const existing = await findExistingTelemetryComment(apiBaseUrl, repository, pullNumber);
if (existing) {
const updateUrl = `${apiBaseUrl}/repos/${repository}/issues/comments/${existing.id}`;
await apiRequest(updateUrl, 'PATCH', { body });
console.log(`Updated existing telemetry comment (id: ${existing.id}).`);
return;
}
const createUrl = `${apiBaseUrl}/repos/${repository}/issues/${pullNumber}/comments`;
await apiRequest(createUrl, 'POST', { body });
console.log('Created telemetry comment on PR.');
}
async function main() {
const eventPath = requireEnv('GITHUB_EVENT_PATH');
const repository = requireEnv('GITHUB_REPOSITORY');
const apiBaseUrl = process.env.GITHUB_API_URL || 'https://api.github.com';
validateRepository(repository);
let parsedApiBaseUrl;
try {
parsedApiBaseUrl = new URL(apiBaseUrl);
} catch {
throw new Error(`Invalid GITHUB_API_URL: ${JSON.stringify(apiBaseUrl)}`);
}
const event = readEventPayload(eventPath);
const pullNumber = resolvePullNumber(event);
console.log(`Event name: ${process.env.GITHUB_EVENT_NAME || 'unknown'}`);
console.log(`Repository: ${repository}`);
console.log(`PR number: ${pullNumber}`);
const files = await getAllPullFiles(parsedApiBaseUrl.origin, repository, pullNumber);
if (files.length === 0) {
console.log('No changed files found for PR; skipping telemetry comment update.');
return;
}
const matches = detectTelemetryChanges(files);
const dataAndPrivacyChanged = hasDataAndPrivacyChange(files);
console.log(`Scanned ${files.length} changed files.`);
console.log(`Telemetry matches found: ${matches.length}.`);
console.log(`DATA_AND_PRIVACY.md changed: ${dataAndPrivacyChanged}.`);
if (matches.length === 0) {
console.log('No telemetry-related additions/modifications detected.');
return;
}
for (const match of matches) {
console.log(
`- ${match.filename} (telemetryPath=${match.telemetryPath}, telemetryLineSignal=${match.telemetryLineSignal}, patchUnavailable=${match.patchUnavailable})`
);
}
const commentBody = dataAndPrivacyChanged
? COMMENT_BODY_WITH_PRIVACY_UPDATE
: COMMENT_BODY_WITHOUT_PRIVACY_UPDATE;
await upsertPrComment(apiBaseUrl, repository, pullNumber, commentBody);
}
main().catch((error) => {
console.error('Telemetry PR check failed.');
console.error(error instanceof Error ? error.stack || error.message : error);
process.exit(1);
});

View File

@@ -28,7 +28,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Apply area labels with AI
uses: actions/github-script@v9
uses: actions/github-script@v7
env:
# actions/github-script does not propagate `github-token` to
# process.env. Expose it explicitly so the inline script can
@@ -88,8 +88,8 @@ jobs:
'Product-Advanced Paste',
'Product-Always On Top',
'Product-Awake',
'Product-ColorPicker',
'Product-Command Not Found',
'Product-Color Picker',
'Product-CommandNotFound',
'Product-Command Palette',
'Product-CropAndLock',
'Product-Environment Variables',
@@ -98,7 +98,7 @@ jobs:
'Product-File Locksmith',
'Product-Find My Mouse',
'Product-Grab And Move',
'Product-Hosts',
'Product-Hosts File Editor',
'Product-Image Resizer',
'Product-Keyboard Manager',
'Product-LightSwitch',
@@ -109,7 +109,7 @@ jobs:
'Product-Mouse Without Borders',
'Product-New+',
'Product-Peek',
'Product-Power Display',
'Product-PowerDisplay',
'Product-PowerRename',
'Product-PowerToys Run',
'Product-Quick Accent',

View File

@@ -0,0 +1,35 @@
# NOTE: This workflow depends on .github/scripts/telemetry-pr-check.js for telemetry detection and PR comments.
# Keep this workflow and script behavior in sync when making changes.
name: Telemetry PR Check
on:
pull_request_target:
types: [opened, reopened, synchronize, ready_for_review]
workflow_dispatch:
inputs:
pr_number:
description: "Pull Request Number to test against"
required: true
type: string
permissions:
contents: read
pull-requests: write
concurrency:
group: telemetry-pr-check-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
detect-telemetry-events:
if: ${{ github.event.pull_request.draft == false }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Detect telemetry event changes and comment PR
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node .github/scripts/telemetry-pr-check.js

View File

@@ -243,8 +243,12 @@
"WinUI3Apps\\PowerToys.RegistryPreview.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.exe",
"PowerToys.ShortcutGuide.exe",
"PowerToys.ShortcutGuideModuleInterface.dll",
"WinUI3Apps\\PowerToys.ShortcutGuide.exe",
"WinUI3Apps\\PowerToys.ShortcutGuide.dll",
"WinUI3Apps\\PowerToys.ShortcutGuideModuleInterface.dll",
"WinUI3Apps\\PowerToys.ShortcutGuide.IndexYmlGenerator.dll",
"WinUI3Apps\\PowerToys.ShortcutGuide.IndexYmlGenerator.exe",
"WinUI3Apps\\ShortcutGuide.CPPProject.dll",
"PowerToys.ZoomIt.exe",
"PowerToys.ZoomItModuleInterface.dll",
@@ -383,6 +387,11 @@
"ColorCode.Core.dll",
"Microsoft.SemanticKernel.Connectors.Ollama.dll",
"OllamaSharp.dll",
"WinUI3Apps\\Google.Apis.dll",
"WinUI3Apps\\Google.Apis.Auth.dll",
"WinUI3Apps\\Google.Apis.Core.dll",
"WinUI3Apps\\Google.GenAI.dll",
"WinUI3Apps\\YamlDotNet.dll",
"boost_regex-vc143-mt-gd-x32-1_87.dll",
"boost_regex-vc143-mt-gd-x64-1_87.dll",

View File

@@ -48,6 +48,11 @@ foreach ($csprojFile in $csprojFilesArray) {
continue
}
# The PowerAccent.Common project does not target WinRT, so skip it
if ($csprojFile -like '*PowerAccent.Common.csproj') {
continue
}
$importExists = Test-ImportSharedCsWinRTProps -filePath $csprojFile
if (!$importExists) {
Write-Output "$csprojFile need to import 'Common.Dotnet.CsWinRT.props'."

View File

@@ -47,8 +47,8 @@
<PackageVersion Include="Microsoft.Graphics.Win2D" Version="1.3.2" />
<PackageVersion Include="Microsoft.Windows.CppWinRT" Version="2.0.250303.1" />
<PackageVersion Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="3.1.16" />
<PackageVersion Include="Microsoft.Extensions.AI" Version="9.9.1" />
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="9.9.1-preview.1.25474.6" />
<PackageVersion Include="Microsoft.Extensions.AI" Version="10.2.0" />
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="10.0.1-preview.1.25571.5" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.7" />
@@ -57,12 +57,12 @@
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="10.0.7" />
<PackageVersion Include="Microsoft.AI.Foundry.Local" Version="0.3.0" />
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.66.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.OpenAI" Version="1.66.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.AzureAIInference" Version="1.66.0-beta" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.Google" Version="1.66.0-alpha" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.MistralAI" Version="1.66.0-alpha" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.Ollama" Version="1.66.0-alpha" />
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.71.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.OpenAI" Version="1.71.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.AzureAIInference" Version="1.71.0-beta" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.Google" Version="1.71.0-alpha" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.MistralAI" Version="1.71.0-alpha" />
<PackageVersion Include="Microsoft.SemanticKernel.Connectors.Ollama" Version="1.71.0-alpha" />
<PackageVersion Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.2" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3719.77" />
<!-- Package Microsoft.Win32.SystemEvents added as a hack for being able to exclude the runtime assets so they don't conflict with 8.0.1. This is a dependency of System.Drawing.Common but the 8.0.1 version wasn't published to nuget. -->
@@ -90,11 +90,12 @@
<PackageVersion Include="MSTest" Version="$(MSTestVersion)" />
<PackageVersion Include="MSTest.TestFramework" Version="$(MSTestVersion)" />
<PackageVersion Include="NJsonSchema" Version="11.4.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NLog" Version="5.2.8" />
<PackageVersion Include="NLog.Extensions.Logging" Version="5.3.8" />
<PackageVersion Include="NLog.Schema" Version="5.2.8" />
<PackageVersion Include="OpenAI" Version="2.5.0" />
<PackageVersion Include="OpenAI" Version="2.7.0" />
<PackageVersion Include="Polly.Core" Version="8.6.5" />
<PackageVersion Include="ReverseMarkdown" Version="4.1.0" />
<PackageVersion Include="RtfPipe" Version="2.0.7677.4303" />
<PackageVersion Include="ScipBe.Common.Office.OneNote" Version="3.0.1" />
@@ -114,13 +115,13 @@
<PackageVersion Include="System.Diagnostics.EventLog" Version="10.0.7" />
<!-- Package System.Diagnostics.PerformanceCounter added as a hack for being able to exclude the runtime assets so they don't conflict with 8.0.11. -->
<PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="10.0.7" />
<PackageVersion Include="System.ClientModel" Version="1.7.0" />
<PackageVersion Include="System.ClientModel" Version="1.8.1" />
<PackageVersion Include="System.Drawing.Common" Version="10.0.7" />
<PackageVersion Include="System.IO.Abstractions" Version="22.0.13" />
<PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="22.0.13" />
<PackageVersion Include="System.Management" Version="10.0.7" />
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<PackageVersion Include="System.Numerics.Tensors" Version="9.0.11" />
<PackageVersion Include="System.Numerics.Tensors" Version="10.0.2" />
<PackageVersion Include="System.Private.Uri" Version="4.3.2" />
<PackageVersion Include="System.Reactive" Version="6.0.1" />
<PackageVersion Include="System.Runtime.Caching" Version="10.0.7" />
@@ -134,8 +135,8 @@
<PackageVersion Include="UTF.Unknown" Version="2.6.0" />
<PackageVersion Include="WinUIEx" Version="2.8.0" />
<PackageVersion Include="WmiLight" Version="6.14.0" />
<PackageVersion Include="WPF-UI" Version="3.0.5" />
<PackageVersion Include="WyHash" Version="1.0.5" />
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
<PackageVersion Include="WixToolset.Heat" Version="5.0.2" />
<PackageVersion Include="WixToolset.Firewall.wixext" Version="5.0.2" />
<PackageVersion Include="WixToolset.Util.wixext" Version="5.0.2" />

View File

@@ -1600,5 +1600,5 @@ SOFTWARE.
- UTF.Unknown
- WinUIEx
- WmiLight
- WPF-UI
- WyHash
- YamlDotNet

View File

@@ -57,6 +57,7 @@
<Project Path="src/common/UnitTests-CommonLib/UnitTests-CommonLib.vcxproj" Id="1a066c63-64b3-45f8-92fe-664e1cce8077" />
<Project Path="src/common/UnitTests-CommonUtils/UnitTests-CommonUtils.vcxproj" Id="8b5cfb38-ccba-40a8-ad7a-89c57b070884" />
<Project Path="src/common/updating/updating.vcxproj" Id="17da04df-e393-4397-9cf0-84dabe11032e" />
<Project Path="src/common/updating/UnitTests/UpdatingUnitTests.vcxproj" Id="a1b2c3d4-e5f6-7890-abcd-ef1234567890" />
<Project Path="src/common/version/version.vcxproj" Id="cc6e41ac-8174-4e8a-8d22-85dd7f4851df" />
</Folder>
<Folder Name="/common/interop/">
@@ -801,6 +802,14 @@
<Project Path="src/modules/peek/peek/peek.vcxproj" Id="a1425b53-3d61-4679-8623-e64a0d3d0a48" />
</Folder>
<Folder Name="/modules/PowerAccent/">
<Project Path="src/modules/poweraccent/PowerAccent.Common.UnitTests/PowerAccent.Common.UnitTests.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/modules/poweraccent/PowerAccent.Common/PowerAccent.Common.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/modules/poweraccent/PowerAccent.Core/PowerAccent.Core.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
@@ -989,9 +998,16 @@
<Platform Solution="*|x64" Project="x64" />
</Project>
</Folder>
<Folder Name="/modules/shortcutguide/">
<Project Path="src/modules/ShortcutGuide/ShortcutGuide/ShortcutGuide.vcxproj" Id="2edb3eb4-fa92-4bff-b2d8-566584837231" />
<Project Path="src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj" Id="2d604c07-51fc-46bb-9eb7-75aecc7f5e81" />
<Folder Name="/modules/ShortcutGuide/">
<Project Path="src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/ShortcutGuide.IndexYmlGenerator.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuide.Ui.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
</Project>
<Project Path="src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj" Id="e487304a-b1fb-4e6b-8e70-014051af5b99" />
</Folder>
<Folder Name="/modules/Workspaces/">
<Project Path="src/modules/Workspaces/Workspaces.ModuleServices/Workspaces.ModuleServices.csproj">
@@ -1126,3 +1142,5 @@
<Project Path="src/Update/PowerToys.Update.vcxproj" Id="44ce9ae1-4390-42c5-bacc-0fd6b40aa203" />
<Project Path="tools/project_template/ModuleTemplate/ModuleTemplateCompileTest.vcxproj" Id="64a80062-4d8b-4229-8a38-dfa1d7497749" />
</Solution>

2
deps/spdlog vendored

View File

@@ -1,94 +0,0 @@
// spdlog-msvc-fix.h
//
// Workaround for MSVC 14.51 (compiler version 19.51, _MSC_VER >= 1951) removing
// stdext::checked_array_iterator. Force-included for all spdlog consumers via
// deps/spdlog.props, because spdlog v1.8.5's bundled fmt format.h(357) still
// references this type inside #if defined(_SECURE_SCL) && _SECURE_SCL -- a
// branch entered in Debug builds where _ITERATOR_DEBUG_LEVEL > 0.
//
// On MSVC 14.50 and earlier, the type still exists in <iterator>, so this shim
// is a no-op via the _MSC_VER guard. On MSVC 14.51+, it provides a minimal
// pointer-backed substitute that satisfies the bundled fmt's usage:
//
// template <typename T> using checked_ptr = stdext::checked_array_iterator<T*>;
// template <typename T> checked_ptr<T> make_checked(T* p, size_t size) {
// return {p, size};
// }
// ... return make_checked(get_data(c) + size, n);
//
// When deps/spdlog is bumped past v1.14 (which ships fmt 10.2 and drops this
// dependency), this shim and its <ForcedIncludeFiles> entry in deps/spdlog.props
// can be deleted.
#pragma once
#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER >= 1951
#include <cstddef>
#include <iterator>
#include <type_traits>
namespace stdext
{
template <typename _Ptr>
class checked_array_iterator
{
_Ptr _Myarray = nullptr;
std::size_t _Mysize = 0;
std::size_t _Myindex = 0;
public:
using iterator_category = std::random_access_iterator_tag;
using value_type = std::remove_cv_t<std::remove_pointer_t<_Ptr>>;
using difference_type = std::ptrdiff_t;
using pointer = _Ptr;
using reference = std::remove_pointer_t<_Ptr>&;
constexpr checked_array_iterator() = default;
constexpr checked_array_iterator(_Ptr arr, std::size_t size, std::size_t idx = 0) noexcept
: _Myarray(arr), _Mysize(size), _Myindex(idx)
{
}
constexpr reference operator*() const noexcept { return _Myarray[_Myindex]; }
constexpr pointer operator->() const noexcept { return _Myarray + _Myindex; }
constexpr reference operator[](difference_type n) const noexcept
{
return _Myarray[_Myindex + static_cast<std::size_t>(n)];
}
constexpr checked_array_iterator& operator++() noexcept { ++_Myindex; return *this; }
constexpr checked_array_iterator operator++(int) noexcept { auto t = *this; ++_Myindex; return t; }
constexpr checked_array_iterator& operator--() noexcept { --_Myindex; return *this; }
constexpr checked_array_iterator operator--(int) noexcept { auto t = *this; --_Myindex; return t; }
constexpr checked_array_iterator& operator+=(difference_type n) noexcept
{
_Myindex = static_cast<std::size_t>(static_cast<difference_type>(_Myindex) + n);
return *this;
}
constexpr checked_array_iterator& operator-=(difference_type n) noexcept
{
_Myindex = static_cast<std::size_t>(static_cast<difference_type>(_Myindex) - n);
return *this;
}
friend constexpr checked_array_iterator operator+(checked_array_iterator it, difference_type n) noexcept { it += n; return it; }
friend constexpr checked_array_iterator operator+(difference_type n, checked_array_iterator it) noexcept { return it + n; }
friend constexpr checked_array_iterator operator-(checked_array_iterator it, difference_type n) noexcept { it -= n; return it; }
friend constexpr difference_type operator-(checked_array_iterator a, checked_array_iterator b) noexcept
{
return static_cast<difference_type>(a._Myindex) - static_cast<difference_type>(b._Myindex);
}
friend constexpr bool operator==(checked_array_iterator a, checked_array_iterator b) noexcept { return a._Myindex == b._Myindex; }
friend constexpr bool operator!=(checked_array_iterator a, checked_array_iterator b) noexcept { return !(a == b); }
friend constexpr bool operator<(checked_array_iterator a, checked_array_iterator b) noexcept { return a._Myindex < b._Myindex; }
friend constexpr bool operator>(checked_array_iterator a, checked_array_iterator b) noexcept { return b < a; }
friend constexpr bool operator<=(checked_array_iterator a, checked_array_iterator b) noexcept { return !(b < a); }
friend constexpr bool operator>=(checked_array_iterator a, checked_array_iterator b) noexcept { return !(a < b); }
};
} // namespace stdext
#endif // __cplusplus && _MSC_VER >= 1951

3
deps/spdlog.props vendored
View File

@@ -2,8 +2,7 @@
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)spdlog\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_FILENAMES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ForcedIncludeFiles>$(MSBuildThisFileDirectory)spdlog-msvc-fix\include\spdlog-msvc-fix.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<PreprocessorDefinitions>SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_FILENAMES;FMT_UNICODE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
</Project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -9,12 +9,14 @@
[Pull Requests](https://github.com/microsoft/PowerToys/pulls?q=is%3Apr+is%3Aopen+label%3A%22Product-Shortcut+Guide%22+)
## Overview
Shortcut Guide is a PowerToy that displays an overlay of available keyboard shortcuts when the Windows key is pressed and held. It provides a visual reference for Windows key combinations, helping users discover and utilize built-in Windows shortcuts.
Shortcut Guide is a PowerToy that displays an overlay of available keyboard shortcuts when a user-set keyboard shortcut is pressed. It helps users discover and remember keyboard shortcuts for Windows and apps.
> [!NOTE]
> The spec for the manifest files is in development and will be linked here once available.
## Usage
- Press and hold the Windows key to display the overlay of available shortcuts
- Press the hotkey again to dismiss the overlay
- The overlay displays Windows shortcuts with their corresponding actions
- Press the user-defined hotkey to display the overlay
- Press the hotkey again or press ESC to dismiss the overlay
## Build and Debug Instructions
@@ -25,67 +27,89 @@ Shortcut Guide is a PowerToy that displays an overlay of available keyboard shor
4. The executable is named PowerToys.ShortcutGuide.exe
### Debug
1. Right-click the ShortcutGuide project and select 'Set as Startup Project'
1. Right-click the ShortcutGuide.Ui project and select 'Set as Startup Project'
2. Right-click the project again and select 'Debug'
## Code Structure
> [!NOTE]
> When run in debug mode, the window behaves differently than in release mode. It will not automatically close when loosing focus, it will be displayed on top of all other windows, and it is not hidden from the taskbar.
![Diagram](../images/shortcutguide/diagram.png)
## Project Structure
### Core Files
The Shortcut Guide module consists of the following 4 projects:
#### [`dllmain.cpp`](/src/modules/shortcut_guide/dllmain.cpp)
Contains DLL boilerplate code. Implements the PowertoyModuleIface, including enable/disable functionality and GPO policy handling. Captures hotkey events and starts the PowerToys.ShortcutGuide.exe process to display the shortcut guide window.
### [`ShortcutGuide.Ui`](/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuide.Ui.csproj
#### [`shortcut_guide.cpp`](/src/modules/shortcut_guide/shortcut_guide.cpp)
Contains the module interface code. It initializes the settings values and the keyboard event listener. Defines the OverlayWindow class, which manages the overall logic and event handling for the PowerToys Shortcut Guide.
This is the main UI project for the Shortcut Guide module. Upon startup it does the following tasks:
#### [`overlay_window.cpp`](/src/modules/shortcut_guide/overlay_window.cpp)
Contains the code for loading the SVGs, creating and rendering of the overlay window. Manages and displays overlay windows with SVG graphics through two main classes:
- D2DOverlaySVG: Handles loading, resizing, and manipulation of SVG graphics
- D2DOverlayWindow: Manages the display and behavior of the overlay window
1. Copies the built-in manifest files to the users manifest directory (overwriting existing files).
2. Generate the `index.yml` manifest file.
3. Populate the PowerToys shortcut manifest with the user-defined shortcuts.
4. Starts the UI.
#### [`keyboard_state.cpp`](/src/modules/shortcut_guide/keyboard_state.cpp)
Contains helper methods for checking the current state of the keyboard.
### Related files in PowerToys.Interop
#### [`target_state.cpp`](/src/modules/shortcut_guide/target_state.cpp)
State machine that handles the keyboard events. It's responsible for deciding when to show the overlay, when to suppress the Start menu (if the overlay is displayed long enough), etc. Handles state transitions and synchronization to ensure the overlay is shown or hidden appropriately based on user interactions.
#### [`excluded_app.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/excluded_app.cpp)
#### [`trace.cpp`](/src/modules/shortcut_guide/trace.cpp)
Contains code for telemetry.
This file contains one function with the following signature:
### Supporting Files
```cpp
__declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide()
```
#### [`animation.cpp`](/src/modules/shortcut_guide/animation.cpp)
Handles the timing and interpolation of animations. Calculates the current value of an animation based on elapsed time and a specified easing function.
This function checks if the current window is excluded from the Shortcut Guide overlay. It returns `true` if the current window is excluded otherwise it returns `false`.
#### [`d2d_svg.cpp`](/src/modules/shortcut_guide/d2d_svg.cpp)
Provides functionality for loading, resizing, recoloring, rendering, and manipulating SVG images using Direct2D.
#### [`tasklist_positions.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/tasklist_positions.cpp)
#### [`d2d_text.cpp`](/src/modules/shortcut_guide/d2d_text.cpp)
Handles creation, resizing, alignment, and rendering of text using Direct2D and DirectWrite.
This file contains helper functions to retrieve the positions of the taskbar buttons. It exports the following function:
#### [`d2d_window.cpp`](/src/modules/shortcut_guide/d2d_window.cpp)
Manages a window using Direct2D and Direct3D for rendering. Handles window creation, resizing, rendering, and destruction.
```cpp
__declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size)
```
#### [`native_event_waiter.cpp`](/src/modules/shortcut_guide/native_event_waiter.cpp)
Waits for a named event and executes a specified action when the event is triggered. Uses a separate thread to handle event waiting and action execution.
This function retrieves the positions of the taskbar buttons for a given monitor. It returns an array of `TasklistButton` structures (max 10), which contain the position and size of each button.
#### [`tasklist_positions.cpp`](/src/modules/shortcut_guide/tasklist_positions.cpp)
Handles retrieving and updating the positions and information of taskbar buttons in Windows.
`monitor` must be the monitor handle of the monitor containing the taskbar instance of which the buttons should be retrieved.
#### [`main.cpp`](/src/modules/shortcut_guide/main.cpp)
The entry point for the PowerToys Shortcut Guide application. Handles initialization, ensures single instance execution, manages parent process termination, creates and displays the overlay window, and runs the main event loop.
`size` will contain the resulting array size.
It determines the positions through Windows `FindWindowEx` function.
For the primary taskbar it searches for:
* A window called "Shell_TrayWnd"
* that contains a window called "ReBarWindow32"
* that contains a window called "MSTaskSwWClass"
* that contains a window called "MSTaskListWClass"
For any secondary taskbar it searches for:
* A window called "Shell_SecondaryTrayWnd"
* that contains a window called "WorkerW"
* that contains a window called "MSTaskListWClass"
It then enumerates all the button elements inside "MSTaskListWClass" while skipping such with a same name (which implies the user does not use combining taskbar buttons)
If this method fails, which it will for newer versions of Windows, it falls back to searching for:
* A window called "Shell_TrayWnd" or "Shell_SecondaryTrayWnd"
* that contains a window called "Windows.UI.Composition.DesktopWindowContentBridge"
* that contains a window called "Windows.UI.Input.InputSite.WindowClass"
* the first child element
It then enumerates all the button elements inside the selected while skipping such with a same name (which implies the user does not use combining taskbar buttons) and such that do not start with "Appid:" (which are not actual taskbar buttons related to apps, but others like the widgets or the search button).
### [`ShortcutGuide.IndexYmlGenerator`](/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/)
This application generates the `index.yml` manifest file.
It is a separate project so that its code can be easier ported to WinGet in the future.
### [`ShortcutGuideModuleInterface`](/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj)
The module interface that handles opening and closing the user interface.
## Features and Limitations
- The overlay displays Windows shortcuts (Windows key combinations)
- The module supports localization, but only for the Windows controls on the left side of the overlay
- Currently the displayed shortcuts (Except the ones from PowerToys) are not localized.
- It's currently rated as a P3 (lower priority) module
## Future Development
A community-contributed version 2 is in development that will support:
- Application-specific shortcuts based on the active application
- Additional shortcuts beyond Windows key combinations
- PowerToys shortcuts
- Implementing with WinGet to get new shortcut manifest files
- Adding localization support for the built-in manifest files

View File

@@ -0,0 +1,318 @@
# WinGet Manifest Keyboard Shortcuts schema
## 1 What this spec is about
This spec provides an extension to the existing [WinGet manifest schema](https://github.com/microsoft/winget-pkgs/blob/master/doc/manifest/README.md) in form of an additional yaml file, that describes keyboard shortcuts the application provides.
These yaml files are saved on a per-user base and so called manifest interpreters can then display these manifests in a human-friendly version.
### 1.1 What this spec is not about
This spec does not provide a way to back up or save user-defined keyboard shortcuts.
## 2 Save location of manifests
### 2.1 WinGet
These files are saved online along with the other manifest files in the [WinGet Package repository](https://github.com/microsoft/winget-pkgs).
### 2.2 Locally
All manifests and one index file are saved locally under `%LocalAppData%/Microsoft/WinGet/KeyboardShortcuts`. All apps are allowed to add their manifest files there. In addition Package Managers (like WinGet) and manifest interpreters (like PowerToys Shortcut Guide) can control and add other manifests themselves.
#### 2.2.1 Downloading manifests
When WinGet or other package managers download a package, they should also download the corresponding keyboard shortcuts manifest file and save it in the local directory, given such a file exists in the WinGet repository.
The downloader is also responsible for updating the local `index.yaml` file, which contains all the information about the different manifest files that are saved in the same directory.
#### 2.2.2 Updating manifests
When a manifest interpreter starts, it should download the latest version of the manifests from the WinGet repository and save them in the local directory. If a manifest interpreter is not able to download the manifests or they do not exist, it should use the locally saved manifests.
The updater is also responsible for updating the local `index.yaml` file, which contains all the information about the different manifest files that are saved in the same directory.
> Note: WinGet must provide a way to update the keyboard shortcuts manifests given a package id.
### 2.3 File names
The file name of a keyboard shortcuts file is the WinGet package identifier, plus the locale of the strings of the file and at last the `.KBSC.yaml` file extension.
For example the package "test.bar" saves its manifest with `en-US` strings in `test.bar.en-US.KBSC.yaml`.
#### 2.3.1 No winget package available
If an application has no corresponding WinGet package its name starts with a plus (`+`) symbol.
### 2.4 Reserved namespaces
Every name starting with `+WindowsNT` is reserved for the Windows OS and its components.
## 3 File syntax
All relevant files are written in [YAML](https://yaml.org/spec).
> Note: A JSON schema will be provided as soon as the spec reaches a further step
### 3.1 Manifest Schema vNext Keyboard Shortcuts File
```
PackageName: # The package unique identifier
WindowFilter: # The filter of window processes to which the shortcuts apply to
BackgroundProcess: # Optionally allows applying WindowFilter to background processes
Shortcuts: # List of sections with keyboard shortcuts
- SectionName: # Name of the category of shortcuts
Properties: # List of shortcuts in the category
- Name: # Name of the shortcut
Description: # Optional description of the shortcut
AdditionalInfo: # Optional additional information about the shortcut
Recommended: # Optionally determines if the shortcut is displayed in a designated recommended area
Shortcut: # An array of shortcuts that need to be pressed
- Win: # Determines if the Windows Key is part of the shortcut
Ctrl: # Determines if the Ctrl Key is part of the shortcut
Shift: # Determines if the Shift Key is part of the shortcut
Alt: # Determines if the Alt Key is part of the shortcut
Keys: # Array of keys that need to be pressed
```
Per Application/Package one or more Keyboard manifests can be declared. Every manifest must have a different locale and the same `PackageName`, `WindowFilter` and `BackgroundProcess` fields.
<details>
<summary><b>PackageName</b> - The package unique identifier</summary>
Package identifier (see 2.1 for more information on the package identifier).
</details>
<details>
<summary><b>WindowFilter</b> - The filter of window processes to which the shortcuts apply to</summary>
This field declares for which process name the shortcuts should be showed (To rephrase: For which processes the shortcut will have an effect if pressed). You can use an asterisk to leave out a certain part. For example `*.PowerToys.*.exe` targets all PowerToys processes and `*` apply to any process.
</details>
<details>
<summary><b>BackgroundProcess</b> - Optionally allows applying WindowFilter to background processes.</summary>
**Optional field**
Defaults to `False`. Determines if WindowFilter should apply to background processes as well (Rephrased: When the process is running, the shortcuts will apply).
</details>
<details>
<summary><b>Shortcuts</b> - List of sections with keyboard shortcuts</summary>
List of different section (also called categories) of shortcuts.
</details>
<details>
<summary><b>SectionName</b> - Name of the category of shortcuts</summary>
Name of the section of shortcuts.
**Special sections**:
Special sections start with an identifier enclosed between `<` and `>`. This declares the category as a special display. If the interpreter of the manifest file can't understand the content this section should be left out.
</details>
<details>
<summary><b>Properties</b> - List of shortcuts in the category</summary>
</details>
<details>
<summary><b>Name</b> - Name of the shortcut</summary>
Name of the shortcut. This is the name that will be displayed in the interpreter.
</details>
<details>
<summary><b>Description</b> - Optional description of the shortcut</summary>
Optional description of the shortcut. This is the description that will be displayed by the interpreter.
</details>
<details>
<summary><b>AdditionalInfo</b> - Optional additional information about the shortcut</summary>
Array of additional information about the shortcut. This is the additional information that will be displayed by the interpreter and are not part of this manifest.
**Example**:
For example, if the shortcut is only available on a certain Windows version, this information could be added here.
```yaml
AdditionalInfo:
- MinWindowsVersion: "10.0.19041.0"
```
</details>
<details>
<summary><b>Shortcut</b> - An array of shortcuts that need to be pressed</summary>
An array of shortcuts that need to be pressed. This allows defining sequential shortcuts that need to be pressed in order to trigger the action.
</details>
<details>
<summary><b>Win</b> - Determines if the Windows Key is part of the shortcut</summary>
Refers to the left Windows Key on the keyboard.
</details>
<details>
<summary><b>Ctrl</b> - Determines if the Ctrl Key is part of the shortcut</summary>
Refers to the left Ctrl Key on the keyboard.
</details>
<details>
<summary><b>Shift</b> - Determines if the Shift Key is part of the shortcut</summary>
Refers to the left Shift Key on the keyboard.
</details>
<details>
<summary><b>Alt</b> - Determines if the Alt Key is part of the shortcut</summary>
Refers to the left Alt Key on the keyboard.
</details>
<details>
<summary><b>Recommended</b> - Optionally determines if the shortcut is displayed in a designated recommended area</summary>
**Optional field**
Defaults to `False`. Determines if the shortcut should be displayed in a designated recommended area. This is a visual hint for the user that this shortcut is important.
</details>
<details>
<summary><b>Keys</b> - Array of keys that need to be pressed</summary>
A string array of all the keys that need to be pressed. If a number is supplied, it should be read as a [KeyCode](https://learn.microsoft.com/windows/win32/inputdev/virtual-key-codes) and displayed accordingly (based on the Keyboard Layout of the user).
**Special keys**:
Special keys are enclosed between `<` and `>` and correspond to a key that should be displayed in a certain way. If the interpreter of the manifest file can't understand the content, the brackets should be left out.
|Name|Description|
|----|-----------|
|`<Office>`| Corresponds to the Office key on some Windows keyboards |
|`<Copilot>`| Corresponds to the Copilot key on some Windows keyboards |
|`<Left>`| Corresponds to the left arrow key |
|`<Right>`| Corresponds to the right arrow key |
|`<Up>`| Corresponds to the up arrow key |
|`<Down>`| Corresponds to the down arrow key |
|`<Enter>`| Corresponds to the Enter key |
|`<Space>`| Corresponds to the Space key |
|`<Tab>`| Corresponds to the Tab key |
|`<Backspace>`| Corresponds to the Backspace key |
|`<Delete>`| Corresponds to the Delete key |
|`<Insert>`| Corresponds to the Insert key |
|`<Home>`| Corresponds to the Home key |
|`<End>`| Corresponds to the End key |
|`<PrtScr>`| Corresponds to the Print Screen key |
|`<Pause>`| Corresponds to the pause key |
|`<PageUp>`| Corresponds to the Page Up key |
|`<PageDown>`| Corresponds to the Page Down key |
|`<Escape>`| Corresponds to the Escape key |
|`<Arrow>`| Corresponds to either the left, right, up or down arrow key |
|`<ArrowLR>`| Corresponds to either the left or right arrow key |
|`<ArrowUD>`| Corresponds to either the up or down arrow key |
|`<Underlined letter>`| Corresponds to any letter that is _underlined_ in the UI |
</details>
#### 3.2.2 Example
```yaml
PackageName: Microsoft.PowerToys
WindowFilter: "*"
BackgroundProcess: True
Shortcuts:
- SectionName: General
Properties:
- Name: Advanced Paste
Shortcut:
- Win: True
Ctrl: False
Alt: False
Shift: False
Keys:
- 86
Description: Open Advanced Paste window
- Name: Advanced Paste
Shortcut:
- Win: True
Ctrl: True
Alt: True
Shift: False
Keys:
- 86
Description: Paste as plain text directly
```
### 3.2 `index.yaml` file
The `index.yaml` file is a file that contains all the information about the different manifest files that are saved in the same directory. This file is only available locally and is not saved in the WinGet repository as it is specific to the user.
```yaml
DefaultShellName: # The package identifier of the default shell used in Windows
Index: # List of all manifest files
- WindowFilter: # The filter of window processes to which the shortcuts apply to
BackgroundProcess: # Optionally allows applying WindowFilter to background processes
Apps: # List of all manifest files for the filter
```
<details>
<summary><b>DefaultShellName</b> - The package identifier of the default shell used in Windows</summary>
This declares the package identifier of the default shell used in Windows. Most commonly it is `+WindowsNT.Shell`. Although not enforced, only the shell declared in the registry key `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell` should be used here.
</details>
<details>
<summary><b>Index</b> - List of all manifest files</summary>
</details>
<details>
<summary><b>WindowFilter</b> - The filter of window processes to which the shortcuts apply to</summary>
See the `WindowFilter` field in the manifest file for more information.
</details>
<details>
<summary><b>BackgroundProcess</b> - Optionally allows applying WindowFilter to background processes</summary>
**Optional field**
See the `BackgroundProcess` field in the manifest file for more information.
</details>
<details>
<summary><b>Apps</b> - List of all the package identifiers applying for the filter</summary>
</details>
#### 3.2.1 Example
```yaml
DefaultShellName: "+WindowsNT.Shell"
Index:
- Filter: "*"
BackgroundProcess: True
Apps: ["+WindowsNT.Shell", "Microsoft.PowerToys"]
- Filter: "explorer.exe"
Apps: ["+WindowsNT.WindowsExplorer"]
- Filter: "taskmgr.exe"
Apps: ["+WindowsNT.TaskManager"]
- Filter: "msedge.exe"
Apps: ["+WindowsNT.Edge"]
```

View File

@@ -2,26 +2,25 @@
<?include $(sys.CURRENTDIR)\Common.wxi?>
<?define ShortcutGuideSvgFiles=?>
<?define ShortcutGuideSvgFilesPath=$(var.BinDir)\Assets\ShortcutGuide\?>
<?define ShortcutGuideAssetsFiles=?>
<?define ShortcutGuideAssetsFilesPath=$(var.BinDir)WinUI3Apps\Assets\ShortcutGuide\?>
<Fragment>
<!-- Shortcut guide files -->
<DirectoryRef Id="BaseApplicationsAssetsFolder">
<Directory Id="ShortcutGuideSvgsInstallFolder" Name="ShortcutGuide" />
<DirectoryRef Id="WinUI3AppsAssetsFolder">
<Directory Id="ShortcutGuideAssetsFolder" Name="ShortcutGuide" />
</DirectoryRef>
<DirectoryRef Id="ShortcutGuideSvgsInstallFolder" FileSource="$(var.ShortcutGuideSvgFilesPath)">
<DirectoryRef Id="ShortcutGuideAssetsFolder" FileSource="$(var.ShortcutGuideAssetsFilesPath)">
<!-- Generated by generateFileComponents.ps1 -->
<!--ShortcutGuideSvgFiles_Component_Def-->
<!--ShortcutGuideAssetsFiles_Component_Def-->
</DirectoryRef>
<!-- Shortcut guide -->
<ComponentGroup Id="ShortcutGuideComponentGroup">
<Component Id="RemoveShortcutGuideFolder" Guid="AD1ABC55-B593-4A60-A86A-BA8C0ED493A5" Directory="ShortcutGuideSvgsInstallFolder">
<ComponentGroup Id="ShortcutGuideComponentGroup" >
<Component Id="RemoveShortcutGuideFolder" Guid="AD1ABC55-B593-4A60-A86A-BA8C0ED493A5" Directory="ShortcutGuideAssetsFolder" >
<RegistryKey Root="$(var.RegistryScope)" Key="Software\Classes\powertoys\components">
<RegistryValue Type="string" Name="RemoveShortcutGuideFolder" Value="" KeyPath="yes" />
<RegistryValue Type="string" Name="RemoveShortcutGuideFolder" Value="" KeyPath="yes"/>
</RegistryKey>
<RemoveFolder Id="RemoveFolderShortcutGuideSvgsInstallFolder" Directory="ShortcutGuideSvgsInstallFolder" On="uninstall" />
<RemoveFolder Id="RemoveFolderShortcutGuideAssetsInstallFolder" Directory="ShortcutGuideAssetsFolder" On="uninstall"/>
</Component>
</ComponentGroup>

View File

@@ -397,8 +397,8 @@ Generate-FileComponents -fileListName "ValueGeneratorImagesCmpFiles" -wxsFilePat
## Plugins
#ShortcutGuide
Generate-FileList -fileDepsJson "" -fileListName ShortcutGuideSvgFiles -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\ShortcutGuide\"
Generate-FileComponents -fileListName "ShortcutGuideSvgFiles" -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs
Generate-FileList -fileDepsJson "" -fileListName ShortcutGuideAssetsFiles -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\ShortcutGuide\"
Generate-FileComponents -fileListName "ShortcutGuideAssetsFiles" -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -regroot $registryroot
#Settings
Generate-FileList -fileDepsJson "" -fileListName SettingsV2AssetsFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\"

View File

@@ -12,6 +12,17 @@
<RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
</PropertyGroup>
<!--
Opt out of CsWinRT 2.2 IIDOptimizer. On .NET 10 / CsWinRT 2.2 the tool exits with code -1
after producing "0 IID calculations/fetches patched", which generates a noisy MSB3073
warning for every CsWinRT-consuming project. The IIDOptimizer is a runtime-perf optimization
that interns GUID lookups; disabling it just means a small first-call cost. This switch
causes Microsoft.Windows.CsWinRT.IIDOptimizer.targets to not be imported at all.
-->
<PropertyGroup>
<CsWinRTIIDOptimizerOptOut>true</CsWinRTIIDOptimizerOptOut>
</PropertyGroup>
<!-- Common from the debug / release items -->
<PropertyGroup>
<WarningLevel>4</WarningLevel>
@@ -41,7 +52,54 @@
<!-- this may need to be removed on future CsWinRT upgrades-->
<Target Name="RemoveCsWinRTPackageAnalyzer" BeforeTargets="CoreCompile">
<ItemGroup>
<Analyzer Remove="@(Analyzer)" Condition="%(Analyzer.NuGetPackageId) == 'Microsoft.Windows.CsWinRT'" />
<Analyzer Remove="@(Analyzer)" Condition="%(Analyzer.NuGetPackageId) == 'Microsoft.Windows.CsWinRT'" />
</ItemGroup>
</Target>
<!--
Ensure any referenced C++/WinRT (.vcxproj) projects are fully built BEFORE the CsWinRT
source generator runs in this csproj. On a clean machine the SDK-style ProjectReference
graph does not guarantee that the producing vcxproj has emitted its .winmd before the
consuming C# Compile / source-generator stage starts in a parallel solution build,
which manifests as CS0246 on the projected namespace (e.g. 'PowerToys.Interop').
Forcing a serialized Build of the .vcxproj references here closes that race.
We hook BEFORE ResolveProjectReferences so the produced .winmd is visible to
CsWinRTRemoveWinMDReferences (which moves it into @(CsWinRTInputs)) and we also
delete a possibly stale cswinrt.rsp so CsWinRTGenerateProjection re-invokes
cswinrt.exe instead of incrementally skipping.
-->
<Target Name="EnsureNativeWinMDProjectionInputsBuilt"
BeforeTargets="ResolveProjectReferences;ResolveAssemblyReferences;CsWinRTPrepareProjection;CsWinRTGenerateProjection"
Condition="'@(ProjectReference)' != '' and '$(DesignTimeBuild)' != 'true' and '$(BuildingProject)' != 'false'">
<ItemGroup>
<_NativeWinMDProjectionRef Include="@(ProjectReference)" Condition="'%(Extension)' == '.vcxproj'" />
</ItemGroup>
<MSBuild Projects="@(_NativeWinMDProjectionRef)"
Properties="Configuration=$(Configuration);Platform=$(Platform)"
Targets="Build"
BuildInParallel="false"
Condition="'@(_NativeWinMDProjectionRef)' != ''" />
<!-- Force CsWinRTGenerateProjection to re-run so stale-rsp incremental skip cannot
leave us without generated .cs files when the .winmd has just been (re)produced. -->
<Delete Files="$(CsWinRTGeneratedFilesDir)cswinrt.rsp;$(CsWinRTGeneratedFilesDir)cswinrt_internal.rsp"
Condition="'@(_NativeWinMDProjectionRef)' != '' and '$(CsWinRTGeneratedFilesDir)' != ''" />
<!-- Mark that we need to delete the rsp again once CsWinRTGeneratedFilesDir is fully resolved
(some projects set it to $(OutDir) which is not evaluated this early). -->
<PropertyGroup>
<_DeleteStaleCsWinRTRspPending>true</_DeleteStaleCsWinRTRspPending>
</PropertyGroup>
</Target>
<!--
Second pass: after CsWinRTPrepareProjection has resolved $(CsWinRTGeneratedFilesDir) to its
final value (which may depend on $(OutDir)), delete any stale cswinrt.rsp so the
CsWinRTGenerateProjection target's incremental-skip cannot leave us without generated .cs files.
-->
<Target Name="DeleteStaleCsWinRTRspAfterPrepare"
AfterTargets="CsWinRTPrepareProjection"
BeforeTargets="CsWinRTGenerateProjection"
Condition="'$(_DeleteStaleCsWinRTRspPending)' == 'true' and '$(CsWinRTGeneratedFilesDir)' != ''">
<Delete Files="$(CsWinRTGeneratedFilesDir)cswinrt.rsp;$(CsWinRTGeneratedFilesDir)cswinrt_internal.rsp" />
</Target>
</Project>

View File

@@ -14,6 +14,8 @@
#include <common/updating/updating.h>
#include <common/updating/updateState.h>
#include <common/updating/installer.h>
#include <common/updating/configBackup.h>
#include <common/updating/updateLifecycle.h>
#include <common/utils/elevation.h>
#include <common/utils/HttpClient.h>
@@ -21,6 +23,8 @@
#include <common/utils/resources.h>
#include <common/utils/timeutil.h>
#include <wil/resource.h>
#include <common/SettingsAPI/settings_helpers.h>
#include <common/logger/logger.h>
@@ -36,17 +40,59 @@ using namespace cmdArg;
namespace fs = std::filesystem;
void CleanupStaleTempUpdaters()
{
// Remove orphaned PowerToys.Update.*.exe files from previous runs
try
{
std::error_code ec;
const auto tempDir = fs::temp_directory_path();
for (const auto& entry : fs::directory_iterator(tempDir, ec))
{
if (ec)
{
break;
}
if (!entry.is_regular_file())
{
continue;
}
const auto filename = entry.path().filename().wstring();
if (filename.starts_with(L"PowerToys.Update.") && filename.ends_with(L".exe"))
{
// Skip our own file (current PID)
const auto ownFilename = L"PowerToys.Update." + std::to_wstring(GetCurrentProcessId()) + L".exe";
if (filename == ownFilename)
{
continue;
}
fs::remove(entry.path(), ec);
// Failure to delete is expected if another updater is still running
}
}
}
catch (...)
{
// Best-effort cleanup; don't block the update
}
}
std::optional<fs::path> CopySelfToTempDir()
{
CleanupStaleTempUpdaters();
std::error_code error;
auto dst_path = fs::temp_directory_path() / "PowerToys.Update.exe";
auto dst_path = fs::temp_directory_path() / (L"PowerToys.Update." + std::to_wstring(GetCurrentProcessId()) + L".exe");
fs::copy_file(get_module_filename(), dst_path, fs::copy_options::overwrite_existing, error);
if (error)
{
return std::nullopt;
}
return std::move(dst_path);
return dst_path;
}
std::optional<fs::path> ObtainInstaller(bool& isUpToDate)
@@ -57,34 +103,9 @@ std::optional<fs::path> ObtainInstaller(bool& isUpToDate)
auto state = UpdateState::read();
const auto new_version_info = std::move(get_github_version_info_async()).get();
if (std::holds_alternative<version_up_to_date>(*new_version_info))
{
isUpToDate = true;
Logger::error("Invoked with -update_now argument, but no update was available");
return std::nullopt;
}
if (state.state == UpdateState::readyToDownload || state.state == UpdateState::errorDownloading)
{
if (!new_version_info)
{
Logger::error(L"Couldn't obtain github version info: {}", new_version_info.error());
return std::nullopt;
}
// Cleanup old updates before downloading the latest
updating::cleanup_updates();
auto downloaded_installer = std::move(download_new_version_async(std::get<new_version_download_info>(*new_version_info))).get();
if (!downloaded_installer)
{
Logger::error("Couldn't download new installer");
}
return downloaded_installer;
}
else if (state.state == UpdateState::readyToInstall)
// Handle readyToInstall first — the installer is already on disk,
// so we don't need a GitHub API call (which may fail if offline).
if (state.state == UpdateState::readyToInstall)
{
fs::path installer{ get_pending_updates_path() / state.downloadedInstallerFilename };
if (fs::is_regular_file(installer))
@@ -97,12 +118,44 @@ std::optional<fs::path> ObtainInstaller(bool& isUpToDate)
return std::nullopt;
}
}
else if (state.state == UpdateState::upToDate)
if (state.state == UpdateState::upToDate)
{
isUpToDate = true;
return std::nullopt;
}
const auto new_version_info = std::move(get_github_version_info_async()).get();
// Check for error BEFORE dereferencing — the old code crashed here
// when GitHub API was unreachable (new_version_info held an error string).
if (!new_version_info)
{
Logger::error(L"Couldn't obtain github version info: {}", new_version_info.error());
return std::nullopt;
}
if (std::holds_alternative<version_up_to_date>(*new_version_info))
{
isUpToDate = true;
Logger::error("Invoked with -update_now argument, but no update was available");
return std::nullopt;
}
if (state.state == UpdateState::readyToDownload || state.state == UpdateState::errorDownloading)
{
// Cleanup old updates before downloading the latest
updating::cleanup_updates();
auto downloaded_installer = std::move(download_new_version_async(std::get<new_version_download_info>(*new_version_info))).get();
if (!downloaded_installer)
{
Logger::error("Couldn't download new installer");
}
return downloaded_installer;
}
Logger::error("Invoked with -update_now argument, but update state was invalid");
return std::nullopt;
}
@@ -116,13 +169,32 @@ bool InstallNewVersionStage1(fs::path installer)
if (pt_main_window != nullptr)
{
SendMessageW(pt_main_window, WM_CLOSE, 0, 0);
// Get the process that owns the tray window so we can wait for it to exit
DWORD ptProcessId = 0;
GetWindowThreadProcessId(pt_main_window, &ptProcessId);
// Use SendMessageTimeoutW to avoid blocking indefinitely if the
// tray window thread is hung or unresponsive.
DWORD_PTR result = 0;
SendMessageTimeoutW(pt_main_window, WM_CLOSE, 0, 0, SMTO_ABORTIFHUNG, 5000, &result);
// Wait for PT to actually exit before launching installer.
// Without this, the installer may find PT files locked.
if (ptProcessId != 0)
{
wil::unique_handle ptProcess{ OpenProcess(SYNCHRONIZE, FALSE, ptProcessId) };
if (ptProcess)
{
WaitForSingleObject(ptProcess.get(), 10000); // 10 second timeout
}
}
}
std::wstring arguments{ UPDATE_NOW_LAUNCH_STAGE2 };
arguments += L" \"";
arguments += installer.c_str();
arguments += L"\"";
// Pass the install directory so Stage 2 can relaunch PowerToys after install
const std::wstring installDir = get_module_folderpath();
std::wstring arguments = updating::BuildStage2Arguments(
UPDATE_NOW_LAUNCH_STAGE2, installer, fs::path(installDir));
SHELLEXECUTEINFOW sei{ sizeof(sei) };
sei.fMask = { SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC };
sei.lpFile = copy_in_temp->c_str();
@@ -190,9 +262,16 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
LPWSTR* args = CommandLineToArgvW(GetCommandLineW(), &nArgs);
if (!args || nArgs < 2)
{
if (args)
{
LocalFree(args);
}
return 1;
}
// D3 fix: ensure args is freed on all exit paths
auto freeArgs = wil::scope_exit([&] { LocalFree(args); });
std::wstring_view action{ args[1] };
std::filesystem::path logFilePath(PTSettingsHelper::get_root_save_folder_location());
@@ -201,6 +280,11 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
if (action == UPDATE_NOW_LAUNCH_STAGE1)
{
// Backup config files before the update to protect against corruption
Logger::info("Backing up config files before update");
auto backupResult = updating::BackupConfigFiles(fs::path(PTSettingsHelper::get_root_save_folder_location()));
Logger::info("Config backup complete: {} files backed up, {} errors", backupResult.filesBackedUp, backupResult.errors);
bool isUpToDate = false;
auto installerPath = ObtainInstaller(isUpToDate);
bool failed = !installerPath.has_value();
@@ -217,6 +301,12 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
}
else if (action == UPDATE_NOW_LAUNCH_STAGE2)
{
if (nArgs < 3)
{
Logger::error("Stage 2 invoked without installer path argument");
return 1;
}
using namespace std::string_view_literals;
const bool failed = !InstallNewVersionStage2(args[2]);
if (failed)
@@ -227,6 +317,39 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
state.state = UpdateState::errorDownloading;
});
}
// Always check for corrupted configs after Stage 2, regardless
// of install success/failure. A failed install may still corrupt configs.
Logger::info("Checking for corrupted config files after update");
auto restoreResult = updating::RestoreCorruptedConfigs(fs::path(PTSettingsHelper::get_root_save_folder_location()));
Logger::info("Config restore check complete: {}/{} files restored, {} errors",
restoreResult.filesRestored, restoreResult.filesChecked, restoreResult.errors);
if (!failed)
{
// Relaunch PowerToys from the install directory
if (updating::CanRelaunchAfterUpdate(nArgs))
{
std::wstring ptExePath = updating::BuildPowerToysExePath(args[3]);
Logger::info(L"Relaunching PowerToys after update: {}", ptExePath);
SHELLEXECUTEINFOW sei{ sizeof(sei) };
sei.fMask = { SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC };
sei.lpFile = ptExePath.c_str();
sei.nShow = SW_SHOWNORMAL;
sei.lpParameters = UPDATE_REPORT_SUCCESS;
if (!ShellExecuteExW(&sei))
{
Logger::error(L"Failed to relaunch PowerToys after update");
}
}
else
{
Logger::warn("Install directory not provided to Stage 2 - cannot relaunch PowerToys");
}
}
return failed;
}

View File

@@ -161,7 +161,7 @@
<ClCompile>
<!-- We use MultiThreadedDebug, rather than MultiThreadedDebugDLL, to avoid DLL dependencies on VCRUNTIME140d.dll and MSVCP140d.dll. -->
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<LanguageStandard Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">stdcpp17</LanguageStandard>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile>
<Link>
<!-- Link statically against the runtime and STL, but link dynamically against the CRT by ignoring the static CRT

View File

@@ -2,43 +2,35 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ManagedCommon
{
public static class IdRecoveryHelper
{
/// <summary>
/// Fixes invalid IDs in the given list by assigning unique values.
/// It ensures that all IDs are non-empty and unique, correcting any duplicates or empty IDs.
/// Ensures that all items in the provided list have unique IDs. Duplicate IDs are replaced
/// with the next available unique ID.
/// </summary>
/// <param name="items">The list of items that may contain invalid IDs.</param>
/// <param name="items">The list of items that may contain duplicate IDs.</param>
public static void RecoverInvalidIds<T>(IEnumerable<T> items)
where T : class, IHasId
{
var idSet = new HashSet<int>();
int newId = 0;
var sortedItems = items.OrderBy(i => i.Id).ToList(); // Sort items by ID for consistent processing
var seenIds = new HashSet<int>();
int nextAvailableId = 0;
// Iterate through the list and fix invalid IDs
foreach (var item in sortedItems)
foreach (var item in items)
{
// If the ID is invalid or already exists in the set (duplicate), assign a new unique ID
if (!idSet.Add(item.Id))
// If this ID is already used, assign a new unique ID.
if (!seenIds.Add(item.Id))
{
// Find the next available unique ID
while (idSet.Contains(newId))
// Find the next unused ID.
while (!seenIds.Add(nextAvailableId))
{
newId++;
nextAvailableId++;
}
item.Id = newId;
idSet.Add(newId); // Add the newly assigned ID to the set
item.Id = nextAvailableId;
}
}
}

View File

@@ -29,7 +29,7 @@
<ClCompile>
<AdditionalIncludeDirectories>..\;..\utils;..\Telemetry;..\..\;..\..\..\deps\;..\..\..\deps\spdlog\include;..\..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\include;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp23</LanguageStandard>
<PreprocessorDefinitions>SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_HEADER_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_HEADER_ONLY;FMT_UNICODE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

View File

@@ -259,6 +259,10 @@ namespace winrt::PowerToys::Interop::implementation
{
return CommonSharedConstants::TERMINATE_POWER_DISPLAY_EVENT;
}
hstring Constants::AutoDisablePowerDisplayEvent()
{
return CommonSharedConstants::POWER_DISPLAY_AUTO_DISABLE_EVENT;
}
hstring Constants::RefreshPowerDisplayMonitorsEvent()
{
return CommonSharedConstants::REFRESH_POWER_DISPLAY_MONITORS_EVENT;

View File

@@ -68,6 +68,7 @@ namespace winrt::PowerToys::Interop::implementation
static hstring ShowCmdPalEvent();
static hstring TogglePowerDisplayEvent();
static hstring TerminatePowerDisplayEvent();
static hstring AutoDisablePowerDisplayEvent();
static hstring RefreshPowerDisplayMonitorsEvent();
static hstring SettingsUpdatedPowerDisplayEvent();
static hstring PowerDisplaySendSettingsTelemetryEvent();

View File

@@ -65,6 +65,7 @@ namespace PowerToys
static String ShowCmdPalEvent();
static String TogglePowerDisplayEvent();
static String TerminatePowerDisplayEvent();
static String AutoDisablePowerDisplayEvent();
static String RefreshPowerDisplayMonitorsEvent();
static String SettingsUpdatedPowerDisplayEvent();
static String PowerDisplaySendSettingsTelemetryEvent();

View File

@@ -41,7 +41,6 @@
</PropertyGroup>
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
@@ -100,6 +99,7 @@
<ClInclude Include="Constants.h">
<DependentUpon>KeyboardListener.idl</DependentUpon>
</ClInclude>
<ClInclude Include="excluded_app.h" />
<ClInclude Include="HotkeyManager.h">
<DependentUpon>HotkeyManager.idl</DependentUpon>
</ClInclude>
@@ -114,6 +114,7 @@
<ClInclude Include="pch.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="shared_constants.h" />
<ClInclude Include="tasklist_positions.h" />
<ClInclude Include="TwoWayPipeMessageIPCManaged.h">
<DependentUpon>TwoWayPipeMessageIPCManaged.idl</DependentUpon>
</ClInclude>
@@ -127,6 +128,7 @@
<ClCompile Include="Constants.cpp">
<DependentUpon>KeyboardListener.idl</DependentUpon>
</ClCompile>
<ClCompile Include="excluded_app.cpp" />
<ClCompile Include="HotkeyManager.cpp">
<DependentUpon>HotkeyManager.idl</DependentUpon>
</ClCompile>
@@ -140,6 +142,7 @@
<ClCompile Include="pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="tasklist_positions.cpp" />
<ClCompile Include="TwoWayPipeMessageIPCManaged.cpp">
<DependentUpon>TwoWayPipeMessageIPCManaged.idl</DependentUpon>
</ClCompile>
@@ -165,6 +168,9 @@
<Midl Include="TwoWayPipeMessageIPCManaged.idl" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SettingsAPI\SettingsAPI.vcxproj">
<Project>{6955446d-23f7-4023-9bb3-8657f904af99}</Project>
</ProjectReference>
<ProjectReference Include="..\version\version.vcxproj">
<Project>{cc6e41ac-8174-4e8a-8d22-85dd7f4851df}</Project>
</ProjectReference>

View File

@@ -54,6 +54,12 @@
<ClInclude Include="Constants.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="excluded_app.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="tasklist_positions.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="keyboard_layout.cpp">
@@ -83,6 +89,12 @@
<ClCompile Include="Constants.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="excluded_app.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="tasklist_positions.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="interop.rc">

View File

@@ -0,0 +1,41 @@
#include "pch.h"
#include "excluded_app.h"
#include <../utils/string_utils.h>
extern "C"
{
__declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide()
{
PowerToysSettings::PowerToyValues settings = PowerToysSettings::PowerToyValues::load_from_settings_file(L"Shortcut Guide");
auto settingsObject = settings.get_raw_json();
std::wstring apps = settingsObject.GetNamedObject(L"properties").GetNamedObject(L"disabled_apps").GetNamedString(L"value").c_str();
auto excludedUppercase = apps;
CharUpperBuffW(excludedUppercase.data(), static_cast<DWORD>(excludedUppercase.length()));
std::wstring_view view(excludedUppercase);
view = left_trim<wchar_t>(trim<wchar_t>(view));
m_excludedApps.clear();
while (!view.empty())
{
auto pos = (std::min)(view.find_first_of(L"\r\n"), view.length());
m_excludedApps.emplace_back(view.substr(0, pos));
view.remove_prefix(pos);
view = left_trim<wchar_t>(trim<wchar_t>(view));
}
if (m_excludedApps.empty())
{
return false;
}
if (HWND foregroundApp{ GetForegroundWindow() })
{
auto processPath = get_process_path(foregroundApp);
CharUpperBuffW(processPath.data(), static_cast<DWORD>(processPath.length()));
return check_excluded_app(foregroundApp, processPath, m_excludedApps);
}
return false;
}
}

View File

@@ -0,0 +1,7 @@
#pragma once
extern "C"
{
std::vector<std::wstring> m_excludedApps;
__declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide();
}

View File

@@ -12,3 +12,29 @@
#include <winrt/Windows.Foundation.Collections.h>
#include <Windows.h>
#include <Endpointvolume.h>
#include <vector>
#include <UIAutomation.h>
#include <dxgi1_3.h>
#include <d3d11_2.h>
#include <d2d1_3.h>
#include <d2d1_3helper.h>
#include <d2d1helper.h>
#include <dwrite.h>
#include <dcomp.h>
#include <dwmapi.h>
#include <Shobjidl.h>
#include <Shlwapi.h>
#include <string>
#include <algorithm>
#include <chrono>
#include <mutex>
#include <thread>
#include <functional>
#include <condition_variable>
#include <stdexcept>
#include <tuple>
#include <unordered_set>
#include <filesystem>
#include <common/utils/excluded_apps.h>
#include <common/utils/process_path.h>
#include <../SettingsAPI/settings_objects.h>

View File

@@ -165,6 +165,7 @@ namespace CommonSharedConstants
const wchar_t SETTINGS_UPDATED_POWER_DISPLAY_EVENT[] = L"Local\\PowerToysPowerDisplay-SettingsUpdatedEvent-2e4d6f8a-1c3b-5e7f-9a1d-4c6e8f0b2d3e";
const wchar_t POWER_DISPLAY_SEND_SETTINGS_TELEMETRY_EVENT[] = L"Local\\PowerToysPowerDisplay-SettingsTelemetryEvent-8c4f2a1d-5e3b-7f9c-1a6d-3b8e5f2c9a7d";
const wchar_t HOTKEY_UPDATED_POWER_DISPLAY_EVENT[] = L"Local\\PowerToysPowerDisplay-HotkeyUpdatedEvent-9d5f3a2b-7e1c-4b8a-6f3d-2a9e5c7b1d4f";
const wchar_t POWER_DISPLAY_AUTO_DISABLE_EVENT[] = L"Local\\PowerToysPowerDisplay-AutoDisableEvent-1a7bd9af-d2e0-4e57-8879-0e1c353994d0";
const wchar_t RESCAN_POWER_DISPLAY_MONITORS_EVENT[] = L"Local\\PowerToysPowerDisplay-RescanMonitorsEvent-7f3e8c5a-1d4b-4a9e-bc6f-5d8a2b9e3c4f";
// IPC Messages used in PowerDisplay (Named Pipe communication)

View File

@@ -0,0 +1,246 @@
#include "pch.h"
#include "tasklist_positions.h"
// Tried my hardest adapting this to C#, but FindWindowW didn't work properly in C#. ~Noraa Junker
static winrt::com_ptr<IUIAutomation> automation;
static winrt::com_ptr<IUIAutomationElement> element;
static winrt::com_ptr<IUIAutomationCondition> true_condition;
extern "C"
{
HWND GetTaskbarHwndForCursorMonitor(HMONITOR monitor)
{
POINT pt;
if (!GetCursorPos(&pt))
return nullptr;
// Find the primary taskbar
HWND primaryTaskbar = FindWindowW(L"Shell_TrayWnd", nullptr);
if (primaryTaskbar)
{
MONITORINFO mi = { sizeof(mi) };
if (GetWindowRect(primaryTaskbar, &mi.rcMonitor))
{
HMONITOR primaryMonitor = MonitorFromRect(&mi.rcMonitor, MONITOR_DEFAULTTONEAREST);
if (primaryMonitor == monitor)
return primaryTaskbar;
}
}
// Find the secondary taskbar(s)
HWND secondaryTaskbar = nullptr;
while ((secondaryTaskbar = FindWindowExW(nullptr, secondaryTaskbar, L"Shell_SecondaryTrayWnd", nullptr)) != nullptr)
{
MONITORINFO mi = { sizeof(mi) };
RECT rc;
if (GetWindowRect(secondaryTaskbar, &rc))
{
HMONITOR taskbarMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
if (monitor == taskbarMonitor)
return secondaryTaskbar;
}
}
return nullptr;
}
void update(HMONITOR monitor)
{
// Get HWND of the tasklist for the monitor under the cursor
auto taskbar_hwnd = GetTaskbarHwndForCursorMonitor(monitor);
if (!taskbar_hwnd)
return;
wchar_t class_name[64] = {};
GetClassNameW(taskbar_hwnd, class_name, 64);
HWND tasklist_hwnd = nullptr;
if (wcscmp(class_name, L"Shell_TrayWnd") == 0)
{
// Primary taskbar structure
tasklist_hwnd = FindWindowExW(taskbar_hwnd, 0, L"ReBarWindow32", nullptr);
if (!tasklist_hwnd)
return;
tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"MSTaskSwWClass", nullptr);
if (!tasklist_hwnd)
return;
tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"MSTaskListWClass", nullptr);
if (!tasklist_hwnd)
return;
}
else if (wcscmp(class_name, L"Shell_SecondaryTrayWnd") == 0)
{
// Secondary taskbar structure
HWND worker_hwnd = FindWindowExW(taskbar_hwnd, 0, L"WorkerW", nullptr);
if (!worker_hwnd)
return;
tasklist_hwnd = FindWindowExW(worker_hwnd, 0, L"MSTaskListWClass", nullptr);
if (!tasklist_hwnd)
return;
}
else
{
// Unknown taskbar type
return;
}
if (!automation)
{
winrt::check_hresult(CoCreateInstance(CLSID_CUIAutomation,
nullptr,
CLSCTX_INPROC_SERVER,
IID_IUIAutomation,
automation.put_void()));
winrt::check_hresult(automation->CreateTrueCondition(true_condition.put()));
}
element = nullptr;
winrt::check_hresult(automation->ElementFromHandle(tasklist_hwnd, element.put()));
}
void update_new(HMONITOR monitor)
{
// Get HWND of the tasklist for the monitor under the cursor
auto taskbar_hwnd = GetTaskbarHwndForCursorMonitor(monitor);
if (!taskbar_hwnd)
return;
wchar_t class_name[64] = {};
GetClassNameW(taskbar_hwnd, class_name, 64);
HWND tasklist_hwnd = nullptr;
if (wcscmp(class_name, L"Shell_TrayWnd") == 0 || wcscmp(class_name, L"Shell_SecondaryTrayWnd") == 0)
{
// Primary taskbar structure
tasklist_hwnd = FindWindowExW(taskbar_hwnd, 0, L"Windows.UI.Composition.DesktopWindowContentBridge", nullptr);
if (!tasklist_hwnd)
return;
tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"Windows.UI.Input.InputSite.WindowClass", nullptr);
if (!tasklist_hwnd)
return;
}
else
{
// Unknown taskbar type
return;
}
if (!automation)
{
winrt::check_hresult(CoCreateInstance(CLSID_CUIAutomation,
nullptr,
CLSCTX_INPROC_SERVER,
IID_IUIAutomation,
automation.put_void()));
winrt::check_hresult(automation->CreateTrueCondition(true_condition.put()));
}
winrt::com_ptr<IUIAutomationElement> tempElement;
element = nullptr;
winrt::check_hresult(automation->ElementFromHandle(tasklist_hwnd, tempElement.put()));
winrt::check_hresult(
tempElement->FindFirst(TreeScope_Children, true_condition.get(), element.put()));
}
bool update_buttons(std::vector<TasklistButton>& buttons)
{
if (!automation || !element)
{
return false;
}
winrt::com_ptr<IUIAutomationElementArray> elements;
if (element->FindAll(TreeScope_Children, true_condition.get(), elements.put()) < 0)
return false;
if (!elements)
return false;
int count;
if (elements->get_Length(&count) < 0)
return false;
winrt::com_ptr<IUIAutomationElement> child;
std::vector<TasklistButton> found_buttons;
found_buttons.reserve(count);
for (int i = 0; i < count; ++i)
{
child = nullptr;
if (elements->GetElement(i, child.put()) < 0)
return false;
TasklistButton button = {};
if (VARIANT var_rect; child->GetCurrentPropertyValue(UIA_BoundingRectanglePropertyId, &var_rect) >= 0)
{
if (var_rect.vt == (VT_R8 | VT_ARRAY))
{
LONG pos;
double value;
pos = 0;
SafeArrayGetElement(var_rect.parray, &pos, &value);
button.x = static_cast<long>(value);
pos = 1;
SafeArrayGetElement(var_rect.parray, &pos, &value);
button.y = static_cast<long>(value);
pos = 2;
SafeArrayGetElement(var_rect.parray, &pos, &value);
button.width = static_cast<long>(value);
pos = 3;
SafeArrayGetElement(var_rect.parray, &pos, &value);
button.height = static_cast<long>(value);
}
VariantClear(&var_rect);
}
else
{
return false;
}
if (BSTR automation_id; child->get_CurrentAutomationId(&automation_id) >= 0)
{
wcsncpy_s(button.name, automation_id, _countof(button.name));
SysFreeString(automation_id);
if (wcsncmp(button.name, L"Appid:", wcslen(L"Appid:")) != 0)
{
continue;
}
}
found_buttons.push_back(button);
}
// assign keynums
buttons.clear();
for (auto& button : found_buttons)
{
if (buttons.empty())
{
button.keynum = 1;
buttons.push_back(std::move(button));
}
else
{
if (button.x < buttons.back().x || button.y < buttons.back().y) // skip 2nd row
break;
if (wcsncmp(button.name, buttons.back().name, _countof(button.name)) == 0)
continue; // skip buttons from the same app
button.keynum = buttons.back().keynum + 1;
buttons.push_back(std::move(button));
if (buttons.back().keynum == 10)
break; // no more than 10 buttons
}
}
return true;
}
__declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size)
{
update(monitor);
static std::vector<TasklistButton> buttons;
update_buttons(buttons);
*size = static_cast<int>(buttons.size());
if (*size == 0)
{
// After a certain Windows update, the old method stopped working, try the new one
update_new(monitor);
update_buttons(buttons);
*size = static_cast<int>(buttons.size());
}
return buttons.data();
}
}

View File

@@ -0,0 +1,19 @@
#pragma once
struct TasklistButton
{
wchar_t name[256];
int x;
int y;
int width;
int height;
int keynum;
};
extern "C"
{
// Helper to get the taskbar HWND for the monitor under the cursor
HWND GetTaskbarHwndForCursorMonitor(HMONITOR monitor);
bool update_buttons(std::vector<TasklistButton>& buttons);
__declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size);
}

View File

@@ -1,7 +1,27 @@
#pragma once
#include <spdlog/spdlog.h>
#include <type_traits>
#include "logger_settings.h"
// fmt 9+ no longer auto-formats enums. Provide a generic formatter that
// converts any scoped or unscoped enum to its underlying integer type so
// existing Logger::xxx(L"... {} ...", someEnum) call sites keep working
// after the spdlog 1.17 / fmt 12 upgrade.
namespace fmt
{
template <typename E, typename Char>
struct formatter<E, Char, std::enable_if_t<std::is_enum_v<E>>>
: formatter<std::underlying_type_t<E>, Char>
{
template <typename FormatContext>
auto format(E value, FormatContext& ctx) const
{
return formatter<std::underlying_type_t<E>, Char>::format(
static_cast<std::underlying_type_t<E>>(value), ctx);
}
};
}
class Logger
{
private:
@@ -17,44 +37,44 @@ public:
// log message should not be localized
template<typename FormatString, typename... Args>
static void trace(const FormatString& fmt, const Args&... args)
static void trace(const FormatString& formatString, const Args&... args)
{
logger->trace(fmt, args...);
logger->trace(fmt::runtime(formatString), args...);
}
// log message should not be localized
template<typename FormatString, typename... Args>
static void debug(const FormatString& fmt, const Args&... args)
static void debug(const FormatString& formatString, const Args&... args)
{
logger->debug(fmt, args...);
logger->debug(fmt::runtime(formatString), args...);
}
// log message should not be localized
template<typename FormatString, typename... Args>
static void info(const FormatString& fmt, const Args&... args)
static void info(const FormatString& formatString, const Args&... args)
{
logger->info(fmt, args...);
logger->info(fmt::runtime(formatString), args...);
}
// log message should not be localized
template<typename FormatString, typename... Args>
static void warn(const FormatString& fmt, const Args&... args)
static void warn(const FormatString& formatString, const Args&... args)
{
logger->warn(fmt, args...);
logger->warn(fmt::runtime(formatString), args...);
}
// log message should not be localized
template<typename FormatString, typename... Args>
static void error(const FormatString& fmt, const Args&... args)
static void error(const FormatString& formatString, const Args&... args)
{
logger->error(fmt, args...);
logger->error(fmt::runtime(formatString), args...);
}
// log message should not be localized
template<typename FormatString, typename... Args>
static void critical(const FormatString& fmt, const Args&... args)
static void critical(const FormatString& formatString, const Args&... args)
{
logger->critical(fmt, args...);
logger->critical(fmt::runtime(formatString), args...);
}
static void flush()

View File

@@ -0,0 +1,679 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#include "pch.h"
#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#include <common/updating/configBackup.h>
#include <common/updating/updateLifecycle.h>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace fs = std::filesystem;
namespace UpdatingUnitTests
{
// Helper to create a temp directory for test isolation.
// Each instance gets a unique subdirectory to prevent test interference.
class TempDir
{
public:
TempDir()
{
wchar_t tempPath[MAX_PATH + 1];
GetTempPathW(MAX_PATH, tempPath);
static std::atomic<int> counter{0};
m_path = fs::path(tempPath) / (L"PowerToysUpdateTests_" + std::to_wstring(counter++));
// Ensure clean state
std::error_code ec;
fs::remove_all(m_path, ec);
fs::create_directories(m_path, ec);
}
~TempDir()
{
std::error_code ec;
fs::remove_all(m_path, ec);
}
const fs::path& path() const { return m_path; }
// Write a file with the given content
void WriteFile(const fs::path& relativePath, const std::string& content)
{
auto fullPath = m_path / relativePath;
fs::create_directories(fullPath.parent_path());
std::ofstream file(fullPath, std::ios::binary);
file.write(content.data(), content.size());
}
// Write a file with raw bytes (including null bytes for corruption testing)
void WriteFileBytes(const fs::path& relativePath, const std::vector<char>& bytes)
{
auto fullPath = m_path / relativePath;
fs::create_directories(fullPath.parent_path());
std::ofstream file(fullPath, std::ios::binary);
file.write(bytes.data(), bytes.size());
}
// Read file content as string
std::string ReadFile(const fs::path& relativePath)
{
auto fullPath = m_path / relativePath;
std::ifstream file(fullPath, std::ios::binary);
return std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
}
bool FileExists(const fs::path& relativePath)
{
return fs::exists(m_path / relativePath);
}
private:
fs::path m_path;
};
TEST_CLASS(IsJsonFileCorruptedTests)
{
public:
// Tests IsJsonFileCorrupted: valid JSON with no null bytes returns false.
// Covers: configBackup.h IsJsonFileCorrupted — happy path, full file scan.
TEST_METHOD(CleanJsonFileIsNotCorrupted)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark","startup":true})");
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"settings.json"));
}
// Tests IsJsonFileCorrupted: zero-length file returns false (empty is not corrupted).
// Covers: configBackup.h IsJsonFileCorrupted — file.read returns 0 bytes immediately.
TEST_METHOD(EmptyFileIsNotCorrupted)
{
TempDir dir;
dir.WriteFile(L"empty.json", "");
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"empty.json"));
}
// Tests IsJsonFileCorrupted: file containing embedded null bytes returns true.
// Covers: configBackup.h IsJsonFileCorrupted — null byte detection within buffer.
TEST_METHOD(FileWithNullBytesIsCorrupted)
{
TempDir dir;
std::vector<char> corrupted = { '{', '"', 'a', '"', ':', '\0', '\0', '\0', '}' };
dir.WriteFileBytes(L"corrupted.json", corrupted);
Assert::IsTrue(updating::IsJsonFileCorrupted(dir.path() / L"corrupted.json"));
}
// Tests IsJsonFileCorrupted: file entirely filled with 0x00 bytes returns true.
// Reproduces the exact bug from #46179 where installer zeroed out JSON files.
// Covers: configBackup.h IsJsonFileCorrupted — first byte is null.
TEST_METHOD(FileFilledWithNullBytesIsCorrupted)
{
TempDir dir;
std::vector<char> allNulls(1024, '\0');
dir.WriteFileBytes(L"workspaces.json", allNulls);
Assert::IsTrue(updating::IsJsonFileCorrupted(dir.path() / L"workspaces.json"));
}
// Tests IsJsonFileCorrupted: path that does not exist returns false.
// Covers: configBackup.h IsJsonFileCorrupted — file.is_open() check.
TEST_METHOD(NonExistentFileIsNotCorrupted)
{
TempDir dir;
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"missing.json"));
}
// Tests IsJsonFileCorrupted: file larger than the 4096-byte read chunk
// with no null bytes returns false.
// Covers: configBackup.h IsJsonFileCorrupted — multi-chunk while loop.
TEST_METHOD(LargeCleanFileIsNotCorrupted)
{
TempDir dir;
std::string largeContent(8192, 'x');
dir.WriteFile(L"large.json", largeContent);
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"large.json"));
}
// Tests IsJsonFileCorrupted: null byte placed after the first 4096-byte
// chunk boundary is still detected.
// Covers: configBackup.h IsJsonFileCorrupted — second chunk scan.
TEST_METHOD(NullByteAtEndOfLargeFileIsDetected)
{
TempDir dir;
std::string content(5000, 'x');
content[4999] = '\0';
std::vector<char> bytes(content.begin(), content.end());
dir.WriteFileBytes(L"sneaky.json", bytes);
Assert::IsTrue(updating::IsJsonFileCorrupted(dir.path() / L"sneaky.json"));
}
};
TEST_CLASS(BackupConfigFilesTests)
{
public:
// Tests BackupConfigFiles: root-level .json files are copied to ConfigBackup.
// Covers: configBackup.h BackupConfigFiles — root directory_iterator,
// is_regular_file && extension == ".json" branch.
// Setup: Two root-level JSON files.
TEST_METHOD(BackupCopiesRootJsonFiles)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
dir.WriteFile(L"UpdateState.json", R"({"state":0})");
updating::BackupConfigFiles(dir.path());
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\settings.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\UpdateState.json"));
Assert::AreEqual(std::string(R"({"theme":"dark"})"), dir.ReadFile(L"ConfigBackup\\settings.json"));
}
// Tests BackupConfigFiles: .json files inside module subdirectories are
// copied to ConfigBackup/<module>/.
// Covers: configBackup.h BackupConfigFiles — is_directory branch,
// module directory_iterator with extension filter.
// Setup: Root JSON + two module directories with JSON files.
TEST_METHOD(BackupCopiesModuleJsonFiles)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
dir.WriteFile(L"FancyZones\\settings.json", R"({"zones":[]})");
dir.WriteFile(L"Workspaces\\workspaces.json", R"({"workspaces":[]})");
updating::BackupConfigFiles(dir.path());
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\FancyZones\\settings.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\Workspaces\\workspaces.json"));
Assert::AreEqual(std::string(R"({"zones":[]})"),
dir.ReadFile(L"ConfigBackup\\FancyZones\\settings.json"));
}
// Tests BackupConfigFiles: non-.json files at root level are not copied.
// Covers: configBackup.h BackupConfigFiles — extension filter excludes .log.
// Setup: One JSON file + one .log file at root.
TEST_METHOD(BackupSkipsNonJsonFiles)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
dir.WriteFile(L"debug.log", "log data");
updating::BackupConfigFiles(dir.path());
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\settings.json"));
Assert::IsFalse(dir.FileExists(L"ConfigBackup\\debug.log"));
}
// Tests BackupConfigFiles: the "Updates" directory is explicitly skipped.
// Covers: configBackup.h BackupConfigFiles — dirName == L"Updates" continue.
// Setup: Root JSON + Updates directory containing a file.
TEST_METHOD(BackupSkipsUpdatesDirectory)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
dir.WriteFile(L"Updates\\installer.exe", "fake exe");
updating::BackupConfigFiles(dir.path());
Assert::IsFalse(dir.FileExists(L"ConfigBackup\\Updates"));
}
// Tests BackupConfigFiles: running backup twice overwrites the previous
// backup with current file content.
// Covers: configBackup.h BackupConfigFiles — fs::remove_all(backupDir) +
// copy_options::overwrite_existing.
// Setup: Backup, modify original, backup again.
TEST_METHOD(BackupOverwritesPreviousBackup)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"version":1})");
updating::BackupConfigFiles(dir.path());
// Update the original
dir.WriteFile(L"settings.json", R"({"version":2})");
updating::BackupConfigFiles(dir.path());
Assert::AreEqual(std::string(R"({"version":2})"), dir.ReadFile(L"ConfigBackup\\settings.json"));
}
// Tests BackupConfigFiles: non-.json files inside module subdirectories
// (e.g., FancyZones/zones.dat) should NOT be backed up.
// Covers: configBackup.h BackupConfigFiles — extension filter in module loop.
TEST_METHOD(BackupSkipsNonJsonFilesInModuleDirs)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({})");
dir.WriteFile(L"FancyZones\\settings.json", R"({"zones":[]})");
dir.WriteFile(L"FancyZones\\zones.dat", "binary data");
updating::BackupConfigFiles(dir.path());
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\FancyZones\\settings.json"));
Assert::IsFalse(dir.FileExists(L"ConfigBackup\\FancyZones\\zones.dat"));
}
// Tests BackupConfigFiles: empty root directory with no files produces
// an empty ConfigBackup dir without errors.
// Covers: configBackup.h BackupConfigFiles — empty directory_iterator.
TEST_METHOD(BackupEmptyRootDirSucceeds)
{
TempDir dir;
// Root dir exists but has no files
updating::BackupConfigFiles(dir.path());
Assert::IsTrue(dir.FileExists(L"ConfigBackup"));
}
};
TEST_CLASS(RestoreCorruptedConfigsTests)
{
public:
// Tests RestoreCorruptedConfigs: corrupted root-level JSON file is restored
// from the good backup copy.
// Covers: configBackup.h RestoreCorruptedConfigs — root file restore branch,
// fs::exists + IsJsonFileCorrupted + backup integrity check.
// Setup: Good file -> backup -> corrupt original -> restore.
TEST_METHOD(RestoreFixesCorruptedRootFile)
{
TempDir dir;
const std::string goodContent = R"({"theme":"dark"})";
dir.WriteFile(L"settings.json", goodContent);
// Backup
updating::BackupConfigFiles(dir.path());
// Corrupt the original
std::vector<char> corrupted(goodContent.size(), '\0');
dir.WriteFileBytes(L"settings.json", corrupted);
Assert::IsTrue(updating::IsJsonFileCorrupted(dir.path() / L"settings.json"));
// Restore
updating::RestoreCorruptedConfigs(dir.path());
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"settings.json"));
Assert::AreEqual(goodContent, dir.ReadFile(L"settings.json"));
}
// Tests RestoreCorruptedConfigs: corrupted module-level JSON file is restored
// from the good backup copy.
// Covers: configBackup.h RestoreCorruptedConfigs — module directory branch,
// moduleBackupEntry restore with integrity check.
// Setup: Module file + root file -> backup -> corrupt module file -> restore.
TEST_METHOD(RestoreFixesCorruptedModuleFile)
{
TempDir dir;
const std::string goodContent = R"({"workspaces":[]})";
dir.WriteFile(L"Workspaces\\workspaces.json", goodContent);
dir.WriteFile(L"settings.json", R"({})");
updating::BackupConfigFiles(dir.path());
// Corrupt the module file
std::vector<char> corrupted(goodContent.size(), '\0');
dir.WriteFileBytes(L"Workspaces\\workspaces.json", corrupted);
updating::RestoreCorruptedConfigs(dir.path());
Assert::AreEqual(goodContent, dir.ReadFile(L"Workspaces\\workspaces.json"));
}
// Tests RestoreCorruptedConfigs: clean (non-corrupted) files are NOT
// overwritten by backup — preserves user changes made after backup.
// Covers: configBackup.h RestoreCorruptedConfigs — IsJsonFileCorrupted
// returns false, copy_file is skipped.
// Setup: File -> backup -> modify (but keep valid) -> restore.
TEST_METHOD(RestoreLeavesCleanFilesUntouched)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"version":1})");
updating::BackupConfigFiles(dir.path());
// Modify original (but keep it clean JSON)
dir.WriteFile(L"settings.json", R"({"version":2})");
updating::RestoreCorruptedConfigs(dir.path());
// Should NOT have been restored since it's not corrupted
Assert::AreEqual(std::string(R"({"version":2})"), dir.ReadFile(L"settings.json"));
}
// Tests RestoreCorruptedConfigs: when no ConfigBackup directory exists,
// restore silently does nothing (no crash, no data loss).
// Covers: configBackup.h RestoreCorruptedConfigs — !fs::exists(backupDir)
// early return.
// Setup: File with no prior backup.
TEST_METHOD(RestoreHandlesMissingBackupDirectory)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
// No backup was created - restore should silently do nothing
updating::RestoreCorruptedConfigs(dir.path());
Assert::AreEqual(std::string(R"({"theme":"dark"})"), dir.ReadFile(L"settings.json"));
}
// Tests RestoreCorruptedConfigs: end-to-end scenario with multiple modules,
// some corrupted and some clean, verifying selective restore.
// Covers: configBackup.h RestoreCorruptedConfigs — both root and module
// branches, selective restore based on corruption status.
// Setup: 4 modules -> backup -> corrupt 2 -> restore -> verify all 4.
TEST_METHOD(FullBackupAndRestoreRoundTrip)
{
TempDir dir;
// Set up a realistic config structure
dir.WriteFile(L"settings.json", R"({"startup":true,"theme":"dark"})");
dir.WriteFile(L"FancyZones\\settings.json", R"({"zones":[{"id":1}]})");
dir.WriteFile(L"Workspaces\\workspaces.json", R"({"workspaces":[{"name":"dev"}]})");
dir.WriteFile(L"KeyboardManager\\default.json", R"({"remaps":[]})");
// Backup
updating::BackupConfigFiles(dir.path());
// Corrupt some files (simulating #46179 scenario)
dir.WriteFileBytes(L"Workspaces\\workspaces.json", std::vector<char>(100, '\0'));
dir.WriteFileBytes(L"settings.json", std::vector<char>(50, '\0'));
// Leave FancyZones and KBM clean
// Restore
updating::RestoreCorruptedConfigs(dir.path());
// Corrupted files should be restored
Assert::AreEqual(std::string(R"({"startup":true,"theme":"dark"})"), dir.ReadFile(L"settings.json"));
Assert::AreEqual(std::string(R"({"workspaces":[{"name":"dev"}]})"), dir.ReadFile(L"Workspaces\\workspaces.json"));
// Clean files should be unchanged
Assert::AreEqual(std::string(R"({"zones":[{"id":1}]})"), dir.ReadFile(L"FancyZones\\settings.json"));
Assert::AreEqual(std::string(R"({"remaps":[]})"), dir.ReadFile(L"KeyboardManager\\default.json"));
}
// Tests RestoreCorruptedConfigs: when the original file has been deleted
// (not corrupted), restore should NOT recreate it from backup. The installer
// may have intentionally removed obsolete config files.
// Covers: configBackup.h RestoreCorruptedConfigs — fs::exists guard.
TEST_METHOD(RestoreSkipsDeletedOriginals)
{
TempDir dir;
dir.WriteFile(L"obsolete.json", R"({"old":true})");
updating::BackupConfigFiles(dir.path());
// Installer deletes the file
std::error_code ec;
fs::remove(dir.path() / L"obsolete.json", ec);
updating::RestoreCorruptedConfigs(dir.path());
// Should NOT be recreated
Assert::IsFalse(dir.FileExists(L"obsolete.json"));
}
// Tests RestoreCorruptedConfigs: when the backup file itself is corrupted
// (e.g., disk error during backup), restore should NOT copy corrupted
// backup over the original — that would make things worse.
// Covers: configBackup.h RestoreCorruptedConfigs — backup integrity check (B2 fix).
TEST_METHOD(RestoreSkipsCorruptedBackup)
{
TempDir dir;
dir.WriteFile(L"settings.json", R"({"theme":"dark"})");
updating::BackupConfigFiles(dir.path());
// Corrupt BOTH the original AND the backup
std::vector<char> nulls(50, '\0');
dir.WriteFileBytes(L"settings.json", nulls);
dir.WriteFileBytes(L"ConfigBackup\\settings.json", nulls);
updating::RestoreCorruptedConfigs(dir.path());
// Original should still be corrupted — we don't restore from bad backup
Assert::IsTrue(updating::IsJsonFileCorrupted(dir.path() / L"settings.json"));
}
};
// Simulates what actually happens during a PowerToys upgrade:
// 1. User has settings from normal use
// 2. Updater backs up before install (Stage 1)
// 3. Installer runs and corrupts some files (simulated)
// 4. Updater restores corrupted files (Stage 2)
// 5. PT relaunches and finds working configs
TEST_CLASS(UpgradeSimulationTests)
{
public:
// Tests full upgrade simulation: backup -> installer corrupts files -> restore.
// Verifies that corrupted files are restored and clean files are untouched.
// Covers: configBackup.h BackupConfigFiles + RestoreCorruptedConfigs —
// end-to-end with 5 modules, 2 corrupted, 3 clean.
// Setup: Realistic config structure with multiple modules.
TEST_METHOD(SimulateUpgradeWithCorruption)
{
TempDir dir;
// === User's real config state before upgrade ===
dir.WriteFile(L"settings.json",
R"({"startup":true,"theme":"dark","run_elevated":false,"download_updates_automatically":true})");
dir.WriteFile(L"FancyZones\\settings.json",
R"({"zones":[{"id":1,"rect":{"x":0,"y":0,"w":960,"h":1080}}]})");
dir.WriteFile(L"Workspaces\\workspaces.json",
R"({"workspaces":[{"name":"dev","apps":["code","terminal"]}]})");
dir.WriteFile(L"KeyboardManager\\default.json",
R"({"remapKeys":{"inProcess":[{"original":"0x41","new":"0x42"}]}})");
dir.WriteFile(L"MouseWithoutBorders\\settings.json",
R"({"machineKey":"abc123","connectToAll":true})");
// Non-JSON files that should be left alone
dir.WriteFile(L"update.log", "2026-04-11 update started");
// === Stage 1: Backup before killing PT ===
updating::BackupConfigFiles(dir.path());
// Verify backup was created correctly
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\settings.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\FancyZones\\settings.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\Workspaces\\workspaces.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\KeyboardManager\\default.json"));
Assert::IsTrue(dir.FileExists(L"ConfigBackup\\MouseWithoutBorders\\settings.json"));
Assert::IsFalse(dir.FileExists(L"ConfigBackup\\update.log"));
// === Installer runs: some files get corrupted (the #46179 scenario) ===
// Workspaces JSON filled with null bytes
dir.WriteFileBytes(L"Workspaces\\workspaces.json", std::vector<char>(512, '\0'));
// Main settings partially corrupted (null bytes injected)
std::vector<char> partialCorrupt = { '{', '"', 's', '\0', '\0', '\0', '\0', '}' };
dir.WriteFileBytes(L"settings.json", partialCorrupt);
// FancyZones, KBM, and MWB survive the install fine
// (this is realistic - not all files get corrupted)
// === Stage 2: Restore after install completes ===
updating::RestoreCorruptedConfigs(dir.path());
// === Verify: PT relaunches and finds working configs ===
// Corrupted files should be restored from backup
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"settings.json"));
Assert::IsFalse(updating::IsJsonFileCorrupted(dir.path() / L"Workspaces\\workspaces.json"));
Assert::AreEqual(
std::string(R"({"startup":true,"theme":"dark","run_elevated":false,"download_updates_automatically":true})"),
dir.ReadFile(L"settings.json"));
Assert::AreEqual(
std::string(R"({"workspaces":[{"name":"dev","apps":["code","terminal"]}]})"),
dir.ReadFile(L"Workspaces\\workspaces.json"));
// Clean files should be untouched (not overwritten with backup)
Assert::AreEqual(
std::string(R"({"zones":[{"id":1,"rect":{"x":0,"y":0,"w":960,"h":1080}}]})"),
dir.ReadFile(L"FancyZones\\settings.json"));
Assert::AreEqual(
std::string(R"({"remapKeys":{"inProcess":[{"original":"0x41","new":"0x42"}]}})"),
dir.ReadFile(L"KeyboardManager\\default.json"));
Assert::AreEqual(
std::string(R"({"machineKey":"abc123","connectToAll":true})"),
dir.ReadFile(L"MouseWithoutBorders\\settings.json"));
}
// Tests upgrade from an old version that has fewer modules than the new version.
// Verifies that new module configs (created by the installer) are not touched
// by restore, while corrupted old configs are restored.
// Covers: configBackup.h RestoreCorruptedConfigs — module dir in root that
// has no corresponding backup entry.
// Setup: Old version with 1 module -> backup -> new installer adds module -> corrupt old -> restore.
TEST_METHOD(SimulateUpgradeFromVeryOldVersion)
{
TempDir dir;
// Old version had fewer modules - only settings.json
dir.WriteFile(L"settings.json", R"({"theme":"dark","powertoys_version":"v0.60.0"})");
// Backup
updating::BackupConfigFiles(dir.path());
// New installer creates new module dirs that didn't exist before
dir.WriteFile(L"NewModule\\settings.json", R"({"enabled":true})");
// Old settings get corrupted during upgrade
dir.WriteFileBytes(L"settings.json", std::vector<char>(100, '\0'));
// Restore
updating::RestoreCorruptedConfigs(dir.path());
// Old settings restored
Assert::AreEqual(
std::string(R"({"theme":"dark","powertoys_version":"v0.60.0"})"),
dir.ReadFile(L"settings.json"));
// New module settings untouched (no backup existed for them)
Assert::AreEqual(
std::string(R"({"enabled":true})"),
dir.ReadFile(L"NewModule\\settings.json"));
}
};
// Tests for the update lifecycle: argument passing between Stage 1 and Stage 2,
// relaunch path construction, and the handoff that was broken in #42004/#43011/#44071.
TEST_CLASS(UpdateLifecycleTests)
{
public:
// Tests BuildStage2Arguments: output contains the stage 2 flag, installer path,
// and install directory — all three components needed for Stage 2.
// Covers: updateLifecycle.h BuildStage2Arguments — concatenation logic.
// Setup: Typical paths with spaces (Program Files).
TEST_METHOD(BuildStage2ArgumentsContainsInstallerAndInstallDir)
{
const auto args = updating::BuildStage2Arguments(
L"-update_now_stage_2",
L"C:\\Users\\test\\AppData\\Local\\PowerToys\\Updates\\powertoyssetup-x64.exe",
L"C:\\Program Files\\PowerToys");
// Must contain the stage 2 flag
Assert::IsTrue(args.find(L"-update_now_stage_2") != std::wstring::npos);
// Must contain the installer path (quoted)
Assert::IsTrue(args.find(L"powertoyssetup-x64.exe") != std::wstring::npos);
// Must contain the install directory (quoted) — this was MISSING before our fix
Assert::IsTrue(args.find(L"C:\\Program Files\\PowerToys") != std::wstring::npos);
}
// Tests BuildStage2Arguments: both paths are wrapped in double quotes to
// survive CommandLineToArgvW parsing when paths contain spaces.
// Covers: updateLifecycle.h BuildStage2Arguments — quote wrapping.
// Setup: Installer path with spaces.
TEST_METHOD(BuildStage2ArgumentsQuotesBothPaths)
{
const auto args = updating::BuildStage2Arguments(
L"-update_now_stage_2",
L"C:\\path with spaces\\installer.exe",
L"C:\\Program Files\\PowerToys");
// Count quotes — should have 4 (open/close for each path)
size_t quoteCount = std::count(args.begin(), args.end(), L'"');
Assert::AreEqual(size_t{ 4 }, quoteCount);
}
// Tests BuildPowerToysExePath: appends "PowerToys.exe" to the install dir.
// Covers: updateLifecycle.h BuildPowerToysExePath — fs::path / operator.
// Setup: Standard install path without trailing backslash.
TEST_METHOD(BuildPowerToysExePathAppendsExeName)
{
const auto path = updating::BuildPowerToysExePath(L"C:\\Program Files\\PowerToys");
Assert::AreEqual(std::wstring(L"C:\\Program Files\\PowerToys\\PowerToys.exe"), path);
}
// Tests BuildPowerToysExePath: trailing backslash does not produce double
// backslash (e.g., "...PowerToys\\PowerToys.exe").
// Covers: updateLifecycle.h BuildPowerToysExePath — fs::path normalizes separators.
// Setup: Install path with trailing backslash.
TEST_METHOD(BuildPowerToysExePathHandlesTrailingBackslash)
{
const auto path = updating::BuildPowerToysExePath(L"C:\\Program Files\\PowerToys\\");
Assert::AreEqual(std::wstring(L"C:\\Program Files\\PowerToys\\PowerToys.exe"), path);
}
// Tests BuildPowerToysExePath: empty string produces just "PowerToys.exe".
// Covers: updateLifecycle.h BuildPowerToysExePath — fs::path with empty input.
// Setup: Empty install directory string.
TEST_METHOD(BuildPowerToysExePathHandlesEmptyString)
{
const auto path = updating::BuildPowerToysExePath(L"");
Assert::AreEqual(std::wstring(L"PowerToys.exe"), path);
}
// Tests CanRelaunchAfterUpdate: returns true when Stage 2 receives
// the install directory (argCount >= 4), false otherwise.
// This is the gate that prevents relaunch when using an old Stage 1
// that didn't pass the install dir (#42004/#43011/#44071).
// Covers: updateLifecycle.h CanRelaunchAfterUpdate.
TEST_METHOD(CanRelaunchReflectsArgCount)
{
// Old Stage 1 (pre-fix): only passed action + installer = 3 args
Assert::IsFalse(updating::CanRelaunchAfterUpdate(0));
Assert::IsFalse(updating::CanRelaunchAfterUpdate(1));
Assert::IsFalse(updating::CanRelaunchAfterUpdate(2));
Assert::IsFalse(updating::CanRelaunchAfterUpdate(3));
// New Stage 1 (post-fix): passes action + installer + installDir = 4 args
Assert::IsTrue(updating::CanRelaunchAfterUpdate(4));
Assert::IsTrue(updating::CanRelaunchAfterUpdate(5));
}
// Tests BuildStage2Arguments + CommandLineToArgvW round-trip: the exact
// scenario where Stage 1 builds args and Windows parses them in Stage 2.
// Verifies quoting is correct so paths with spaces survive the round trip.
// Covers: updateLifecycle.h BuildStage2Arguments — quote correctness.
// Setup: Realistic paths with spaces and version numbers.
TEST_METHOD(Stage2ArgumentsCanBeRoundTrippedThroughCommandLineToArgvW)
{
const std::wstring installerPath = L"C:\\Users\\test user\\AppData\\Local\\PowerToys\\Updates\\powertoyssetup-0.86.0-x64.exe";
const std::wstring installDir = L"C:\\Program Files\\PowerToys";
const auto args = updating::BuildStage2Arguments(L"-update_now_stage_2", installerPath, installDir);
// Simulate what Windows does: prepend a fake exe name and parse
std::wstring commandLine = L"PowerToys.Update.exe " + args;
int argc = 0;
LPWSTR* argv = CommandLineToArgvW(commandLine.c_str(), &argc);
Assert::IsNotNull(argv);
Assert::AreEqual(4, argc);
Assert::AreEqual(std::wstring(L"-update_now_stage_2"), std::wstring(argv[1]));
Assert::AreEqual(installerPath, std::wstring(argv[2]));
Assert::AreEqual(installDir, std::wstring(argv[3]));
LocalFree(argv);
}
};
}

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>UpdatingUnitTests</RootNamespace>
<ProjectSubType>NativeUnitTestProject</ProjectSubType>
<ProjectName>Updating.UnitTests</ProjectName>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\tests\UpdatingUnitTests\</OutDir>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\;..\..\;..\..\..\;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="UpdatingTests.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(UsePrecompiledHeaders)' != 'false'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -0,0 +1,5 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#include "pch.h"

View File

@@ -0,0 +1,17 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#ifndef PCH_H
#define PCH_H
#include <atomic>
#include <Windows.h>
// Suppressing 26466 - Don't use static_cast downcasts - in CppUnitTest.h
#pragma warning(push)
#pragma warning(disable : 26466)
#include "CppUnitTest.h"
#pragma warning(pop)
#endif //PCH_H

View File

@@ -0,0 +1,228 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#pragma once
#include <filesystem>
#include <fstream>
#include <string>
namespace updating
{
namespace fs = std::filesystem;
struct BackupResult
{
int filesBackedUp{ 0 };
int errors{ 0 };
};
struct RestoreResult
{
int filesRestored{ 0 };
int filesChecked{ 0 };
int errors{ 0 };
};
// Check if a JSON file is corrupted (contains null bytes, as seen in #46179)
inline bool IsJsonFileCorrupted(const fs::path& filePath)
{
try
{
std::ifstream file(filePath, std::ios::binary);
if (!file.is_open())
{
return false;
}
constexpr size_t c_readChunkSize{ 4096 };
char buffer[c_readChunkSize];
while (file.read(buffer, c_readChunkSize) || file.gcount() > 0)
{
const auto bytesRead = file.gcount();
for (std::streamsize i = 0; i < bytesRead; ++i)
{
if (buffer[i] == '\0')
{
return true;
}
}
}
return false;
}
catch (...)
{
return true;
}
}
// Backup all JSON config files before update to protect against corruption (#46179)
inline BackupResult BackupConfigFiles(const fs::path& rootPath)
{
BackupResult result{};
try
{
const fs::path backupDir = rootPath / L"ConfigBackup";
std::error_code ec;
fs::remove_all(backupDir, ec);
fs::create_directories(backupDir, ec);
if (ec)
{
result.errors++;
return result;
}
for (const auto& entry : fs::directory_iterator(rootPath, ec))
{
if (ec)
{
result.errors++;
break;
}
if (entry.is_regular_file() && entry.path().extension() == L".json")
{
std::error_code copyEc;
fs::copy_file(entry.path(), backupDir / entry.path().filename(), fs::copy_options::overwrite_existing, copyEc);
if (copyEc)
{
result.errors++;
}
else
{
result.filesBackedUp++;
}
}
else if (entry.is_directory())
{
const auto dirName = entry.path().filename().wstring();
if (dirName == L"ConfigBackup" || dirName == L"Updates")
{
continue;
}
const auto moduleBackup = backupDir / entry.path().filename();
fs::create_directories(moduleBackup, ec);
std::error_code moduleEc;
for (const auto& moduleEntry : fs::directory_iterator(entry.path(), moduleEc))
{
if (moduleEc)
{
result.errors++;
break;
}
if (moduleEntry.is_regular_file() && moduleEntry.path().extension() == L".json")
{
std::error_code copyEc;
fs::copy_file(moduleEntry.path(), moduleBackup / moduleEntry.path().filename(), fs::copy_options::overwrite_existing, copyEc);
if (copyEc)
{
result.errors++;
}
else
{
result.filesBackedUp++;
}
}
}
}
}
}
catch (...)
{
result.errors++;
}
return result;
}
// Restore JSON configs from backup if corruption is detected after update.
// Cleans up the backup directory afterward.
inline RestoreResult RestoreCorruptedConfigs(const fs::path& rootPath)
{
RestoreResult result{};
try
{
const fs::path backupDir = rootPath / L"ConfigBackup";
if (!fs::exists(backupDir))
{
return result;
}
std::error_code ec;
for (const auto& backupEntry : fs::directory_iterator(backupDir, ec))
{
if (ec)
{
result.errors++;
break;
}
if (backupEntry.is_regular_file() && backupEntry.path().extension() == L".json")
{
const auto originalPath = rootPath / backupEntry.path().filename();
result.filesChecked++;
if (fs::exists(originalPath) && IsJsonFileCorrupted(originalPath) && !IsJsonFileCorrupted(backupEntry.path()))
{
std::error_code copyEc;
fs::copy_file(backupEntry.path(), originalPath, fs::copy_options::overwrite_existing, copyEc);
if (copyEc)
{
result.errors++;
}
else
{
result.filesRestored++;
}
}
}
else if (backupEntry.is_directory())
{
const auto moduleDir = rootPath / backupEntry.path().filename();
std::error_code moduleEc;
for (const auto& moduleBackupEntry : fs::directory_iterator(backupEntry.path(), moduleEc))
{
if (moduleEc)
{
result.errors++;
break;
}
if (moduleBackupEntry.is_regular_file() && moduleBackupEntry.path().extension() == L".json")
{
const auto originalModulePath = moduleDir / moduleBackupEntry.path().filename();
result.filesChecked++;
if (fs::exists(originalModulePath) && IsJsonFileCorrupted(originalModulePath) && !IsJsonFileCorrupted(moduleBackupEntry.path()))
{
std::error_code copyEc;
fs::copy_file(moduleBackupEntry.path(), originalModulePath, fs::copy_options::overwrite_existing, copyEc);
if (copyEc)
{
result.errors++;
}
else
{
result.filesRestored++;
}
}
}
}
}
}
// Clean up backup directory after restore check
fs::remove_all(backupDir, ec);
}
catch (...)
{
result.errors++;
}
return result;
}
}

View File

@@ -0,0 +1,47 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#pragma once
#include <filesystem>
#include <string>
namespace updating
{
namespace fs = std::filesystem;
// Build the command-line arguments for Stage 2.
// Stage 1 passes the installer path and the PT install directory
// so Stage 2 can run the installer and relaunch PowerToys afterward.
// Note: paths containing embedded double-quote characters are not supported.
// This is safe because install paths come from get_module_folderpath().
inline std::wstring BuildStage2Arguments(
const std::wstring& stage2Flag,
const fs::path& installerPath,
const fs::path& installDir)
{
std::wstring arguments{ stage2Flag };
arguments += L" \"";
arguments += installerPath.c_str();
arguments += L"\" \"";
arguments += installDir.c_str();
arguments += L"\"";
return arguments;
}
// Build the full path to PowerToys.exe from the install directory.
// Used by Stage 2 to relaunch PT after a successful update.
inline std::wstring BuildPowerToysExePath(const std::wstring& installDir)
{
return (std::filesystem::path(installDir) / L"PowerToys.exe").wstring();
}
// Determine whether Stage 2 has enough information to relaunch PT.
// Returns true if the install directory argument was provided.
inline bool CanRelaunchAfterUpdate(int argCount)
{
// args[0]=exe, args[1]=action, args[2]=installer, args[3]=installDir
return argCount >= 4;
}
}

View File

@@ -55,7 +55,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<WarningLevel>Level4</WarningLevel>
<PreprocessorDefinitions>WIN32;_WINDOWS;SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_FILENAMES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_WINDOWS;SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_FILENAMES;SPDLOG_WCHAR_TO_UTF8_SUPPORT;FMT_UNICODE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ObjectFileName>$(IntDir)</ObjectFileName>
<FunctionLevelLinking>true</FunctionLevelLinking>
<EnableParallelCodeGeneration>true</EnableParallelCodeGeneration>
@@ -71,7 +71,7 @@
<ClCompile Include="$(RepoRoot)deps\spdlog\src\file_sinks.cpp" />
<ClCompile Include="$(RepoRoot)deps\spdlog\src\async.cpp" />
<ClCompile Include="$(RepoRoot)deps\spdlog\src\cfg.cpp" />
<ClCompile Include="$(RepoRoot)deps\spdlog\src\fmt.cpp" />
<ClCompile Include="$(RepoRoot)deps\spdlog\src\bundled_fmtlib_format.cpp" />
<ClInclude Include="$(RepoRoot)deps\spdlog\include\spdlog\async.h" />
<ClInclude Include="$(RepoRoot)deps\spdlog\include\spdlog\async_logger-inl.h" />
<ClInclude Include="$(RepoRoot)deps\spdlog\include\spdlog\async_logger.h" />

View File

@@ -698,7 +698,7 @@ void LightSwitchInterface::init_settings()
}
catch (const winrt::hresult_error& e)
{
Logger::error(L"[Light Switch] init_settings: hresult_error 0x{:08X} - {}", e.code(), e.message().c_str());
Logger::error(L"[Light Switch] init_settings: hresult_error 0x{:08X} - {}", static_cast<int32_t>(e.code()), e.message().c_str());
}
catch (const std::exception& e)
{

View File

@@ -0,0 +1,68 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ShortcutGuide.Helpers;
using ShortcutGuide.Models;
using YamlDotNet.Serialization;
// This class should be moved to WinGet in the future
namespace ShortcutGuide.IndexYmlGenerator
{
public class IndexYmlGenerator
{
public static void Main()
{
CreateIndexYmlFile();
}
// Todo: Exception handling
public static void CreateIndexYmlFile()
{
string path = ManifestInterpreter.PathOfManifestFiles;
if (File.Exists(Path.Combine(path, "index.yml")))
{
File.Delete(Path.Combine(path, "index.yml"));
}
IndexFile indexFile = new() { };
Dictionary<(string WindowFilter, bool BackgroundProcess), List<string>> processes = [];
foreach (string file in Directory.EnumerateFiles(path, "*.yml"))
{
string content = File.ReadAllText(file);
Deserializer deserializer = new();
ShortcutFile shortcutFile = deserializer.Deserialize<ShortcutFile>(content);
if (processes.TryGetValue((shortcutFile.WindowFilter, shortcutFile.BackgroundProcess), out List<string>? apps))
{
if (apps.Contains(shortcutFile.PackageName))
{
continue;
}
apps.Add(shortcutFile.PackageName);
continue;
}
processes[(shortcutFile.WindowFilter, shortcutFile.BackgroundProcess)] = [shortcutFile.PackageName];
}
indexFile.Index = processes.Select(item => new IndexFile.IndexItem
{
WindowFilter = item.Key.WindowFilter,
BackgroundProcess = item.Key.BackgroundProcess,
Apps = [.. item.Value],
}).ToArray();
// Todo: Take the default shell name from the settings or environment variable, default to "+WindowsNT.Shell"
indexFile.DefaultShellName = "+WindowsNT.Shell";
Serializer serializer = new();
string yamlContent = serializer.Serialize(indexFile);
File.WriteAllText(Path.Combine(path, "index.yml"), yamlContent);
}
}
}

View File

@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<!-- Look at Directory.Build.props in root for common stuff as well -->
<Import Project="..\..\..\Common.Dotnet.CsWinRT.props" />
<Import Project="..\..\..\Common.SelfContained.props" />
<PropertyGroup>
<OutputType>WinExe</OutputType>
<RootNamespace>ShortcutGuide.IndexYmlGenerator</RootNamespace>
<Nullable>enable</Nullable>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<OutputPath>..\..\..\..\$(Platform)\$(Configuration)\WinUI3Apps</OutputPath>
<AssemblyName>PowerToys.ShortcutGuide.IndexYmlGenerator</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="YamlDotNet" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ShortcutGuide.Ui\ShortcutGuide.Ui.csproj" />
</ItemGroup>
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -0,0 +1,247 @@
PackageName: +WindowsNT.Notepad
Name: Notepad
WindowFilter: "Notepad.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: File
Properties:
- Name: New tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: New window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Open
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Save all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- S
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Close tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Close window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- SectionName: Edit
Properties:
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Z
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Search with Bing
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Find
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find next
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Find previous
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Go to
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Time/Date
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F5
- SectionName: View
Properties:
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset zoom
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 0
- SectionName: Formatting
Properties:
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Insert link
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Clear formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space

View File

@@ -0,0 +1,773 @@
PackageName: +WindowsNT.Shell
WindowFilter: "*"
BackgroundProcess: true
Shortcuts:
- SectionName: Desktop Shortcuts
Properties:
- Name: Close active window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Open shutdown box
Description: When no windows are open
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Cycle through open Windows
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Esc
- Name: Reveal typed password
Description: On sign-in screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F8
- Name: Go back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Move up one screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Page Up>"
- Name: Move down one screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Page Down>"
- Name: Window context menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Space
- Name: Switch between open apps
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Tab
Description: While pressing Tab multiple times
- Name: Run command
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Underlined letter>"
Description: for the underlined letter in the app
- Name: View open apps
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Tab
- Name: Change start menu size
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Arrow>"
- Name: Move cursor
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<ArrowLR>"
Description: To the beginning or end of a word
- Name: Switch keyboard layout
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- ""
- Name: Select block of text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Arrow>"
- Name: Open Task Manager
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Esc
- Name: Enable/Disable Chinese IME
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- Name: Open context menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
Description: For the selected item
- SectionName: Virtual desktop
Properties:
- Name: Open task view
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Add a virtual desktop
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Close current desktop
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- F4
- Name: Switch desktop
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "<ArrowLR>"
Recommended: true
- SectionName: "Windows key"
Properties:
- Name: Open start menu
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- ""
- Name: Open Action Center
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "A"
- Name: Open Date and Time
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: true
Keys:
- "D"
- Name: Focus on the notification area
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "B"
- Name: Open narrator
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "Enter"
- Name: Open domain search
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "F"
- Name: Open Quick Assist
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "Q"
- Name: Wake up device
Shortcut:
- Win: true
Ctrl: true
Shift: true
Alt: false
Keys:
- "B"
Description: When black or a blank screen.
- Name: Change input option
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Space"
Description: To next option
- Name: Change input option
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "Space"
Description: To previous option
- Name: Display/Hide desktop
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "D"
- Name: Minimize the active window
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Down"
Recommended: true
- Name: Open file Explorer
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "E"
- Name: Close Magnifier
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Esc"
- Name: Open Feedback Hub
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "F"
Recommended: true
- Name: Start IME reconversion
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "/"
- Name: Open Game Bar
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "G"
- Name: Open voice dictation
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "H"
- Name: Minimize or restore all other windows
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Home>"
- Name: Open Settings
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "I"
- Name: Set focus to a Windows tip
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "J"
- Name: Open Cast
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "K"
- Name: Lock the device
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "L"
- Name: Snap the window
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<ArrowLR>"
- Name: Minimize all windows
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "M"
- Name: Zoom out Magnifier
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "-"
- Name: Zoom in Magnifier
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "="
- Name: Open notification center
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "N"
- Name: Lock the device orientation
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "O"
- Name: Open project Settings
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "P"
- Name: Open Settings about Page
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Pause>"
- Name: Open the emoji panel
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "."
- Name: Open the emoji panel
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- ";"
- Name: Capture a screenshot
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<PrtScr>"
Description: Save to the pictures folder
- Name: Open search
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Q"
- Name: Open search
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "S"
- Name: Open Run dialog
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "R"
- Name: Restore window
Description: If a window is snapped or maximized
Shortcut:
- Win: true
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Make UWP app full screen
Shortcut:
- Win: true
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Move window to monitor
Shortcut:
- Win: true
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Arrow>"
- Name: Open Snipping Tool
Shortcut:
- Win: true
Ctrl: false
Shift: true
Alt: false
Keys:
- "S"
- Name: Stretch window
Description: To the top and bottom of the screen
Shortcut:
- Win: true
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Open task view
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Tab"
- Name: Open Accessibility Settings
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "U"
- Name: Maximize the active window
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Open the clipboard history
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "V"
- Name: Open widgets
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "W"
- Name: Open Quick Link menu
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "X"
- Name: Open snap layouts
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "Z"
- SectionName: Clipboard
Properties:
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "C"
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "X"
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "V"
- Name: Paste
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Insert>"
Description: Paste as plain text
- SectionName: <TASKBAR1-9>Taskbar Shortcuts
Properties:
- Name: Open app in Taskbar
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "<TASKBAR1-9>"
- Name: Open jump list
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: true
Keys:
- "<TASKBAR1-9>"
- Name: Switch to last active window
Shortcut:
- Win: true
Ctrl: true
Shift: false
Alt: false
Keys:
- "<TASKBAR1-9>"
- Name: Open as administrator
Shortcut:
- Win: true
Ctrl: true
Shift: true
Alt: false
Keys:
- "<TASKBAR1-9>"
- SectionName: Copilot key
Properties:
- Name: Open Copilot
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- '<Copilot>'
Description: When copilot is available
- Name: Open Windows search
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- '<Copilot>'
Description: When copilot is not available
- SectionName: Office key
Properties:
- Name: Open Word
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "W"
- Name: Open Excel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "X"
- Name: Open PowerPoint
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "P"
- Name: Open Outlook
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "O"
- Name: Open Microsoft Teams
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "T"
- Name: Open OneNote
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "N"
- Name: Open OneDrive
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "D"
- Name: Open Yammer
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "Y"
- Name: Open LinkedIn
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Office>"
- "L"

View File

@@ -0,0 +1,266 @@
PackageName: +WindowsNT.WindowsExplorer
WindowFilter: "explorer.exe"
Name: File Explorer
Shortcuts:
- SectionName: General
Properties:
- Name: Open File Explorer
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "E"
Recommended: true
- Name: Select the address bar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "D"
- Name: Select the address bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "L"
- Name: Select the address bar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F4"
- Name: Select the search box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "E"
- Name: Select the search box
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F3"
- Name: Select the search box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "F"
- Name: Refresh the window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F5"
- Name: Cycle through elements in the active window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F6"
- Name: Maximize or restore the active window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F11"
- SectionName: Navigation
Properties:
- Name: Navigate to the previous folder
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Navigate to the previous folder
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Backspace>"
- Name: Navigate to the next folder
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Move up a level in the folder path
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- SectionName: "Window management"
Properties:
- Name: Open a new window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "N"
- Name: Open a new tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "T"
Recommended: true
- Name: Close the current active tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "W"
- Name: Move to the next tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "Tab"
- Name: Move to the previous tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "Tab"
- Name: Move to that tab number
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "Number (1-9)"
- Name: Show/Hide the preview pane
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "P"
- Name: Show/Hide the details pane
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "P"
- Name: Resize all columns to fit text
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "+"
- Name: Expand all folders
Description: In the navigation pane
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "E"
- SectionName: "File management"
Properties:
- Name: Display properties for the selected item
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "Enter"
- Name: Delete the selected item
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Delete>"
- Name: Delete the selected item
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "D"
- Name: Delete the selected item permanently
Description: "This removes the item without sending it to the Recycle Bin"
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "D"
- Name: Create a new folder
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "N"
Recommended: true
- Name: Rename the selected item
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "F2"
- Name: Select multiple items
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Arrow>"

View File

@@ -0,0 +1,687 @@
PackageName: BlenderFoundation.Blender
Name: Blender
WindowFilter: "blender.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: General
Properties:
- Name: Open file
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save file
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: New file
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Quit Blender
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Z
- Name: Search menu (operator search)
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Toggle fullscreen window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Save user preferences
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Toggle Edit Mode
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Toggle quad view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Q
- SectionName: Editor switching
Properties:
- Name: 3D Viewport
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F5
- Name: Image Editor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: UV Editor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Shader Editor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Compositor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Outliner
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F9
- Name: Properties
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F7
- Name: Text Editor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F11
- Name: Timeline
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F12
- Name: Python Console
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F4
- SectionName: Selection (3D Viewport)
Properties:
- Name: Select all / deselect all (toggle)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- A
- Name: Deselect all
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- A
- Name: Invert selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Box select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- B
- Name: Circle select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- C
- Name: Lasso select
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- drag
- Name: Select linked under cursor
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- L
- Name: Select linked
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- SectionName: Object mode
Properties:
- Name: Add menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- A
- Name: Duplicate
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- D
- Name: Duplicate linked
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- D
- Name: Move (grab)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- G
- Name: Rotate
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- R
- Name: Scale
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- S
- Name: Apply transformation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Clear location
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- G
- Name: Clear rotation
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- R
- Name: Clear scale
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- S
- Name: Parent
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Clear parent
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- P
- Name: Join
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Move to collection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- M
- Name: Hide selected
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- H
- Name: Hide unselected
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- H
- Name: Reveal hidden
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- H
- Name: Delete selected
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- X
- SectionName: Edit mode (mesh)
Properties:
- Name: Vertex select mode
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 1
- Name: Edge select mode
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 2
- Name: Face select mode
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 3
- Name: Extrude region
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- E
- Name: Inset faces
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- I
- Name: Bevel
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Loop cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Knife tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- K
- Name: Subdivide
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Right-click menu
- Name: Merge vertices menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- M
- Name: Separate selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Fill
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F
- Name: Toggle proportional editing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- O
- SectionName: Viewport navigation
Properties:
- Name: View selected
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad Period
- Name: View all
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Toggle perspective / orthographic
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad 5
- Name: Front view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad 1
- Name: Right view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad 3
- Name: Top view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad 7
- Name: Camera view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad 0
- Name: Local view (toggle)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Numpad Slash
- Name: Toggle wireframe / solid shading
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Z
- Name: Toggle x-ray
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Z
- SectionName: Render and animation
Properties:
- Name: Render image
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Name: Render animation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F12
- Name: Show / hide render window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Play / pause animation
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Next frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Previous frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: First frame
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Left>"
- Name: Last frame
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Right>"
- Name: Forward 10 frames
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Back 10 frames
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Down>"
- Name: Insert keyframe
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- I
- Name: Delete keyframe
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- I

View File

@@ -0,0 +1,264 @@
PackageName: Discord.Discord
Name: Discord
WindowFilter: "discord.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Server and channel navigation
Properties:
- Name: Navigate between servers (up)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Navigate between servers (down)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Navigate between channels (up)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Navigate between channels (down)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Navigate between unread channels (up)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Navigate between unread channels (down)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Navigate between unread channels with mentions (up)
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Navigate between unread channels with mentions (down)
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Return to previous text channel
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Return to active audio channel
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- A
- Name: Find or start a direct message
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Create or join a server
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Create a private group
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- SectionName: Message reading
Properties:
- Name: Mark channel as read
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Mark server as read
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- Name: Scroll chat up a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Scroll chat down a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Jump to oldest unread message
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- PageUp
- SectionName: Pop-outs and panels
Properties:
- Name: Toggle pins pop-out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Toggle mentions pop-out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Toggle channel member list
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Toggle emoji picker
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Toggle hotkeys reference
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Slash
- SectionName: Voice and calls
Properties:
- Name: Answer incoming call
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Decline incoming call
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Start call in private message or group
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- LeftBracket
- Name: Toggle mute
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Toggle deafen
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- SectionName: Other
Properties:
- Name: Focus text area
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Get help
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Upload a file
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U

View File

@@ -0,0 +1,957 @@
PackageName: Figma.Figma
Name: Figma
WindowFilter: "figma.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Essentials
Properties:
- Name: Show / Hide UI
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL \
- Name: Pick color
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⌃ C
- Name: Quick actions
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL /
- SectionName: Tools
Properties:
- Name: Move tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- V
- Name: Frame tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F
- Name: Pen tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Pencil tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ P
- Name: Text tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- T
- Name: Rectangle tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- R
- Name: Ellipse tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- O
- Name: Line tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- L
- Name: Arrow tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ L
- Name: Add comment
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- C
- Name: Pick color
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- I
- Name: Slice cool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- S
- SectionName: View
Properties:
- Name: Show / Hide UI
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL \
- Name: Multiplayer cursors
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL \
- Name: Rulers
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ R
- Name: Outlines
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL O
- Name: Pixel preview
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL ⇧ P
- Name: Layout grids
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ G
- Name: Pixel grid
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "⇧ `"
- Name: Open layers panel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 1
- Name: Open assets panel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 2
- Name: Open design panel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 8
- Name: Open prototype panel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 9
- Name: Open inspect panel
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 0
- SectionName: Zoom
Properties:
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Minus
- Name: "Zoom to 100%"
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ 0
- Name: Zoom to fit
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ 1
- Name: Zoom to selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ 2
- Name: Zoom to previous frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ N
- Name: Zoom to next frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- N
- Name: Previous page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Next page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Find previous frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Find next frame
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- SectionName: Text
Properties:
- Name: Bold
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL B
- Name: Italic
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL I
- Name: Underline
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL U
- Name: Create link
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL K
- Name: Strikethrough
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL X
- Name: Turn into a list
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL 7
- Name: Text align left
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL L
- Name: Text align center
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL T
- Name: Text align right
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL R
- Name: Text align justified
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL J
- Name: Adjust font size
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL
- Name: Adjust font weight
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL
- Name: Adjust letter spacing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Name: Adjust line height
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ Alt
- SectionName: Shape
Properties:
- Name: Pen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Pencil
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ P
- Name: Paint bucket
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- B
- Name: Bend tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Name: Remove fill
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt /
- Name: Remove stroke
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Slash
- Name: Swap fill and stroke
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ X
- Name: Outline stroke
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL O
- Name: Flatten selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL E
- Name: Join selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL J
- Name: Smooth join selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL J
- Name: Delete and heal selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ Delete
- SectionName: Selection
Properties:
- Name: Select all
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL A
- Name: Select inverse
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL A
- Name: Select none
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Select children
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
-
- Name: Select parent
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ ↩
- Name: Select next sibling
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Select previous sibling
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ Tab
- Name: Group selections
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL G
- Name: Ungroup selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL G
- Name: Frame selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL G
- Name: Show / Hide selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL H
- Name: Lock / Unlock selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL L
- SectionName: Cursor
Properties:
- Name: Measure to selection (while pointing)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Name: Duplicate selection (while moving)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Name: Resize from center (while dragging)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Name: Resize proportionally (while dragging)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
-
- Name: Move while resizing (while dragging)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: "Ignore constraints (frames only, while dragging)"
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- SectionName: Edit
Properties:
- Name: Copy
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL C
- Name: Cut
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL X
- Name: Paste
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL V
- Name: Paste over selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL V
- Name: Duplicate
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL D
- Name: Rename selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL R
- Name: Export
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL E
- Name: Copy properties
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL C
- Name: Paste properties
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL V
- Name: Copy as PNG
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL C
- Name: Copy Page Link to Clipboard
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- CTRL L
- SectionName: Transform
Properties:
- Name: Flip horizontal
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ H
- Name: Flip vertical
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ V
- Name: Use a mask
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⌃ CTRL M
- Name: Edit shape or image
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
-
- Name: Place image
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ CTRL K
- Name: Set opacity to 10
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 1
- Name: Set opacity to 50
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 5
- Name: Set opacity to 100
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 0
- SectionName: Arrange
Properties:
- Name: Bring forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "CTRL ]"
- Name: Send backward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "CTRL ["
- Name: Bring to front
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "Alt CTRL ["
- Name: Send to back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "Alt CTRL ]"
- Name: Align left
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt A
- Name: Align right
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt D
- Name: Align top
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt W
- Name: Align bottom
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt S
- Name: Tidy up
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⌃ Alt T
- Name: Add auto layout
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- ⇧ A
- Name: Remove auto layout
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt ⇧ A
- SectionName: Components
Properties:
- Name: Show assets
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt 2
- Name: Team library
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL O
- Name: Create component
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL K
- Name: Detach intense
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Alt CTRL B
- Name: Swap component instance
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:

View File

@@ -0,0 +1,710 @@
PackageName: GIMP.GIMP
Name: GIMP
WindowFilter: "gimp*.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Help
Properties:
- Name: Help
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Context Help
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F1
- SectionName: Tools
Properties:
- Name: Rectangle Select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- R
- Name: Ellipse Select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- E
- Name: Free Select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F
- Name: Fuzzy Select
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- U
- Name: Select By Color
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- O
- Name: Scissors
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- I
- Name: Paths
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- B
- Name: Color Picker
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- O
- Name: Move
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- M
- Name: Crop and Resize
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- C
- Name: Rotate
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- R
- Name: Scale
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- T
- Name: Shear
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- S
- Name: Perspective
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- P
- Name: Flip
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F
- Name: Text
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- T
- Name: Bucket Fill
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- B
- Name: Blend (Gradient)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- G
- Name: Pencil
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- N
- Name: Paintbrush
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Eraser
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- E
- Name: Airbrush
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- A
- Name: Ink
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- K
- Name: Clone
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- C
- Name: Blur/Sharpen
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- U
- Name: Smudge
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- S
- Name: Dodge/Burn
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- D
- SectionName: Color context
Properties:
- Name: Swap foreground / background colors
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- X
- Name: Reset to default colors
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- D
- SectionName: File
Properties:
- Name: New image
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open image
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Open image as new layer
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- O
- Name: Duplicate image
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Save image
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save under a new name
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Export to
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Export As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Quit
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- SectionName: Dialogs
Properties:
- Name: Layers
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Brushes
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Patterns
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Gradients
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Tool Options
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Palettes
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Pointer (Info) window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Navigation window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- SectionName: Window and view
Properties:
- Name: Main menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F10
- Name: Toggle fullscreen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Toggle quickmask
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Q
- Name: Close document window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Toggle rulers
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Toggle guides
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Shrink-wrap window to image
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Fit image in window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Minus
- Name: "Zoom 1:1"
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- 1
- SectionName: Edit
Properties:
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Copy selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Paste clipboard
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Clear selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Named copy selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Named cut selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Named paste clipboard
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- SectionName: Fill
Properties:
- Name: Fill with foreground color
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Comma
- Name: Fill with background color
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Period
- Name: Fill with pattern
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Semicolon
- SectionName: Layers
Properties:
- Name: Select layer above
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Select layer below
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Select first layer
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Select last layer
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Merge visible layers
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Anchor layer
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- SectionName: Selections
Properties:
- Name: Toggle selection visibility
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Select none
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Invert selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Float selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- Name: Path to selection
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- V
- SectionName: Filters
Properties:
- Name: Repeat last filter
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Reshow last filter
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F

View File

@@ -0,0 +1,483 @@
PackageName: Google.Chrome
Name: Google Chrome
WindowFilter: "chrome.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Tabs and windows
Properties:
- Name: New window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: New incognito window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: New tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Reopen previously closed tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Jump to next tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Jump to previous tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Jump to specific tab (18)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 1
- Name: Jump to rightmost tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 9
- Name: Open home page in current tab
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- Name: Open previous page in history
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Open next page in history
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Close current tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Close current window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Name: Move tab right
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageDown
- Name: Move tab left
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageUp
- Name: Turn full-screen mode on/off
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Open split view in active tab
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- N
- SectionName: Chrome features
Properties:
- Name: Open the Chrome menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F
- Name: Show or hide bookmarks bar
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Open Bookmarks Manager
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Open History page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Open Downloads page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Open Chrome Task Manager
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- Name: Open Find Bar
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find next match
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Find previous match
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Open Developer Tools
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Open Developer Tools (alt)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Name: Clear Browsing Data
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Delete>"
- Name: Open Help Center
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Switch user / browse as guest
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Open feedback form
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- I
- Name: Toggle caret browsing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- SectionName: Address bar
Properties:
- Name: Jump to address bar
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Jump to address bar (alt)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- D
- Name: Add www. and .com and open in current tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Add www. and .com and open in new window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Open new tab and search
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Enter>"
- Name: Search from anywhere on the page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- SectionName: Web page
Properties:
- Name: Print current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Save current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Reload current page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: "Reload, ignoring cache"
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Stop loading
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Open file in Chrome
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: View page source
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Bookmark current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Bookmark all open tabs
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset zoom
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 0
- Name: Scroll down a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Scroll up a screen
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Space>"
- Name: Go to top of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Go to bottom of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Move cursor to start of previous word
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: Move cursor to next word
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Delete previous word in text field
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Backspace>"

View File

@@ -0,0 +1,718 @@
PackageName: Inkscape.Inkscape
Name: Inkscape
WindowFilter: "inkscape.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Tools
Properties:
- Name: Selector tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- S
- Name: Node tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- N
- Name: Rectangle tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- R
- Name: Ellipse / arc tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- E
- Name: Spiral tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- I
- Name: Pencil (Freehand) tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Calligraphy tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- C
- Name: Text tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- T
- Name: Dropper tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- D
- Name: Paint Bucket tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- U
- Name: Tweak tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- W
- Name: Spray tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- A
- Name: Eraser tool
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- E
- Name: Measure tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- M
- Name: Zoom tool
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Z
- SectionName: Dialogs
Properties:
- Name: Fill and Stroke
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Swatches
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Name: Text and Font
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Transform
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Layers and Objects
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- Name: Symbols
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Y
- Name: Align and Distribute
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Object Properties
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Undo History
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: XML Editor
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Selectors and CSS
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Q
- Name: Document Properties
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Inkscape Preferences
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Export
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Find and Replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Toggle dialog visibility
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- SectionName: File
Properties:
- Name: New document
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open from template
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- N
- Name: Open document
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Save a copy
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- S
- Name: Import
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Export
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Quit Inkscape
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- SectionName: Window
Properties:
- Name: Toggle rulers
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Toggle scrollbars
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Toggle palette
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- P
- Name: Toggle full-screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Toggle toolbars
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F11
- Name: Main menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F10
- Name: Context menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Close document window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F4
- Name: Next document window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Previous document window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- SectionName: Edit
Properties:
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Copy selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Paste clipboard
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste in place
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- Name: Paste style
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Duplicate selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Duplicate and transform
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- D
- Name: Reapply transform
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- T
- Name: Clone object
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- D
- Name: Unlink clone
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- D
- Name: Select original
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- D
- SectionName: Layers
Properties:
- Name: Create new layer
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Move to layer above
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- PageUp
- Name: Move to layer below
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- PageDown
- Name: Raise layer
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageUp
- Name: Lower layer
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageDown
- Name: Raise layer to top
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Home
- Name: Lower layer to bottom
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- End
- SectionName: Object
Properties:
- Name: Group selected objects
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Ungroup selected groups
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Set clip
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Release clip
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- M
- Name: Raise selection to top
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Lower selection to bottom
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Raise selection one step
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Lower selection one step
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- SectionName: Path
Properties:
- Name: Convert object to path
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Convert stroke to path
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- C
- Name: Combine paths
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Break paths apart
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Simplify
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Create dynamic offset
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Create linked offset
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- J

View File

@@ -0,0 +1,861 @@
PackageName: JetBrains.IntelliJIDEA.Community
Name: IntelliJ IDEA
WindowFilter: "idea*.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Top shortcuts
Properties:
- Name: Find Action
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Show Project window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 1
- Name: Show Intention Actions
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Enter>"
- Name: Recent Files
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Find Usages
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F7
- Name: Settings
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- S
- Name: Generate
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Insert>"
- Name: Refactor This
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- T
- Name: Reformat Code
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- L
- Name: Build Project
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F9
- Name: Rebuild
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F9
- SectionName: Basic editing
Properties:
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste from history
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Save All
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Z
- Name: Duplicate Line or Selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Delete Line
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Join Lines
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Toggle Case
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Auto-Indent Lines
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- I
- Name: Start New Line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Start New Line Before Current
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Enter>"
- SectionName: Caret navigation and selection
Properties:
- Name: Move caret to previous word
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: Move caret to next word
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Move caret to line start
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Move caret to line end
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Move caret to text start
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: Move caret to text end
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Extend selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Shrink selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- SectionName: Code completion and assistance
Properties:
- Name: Basic completion
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Type-matching completion
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Space>"
- Name: Complete current statement
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Parameter info
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Quick documentation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- Name: Move statement up
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Move statement down
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Move line up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Move line down
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Comment with line comment
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Slash
- Name: Comment with block comment
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Slash
- Name: Surround with
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- T
- SectionName: Find everything
Properties:
- Name: Find
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find Next
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Find Previous
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Find in Files
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Replace in Files
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Go to File
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: File Structure
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F12
- Name: Go to Symbol
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- N
- Name: Find Action
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- SectionName: Navigate from symbols
Properties:
- Name: Find Usages
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F7
- Name: Go to Declaration or Usages
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Go to Type Declaration
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Go to Super Method
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Go to Implementation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- B
- Name: Go to Test
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Highlight Usages in File
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F7
- SectionName: Run and debug
Properties:
- Name: Run context configuration
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Run
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F10
- Name: Debug context configuration
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F9
- Name: Debug
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F9
- Name: Stop
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F2
- Name: Resume Program
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- Name: Step Over
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- Name: Step Into
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- Name: Step Out
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F8
- Name: Run To Cursor
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F9
- Name: Evaluate Expression
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F8
- Name: Toggle Line Breakpoint
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F8
- Name: View Breakpoints
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F8
- SectionName: Refactorings
Properties:
- Name: Rename
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F6
- Name: Change Signature
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F6
- Name: Inline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- N
- Name: Move
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Extract Method
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- M
- Name: Introduce Field
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- F
- Name: Introduce Parameter
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- P
- Name: Introduce Variable
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- Name: Safe Delete
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Delete>"
- SectionName: Version control
Properties:
- Name: VCS Operations Popup
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Tilde
- Name: Commit
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Update Project
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Push
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Rollback
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Z
- SectionName: Tool windows
Properties:
- Name: Hide Active Tool Window
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- Name: Hide All Tool Windows
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F12
- Name: Jump to Last Tool Window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Name: Show Project window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 1
- Name: Show Bookmarks window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 2
- Name: Show Find window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 3
- Name: Show Run window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 4
- Name: Show Debug window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 5
- Name: Show Problems window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 6
- Name: Show Structure window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 7
- Name: Show Services window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 8
- Name: Show Version Control window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 9
- Name: Show Commit window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- 0
- Name: Show Terminal window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F12

View File

@@ -0,0 +1,272 @@
PackageName: Microsoft.Access
Name: Access
WindowFilter: "msaccess.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Open an existing database
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Create a new database
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Save a database object
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Print the current or selected object
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Show or hide the Navigation Pane
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Show or hide a property sheet
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F4
- Name: Move focus to a different pane of the window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Switch between Edit and Navigation mode
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F2
- Name: Open Find tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Open Help
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Exit Access
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Display shortcut menu for selected item
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Switch to Form View from Design View
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Open the Save As dialog
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- SectionName: Edit text and data
Properties:
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- SectionName: Navigate databases
Properties:
- Name: Switch to next database window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F6
- Name: Switch to previous database window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F6
- Name: Close the active database window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Switch to Visual Basic Editor
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F11
- Name: Display the Immediate window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- SectionName: Datasheet navigation
Properties:
- Name: Move to next field
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Move to previous field
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Tab
- Name: Move to first field in current record
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Move to last field in current record
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Move to first record
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: Move to last record
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Move to same field in next record
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Down>"
- Name: Move to same field in previous record
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Up>"

View File

@@ -0,0 +1,616 @@
PackageName: Microsoft.Edge
Name: Microsoft Edge
WindowFilter: "msedge.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Tabs and windows
Properties:
- Name: New tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Reopen the last closed tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Switch to the next tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Switch to the previous tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Switch to a specific tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 1
- Name: Switch to the last tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 9
- Name: Close the current tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Close the current tab (alt)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F4
- Name: Close the current window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Name: Close the current window (alt)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: New window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: New InPrivate window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Duplicate the current tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Mute the current tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Switch to the next tab (alt)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Switch to the previous tab (alt)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: Enter full screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- SectionName: Address bar
Properties:
- Name: Select the URL in the address bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- D
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F4
- Name: Open a search query in the address bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Add www. and .com to text in the address bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Paste and search or paste and go
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- SectionName: Browser features
Properties:
- Name: Open Settings and more menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- E
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F
- Name: Open History
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Open Downloads
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Open Favorites
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Open Collections
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Y
- Name: Open search in sidebar
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Show or hide the favorites bar
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Save the current tab as a favorite
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Save all open tabs as favorites in a new folder
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Open Developer Tools
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Name: Open Send feedback dialog
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- I
- Name: Sign in as different user / browse as guest
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Open clear browsing data options
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Delete>"
- Name: Open Help
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Turn caret browsing on or off
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- Name: Enter or exit Immersive Reader
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- SectionName: Web page
Properties:
- Name: Open find on page
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Find next result
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Find previous result
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Reload the current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: "Reload, ignoring cached content"
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F5
- Name: Save the current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Print the current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Print using the system dialog
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Open a file in Edge
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: View source
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Start or stop Read Aloud
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Paste without formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset page zoom level
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 0
- Name: Stop loading page; close dialog or pop-up
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Scroll down a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Space>"
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Scroll up a screen
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Space>"
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Go to top of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Go to bottom of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Go back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Open home page in current tab
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- SectionName: Focus
Properties:
- Name: Move focus to next pane
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Move focus to previous pane
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F6
- Name: Move focus to web content pane
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F6
- Name: Set focus on the favorites bar (first item)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- B
- Name: Set focus on the app bar toolbar (first item)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- T
- Name: Set focus on Settings and more button
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F10
- Name: Open context menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10

View File

@@ -0,0 +1,592 @@
PackageName: Microsoft.Excel
Name: Excel
WindowFilter: "excel.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Open workbook
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save workbook
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Close workbook
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste Special
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo or repeat last action
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Remove cell contents
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Delete
- Name: Find
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find and replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- SectionName: Navigation
Properties:
- Name: Move to edge of data region
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Arrow>"
- Name: Move to beginning of worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: Move to last used cell
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Next worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Previous worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: One screen to the right
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageDown
- Name: One screen to the left
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageUp
- Name: Open Go To dialog
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Minus
- SectionName: Selection
Properties:
- Name: Select entire worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Extend selection by one cell
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Arrow>"
- Name: Extend selection to last nonblank cell
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Arrow>"
- Name: Extend selection to start of worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Home
- Name: Extend selection to last used cell
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- End
- Name: Select entire column
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- Name: Select entire row
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Space
- Name: Turn extend mode on
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- Name: Start a new line in the same cell
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Enter>"
- Name: Fill selected range with current entry
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- SectionName: Cell formatting
Properties:
- Name: Open Format Cells dialog
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Bold
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Strikethrough
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "5"
- Name: Apply General number format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "~"
- Name: Apply Currency format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "$"
- Name: Apply Percentage format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "%"
- Name: Apply Date format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "#"
- Name: Apply Time format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "@"
- Name: Apply Number format
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "!"
- Name: Apply outline border
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "&"
- Name: Remove outline border
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "_"
- SectionName: Data entry and editing
Properties:
- Name: Edit active cell
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F2
- Name: Fill down
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Enter current date
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- ";"
- Name: Enter current time
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- ":"
- Name: Toggle formula display
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "`"
- Name: Copy formula from cell above
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "'"
- Name: Insert blank cells
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Plus
- Name: Delete selected cells
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Flash Fill
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Quick Analysis
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- Name: Create Table
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Hide selected rows
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "9"
- Name: Hide selected columns
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "0"
- SectionName: Formulas and functions
Properties:
- Name: AutoSum
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "="
- Name: Insert function
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Calculate all worksheets
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- Name: Calculate active worksheet
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F9
- Name: Cycle absolute and relative references
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F4
- Name: Create embedded chart
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F1
- Name: Create chart on new sheet
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Open macro dialog
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F8
- Name: Open Visual Basic Editor
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F11
- Name: Refresh data in current worksheet
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F5
- Name: Refresh all data in workbook
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- F5

View File

@@ -0,0 +1,463 @@
PackageName: Microsoft.OneNote
Name: OneNote
WindowFilter: "onenote.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Open notebook
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Open a new OneNote window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Create a Quick Note
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Dock the OneNote window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- D
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Select all on page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste text only
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Check spelling
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- Name: Print current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- SectionName: Format
Properties:
- Name: Bold
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Strikethrough
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Minus
- Name: Superscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Plus
- Name: Subscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Minus
- Name: Highlight selected text
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- H
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Bulleted list
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "."
- Name: Numbered list
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "/"
- Name: Apply Heading 1
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "1"
- Name: Apply Heading 2
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "2"
- Name: Apply Heading 3
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "3"
- Name: Clear all formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Align left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Align right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Copy formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- C
- Name: Paste formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- SectionName: Insert
Properties:
- Name: Insert current date
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- D
- Name: Insert current time
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- T
- Name: Insert current date and time
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F
- Name: Start math equation
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "="
- Name: Insert line break
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- SectionName: Tags
Properties:
- Name: To Do tag
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Important tag
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "2"
- Name: Question tag
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "3"
- Name: Remember for later tag
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "4"
- Name: Definition tag
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "5"
- Name: Remove all note tags
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "0"
- SectionName: Pages and sections
Properties:
- Name: Add a new page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Create a new section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Go to next section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Go to previous section
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Next page in section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Previous page in section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: First page in section
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- Name: Last page in section
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- End
- Name: Enable or disable full page view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- SectionName: Search
Properties:
- Name: Search all notebooks
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Search current page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F

View File

@@ -0,0 +1,360 @@
PackageName: Microsoft.Outlook
Name: Outlook
WindowFilter: "outlook.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Create new message or calendar event
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Send email
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Reply to email
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Reply all
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Forward message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Open selected message in new window
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Delete message or item
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Delete
- Name: Permanently delete message
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Delete
- Name: Mark as read
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- Name: Mark as unread
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Flag message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Insert
- Name: Send and receive all folders
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- SectionName: Navigate Outlook
Properties:
- Name: Go to Mail
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Go to Calendar
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "2"
- Name: Go to Contacts or Copilot
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "3"
- Name: Go to People
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "4"
- Name: Go to next message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- ">"
- Name: Go to previous message
Description: Press Ctrl+Shift+Comma (rendered as Ctrl+<) to go back.
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- ","
- Name: Go to Folder pane
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- SectionName: Text editing
Properties:
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Delete word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Backspace>"
- SectionName: Format text
Properties:
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- SectionName: Calendar
Properties:
- Name: Create new calendar item
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Switch to Day view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "1"
- Name: Switch to Work week view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "2"
- Name: Switch to full Week view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "3"
- Name: Switch to Month view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "4"
- Name: Go to previous time period
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go to next time period
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Go to today
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- Y
- SectionName: People
Properties:
- Name: Create a contact
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Search for a contact
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Save contact
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Select all contacts
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Create a contact list
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L

View File

@@ -0,0 +1,247 @@
PackageName: Microsoft.Paint
Name: Paint
WindowFilter: "mspaint.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: File
Properties:
- Name: New picture
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save as
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- SectionName: Edit
Properties:
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Delete selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Delete
- Name: Move selection
Description: Use the arrow keys to nudge the current selection one pixel.
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Arrow>"
- SectionName: View
Properties:
- Name: Zoom in
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: Zoom out
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Show or hide gridlines
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Show or hide rulers
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Full screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- SectionName: Image
Properties:
- Name: Image properties
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Resize and skew
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Crop to selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Invert colors
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- SectionName: Tools
Properties:
- Name: Increase brush or tool width
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Decrease brush or tool width
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Text tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- SectionName: Text tool
Properties:
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U

View File

@@ -0,0 +1,668 @@
PackageName: Microsoft.PowerPoint
Name: PowerPoint
WindowFilter: "powerpnt.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: New presentation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open presentation
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste Special
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Insert new comment
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- M
- Name: Close PowerPoint
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- SectionName: Slides
Properties:
- Name: Insert new slide
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Duplicate selected slide
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Next slide
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Previous slide
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Move slide up in order
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Move slide down in order
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Down>"
- Name: Move slide to beginning
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Move slide to end
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- SectionName: Slide show and view
Properties:
- Name: Start slide show
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Start Presenter view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F5
- Name: End slide show
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Zoom to fit
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- O
- Name: Full screen
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F1
- Name: Show or hide guides
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F9
- Name: Show or hide grid
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F9
- Name: Toggle Outline and Thumbnail views
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Cycle through panes
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- SectionName: Objects
Properties:
- Name: Select all objects
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Duplicate selected object
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Group selected objects
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Ungroup selected group
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Regroup objects
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Send object back one position
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "["
- Name: Send object forward one position
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "]"
- Name: Rotate object clockwise 15 degrees
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Rotate object counterclockwise 15 degrees
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Copy object formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Paste object formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Copy animation painter
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- C
- Name: Paste animation painter
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- V
- Name: Play or pause media
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- SectionName: Text editing
Properties:
- Name: Find
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Delete word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Backspace>"
- Name: Delete word to the right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Delete
- Name: Move one word left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: Move one word right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Move up one paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Move down one paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Down>"
- Name: Beginning of text box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: End of text box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Select to end of word
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Right>"
- Name: Select to beginning of word
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Left>"
- Name: Select to end of paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Select to beginning of paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- SectionName: Text formatting
Properties:
- Name: Bold
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Open Font dialog
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Change case
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Subscript
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "="
- Name: Superscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Plus
- Name: Remove manual character formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- Name: Center paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Justify paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Left align paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Right align paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Promote paragraph
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Left>"
- Name: Demote paragraph
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Right>"
- Name: Move paragraph up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Move paragraph down
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- SectionName: Tables
Properties:
- Name: Move to next cell
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Move to preceding cell
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Tab
- Name: Insert tab in a cell
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab

View File

@@ -0,0 +1,9 @@
PackageName: Microsoft.PowerToys
Name: PowerToys
BackgroundProcess: True
WindowFilter: "powertoys.exe"
Shortcuts:
- SectionName: General
Properties:
# <Populate start>
# <Populate end>

View File

@@ -0,0 +1,379 @@
PackageName: Microsoft.Project
Name: Project
WindowFilter: "winproj.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Create a new project
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open a project file
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save a project file
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Open dialog box (direct)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F12
- Name: Activate the entry bar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F2
- Name: Activate the menu bar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F10
- Name: Close the program window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Display all filtered tasks or resources
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Reset sort order and turn off grouping
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Open a new window
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F11
- Name: Display task or resource information
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F2
- Name: Turn Auto Calculate on or off
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F9
- Name: Turn Extend Selection mode on or off
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- SectionName: Edit in a view
Properties:
- Name: Copy selected data
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut selected data
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Paste data
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Fill down a column
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Find
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Go To
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Link tasks
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F2
- Name: Unlink tasks
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F2
- Name: Clear or reset selected field
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Delete
- Name: Set task to manually schedule
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Set task to auto schedule
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Cancel an entry
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- SectionName: Outline a project
Properties:
- Name: Indent the selected task
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Right>"
- Name: Remove a task indent
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Left>"
- Name: Move selected task up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Move selected task down
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Hide subtasks
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- Minus
- Name: Show subtasks
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "="
- SectionName: Timescale navigation
Properties:
- Name: Move timescale to beginning of project
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- Name: Move timescale to end of project
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- End
- Name: Scroll timescale left
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Scroll timescale right
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Move timescale left one page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageUp
- Name: Move timescale right one page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageDown
- SectionName: Select in a sheet view
Properties:
- Name: Move to first field in row
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Move to last field in row
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Move to first field of first row
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: Move to last field of last row
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Select a column
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- Name: Select a row
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Space
- Name: Select all rows and columns
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Space

View File

@@ -0,0 +1,419 @@
PackageName: Microsoft.Publisher
Name: Publisher
WindowFilter: "mspub.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Open a new instance of Publisher
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open a publication
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Close the current publication
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Save (Save As)
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Find text
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Replace text
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Check spelling
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- SectionName: Edit text
Properties:
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Copy formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Paste formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- SectionName: Format text
Properties:
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Small capitals
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Open Font dialog
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Subscript
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "="
- Name: Superscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "="
- Name: Increase kerning
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "]"
- Name: Decrease kerning
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "["
- Name: Increase font size by 1 point
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "]"
- Name: Decrease font size by 1 point
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "["
- Name: Center paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Align paragraph left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Align paragraph right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Justify paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Distribute paragraph evenly
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Insert current date
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- D
- Name: Insert current time
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- T
- Name: Insert current page number
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- P
- SectionName: Objects and layers
Properties:
- Name: Group or ungroup selected objects
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Bring object to front
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F6
- Name: Send object to back
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F6
- Name: Nudge selected object
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Arrow>"
- Name: Nudge object in small increments
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Arrow>"
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- SectionName: Pages and view
Properties:
- Name: Go to page
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Next page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Previous page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: Insert new page or two-page spread
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Insert duplicate page
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Switch between current page and master page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Toggle boundaries
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Switch between current view and actual size
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- Name: Zoom to full page view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L

View File

@@ -0,0 +1,452 @@
PackageName: Microsoft.Teams
Name: Teams
WindowFilter: "ms-teams.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: General
Properties:
- Name: Show keyboard shortcuts
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "."
- Name: Go to Search
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Open filter
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Start a new chat
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Start a chat in a new window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Open Settings
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- ","
- Name: Open Help
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Close
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "="
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset zoom level
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "0"
- Name: Go to a specific chat or channel
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Pin a window on top
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- SectionName: Navigation
Properties:
- Name: Open 1st app on app bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Open 2nd app on app bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "2"
- Name: Open 3rd app on app bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "3"
- Name: Move focus to chat or channel list
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Move focus to message pane
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Go to compose box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Go to previous section
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F6
- Name: Go to next section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F6
- Name: Go back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- SectionName: Messaging
Properties:
- Name: Mark all as read
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- Name: Jump to last read or newest message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Find in current chat or channel
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Reply to the last message
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- R
- Name: React to the last message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- R
- SectionName: Compose
Properties:
- Name: Expand compose box
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Send message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Start new line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Strikethrough
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- X
- Name: Insert link
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Insert inline code
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Insert code block
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Mark message as important
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Apply Heading 1
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "1"
- Name: Apply Heading 2
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "2"
- Name: Apply Heading 3
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "3"
- Name: Attach file
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- O
- SectionName: Meetings and calls
Properties:
- Name: Toggle mute
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Temporarily unmute
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- Name: Raise or lower your hand
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Toggle video
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Accept video call
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Accept audio call
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Decline call
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Start audio call
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- A
- Name: Start video call
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- V
- Name: End call
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Schedule a meeting
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- N

View File

@@ -0,0 +1,427 @@
PackageName: Microsoft.Visio
Name: Visio
WindowFilter: "visio.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: Enter full-screen view
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Exit full-screen view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Open the Home tab on the ribbon
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- H
- Name: Open the Text dialog box
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Open the Format Shape task pane
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Select Pointer Tool
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Select Text tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "2"
- Name: Select Connector tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "3"
- Name: Select text block tool
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "4"
- SectionName: Navigate
Properties:
- Name: Next page in the drawing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Name: Previous page in the drawing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Name: Cycle through open drawings
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Cycle through open drawings in reverse
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Cycle focus through pages
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Cycle focus through pages in reverse
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- SectionName: Format text
Properties:
- Name: Bold
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Double underline
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: All caps
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Small caps
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Subscript
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "="
- Name: Superscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "="
- Name: Align text left
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- Name: Center text horizontally
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Align text right
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Justify text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Top-align text vertically
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Center text vertically
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Bottom-align text vertically
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Select all text in a text block
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- SectionName: Shapes
Properties:
- Name: Group selected shapes
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Ungroup shapes
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Bring shape to front
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Send shape to back
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Rotate shape left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Rotate shape right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Flip shape horizontally
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Flip shape vertically
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Open Align Shapes dialog
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- Name: Nudge one pixel
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Arrow>"
- SectionName: Tools and zoom
Properties:
- Name: Toggle Format Painter
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Select rectangle tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "8"
- Name: Select ellipse tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "9"
- Name: Select line tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "6"
- Name: Select arc tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "7"
- Name: Select freeform tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "5"
- Name: Select pencil tool
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "4"
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F6
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F6
- Name: Fit view to window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W

View File

@@ -0,0 +1,803 @@
PackageName: Microsoft.VisualStudioCode
Name: Visual Studio Code
WindowFilter: "code.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: General
Properties:
- Name: Show All Commands (Command Palette)
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F1
- Name: Quick Open / Go to File
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: New Window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Close Window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Open Settings
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Comma
- Name: Open Keyboard Shortcuts
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Toggle Full Screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Toggle Zen Mode
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Z
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- SectionName: Basic editing
Properties:
- Name: Cut line (empty selection)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy line (empty selection)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Delete Line
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Insert Line Below
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Insert Line Above
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Move Line Down
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Move Line Up
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Copy Line Down
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Copy Line Up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Add Selection To Next Find Match
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Select all occurrences of current selection
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- Name: Insert Cursor Below
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Insert Cursor Above
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Toggle Line Comment
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Slash
- Name: Toggle Block Comment
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- A
- Name: Indent Line
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- RightBracket
- Name: Outdent Line
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- LeftBracket
- Name: Find
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Find Next
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Name: Find Previous
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Toggle Word Wrap
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Z
- SectionName: Rich languages editing
Properties:
- Name: Trigger Suggest
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Trigger Parameter Hints
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Space>"
- Name: Format Document
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- F
- Name: Format Selection
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Go to Definition
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Name: Show Hover
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Peek Definition
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F12
- Name: Quick Fix
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Period
- Name: Go to References
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F12
- Name: Rename Symbol
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F2
- SectionName: Navigation
Properties:
- Name: Show All Symbols
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Go to Line
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Go to Symbol
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- Name: Show Problems
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Go to Next Error or Warning
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- Name: Go to Previous Error or Warning
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F8
- Name: Go Back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go Forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- SectionName: Editor and window management
Properties:
- Name: Close Editor
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F4
- Name: Split Editor
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Backslash
- Name: Focus into First Editor Group
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 1
- Name: Focus into Second Editor Group
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 2
- Name: Focus into Third Editor Group
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 3
- Name: Move Editor Left
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageUp
- Name: Move Editor Right
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageDown
- SectionName: File management
Properties:
- Name: New File
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open File
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Save As
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Close
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Close All
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Reopen Closed Editor
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- SectionName: Display
Properties:
- Name: Toggle Sidebar Visibility
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Show Explorer / Toggle Focus
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Show Search
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Show Source Control
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Show Run
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Show Extensions
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Show Output
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Toggle Markdown Preview
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Toggle Integrated Terminal
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tilde
- SectionName: Search
Properties:
- Name: Replace in Files
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Toggle Search Details
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Focus Next Search Result
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F4
- Name: Focus Previous Search Result
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F4
- SectionName: Chat and AI
Properties:
- Name: Open Chat view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- I
- Name: Open chat in agent mode
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Open editor inline chat
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Open quick chat
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- L
- Name: New chat session
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Accept inline suggestion
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- SectionName: Debug
Properties:
- Name: Toggle Breakpoint
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- Name: Start / Continue
Recommended: true
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Name: Start without debugging
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F5
- Name: Pause
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Step Into
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- SectionName: Tasks
Properties:
- Name: Run Build Task
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B

View File

@@ -0,0 +1,449 @@
PackageName: Microsoft.WindowsTerminal
Name: Windows Terminal
WindowFilter: "WindowsTerminal.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Application
Properties:
- Name: Close window
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Toggle full-screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Enter>"
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Open new tab dropdown
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Space
- Name: Open settings UI
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- ","
- Name: Open settings JSON file
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- ","
- Name: Open default settings file
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- ","
- Name: Find text
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Toggle command palette
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Quake mode (drop-down window)
Shortcut:
- Win: true
Ctrl: false
Shift: false
Alt: false
Keys:
- "`"
- Name: Open system menu
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Space
- Name: Show command suggestions
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "."
- SectionName: Tab management
Properties:
- Name: Open new tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Open new window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Duplicate current tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Next tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Previous tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Open new tab with profile 1
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "1"
- Name: Open new tab with profile 2
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "2"
- Name: Open new tab with profile 3
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "3"
- Name: Open new tab with profile 4
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "4"
- Name: Open new tab with profile 5
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "5"
- Name: Switch to tab 1
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "1"
- Name: Switch to tab 2
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "2"
- Name: Switch to tab 3
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "3"
- Name: Switch to last tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "9"
- SectionName: Pane management
Properties:
- Name: Close current pane
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Name: Duplicate pane (horizontal split)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- Minus
- Name: Duplicate pane (vertical split)
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- Plus
- Name: Resize pane down
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Resize pane up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Resize pane left
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Left>"
- Name: Resize pane right
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Right>"
- Name: Move focus down
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Move focus up
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Move focus left
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Move focus right
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Move focus to previous pane
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Left>"
- SectionName: Clipboard and selection
Properties:
- Name: Copy to clipboard
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Insert
- Name: Paste from clipboard
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Insert
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Toggle mark mode (keyboard selection)
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- SectionName: Scrollback
Properties:
- Name: Scroll down one line
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Scroll up one line
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Scroll down one page
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageDown
- Name: Scroll up one page
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageUp
- Name: Scroll to top
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Home
- Name: Scroll to bottom
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- End
- Name: Clear buffer
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- SectionName: Font size
Properties:
- Name: Increase font size
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Decrease font size
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset font size
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "0"

View File

@@ -0,0 +1,738 @@
PackageName: Microsoft.Word
Name: Word
WindowFilter: "winword.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Frequently used
Properties:
- Name: New document
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Open
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Save
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Close document
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste text only
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Undo
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Name: Cancel a command
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- SectionName: Editing
Properties:
- Name: Delete one word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Backspace>"
- Name: Delete one word to the right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Delete
- Name: Find
Recommended: true
Description: Display the Navigation task pane to search the document.
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find and replace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Go to
Description: Navigate to a specific page, bookmark, footnote, table, comment, graphic, or other location.
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Copy formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- C
- Name: Paste formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- V
- SectionName: Navigation
Properties:
- Name: Move one word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: Move one word to the right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Move up one paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Move down one paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Down>"
- Name: Beginning of document
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- Name: End of document
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- End
- Name: Top of next page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Name: Top of previous page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: Previous revision
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F5
- SectionName: Selection
Properties:
- Name: Select word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Left>"
- Name: Select word to the right
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Right>"
- Name: Select to beginning of line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Home
- Name: Select to end of line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- End
- Name: Select to beginning of paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Select to end of paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Select to beginning of document
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Home
- Name: Select to end of document
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- End
- Name: Start extending the selection
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F8
- SectionName: Character formatting
Properties:
- Name: Bold
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italic
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Underline
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Double underline
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: All uppercase
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Change case
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Name: Font dialog box
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Increase font size by 1 point
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "]"
- Name: Decrease font size by 1 point
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "["
- Name: Subscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Minus
- Name: Superscript
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Plus
- Name: Remove manual character formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Space
- SectionName: Paragraph formatting
Properties:
- Name: Center
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- Name: Align left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Align right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Justify
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Increase indent
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Decrease indent
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Hanging indent
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Remove paragraph formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- Name: Apply Normal style
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Single line spacing
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "1"
- Name: Double line spacing
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "2"
- Name: 1.5 line spacing
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "5"
- Name: Apply Heading 1
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "1"
- Name: Apply Heading 2
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "2"
- Name: Apply Heading 3
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "3"
- SectionName: View and zoom
Properties:
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset zoom to 100%
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "0"
- Name: Split the document window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- S
- Name: Print preview
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- I
- Name: Show or hide nonprinting characters
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "8"
- SectionName: Insert
Properties:
- Name: Insert hyperlink
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Insert page break
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Name: Insert line break
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Insert column break
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Insert non-breaking space
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Space
- Name: Insert footnote
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- F
- Name: Insert endnote
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- D
- SectionName: Review
Properties:
- Name: Insert comment
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- M
- Name: Turn Track Changes on or off
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Close the Reviewing pane
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- C
- SectionName: Tables
Properties:
- Name: Move to next cell
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Move to previous cell
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Tab
- Name: First cell in the row
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- Name: Last cell in the row
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- End
- Name: First cell in the column
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageUp
- Name: Last cell in the column
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- PageDown
- Name: Insert tab character in a cell
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab

View File

@@ -0,0 +1,819 @@
PackageName: Mozilla.Firefox
Name: Firefox
WindowFilter: "firefox.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Navigation
Properties:
- Name: Back
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- LeftBracket
- Name: Forward
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- RightBracket
- Name: Home
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- Home
- Name: Open file
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Reload
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F5
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- R
- Name: Reload (override cache)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F5
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- R
- Name: Stop
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- SectionName: Current page
Properties:
- Name: Focus next link or input field
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Tab
- Name: Focus previous link or input field
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- Tab
- Name: Go down a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageDown
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Space>"
- Name: Go up a screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- PageUp
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Space>"
- Name: Go to bottom of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- End
- Name: Go to top of page
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Home
- Name: Move to next frame or pop-up
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Move to previous frame or pop-up
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F6
- Name: Print
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- P
- Name: Save page as
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- S
- Name: Zoom in
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Plus
- Name: Zoom out
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Minus
- Name: Reset zoom
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 0
- SectionName: Editing
Properties:
- Name: Copy
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- C
- Name: Cut
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- X
- Name: Delete
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Delete>"
- Name: Delete word to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Backspace>"
- Name: Delete word to the right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Delete>"
- Name: Move one word left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Left>"
- Name: Move one word right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Right>"
- Name: Paste
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- V
- Name: Paste as plain text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- V
- Name: Redo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Y
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Z
- Name: Select all
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- A
- Name: Undo
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- SectionName: Search
Properties:
- Name: Find in this page
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find again
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F3
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Find previous
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F3
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Quick find within link text
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Quote
- Name: Quick find
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- Slash
- Name: Close find bar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Focus address bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- D
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Focus search bar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- E
- SectionName: Windows and tabs
Properties:
- Name: Close tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F4
- Name: Close window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- F4
- Name: Cycle through tabs in recently used order
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Quit
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Q
- Name: Go one tab to the left
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Go one tab to the right
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Name: Go to tab 18
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 1
- Name: Go to last tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- 9
- Name: Move tab left
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageUp
- Name: Move tab right
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- PageDown
- Name: Move tab to start
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Home
- Name: Move tab to end
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- End
- Name: Mute or unmute audio
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: New tab
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: New window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: New private window
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- P
- Name: Reopen last closed tab
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Reopen last closed window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- SectionName: History and bookmarks
Properties:
- Name: History sidebar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- H
- Name: Library window (History)
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Clear recent history
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Delete>"
- Name: Bookmark this page
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- D
- Name: Bookmark all tabs
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- D
- Name: Bookmarks sidebar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Show or hide the bookmarks toolbar
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- B
- Name: Show all bookmarks (Library window)
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- O
- SectionName: Tools
Properties:
- Name: Downloads
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Y
- Name: Add-ons
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Toggle developer tools
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F12
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Web Console
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Inspector
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Take a screenshot
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Style Editor
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F7
- Name: Task Manager
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- Name: Profiler
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F5
- Name: Network
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Responsive Design View
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Page source
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Browser Console
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Page info
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- SectionName: Miscellaneous
Properties:
- Name: Toggle full screen
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Toggle reader mode
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- R
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F9
- Name: Caret browsing
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F7
- Name: Toggle context menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Expand or collapse vertical tabs
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Z

View File

@@ -0,0 +1,740 @@
PackageName: SlackTechnologies.Slack
Name: Slack
WindowFilter: "slack.exe"
BackgroundProcess: false
Shortcuts:
- SectionName: Slack basics
Properties:
- Name: Compose a new message
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- K
- Name: Compose a new message (alt)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- N
- Name: Unsend a message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Set your status
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Y
- Name: Open your preferences
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Comma
- Name: Hide the right sidebar
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Period
- Name: Create a new canvas
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Upload a file
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: View all downloaded files
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- J
- Name: Create a new snippet
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Start a search
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Search in current conversation
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: "Start, join, leave or end a huddle"
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Toggle mute on a huddle
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Space>"
- Name: Toggle full-screen view
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F11
- Name: Close window
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Reopen last closed window
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- W
- Name: Open the People view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- E
- Name: Quit Slack
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q
- SectionName: Navigate conversations
Properties:
- Name: Jump to a conversation
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- Name: Jump to a conversation (alt)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- T
- Name: Jump to most recent unread message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Jump to previous unread channel or DM
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Up>"
- Name: Jump to next unread channel or DM
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: true
Keys:
- "<Down>"
- Name: Jump to previous channel or DM in sidebar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Jump to next channel or DM in sidebar
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Go back in history
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Left>"
- Name: Go forwards in history
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Right>"
- Name: Open the Home view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 1
- Name: Browse DMs
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 2
- Name: Open the Activity view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Open the More view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 0
- Name: Open the Threads view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- T
- Name: Browse channels
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- L
- Name: Open conversation details
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- I
- Name: Move focus to next section
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F6
- Name: Move focus to previous section
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F6
- SectionName: Mark messages read or unread
Properties:
- Name: Mark all messages in current conversation as read
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- Name: Mark all messages as read
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Escape>"
- SectionName: All unread
Properties:
- Name: Open the All unread view
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- A
- Name: Mark a group of messages as read
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- SectionName: Switch workspaces
Properties:
- Name: Expand or collapse the workspace switcher
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- S
- Name: Switch to previous workspace
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Name: Switch to next workspace
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- SectionName: Switch tabs
Properties:
- Name: Switch to previous tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Name: Switch to next tab
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- SectionName: Take actions on messages
Properties:
- Name: Edit a message you sent
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- E
- Name: Delete a message you sent
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Delete>"
- Name: Open or reply to a thread
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- T
- Name: Forward a message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- F
- Name: Pin or unpin a message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- P
- Name: Save a message (or remove from Later)
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- A
- Name: Mark all messages above as unread
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- U
- Name: Create a reminder about a message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- M
- Name: Add an emoji reaction
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- R
- SectionName: Format messages
Properties:
- Name: Select text to beginning of line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Select text to end of line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: New line
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Bold selected text
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Italicise selected text
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Strikethrough selected text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Hyperlink selected text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- U
- Name: Quote selected text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 9
- Name: Inline code selected text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- C
- Name: Codeblock selected text
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: true
Keys:
- C
- Name: Bulleted list
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 8
- Name: Numbered list
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 7
- Name: Apply markdown formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- F
- Name: Undo formatting
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- SectionName: Format text in a canvas
Properties:
- Name: Paragraph
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- 0
- Name: Big heading
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- 1
- Name: Medium heading
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- 2
- Name: Small heading
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- 3
- Name: Checklist
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 0
- Name: Bulleted list
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 8
- Name: Numbered list
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- 7
- Name: Toggle heading and list styles
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tilde
- SectionName: Navigate a canvas
Properties:
- Name: View comment thread
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- T
- Name: Show reader or edit view
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- R
- Name: Open context menu
Shortcut:
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- F10
- Name: Find text in the canvas
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Find next
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- G
- Name: Find previous
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- G
- Name: Find and replace
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- H
- Name: Copy anchor link to section
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- Q
- Name: Undo last action
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Z
- Name: Redo last action
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Z
- Name: Move item in list up
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Move item in list down
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: true
Keys:
- "<Down>"

View File

@@ -0,0 +1,228 @@
PackageName: Telegram.TelegramDesktop
Name: Telegram Desktop
WindowFilter: "telegram.exe"
BackgroundProcess: true
Shortcuts:
- SectionName: Chat navigation
Properties:
- Name: Move to next chat
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Tab
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageDown
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Down>"
- Name: Move to previous chat
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- Tab
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- PageUp
- Win: false
Ctrl: false
Shift: false
Alt: true
Keys:
- "<Up>"
- Name: Go to previous folder
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Up>"
- Name: Go to next folder
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- "<Down>"
- Name: Search in selected chat
Recommended: true
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- F
- Name: Exit selected chat / global search
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Escape>"
- SectionName: Messages
Properties:
- Name: Edit previous message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Up>"
- Name: Delete currently selected message
Shortcut:
- Win: false
Ctrl: false
Shift: false
Alt: false
Keys:
- "<Delete>"
- Name: Start new line in input area
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- "<Enter>"
- Win: false
Ctrl: false
Shift: true
Alt: false
Keys:
- "<Enter>"
- Name: Move cursor to start of multi-line message
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Home
- SectionName: Text formatting
Properties:
- Name: Italic
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- I
- Name: Bold
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- B
- Name: Underline
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- U
- Name: Strikethrough
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- X
- Name: Monospace
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- M
- Name: Remove formatting
Shortcut:
- Win: false
Ctrl: true
Shift: true
Alt: false
Keys:
- N
- Name: Add URL to selection (link)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- K
- SectionName: Application
Properties:
- Name: Send file
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- O
- Name: Open contacts
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- J
- Name: Lock Telegram (if local password set)
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- L
- Name: Minimize Telegram
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- M
- Name: Minimize to system tray
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- W
- Name: Quit Telegram
Shortcut:
- Win: false
Ctrl: true
Shift: false
Alt: false
Keys:
- Q

View File

@@ -0,0 +1,111 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using ManagedCommon;
using Microsoft.UI.Xaml.Data;
using ShortcutGuide.Models;
using Windows.System;
namespace ShortcutGuide.Converters
{
public sealed partial class ShortcutDescriptionToKeysConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is ShortcutDescription description)
{
// Populate keysList with the keys from the ShortcutDescription
return this.GetKeysList(description);
}
else
{
List<object> keysList = [string.Empty];
return keysList;
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return value;
}
public List<object> GetKeysList(ShortcutDescription description)
{
List<object> shortcutList = [];
if (description.Win)
{
shortcutList.Add(92); // The Windows key or button.
}
if (description.Ctrl)
{
shortcutList.Add("Ctrl");
}
if (description.Alt)
{
shortcutList.Add("Alt");
}
if (description.Shift)
{
shortcutList.Add(16); // The Shift key or button.
}
foreach (var key in description.Keys)
{
// Try to parse a string key number to a key code
if (int.TryParse(key, out int keyCode))
{
switch (keyCode)
{
// https://learn.microsoft.com/uwp/api/windows.system.virtualkey?view=winrt-20348
case 38: // The Up Arrow key or button.
case 40: // The Down Arrow key or button.
case 37: // The Left Arrow key or button.
case 39: // The Right Arrow key or button.
shortcutList.Add(keyCode);
break;
default:
shortcutList.Add(Microsoft.PowerToys.Settings.UI.Library.Utilities.Helper.GetKeyName((uint)keyCode));
break;
}
}
else
{
switch (key)
{
// https://learn.microsoft.com/uwp/api/windows.system.virtualkey?view=winrt-20348
case "Up":
shortcutList.Add(38); // The Up Arrow key or button.
break;
case "Down":
shortcutList.Add(40); // The Down Arrow key or button.
break;
case "Left":
shortcutList.Add(37); // The Left Arrow key or button.
break;
case "Right":
shortcutList.Add(39); // The Right Arrow key or button.
break;
case "Back":
shortcutList.Add(8); // The Back key or button.
break;
case "<TASKBAR1-9>":
shortcutList.Add("Num");
break;
default:
shortcutList.Add(key); // Add other keys as strings.
break;
}
}
}
return shortcutList;
}
}
}

View File

@@ -0,0 +1,49 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Windows.Foundation;
using WinUIEx;
namespace ShortcutGuide.Helpers
{
public static class DisplayHelper
{
/// <summary>
/// Returns the display work area for the monitor that contains the specified window.
/// </summary>
/// <param name="hwnd">The window handle</param>
/// <returns>A <see cref="Rect"/> element containing the display area</returns>
public static Rect GetWorkAreaForDisplayWithWindow(nint hwnd)
{
var monitor = NativeMethods.MonitorFromWindow(hwnd, (int)NativeMethods.MonitorFromWindowDwFlags.MONITOR_DEFAULTTONEAREST);
int foundIndex = -1;
int currentIndex = 0;
NativeMethods.EnumDisplayMonitors(
nint.Zero,
nint.Zero,
(nint hMonitor, nint hdcMonitor, ref NativeMethods.RECT lprcMonitor, nint dwData) =>
{
if (hMonitor == dwData)
{
foundIndex = currentIndex;
return false;
}
currentIndex++;
return true;
},
monitor);
var monitors = MonitorInfo.GetDisplayMonitors();
if (foundIndex < 0 || foundIndex >= monitors.Count)
{
foundIndex = 0;
}
return monitors[foundIndex].RectWork;
}
}
}

View File

@@ -0,0 +1,43 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace ShortcutGuide.Helpers
{
// This class is rewritten from C++ to C# from the measure tool project
internal static class DpiHelper
{
#pragma warning disable SA1310 // Field names should not contain underscore
private const int DEFAULT_DPI = 96;
private const int MONITOR_DEFAULTTONEAREST = 2;
private const int MDT_EFFECTIVE_DPI = 0;
#pragma warning restore SA1310 // Field names should not contain underscore
public static float GetDPIScaleForWindow(nint hwnd)
{
int dpi = DEFAULT_DPI;
GetScreenDPIForWindow(hwnd, ref dpi);
return (float)dpi / DEFAULT_DPI;
}
private static long GetScreenDPIForWindow(nint hwnd, ref int dpi)
{
var targetMonitor = NativeMethods.MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
return GetScreenDPIForMonitor(targetMonitor, ref dpi);
}
private static long GetScreenDPIForMonitor(nint targetMonitor, ref int dpi)
{
if (targetMonitor != 0)
{
int dummy = 0;
return NativeMethods.GetDpiForMonitor(targetMonitor, MDT_EFFECTIVE_DPI, ref dpi, ref dummy);
}
else
{
dpi = DEFAULT_DPI;
return 0x80004005L;
}
}
}
}

View File

@@ -0,0 +1,62 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Microsoft.UI.Xaml.Media.Imaging;
namespace ShortcutGuide.Helpers
{
/// <summary>
/// Helpers for loading executable icons as XAML image sources.
/// </summary>
internal static class IconHelper
{
/// <summary>
/// Extracts the associated icon of an executable file and returns it as a
/// <see cref="BitmapImage"/> suitable for use with <c>ImageIcon</c>.
/// </summary>
/// <param name="path">Full path to the executable, or <c>null</c>/empty.</param>
/// <returns>
/// A <see cref="BitmapImage"/> when extraction succeeds; otherwise <c>null</c>.
/// Callers should fall back to a glyph icon when this returns <c>null</c>.
/// </returns>
public static BitmapImage? TryGetExecutableIcon(string? path)
{
if (string.IsNullOrEmpty(path) || !File.Exists(path))
{
return null;
}
try
{
using Icon? icon = Icon.ExtractAssociatedIcon(path);
if (icon is null)
{
return null;
}
using Bitmap bitmap = icon.ToBitmap();
using MemoryStream stream = new();
bitmap.Save(stream, ImageFormat.Png);
stream.Position = 0;
BitmapImage bitmapImage = new();
bitmapImage.SetSource(stream.AsRandomAccessStream());
return bitmapImage;
}
catch (Exception ex) when (ex is FileNotFoundException
or UnauthorizedAccessException
or Win32Exception
or ArgumentException
or IOException)
{
return null;
}
}
}
}

View File

@@ -0,0 +1,191 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using ShortcutGuide.Models;
using YamlDotNet.Serialization;
namespace ShortcutGuide.Helpers
{
/// <summary>
/// Helps to interpret the manifest files for the Shortcut Guide.
/// </summary>
public class ManifestInterpreter
{
// Todo: Get language from settings or environment variable, default to "en-US"
/// <summary>
/// Gets the language used for the manifest files.
/// </summary>
public static string Language => "en-US";
/// <summary>
/// Returns the shortcuts for a specific application.
/// </summary>
/// <remarks>
/// The method should only be called if the application is known to have a shortcuts file.
/// </remarks>
/// <param name="applicationName">The manifest id.</param>
/// <returns>The deserialized shortcuts file.</returns>
/// <exception cref="FileNotFoundException">The requested file was not found.</exception>
public static ShortcutFile GetShortcutsOfApplication(string applicationName)
{
string path = PathOfManifestFiles;
IEnumerable<string> files = Directory.EnumerateFiles(path, applicationName + ".*.yml") ??
throw new FileNotFoundException($"The file for the application '{applicationName}' was not found in '{path}'.");
IEnumerable<string> filesEnumerable = files as string[] ?? [.. files];
return filesEnumerable.Any(f => f.EndsWith($".{Language}.yml", StringComparison.InvariantCulture))
? YamlToShortcutList(File.ReadAllText(Path.Combine(path, applicationName + $".{Language}.yml")))
: filesEnumerable.Any(f => f.EndsWith(".en-US.yml", StringComparison.InvariantCulture))
? YamlToShortcutList(File.ReadAllText(filesEnumerable.First(f => f.EndsWith(".en-US.yml", StringComparison.InvariantCulture))))
: throw new FileNotFoundException($"The file for the application '{applicationName}' was not found in '{path}' with the language '{Language}' or 'en-US'.");
}
/// <summary>
/// Deserializes the content of a YAML file to a <see cref="ShortcutFile"/>.
/// </summary>
/// <param name="content">The content of the YAML file.</param>
/// <returns>A deserialized <see cref="ShortcutFile"/> object.</returns>
private static ShortcutFile YamlToShortcutList(string content)
{
Deserializer deserializer = new();
return deserializer.Deserialize<ShortcutFile>(content);
}
/// <summary>
/// Gets the path to the directory where the manifest files are stored.
/// </summary>
public static string PathOfManifestFiles => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "WinGet", "KeyboardShortcuts");
/// <summary>
/// Retrieves the index YAML file that contains the list of all applications and their shortcuts.
/// </summary>
/// <returns>A deserialized <see cref="IndexFile"/> object.</returns>
public static IndexFile GetIndexYamlFile()
{
string path = PathOfManifestFiles;
string content = File.ReadAllText(Path.Combine(path, "index.yml"));
Deserializer deserializer = new();
return deserializer.Deserialize<IndexFile>(content);
}
/// <summary>
/// Retrieves all application IDs that should be displayed, based on the foreground window and background processes.
/// </summary>
/// <returns>
/// A dictionary mapping each application ID to the full path of the executable
/// that caused the match (used for icon extraction), or <c>null</c> when no
/// specific executable is associated (for example, wildcard filters like the
/// default shell).
/// </returns>
public static Dictionary<string, string?> GetAllCurrentApplicationIds()
{
nint handle = NativeMethods.GetForegroundWindow();
Dictionary<string, string?> applicationIds = new(StringComparer.Ordinal);
Process[] processes = Process.GetProcesses();
if (NativeMethods.GetWindowThreadProcessId(handle, out uint processId) > 0)
{
string? name = null;
string? executablePath = null;
try
{
ProcessModule? mainModule = Process.GetProcessById((int)processId).MainModule;
name = mainModule?.ModuleName;
executablePath = mainModule?.FileName;
}
catch (Win32Exception)
{
// Access denied for elevated processes; we cannot read the module.
}
catch (InvalidOperationException)
{
// Process exited between enumeration and access.
}
if (name is not null)
{
try
{
IndexFile.IndexItem match = GetIndexYamlFile().Index.First((s) => !s.BackgroundProcess && IsMatch(name, s.WindowFilter));
string? pathForApp = match.WindowFilter == "*" ? null : executablePath;
foreach (var item in match.Apps)
{
applicationIds[item] = pathForApp;
}
}
catch (InvalidOperationException)
{
}
}
}
foreach (var item in GetIndexYamlFile().Index.Where((s) => s.BackgroundProcess))
{
try
{
string? matchedExecutablePath = null;
bool matched = false;
foreach (var p in processes)
{
try
{
if (IsMatch(p.MainModule!.ModuleName, item.WindowFilter))
{
matched = true;
if (item.WindowFilter != "*")
{
matchedExecutablePath = p.MainModule!.FileName;
}
break;
}
}
catch (Win32Exception)
{
// Access denied for elevated processes; skip.
}
}
if (matched)
{
foreach (var app in item.Apps)
{
// Preserve an existing (foreground) path if one was already set;
// only fill in a path when the slot is currently null.
if (!applicationIds.TryGetValue(app, out string? existing) || existing is null)
{
applicationIds[app] = matchedExecutablePath;
}
}
}
}
catch (InvalidOperationException)
{
}
}
return applicationIds;
static bool IsMatch(string input, string filter)
{
input = input.ToLower(CultureInfo.InvariantCulture);
filter = filter.ToLower(CultureInfo.InvariantCulture);
string regexPattern = "^" + Regex.Escape(filter).Replace("\\*", ".*") + "$";
return Regex.IsMatch(input, regexPattern);
}
}
}
}

View File

@@ -0,0 +1,85 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Microsoft.UI.Xaml;
namespace ShortcutGuide.Helpers;
internal static class NavItemIconHelper
{
public static object GetSelectedIcon(DependencyObject obj)
{
return obj.GetValue(SelectedIconProperty);
}
public static void SetSelectedIcon(DependencyObject obj, object value)
{
obj.SetValue(SelectedIconProperty, value);
}
public static readonly DependencyProperty SelectedIconProperty =
DependencyProperty.RegisterAttached("SelectedIcon", typeof(object), typeof(NavItemIconHelper), new PropertyMetadata(null));
/// <summary>
/// Gets the value of <see cref="ShowNotificationDotProperty" /> for a <see cref="DependencyObject" />
/// </summary>
/// <returns>Returns a boolean indicating whether the notification dot should be shown.</returns>
public static bool GetShowNotificationDot(DependencyObject obj)
{
return (bool)obj.GetValue(ShowNotificationDotProperty);
}
/// <summary>
/// Sets <see cref="ShowNotificationDotProperty" /> on a <see cref="DependencyObject" />
/// </summary>
public static void SetShowNotificationDot(DependencyObject obj, bool value)
{
obj.SetValue(ShowNotificationDotProperty, value);
}
/// <summary>
/// An attached property that sets whether or not a notification dot should be shown on an associated <see cref="Microsoft.UI.Xaml.Controls.NavigationViewItem" />
/// </summary>
public static readonly DependencyProperty ShowNotificationDotProperty =
DependencyProperty.RegisterAttached("ShowNotificationDot", typeof(bool), typeof(NavItemIconHelper), new PropertyMetadata(false));
/// <summary>
/// Gets the value of <see cref="UnselectedIconProperty"/> for a <see cref="DependencyObject"/>
/// </summary>
/// <returns>Returns the unselected icon as an object.</returns>
public static object GetUnselectedIcon(DependencyObject obj)
{
return (object)obj.GetValue(UnselectedIconProperty);
}
/// <summary>
/// Sets the value of <see cref="UnselectedIconProperty"/> for a <see cref="DependencyObject"/>
/// </summary>
public static void SetUnselectedIcon(DependencyObject obj, object value)
{
obj.SetValue(UnselectedIconProperty, value);
}
/// <summary>
/// An attached property that sets the unselected icon on an associated <see cref="Microsoft.UI.Xaml.Controls.NavigationViewItem" />
/// </summary>
public static readonly DependencyProperty UnselectedIconProperty =
DependencyProperty.RegisterAttached("UnselectedIcon", typeof(object), typeof(NavItemIconHelper), new PropertyMetadata(null));
public static Visibility GetStaticIconVisibility(DependencyObject obj)
{
return (Visibility)obj.GetValue(StaticIconVisibilityProperty);
}
public static void SetStaticIconVisibility(DependencyObject obj, Visibility value)
{
obj.SetValue(StaticIconVisibilityProperty, value);
}
/// <summary>
/// An attached property that sets the visibility of the static icon in the associated <see cref="Microsoft.UI.Xaml.Controls.NavigationViewItem"/>.
/// </summary>
public static readonly DependencyProperty StaticIconVisibilityProperty =
DependencyProperty.RegisterAttached("StaticIconVisibility", typeof(Visibility), typeof(NavItemIconHelper), new PropertyMetadata(Visibility.Collapsed));
}

View File

@@ -0,0 +1,50 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.PowerToys.Settings.UI.Library;
using ShortcutGuide.Models;
namespace ShortcutGuide.Helpers
{
public static class PinnedShortcutsHelper
{
/// <summary>
/// Raised after the pinned-shortcut list for an application has been updated and persisted.
/// The string argument is the affected application name.
/// </summary>
public static event EventHandler<string>? PinnedShortcutsChanged;
public static void UpdatePinnedShortcuts(string appName, ShortcutEntry shortcutEntry)
{
if (!App.PinnedShortcuts.TryGetValue(appName, out var list))
{
list = new List<ShortcutEntry>();
App.PinnedShortcuts[appName] = list;
}
if (!list.Remove(shortcutEntry))
{
list.Add(shortcutEntry);
}
Save();
PinnedShortcutsChanged?.Invoke(null, appName);
}
public static void Save()
{
string serialized = JsonSerializer.Serialize(App.PinnedShortcuts);
string pinnedPath = SettingsUtils.Default.GetSettingsFilePath(ShortcutGuideSettings.ModuleName, "Pinned.json");
File.WriteAllText(pinnedPath, serialized);
}
}
}

View File

@@ -0,0 +1,197 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.PowerToys.Settings.UI.Library;
using static ShortcutGuide.Helpers.ResourceLoaderInstance;
namespace ShortcutGuide.Helpers
{
/// <summary>
/// Populates the PowerToys shortcuts in the manifest files.
/// </summary>
internal sealed partial class PowerToysShortcutsPopulator
{
/// <summary>
/// Populates the PowerToys shortcuts in the manifest files.
/// </summary>
public static void Populate()
{
string path = Path.Combine(ManifestInterpreter.PathOfManifestFiles, $"Microsoft.PowerToys.{ManifestInterpreter.Language}.yml");
StringBuilder content = new(File.ReadAllText(path));
const string populateStartString = "# <Populate start>";
const string populateEndString = "# <Populate end>";
content = new(PopulateRegex().Replace(content.ToString(), populateStartString + Environment.NewLine));
SettingsUtils settingsUtils = SettingsUtils.Default;
EnabledModules enabledModules = SettingsRepository<GeneralSettings>.GetInstance(settingsUtils).SettingsConfig.Enabled;
if (enabledModules.AdvancedPaste)
{
AdvancedPasteProperties advancedPasteProperties = SettingsRepository<AdvancedPasteSettings>.GetInstance(settingsUtils).SettingsConfig.Properties;
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdvancedPasteUIShortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("AdvancedPasteUI_Shortcut/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.PasteAsPlainTextShortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsPlainText_Shortcut/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.PasteAsMarkdownShortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsMarkdown_Shortcut/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.PasteAsJsonShortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsJson_Shortcut/Header")));
if (advancedPasteProperties.AdditionalActions.ImageToText.IsShown)
{
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.ImageToText.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("ImageToText/Header")));
}
if (advancedPasteProperties.AdditionalActions.PasteAsFile.IsShown)
{
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.PasteAsFile.PasteAsTxtFile.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsTxtFile/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.PasteAsFile.PasteAsPngFile.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsPngFile/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.PasteAsFile.PasteAsHtmlFile.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("PasteAsHtmlFile/Header")));
}
if (advancedPasteProperties.AdditionalActions.Transcode.IsShown)
{
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.Transcode.TranscodeToMp3.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("TranscodeToMp3/Header")));
content.Append(HotkeySettingsToYaml(advancedPasteProperties.AdditionalActions.Transcode.TranscodeToMp4.Shortcut, SettingsResourceLoader.GetString("AdvancedPaste/ModuleTitle"), SettingsResourceLoader.GetString("TranscodeToMp4/Header")));
}
}
if (enabledModules.AlwaysOnTop)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<AlwaysOnTopSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.Hotkey, SettingsResourceLoader.GetString("AlwaysOnTop/ModuleTitle"), SettingsResourceLoader.GetString("AlwaysOnTop_ShortDescription")));
}
if (enabledModules.ColorPicker)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<ColorPickerSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("ColorPicker/ModuleTitle"), SettingsResourceLoader.GetString("ColorPicker_ShortDescription")));
}
if (enabledModules.CmdPal)
{
content.Append(HotkeySettingsToYaml(new CmdPalProperties().Hotkey, SettingsResourceLoader.GetString("CmdPal/ModuleTitle")));
}
if (enabledModules.CropAndLock)
{
CropAndLockProperties cropAndLockProperties = SettingsRepository<CropAndLockSettings>.GetInstance(settingsUtils).SettingsConfig.Properties;
content.Append(HotkeySettingsToYaml(cropAndLockProperties.ThumbnailHotkey, SettingsResourceLoader.GetString("CropAndLock/ModuleTitle"), SettingsResourceLoader.GetString("CropAndLock_Thumbnail")));
content.Append(HotkeySettingsToYaml(cropAndLockProperties.ReparentHotkey, SettingsResourceLoader.GetString("CropAndLock/ModuleTitle"), SettingsResourceLoader.GetString("CropAndLock_Reparent")));
}
if (enabledModules.CursorWrap)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<CursorWrapSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("MouseUtils_CursorWrap/Header"), SettingsResourceLoader.GetString("MouseUtils_CursorWrap/Description")));
}
if (enabledModules.FancyZones)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<FancyZonesSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.FancyzonesEditorHotkey, SettingsResourceLoader.GetString("FancyZones/ModuleTitle"), SettingsResourceLoader.GetString("FancyZones_OpenEditor")));
}
if (enabledModules.LightSwitch)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<LightSwitchSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ToggleThemeHotkey, SettingsResourceLoader.GetString("LightSwitch/ModuleTitle"), SettingsResourceLoader.GetString("LightSwitch_ForceDarkMode")));
}
if (enabledModules.MouseHighlighter)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<MouseHighlighterSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("MouseUtils_MouseHighlighter/Header"), SettingsResourceLoader.GetString("MouseHighlighter_ShortDescription")));
}
if (enabledModules.MouseJump)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<MouseJumpSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("MouseUtils_MouseJump/Header"), SettingsResourceLoader.GetString("MouseJump_ShortDescription")));
}
if (enabledModules.MousePointerCrosshairs)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<MousePointerCrosshairsSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("MouseUtils_MousePointerCrosshairs/Header"), SettingsResourceLoader.GetString("MouseCrosshairs_ShortDescription")));
}
if (enabledModules.Peek)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<PeekSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("Peek/ModuleTitle")));
}
if (enabledModules.PowerLauncher)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<PowerLauncherSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.OpenPowerLauncher, SettingsResourceLoader.GetString("PowerLauncher/ModuleTitle")));
}
if (enabledModules.MeasureTool)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<MeasureToolSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("MeasureTool/ModuleTitle"), SettingsResourceLoader.GetString("ScreenRuler_ShortDescription")));
}
if (enabledModules.ShortcutGuide)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<ShortcutGuideSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.DefaultOpenShortcutGuide, SettingsResourceLoader.GetString("ShortcutGuide/ModuleTitle"), SettingsResourceLoader.GetString("ShortcutGuide_ShortDescription")));
}
if (enabledModules.PowerOcr)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<PowerOcrSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ActivationShortcut, SettingsResourceLoader.GetString("TextExtractor/ModuleTitle"), SettingsResourceLoader.GetString("PowerOcr_ShortDescription")));
}
if (enabledModules.Workspaces)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<WorkspacesSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.Hotkey, SettingsResourceLoader.GetString("Workspaces/ModuleTitle"), SettingsResourceLoader.GetString("Workspaces_ShortDescription")));
}
// Todo: ZoomIt hotkeys currently not supported, because ZoomIt does save their settings in the view model instead of the settings properties, which is weird.
/*
if (enabledModules.ZoomIt)
{
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.ToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_ZoomGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.LiveZoomToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_LiveZoomGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.DrawToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_DrawGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.DemoTypeToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_DemoTypeGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.BreakTimerKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_BreakGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.RecordToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_RecordGroup/Header")));
content.Append(HotkeySettingsToYaml(SettingsRepository<ZoomItSettings>.GetInstance(settingsUtils).SettingsConfig.Properties.SnipToggleKey, SettingsResourceLoader.GetString("ZoomIt/ModuleTitle"), SettingsResourceLoader.GetString("ZoomIt_SnipGroup/Header")));
}*/
content.Append(populateEndString);
File.WriteAllText(path, content.ToString());
}
/// <summary>
/// Converts the hotkey settings to a YAML format string for the manifest file.
/// </summary>
/// <param name="hotkeySettings">Object containing a hotkey from the settings.</param>
/// <param name="moduleName">The name of the PowerToys module.</param>
/// <param name="description">Description of the action.</param>
/// <returns>Yaml code for the manifest file.</returns>
private static string HotkeySettingsToYaml(HotkeySettings hotkeySettings, string moduleName, string? description = null)
{
string content = string.Empty;
content += " - Name: " + moduleName + Environment.NewLine;
content += " Shortcut: " + Environment.NewLine;
content += " - Win: " + hotkeySettings.Win.ToString() + Environment.NewLine;
content += " Ctrl: " + hotkeySettings.Ctrl.ToString() + Environment.NewLine;
content += " Alt: " + hotkeySettings.Alt.ToString() + Environment.NewLine;
content += " Shift: " + hotkeySettings.Shift.ToString() + Environment.NewLine;
content += " Keys:" + Environment.NewLine;
content += " - " + hotkeySettings.Code.ToString(CultureInfo.InvariantCulture) + Environment.NewLine;
if (description != null)
{
content += " Description: " + description + Environment.NewLine;
}
return content;
}
/// <inheritdoc cref="HotkeySettingsToYaml(HotkeySettings, string, string?)"/>
private static string HotkeySettingsToYaml(KeyboardKeysProperty hotkeySettings, string moduleName, string? description = null)
{
return HotkeySettingsToYaml(hotkeySettings.Value, moduleName, description);
}
[GeneratedRegex(@"# <Populate start>[\s\S\n\r]*# <Populate end>")]
private static partial Regex PopulateRegex();
}
}

View File

@@ -0,0 +1,27 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Microsoft.Windows.ApplicationModel.Resources;
namespace ShortcutGuide.Helpers
{
internal static class ResourceLoaderInstance
{
/// <summary>
/// Gets the resource loader for the Shortcut Guide module.
/// </summary>
internal static ResourceLoader ResourceLoader { get; private set; }
/// <summary>
/// Gets the resource loader for the Settings module.
/// </summary>
internal static ResourceLoader SettingsResourceLoader { get; private set; }
static ResourceLoaderInstance()
{
ResourceLoader = new ResourceLoader("PowerToys.ShortcutGuide.pri");
SettingsResourceLoader = new ResourceLoader("PowerToys.Settings.pri");
}
}
}

View File

@@ -0,0 +1,30 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Microsoft.UI.Xaml.Markup;
namespace ShortcutGuide.Helpers
{
[MarkupExtensionReturnType(ReturnType = typeof(string))]
public partial class StringResourceExtension : MarkupExtension
{
public enum SpecialTreatment
{
None,
FirstCharOnly,
EverythingExceptFirstChar,
}
public string Key { get; set; } = string.Empty;
public SpecialTreatment Treatment { get; set; } = SpecialTreatment.None;
protected override object ProvideValue() => this.Treatment switch
{
SpecialTreatment.FirstCharOnly => ResourceLoaderInstance.ResourceLoader.GetString(this.Key)[0].ToString(),
SpecialTreatment.EverythingExceptFirstChar => ResourceLoaderInstance.ResourceLoader.GetString(this.Key)[1..],
_ => ResourceLoaderInstance.ResourceLoader.GetString(this.Key),
};
}
}

View File

@@ -0,0 +1,45 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Runtime.InteropServices;
using WinRT.Interop;
using TasklistButton = ShortcutGuide.NativeMethods.TasklistButton;
namespace ShortcutGuide.Helpers
{
/// <summary>
/// Provides methods to retrieve the positions of taskbar buttons on the current monitor.
/// </summary>
internal static class TasklistPositions
{
/// <summary>
/// Retrieves the taskbar buttons for the current monitor.
/// </summary>
/// <returns>An array of the taskbar buttons.</returns>
public static TasklistButton[] GetButtons()
{
var monitor = NativeMethods.MonitorFromWindow(WindowNative.GetWindowHandle(App.MainWindow), 0);
nint ptr = NativeMethods.GetTasklistButtons(monitor, out int size);
if (ptr == nint.Zero)
{
return [];
}
if (size <= 0)
{
return [];
}
TasklistButton[] buttons = new TasklistButton[size];
nint currentPtr = ptr;
for (int i = 0; i < size; i++)
{
buttons[i] = Marshal.PtrToStructure<TasklistButton>(currentPtr);
currentPtr += Marshal.SizeOf<TasklistButton>();
}
return buttons;
}
}
}

View File

@@ -0,0 +1,22 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace ShortcutGuide.Models
{
public struct IndexFile
{
public struct IndexItem
{
public string WindowFilter { get; set; }
public bool BackgroundProcess { get; set; }
public string[] Apps { get; set; }
}
public string DefaultShellName { get; set; }
public IndexItem[] Index { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace ShortcutGuide.Models
{
public struct ShortcutCategory
{
public string SectionName { get; set; }
public ShortcutEntry[] Properties { get; set; }
}
}

View File

@@ -0,0 +1,66 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace ShortcutGuide.Models
{
public class ShortcutDescription(bool ctrl, bool shift, bool alt, bool win, string[] keys)
{
public ShortcutDescription()
: this(false, false, false, false, [])
{
}
[JsonPropertyName(nameof(Ctrl))]
public bool Ctrl { get; set; } = ctrl;
[JsonPropertyName(nameof(Shift))]
public bool Shift { get; set; } = shift;
[JsonPropertyName(nameof(Alt))]
public bool Alt { get; set; } = alt;
[JsonPropertyName(nameof(Win))]
public bool Win { get; set; } = win;
[JsonPropertyName(nameof(Keys))]
public string[] Keys { get; set; } = keys;
public override bool Equals(object? obj)
{
return obj is ShortcutDescription other && this.Ctrl == other.Ctrl &&
this.Shift == other.Shift &&
this.Alt == other.Alt &&
this.Win == other.Win &&
this.Keys.SequenceEqual(other.Keys);
}
public override int GetHashCode()
{
var hash = HashCode.Combine(Ctrl, Shift, Alt, Win);
foreach (var key in Keys)
{
hash = HashCode.Combine(hash, key);
}
return hash;
}
public static bool operator ==(ShortcutDescription? left, ShortcutDescription? right)
{
return (left is null && right is null) || (left is not null && right is not null && left.Equals(right));
}
public static bool operator !=(ShortcutDescription? left, ShortcutDescription? right)
{
return !(left == right);
}
}
}

View File

@@ -0,0 +1,69 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
using Windows.UI.Text;
using static ShortcutGuide.Models.ShortcutEntry;
using Orientation = Microsoft.UI.Xaml.Controls.Orientation;
namespace ShortcutGuide.Models
{
public class ShortcutEntry(string name, string? description, bool recommended, ShortcutDescription[] shortcutDescriptions)
{
public override bool Equals(object? obj)
{
return obj is ShortcutEntry other && this.Name == other.Name &&
this.Description == other.Description &&
this.Shortcut.Length == other.Shortcut.Length &&
this.Shortcut.SequenceEqual(other.Shortcut);
}
public override int GetHashCode()
{
var hash = HashCode.Combine(Name, Description);
foreach (var s in Shortcut)
{
hash = HashCode.Combine(hash, s.GetHashCode());
}
return hash;
}
public static bool operator ==(ShortcutEntry? left, ShortcutEntry? right)
{
return (left is null && right is null) || (left is not null && right is not null && left.Equals(right));
}
public static bool operator !=(ShortcutEntry? left, ShortcutEntry? right)
{
return !(left == right);
}
public ShortcutEntry()
: this(string.Empty, string.Empty, false, [])
{
}
[JsonPropertyName(nameof(Name))]
public string Name { get; set; } = name;
[JsonPropertyName(nameof(Description))]
public string? Description { get; set; } = description;
[JsonPropertyName(nameof(Recommended))]
public bool Recommended { get; set; } = recommended;
[JsonPropertyName(nameof(Shortcut))]
public ShortcutDescription[] Shortcut { get; set; } = shortcutDescriptions;
}
}

View File

@@ -0,0 +1,19 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace ShortcutGuide.Models
{
public struct ShortcutFile
{
public string PackageName { get; set; }
public ShortcutCategory[] Shortcuts { get; set; }
public string WindowFilter { get; set; }
public bool BackgroundProcess { get; set; }
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShortcutGuide.Models
{
internal sealed class ShortcutPageNavParam
{
public string AppName { get; set; } = string.Empty;
public ShortcutFile ShortcutFile { get; set; }
}
}

View File

@@ -0,0 +1,110 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Runtime.InteropServices;
using Windows.Graphics;
namespace ShortcutGuide;
internal static partial class NativeMethods
{
internal const int GWL_STYLE = -16;
internal const int WS_CAPTION = 0x00C00000;
[LibraryImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
[LibraryImport("user32.dll", SetLastError = true)]
internal static partial int GetWindowLongW(IntPtr hWnd, int nIndex);
[LibraryImport("user32.dll")]
internal static partial int SetWindowLongW(IntPtr hWnd, int nIndex, int dwNewLong);
[LibraryImport("user32.dll", StringMarshalling = StringMarshalling.Utf16)]
internal static partial IntPtr FindWindowW(in string lpClassName, in string? lpWindowName);
[LibraryImport("User32.dll")]
internal static partial IntPtr MonitorFromWindow(IntPtr hwnd, int dwFlags);
[LibraryImport("Shcore.dll")]
internal static partial long GetDpiForMonitor(IntPtr hmonitor, int dpiType, ref int dpiX, ref int dpiY);
[LibraryImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool GetCursorPos(out POINT lpPoint);
[LibraryImport("user32.dll")]
internal static partial IntPtr GetForegroundWindow();
[LibraryImport("user32.dll", SetLastError = true)]
internal static partial uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
[LibraryImport("user32.dll")]
internal static partial short GetAsyncKeyState(int vKey);
[DllImport("../PowerToys.Interop.dll", EntryPoint = "get_buttons")]
internal static extern IntPtr GetTasklistButtons(IntPtr monitor, out int size);
[LibraryImport("../PowerToys.Interop.dll", EntryPoint = "IsCurrentWindowExcludedFromShortcutGuide")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool IsCurrentWindowExcludedFromShortcutGuide();
[LibraryImport("User32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumDelegate lpfnEnum, IntPtr dwData);
internal delegate bool MonitorEnumDelegate(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData);
internal struct LPARAM(IntPtr value)
{
internal IntPtr Value = value;
public static implicit operator IntPtr(LPARAM lParam)
{
return lParam.Value;
}
public static implicit operator LPARAM(IntPtr value)
{
return new LPARAM(value);
}
public static implicit operator LPARAM(int value)
{
return new LPARAM(new IntPtr(value));
}
public static implicit operator int(LPARAM lParam)
{
return lParam.Value.ToInt32();
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
internal struct POINT
{
internal int X;
internal int Y;
public static implicit operator PointInt32(POINT point)
{
return new PointInt32(point.X, point.Y);
}
}
public enum MonitorFromWindowDwFlags
{
MONITOR_DEFAULTTONEAREST = 2,
}
}

View File

@@ -0,0 +1,123 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using ManagedCommon;
using Microsoft.PowerToys.Settings.UI.Library;
using Microsoft.PowerToys.Telemetry;
using Microsoft.UI.Dispatching;
using Microsoft.Windows.AppLifecycle;
using ShortcutGuide.Helpers;
using ShortcutGuide.Telemetry;
using Application = Microsoft.UI.Xaml.Application;
namespace ShortcutGuide
{
public sealed class Program
{
[STAThread]
public static void Main(string[] args)
{
Logger.InitializeLogger("\\ShortcutGuide\\Logs");
// The module interface passes: <powertoys_pid> [telemetry]
if (args.Length >= 2 && args[1] == "telemetry")
{
Logger.LogInfo("Telemetry mode requested. Sending settings telemetry.");
SendSettingsTelemetry();
return;
}
if (PowerToys.GPOWrapper.GPOWrapper.GetConfiguredShortcutGuideEnabledValue() == PowerToys.GPOWrapper.GpoRuleConfigured.Disabled)
{
Logger.LogWarning("Tried to start with a GPO policy setting the utility to always be disabled. Please contact your systems administrator.");
return;
}
Directory.CreateDirectory(ManifestInterpreter.PathOfManifestFiles);
if (NativeMethods.IsCurrentWindowExcludedFromShortcutGuide())
{
return;
}
// Copy every shipped manifest from the install directory to the per-user manifest folder.
// Enumerating the source folder avoids drift between the deployed assets and a hard-coded list.
// Todo: Only copy files after an update.
string sourceManifestFolder = Path.Combine(
Path.GetDirectoryName(Environment.ProcessPath)!,
"Assets",
"ShortcutGuide",
"Manifests");
try
{
foreach (string sourceFile in Directory.EnumerateFiles(sourceManifestFolder, "*.yml"))
{
string destinationFile = Path.Combine(ManifestInterpreter.PathOfManifestFiles, Path.GetFileName(sourceFile));
File.Copy(sourceFile, destinationFile, true);
}
}
catch (Exception ex)
{
Logger.LogError($"Failed to copy bundled shortcut manifests from '{sourceManifestFolder}'.", ex);
}
Process indexGeneration = Process.Start(Path.GetDirectoryName(Environment.ProcessPath) + "\\PowerToys.ShortcutGuide.IndexYmlGenerator.exe");
indexGeneration.WaitForExit();
if (indexGeneration.ExitCode != 0)
{
Logger.LogError($"Index generation failed with exit code {indexGeneration.ExitCode}. There may be a corrupt shortcuts file in \"{ManifestInterpreter.PathOfManifestFiles}\".");
return;
}
PowerToysShortcutsPopulator.Populate();
WinRT.ComWrappersSupport.InitializeComWrappers();
var instanceKey = AppInstance.FindOrRegisterForKey("PowerToys_ShortcutGuide_Instance");
if (instanceKey.IsCurrent)
{
Application.Start((p) =>
{
var context = new DispatcherQueueSynchronizationContext(DispatcherQueue.GetForCurrentThread());
SynchronizationContext.SetSynchronizationContext(context);
_ = new App();
});
}
else
{
Logger.LogWarning("Another instance of ShortcutGuide is running. Exiting ShortcutGuide");
}
// The WinRT/WinUI dispatcher thread doesn't terminate cleanly; force exit.
Environment.Exit(0);
}
private static void SendSettingsTelemetry()
{
try
{
var settingsUtils = SettingsUtils.Default;
var settings = settingsUtils.GetSettingsOrDefault<ShortcutGuideSettings>(ShortcutGuideSettings.ModuleName);
if (settings?.Properties != null)
{
var props = settings.Properties;
PowerToysTelemetry.Log.WriteEvent(new ShortcutGuideSettingsEvent(
props.OpenShortcutGuide?.ToString() ?? string.Empty,
props.Theme?.Value ?? "system",
props.DisabledApps?.Value ?? string.Empty));
}
}
catch (Exception ex)
{
Logger.LogError("Failed to send settings telemetry.", ex);
}
}
}
}

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