mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-07-09 20:09:28 +02:00
main
9396 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
18edd52239 |
Fix Peek Ctrl+W shortcut not working after clicking preview (#48293)
## Summary Fixes #48274 When previewing a file with Peek, clicking inside the preview content (PDF, text/code, markdown, HTML) makes **Ctrl+W unable to close the window**. This happens because the preview controls (WebView2 for most file types, native shell handlers for others) capture keyboard focus in their own message loop, bypassing the XAML keyboard accelerator system entirely. ## Problem Peek defines keyboard shortcuts (Ctrl+W to close, Escape to close, arrow keys to navigate) as `KeyboardAccelerator` elements on the main XAML Grid. These only fire when keyboard input flows through the XAML input system. However: - **WebView2** (used for PDF, text/code via Monaco, markdown, HTML): Runs Chromium in a separate process that consumes all keyboard input when focused. Ctrl+W is particularly problematic because Chromium treats it as "close tab." - **Shell Preview Handlers** (native HWND): Run in a child Win32 window that handles keyboard messages independently. Once either of these controls gets focus via a mouse click, keyboard shortcuts stop working. ## Solution Added a **low-level keyboard hook** (`WH_KEYBOARD_LL`) that intercepts key events at the OS level, regardless of which control has focus: - **Ctrl+W** and **Escape** → close the Peek window - **Arrow keys** (Left/Right/Up/Down without Ctrl) → navigate between files The hook is installed only while the Peek window is visible and only acts when Peek is the foreground window, so it has no impact on other applications. As additional defense-in-depth, `AreBrowserAcceleratorKeysEnabled` is set to `false` on the WebView2 control, preventing Chromium from consuming browser-specific shortcuts like Ctrl+W. ## Changes | File | Change | |------|--------| | `Peek.UI/PeekXAML/MainWindow.xaml.cs` | Install/uninstall keyboard hook in Initialize/Uninitialize; hook callback handles Ctrl+W, Escape, and arrow keys | | `Peek.UI/Native/NativeMethods.cs` | P/Invoke declarations for `SetWindowsHookEx`, `UnhookWindowsHookEx`, `CallNextHookEx`, `GetAsyncKeyState` | | `Peek.FilePreviewer/Controls/BrowserControl.xaml.cs` | Disable browser accelerator keys on WebView2 | ## Validation - [x] Ctrl+W closes Peek after clicking inside PDF preview - [x] Ctrl+W closes Peek after clicking inside text/code preview (Monaco) - [x] Escape closes Peek after clicking inside preview - [x] Arrow keys navigate between files after clicking inside preview - [x] Normal typing/interaction inside previews still works (Ctrl+C, scrolling, etc.) - [x] Shortcuts still work without clicking (existing behavior preserved) --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
3fd6a03ed4 |
Make PowerShell script invocation more reliable (#46729)
## Summary of the Pull Request - Protect against issues caused by loading PowerShell profile scripts - Ignore any warnings that may be generated by auto-loaded PowerShell modules. Warnings are written to stderr which the Exec then interprets as an error <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #46618 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [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 - [ ] **Localization:** All end-user-facing strings can be localized - [x] **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 build contains PowerShell invocations. The issue with these prior to this change is that they are vulnerable to what ever may be in the current user's PowerShell profile script. They are also vulnerable to any auto-loaded PowerShell modules that may generate warnings, as the warning output is interpreted as an error by the MSBuild `Exec` task. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed 1. Built successfully from command line and in Visual Studio 2. Tested locally and also tested MouseWithoutBorders against second machine. |
||
|
|
4881f23545 |
Add PR Needs-Author-Feedback lifecycle to fabricbot configuration (#49151)
## Summary Adds fabricbot rules to manage the `Needs-Author-Feedback` label lifecycle for **pull requests**, complementing the existing issue management rules in `resourceManagement.yml`. This is a **simpler alternative** to the GitHub Actions workflow approach (PR #48812), trading advanced features (draft conversion, author-specific activity tracking) for zero-maintenance fabricbot automation. ## Behavior ### Flow diagram ``` ┌──────────────────────────────────────────────────────────────────────┐ │ Maintainer adds "Needs-Author-Feedback" label to a PR │ └──────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ ┌──────────────────────────────────┐ │ 7 days, no activity │────►│ Add "Status-No recent activity" │ │ │ │ + post warning comment │ └─────────────────────────────────────┘ └──────────────────────────────────┘ │ │ ▼ ▼ ┌─────────────────────────────────────┐ ┌──────────────────────────────────┐ │ 7 more days (14 total), no activity│────►│ Close PR + post closing comment │ └─────────────────────────────────────┘ └──────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────────┐ │ Author pushes commits OR comments on PR (at any point) │ └──────────────────────────────────────────────────────────────────────┘ │ ▼ Remove "Needs-Author-Feedback" → Add "Needs-Triage" Remove "Status-No recent activity" (if present) ``` ### Scheduled searches (every 6 hours) | Condition | Action | |-----------|--------| | PR + `Needs-Author-Feedback` + 7 days inactive + no `Status-No recent activity` | Add `Status-No recent activity` label + warning comment | | PR + `Needs-Author-Feedback` + `Status-No recent activity` + 7 more days inactive | Post closing comment + close PR | ### Event responders | Trigger | Action | |---------|--------| | Author comments on PR (`Issue_Comment` + `issueAuthor`) | Remove `Needs-Author-Feedback`, add `Needs-Triage` + `Needs-Team-Response` | | Author pushes commits (`Pull_Request` + `Synchronize` + `issueAuthor`) | Remove `Needs-Author-Feedback`, add `Needs-Triage` | | Any PR update activity | Remove `Status-No recent activity` | ### Bot messages **Warning (at 7 days):** > This pull request has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **7 days**. It will be closed if no further activity occurs **within 7 days of this comment**. To keep this PR active, please push your changes or leave a comment. **Closing (at 14 days):** > This pull request has been automatically closed because it has been marked as requiring author feedback but has not had any activity for **14 days**. If you would like to continue working on this, please reopen the PR and push your changes. ## Comparison with GitHub Actions workflow (PR #48812) | Feature | This PR (fabricbot) | PR #48812 (Actions) | |---------|-------------------|-------------------| | Convert to draft at 7 days | ❌ Not supported | ✅ Via GraphQL | | Close at 14 days | ✅ | ✅ | | Author-specific activity tracking | ❌ Any activity resets timer | ✅ Only author activity counts | | Bot comment resets timer | ⚠️ Yes (fabricbot limitation) | ✅ No (filtered out) | | Maintenance burden | None (fabricbot managed) | Low (workflow file) | | Testing before merge | ❌ No local testing | ✅ `workflow_dispatch` + dry-run | | Review comment detection | ❌ Only issue comments | ✅ Reviews + inline comments | ## Trade-offs **Pros:** - Zero maintenance — fabricbot is a managed service - Consistent with existing issue management patterns in the same file - No workflow YAML to debug or maintain **Cons:** - No draft conversion (fabricbot cannot call GraphQL) - `noActivitySince` counts **all** activity — bot comments, maintainer comments, and label changes all reset the inactivity timer - Cannot distinguish author activity from other activity - No way to test locally or with dry-run before merge ## Relationship to existing automation Mirrors the existing issue rules (lines 11-43) which use the same pattern: - Issues: 5 days → warning, 5 more days → close - PRs (this change): 7 days → warning, 7 more days → close Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
85f698677a |
[UITests] AI migration skill + ScreenRuler tests example port. (#48842)
This PR is build on top of https://github.com/microsoft/PowerToys/pull/48717 and https://github.com/microsoft/PowerToys/pull/48467 It adds the ui-tests-migration skill which should be used to migrate the old UITest module by module to use new .Next UI framework. As an example, the screen ruller tests was ported here. --------- Co-authored-by: Boliang Zhang (from Dev Box) <bozhang@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
4395b1d0ca |
[skill] Generalize verification skill into 2 scenarios (module checklist / PR validation) (#48848)
## Summary of the Pull Request Generalizes the `powertoys-verification` agent skill from "one module checklist" into a **single shared engine that serves two verification scenarios**, using the *shared engine + per-scenario reference docs* design (no duplication of the winapp mechanics): - **A — Module checklist**: verify a supplied module checklist against the installed build. - **B — PR validation**: derive each PR's checklist from its description + diff, then drive it. A single **bits sub-decision** picks the target — drive the **installed** build when the PR's code is already shipped (a merged PR, or a whole release/hotfix set, e.g. the 0.100.1 14-PR sign-off), or **build + sideload** the affected module when it isn't (an unmerged or not-yet-released PR, e.g. #45242). Both scenarios share the same `winapp ui` drive techniques, helper scripts, per-module profiles, taxonomy, and report format. They differ mainly on **what bits you run**, so the only new content is a thin scenario layer. ## PR Checklist - [ ] **Closes:** N/A (follow-up to the merged `powertoys-verification` skill) - [x] **Communication:** design discussed and agreed before implementation - [x] **Tests:** N/A — docs/skill-only change; validated link/constraint checks (see below) - [x] **Localization:** N/A - [x] **Dev docs:** this PR *is* skill documentation - [x] **New binaries:** none ## Detailed Description of the Pull Request / Additional comments **`SKILL.md` (shared engine)** — broaden `description` + "When to use" to cover both scenarios, add a **Step-0 scenario router** (plus, for B, the bits sub-decision "is the PR's code in the build under test?"), keep the supplied-checklist read **Scenario-A-only**, and make the bootstrap/placeholders/"What NOT to do" scenario-aware. **`references/scenarios/`:** - `index.md` — router table (A/B); the **"bits under test" contract** (the one real conflict: installed-and-immutable, vs build-and-sideload when the PR's code isn't in the build, echoed in the report header so the evidence chain is trustworthy); and a verdict-vocabulary mapping (engine `PASS/FAIL/BLOCKED` <-> legacy labels). - `module-checklist.md` (A) — supplied checklist, installed bits. - `pr-validation.md` (B, **new — merges the former release-PR and active-PR docs**) — derive each PR's checklist from `gh pr view/diff`; the **bits sub-decision**; a **PR-discovery model with a size gate** (auto-verify hotfix-sized sets <=25; for full ~100-PR releases, scope-and-confirm instead of blind-looping) and a non-runtime-PR pre-filter; per-PR folders + roll-up; and the **build + sideload** front-end (in-repo worktree helper + build commands), unpackaged (run the built runner, dismiss the expected partial-build dialogs) vs packaged/CmdPal (`Add-AppxPackage -Register`) deploy recipes, prove-your-bits, and restore-to-shipped cleanup. Removed the separate `release-pr-signoff.md` and `active-pr-validation.md` (folded into `pr-validation.md`). The existing engine docs (`winapp-ui-testing.md`, `pre-flight.md`, `reporting-format.md`), per-module profiles, and helper scripts are reused unchanged — single source of truth. The `BITS:` header version is a `<version>` placeholder (not pinned to a release). ## Validation Steps Performed - `SKILL.md` within authoring limits: **331 lines** (< 500) and **description 999 chars** (< 1024). - All relative markdown links in `references/scenarios/*.md` resolve, and every engine doc they cite exists. - Scenario B exercised end-to-end both ways: the 0.100.1 14-PR sign-off (8 PASS / 6 BLOCKED, installed bits) and PR #45242 (Advanced Paste, 3/3 PASS, build + sideload). --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
6b5c21000f |
Align ZoomIt dialog controls (#49210)
<!-- 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 change deals with ZoomIt standalone texts. <!-- 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 |
||
|
|
99d01dc37b |
CmdPal: Fix "Open Command Palette" dock item (#49095)
## Summary of the Pull Request This PR fixes the "Open Command Palette" dock item. Dock only opens Command Palette for page commands (see DockControl.InvokeItem). The recent dock home change introduced `GoHomeDockCommand` as an invokable command, so the Palette no longer opened from the dock item. - Restores dock home to use the shared root page. - Adds a deferred root page accessor to avoid DI cycles. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #49089 <!-- - [ ] 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 |
||
|
|
f740d0b3e5 |
Build(deps): Bump actions/dependency-review-action from 4 to 5 (#47907)
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4 to 5. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/dependency-review-action/releases">actions/dependency-review-action's releases</a>.</em></p> <blockquote> <h2>5.0.0</h2> <p>This is a new major version of the Dependency Review Action which updates the runtime to node24. This requires a minimum Actions Runner version <a href="https://github.com/actions/runner/releases/tag/v2.327.1">v2.327.1</a> to run.</p> <h2>What's Changed</h2> <ul> <li>Add .github/copilot-instructions.md for Copilot coding agent by <a href="https://github.com/ahpook"><code>@ahpook</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1067">actions/dependency-review-action#1067</a></li> <li>Update Node.js runtime from 20 to 24 by <a href="https://github.com/scottschreckengaust"><code>@scottschreckengaust</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1084">actions/dependency-review-action#1084</a></li> <li>Bump spdx-license-ids from 3.0.20 to 3.0.23 by <a href="https://github.com/mongolyy"><code>@mongolyy</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1091">actions/dependency-review-action#1091</a></li> <li>docs: bump actions/checkout from v4 to v6 in workflow examples by <a href="https://github.com/Marukome0743"><code>@Marukome0743</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1077">actions/dependency-review-action#1077</a></li> <li>fix: patched version display for advisories with non-strict semver ranges (e.g. Maven beta versions) by <a href="https://github.com/tspascoal"><code>@tspascoal</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1076">actions/dependency-review-action#1076</a></li> <li>Resolve security findings by <a href="https://github.com/AshelyTC"><code>@AshelyTC</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1094">actions/dependency-review-action#1094</a></li> <li>v5.0.0 release branch by <a href="https://github.com/ahpook"><code>@ahpook</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1098">actions/dependency-review-action#1098</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/scottschreckengaust"><code>@scottschreckengaust</code></a> made their first contribution in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1084">actions/dependency-review-action#1084</a></li> <li><a href="https://github.com/mongolyy"><code>@mongolyy</code></a> made their first contribution in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1091">actions/dependency-review-action#1091</a></li> <li><a href="https://github.com/Marukome0743"><code>@Marukome0743</code></a> made their first contribution in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1077">actions/dependency-review-action#1077</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/dependency-review-action/compare/v4.9.0...v5.0.0">https://github.com/actions/dependency-review-action/compare/v4.9.0...v5.0.0</a></p> <h2>Dependency Review Action 4.9.0</h2> <p>This feature release contains a couple of notable changes:</p> <ul> <li>There is a new configuration option <code>show_patched_versions</code> which will add a column to the output, showing the fix version of each vulnerable dependency. Thanks <a href="https://github.com/felickz"><code>@felickz</code></a>!</li> <li>Runs which do not display OpenSSF scorecards no longer fetch scorecard information; previously it was fetched regardless of whether or not it was displayed, causing unneccessary slowness. Great catch <a href="https://github.com/jantiebot"><code>@jantiebot</code></a>!</li> <li>There are a couple of fixes to purl parsing which should improve match accuracy for <code>allow-package-dependency</code> lists, including case (in)sensitivity and url-encoded namespaces Thanks <a href="https://github.com/juxtin"><code>@juxtin</code></a>!</li> </ul> <h2>What's Changed</h2> <ul> <li>Compare normalized purls to account for encoding quirks by <a href="https://github.com/juxtin"><code>@juxtin</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1056">actions/dependency-review-action#1056</a></li> <li>Make purl comparisons case insensitive by <a href="https://github.com/juxtin"><code>@juxtin</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1057">actions/dependency-review-action#1057</a></li> <li>Feat: Add <code>Patched Version</code> to <code>Vulnerabilities</code> summary by <a href="https://github.com/felickz"><code>@felickz</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1045">actions/dependency-review-action#1045</a></li> <li>fix: only get scorecard levels if user wants to see the OpenSSF scorecard by <a href="https://github.com/jantiebot"><code>@jantiebot</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1060">actions/dependency-review-action#1060</a></li> <li>Bump actions/stale from 10.1.0 to 10.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1058">actions/dependency-review-action#1058</a></li> <li>Bump actions/checkout from 4 to 6 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1021">actions/dependency-review-action#1021</a></li> <li>Updates for release 4.9.0 by <a href="https://github.com/ahpook"><code>@ahpook</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1064">actions/dependency-review-action#1064</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/jantiebot"><code>@jantiebot</code></a> made their first contribution in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1060">actions/dependency-review-action#1060</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/dependency-review-action/compare/v4.8.3...v4.9.0">https://github.com/actions/dependency-review-action/compare/v4.8.3...v4.9.0</a></p> <h2>4.8.3</h2> <h2>Dependency Review Action v4.8.3</h2> <p>This is a bugfix release that updates a number of upstream dependencies and includes a fix for the earlier feature that detected oversized summaries and upload them as artifacts, which could occasionally crash the action.</p> <p>We have also updated the release process to use a long-lived <code>v4</code> <strong>branch</strong> for the action, instead of a force-pushed tag, which aligns better with git branching strategies; the change should be transparent to end users.</p> <h2>What's Changed</h2> <ul> <li>GitHub Actions can't push to our protected main by <a href="https://github.com/dangoor"><code>@dangoor</code></a> in <a href="https://redirect.github.com/actions/dependency-review-action/pull/1017">actions/dependency-review-action#1017</a></li> <li>Bump actions/stale from 9.1.0 to 10.1.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/dependency-review-action/pull/995">actions/dependency-review-action#995</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
dd21dc976f |
Quick Accent: Renormalize CharacterMappings.cs line endings (#49203)
The Belarusian Cyrillic block had a stray line-ending inconsistency in the committed blob that violated the file's .gitattributes (text, eol=crlf). This caused git to report the file as perpetually modified since clean(blob) != blob, so it could never be restored to a clean working tree. <!-- 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 |
||
|
|
bd025098c6 |
Move wiki triage queries into the repo (#48744)
Consolidates the **Triage-queries** and **Common-Triage-Issue** wiki pages into a single \doc/devdocs/triage-queries.md\ file so the content lives in the repository instead of the wiki. - Merged both pages into one document - Dropped empty sections (Advanced Paste, New+, Workspaces) - Minor formatting cleanup --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
15cb76f9b8 |
Fix dev setup .vsconfig component IDs for Visual Studio 2026 (#48824)
## Summary Fixes #48778 — the automated developer setup (`winget configure .config\configuration.winget`) provisions **Visual Studio 2026** but feeds it a `.vsconfig` containing **Visual Studio 2022-era component IDs** that were renamed or removed in VS 2026. The `VSComponents` DSC resource silently skips the invalid IDs, so the **Windows 11 SDK (26100)** and **WindowsAppSDK C# support** never install — breaking the build with cppwinrt (exit code 3) and WindowsAppSDK target failures, exactly as reported. ## Root cause PR #45534 bumped `.config/configuration.winget` from VS 2022 → VS 2026 (`Microsoft.VisualStudio.Community`, `channelId: VisualStudio.18.Release`) but left `.vsconfig` untouched. Five component IDs in `.vsconfig` are invalid in the VS 2026 (Dev18) catalog: | `.vsconfig` (old, VS 2022) | VS 2026 reality | |---|---| | `Component.Windows10SDK.22621` | renamed → `Component.Windows11SDK.22621` | | `Component.Windows10SDK.26100` | renamed → `Component.Windows11SDK.26100` (the build's target SDK) | | `ComponentGroup.WindowsAppSDK.Cs` | renamed → `WindowsAppSdkSupport.CSharp` | | `Component.Windows10SDK.19041` | removed from VS 2026 (only a `WindowsTargetPlatformMinVersion` floor — never a real install requirement) | | `Component.Windows10SDK.20348` | removed from VS 2026 (not referenced by the build) | A single `.vsconfig` is the source of truth for all three winget variants (`configuration.winget`, `configuration.vsProfessional.winget`, `configuration.vsEnterprise.winget`), which reference it via `${WinGetConfigRoot}\..\.vsconfig`, so this one edit fixes every automated path. ## Changes - `Windows10SDK.22621/26100` → `Windows11SDK.22621/26100` - `ComponentGroup.WindowsAppSDK.Cs` → `WindowsAppSdkSupport.CSharp`, and added `WindowsAppSdkSupport.Cpp` (PowerToys' C++/WinRT projects need it) - Removed `Windows10SDK.19041` and `Windows10SDK.20348` - `doc/devdocs/readme.md`: corrected the `10.0.22621.0` SDK label from "Windows 10 SDK" to "Windows 11 SDK" ## Validation - All 18 resulting component IDs validated against a live VS 2026 (18.7.0) installation via `vswhere -include packages` — all present/valid. - `.vsconfig` parses as valid JSON. - Build target requirements confirmed from `Cpp.Build.props` (`WindowsTargetPlatformVersion = 10.0.26100.0`, min `10.0.19041.0`) and `Common.Dotnet.CsWinRT.props`. ## Notes The docs still list "VS 2022 17.4+" as an alternative; this `.vsconfig` is aligned to the recommended/automated VS 2026 path. The VS Installer treats any unrecognized component IDs in `.vsconfig` gracefully (shown as unavailable, non-blocking) for VS 2022 users. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
b3a3c132da |
Add Shortcut Guide manifest for ON1 Photo RAW (#49143)
Adds a Shortcut Guide keyboard shortcut manifest for ON1 Photo RAW. ON1 Photo RAW has no WinGet package, so the manifest uses the `+` prefix convention. ## Summary of the Pull Request New manifest file `+ON1.PhotoRAW.en-US.yml` targeting `ON1PhotoRAW.exe` with 71 shortcuts across 9 sections: - **Module navigation** — Browse (G), Develop (D), Effects (S), Portrait (I), Local Adjustments (A), Resize (Y) - **File operations** — Undo, Redo, Quick export, Print, Quit - **Image navigation** — Zoom in/out, Fit to screen, 100% zoom, Pan - **View** — Grid/Photo/Filmstrip/Compare views, panel toggles, split-screen compare, original view toggle - **Browse module** — Folder browsing, selection, ratings (1–5), like/dislike flags, delete - **Editing settings** — Rotate, reset/copy/paste/sync settings, create version - **Tools** — Crop, Adjustment brush, Adjustable gradient, Perfect Eraser, Retouch, Clone stamp, Masking brush, Gradient mask, Refine mask, Zoom/Pan, Move/Transform, Text - **Brush adjustments** — Size, feather, opacity controls; Perfect Brush toggle; paint-in/out - **Masking** — Invert mask, show/hide mask, show clipping ## PR Checklist - [ ] Closes: #xxx - [ ] **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 ON1 Photo RAW has no WinGet package entry, so the manifest ID is prefixed with `+` per the [keyboard shortcuts schema spec](doc/specs/WinGet%20Manifest%20Keyboard%20Shortcuts%20schema.md). The executable name `ON1PhotoRAW.exe` is consistent across yearly releases (the installation folder changes per year, but the binary name does not). Shortcut data sourced from the [official ON1 keyboard shortcuts reference](https://www.on1.com/bookshelf/photo-raw-keyboard-shortcuts/). ## Validation Steps Performed - YAML parsed successfully with Python `yaml.safe_load` - Structure verified against existing manifests (same field names, casing conventions, key notation) --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
13835c1931 |
[Deps] Update .NET packages from 10.0.8 to 10.0.9 (#48568)
<!-- 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 Updates `Directory.Packages.props` to align several Microsoft and System package references from `10.0.8` to `10.0.9`. <!-- 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 - [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 Bumped dependency versions for the following packages: - `Microsoft.Data.Sqlite` - `Microsoft.Bcl.AsyncInterfaces` - `Microsoft.Extensions.Caching.Abstractions` - `Microsoft.Extensions.Caching.Memory` - `Microsoft.Extensions.DependencyInjection` - `Microsoft.Extensions.Logging` - `Microsoft.Extensions.Logging.Abstractions` - `Microsoft.Extensions.Hosting` - `Microsoft.Extensions.Hosting.WindowsServices` - `Microsoft.Win32.SystemEvents` - `Microsoft.Windows.Compatibility` - `System.CodeDom` - `System.ComponentModel.Composition` - `System.Configuration.ConfigurationManager` - `System.Data.OleDb` - `System.Diagnostics.EventLog` - `System.Diagnostics.PerformanceCounter` - `System.Drawing.Common` - `System.Management` - `System.Runtime.Caching` - `System.ServiceProcess.ServiceController` - `System.Text.Encoding.CodePages` - `System.Text.Json` <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed - Verified the version-only dependency update in `Directory.Packages.props` |
||
|
|
889860ec49 |
fix: Peek.UI persists as a media player after closed & redundant SMTC… (#46899)
… control for audio preview <!-- 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 [Peek] Fix https://github.com/microsoft/PowerToys/issues/26755 and remove redundant SMTC control for audio preview. 1. If it is not a media file, the Hardware Media Key UI will not be displayed. 2. When navigating between files using the arrow keys, only media files display the Hardware Media Key UI. 3. After the Peek window is closed, the Hardware Media Key UI disappears. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #26755 <!-- - [ ] 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 - [x] **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 Manually verified: When peeking at media and non-media files, navigating between different types of files using the arrow keys, and closing the Peek window, the Hardware Media Key UI all works as expected. Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com> |
||
|
|
7306acdc3b |
CmdPal: compact is supposed to be off by default (#49186)
Title. It should be off by default. Oops. |
||
|
|
74e6c3ad79 |
[UITests] New framework around WinApp CLI, no WinAppDriver or Selenium. (#48467)
# Add winappcli-based UI test harness (no WinAppDriver / Selenium) ## Summary Introduces a new UI test harness — `Microsoft.PowerToys.UITest.Next` — that drives PowerToys modules through Microsoft's [winappcli](https://github.com/microsoft/WinAppCli) (UI Automation CLI) instead of WinAppDriver + Selenium. Engine is a single executable shelled out from C#; no third-party NuGet packages, no driver process, no Appium server. Adds two real consumers: a full ColorPicker end-to-end scenario and a Settings shell navigation smoke test. This is opt-in and additive — the existing `UITestAutomation` library and the WinAppDriver-based test projects are untouched. Both can coexist while we evaluate the new harness. Inspired in part by [#48414](https://github.com/microsoft/PowerToys/pull/48414), which lands the same architectural bet (winappcli, AutomationId selectors, no WinAppDriver) at a smaller scope. This PR generalizes it into a reusable library. ## Why WinAppDriver + Selenium is a legacy pre-agentic solution that is no longer actively maintained. It's unreliable, heavyweight, and slow. To achieve 100% UI test coverage, we should leverage modern, reliable solutions, and WinApp CLI is a strong candidate. ## What's in this PR ### Harness library — [`src/common/UITestAutomation.Next/`](src/common/UITestAutomation.Next/) | File | Purpose | |---|---| | [`WinappCli.cs`](src/common/UITestAutomation.Next/WinappCli.cs) | Process wrapper around `winapp.exe`. `Invoke` / `InvokeAssertSuccess` / `InvokeJson` / `IsAvailable` / `TryResolveExecutable`. `Result` carries the args and emits `DescribeFailure()` like `winapp ui invoke X -w 12345 -> exit 1; stderr: ...` | | [`Session.cs`](src/common/UITestAutomation.Next/Session.cs) | Test session, scoped by either HWND (`-w`) or process (`-a`) via `TargetScope`. `Find<T>` / `FindAll<T>` / `Inspect` / `Screenshot` / `SendKeys`. `Session.FromProcess(...)` factory for the single-window-per-process case | | [`SessionHelper.cs`](src/common/UITestAutomation.Next/SessionHelper.cs) | Owns the launch + window-readiness flow. Static `EnsureRunning(scope, timeout)` returns whether the call had to launch (so cleanup only kills what we started). Uses `UseShellExecute=true` so child handles don't keep MSTest hanging | | [`UITestBase.cs`](src/common/UITestAutomation.Next/UITestBase.cs) | MSTest base class. Pre-flights `WinappCli.IsAvailable()` once per process and fails fast with the install hint if `winapp.exe` isn't on PATH | | [`Element/*.cs`](src/common/UITestAutomation.Next/Element/) | `Element`, `Button`, `ToggleSwitch`, `TextBox`, `NavigationViewItem`, `Window`. `Click` / `MouseClick` / `Focus` / `GetProperty` / `GetValue` / `HelpText` / `WaitForProperty` / `WaitForGone` plus coords (`X`/`Y`/`Width`/`Height`) | | [`By.cs`](src/common/UITestAutomation.Next/By.cs) | `By.Name` / `By.AccessibilityId` / `By.Id` / `By.Slug` | | [`Windows.cs`](src/common/UITestAutomation.Next/Windows.cs) | `WindowsFinder.ListAll` / `ListByApp` / `WaitForWindowByApp` / `WaitForWindowByProcess`. Notes the winappcli bug where unfiltered `list-windows` drops untitled windows | | [`WindowControl.cs`](src/common/UITestAutomation.Next/WindowControl.cs) | Tolerant Win32 helpers — `TryCloseByApp` / `TryFocusByApp` / `SafeCloseAndFocus` / `TryKillProcess` — for `finally` blocks | | [`KeyboardHelper.cs`](src/common/UITestAutomation.Next/KeyboardHelper.cs) | Hybrid `keybd_event` + `SendKeys.SendWait` chord sender — required for global PowerToys hotkeys | | [`MouseHelper.cs`](src/common/UITestAutomation.Next/MouseHelper.cs) | `MoveTo` / `LeftClick` / `RightClick` / `LeftClickAt` Win32 wrappers | | [`ClipboardHelper.cs`](src/common/UITestAutomation.Next/ClipboardHelper.cs) | STA-thread `Clipboard` access with `WaitForText` | | [`ModuleConfigData.cs`](src/common/UITestAutomation.Next/ModuleConfigData.cs) | `PowerToysModule` enum + path/process-name resolution | ### Tests **[`src/modules/colorPicker/ColorPicker.UITests/`](src/modules/colorPicker/ColorPicker.UITests/)** — replaces the previous empty `UITest-ColorPicker` stub. One test, [`ColorPickerEndToEndTests.NavigateReadShortcutActivateAndCapture`](src/modules/colorPicker/ColorPicker.UITests/ColorPickerEndToEndTests.cs), drives the full E2E: 1. Navigate to the Color Picker page via the dashboard utilities stack 2. Toggle the module OFF, verify `PowerToys.ColorPickerUI` exits; toggle ON, verify it respawns 3. Read the activation shortcut from the page's `ShortcutControl` (`EditButton.HelpText`) 4. Clear clipboard, park cursor, send the chord 5. Wait for the picker overlay window 6. Read the displayed HEX from a hidden XAML automation peer (see below) 7. Left-click to capture; assert the clipboard value matches the peer's HEX 8. Wait for the editor window and assert the captured color appears in its tree **[`src/settings-ui/Settings.UITests/`](src/settings-ui/Settings.UITests/)** — `SettingsNavigationSmokeTests.NavigationItem_NavigatesWithoutCrashing` is one `[TestMethod]` parameterized with `[DynamicData]`, producing 31 discrete results — one per `NavigationViewItem` in [`ShellPage.xaml`](src/settings-ui/Settings.UI/SettingsXAML/Views/ShellPage.xaml). For each item: navigate, settle 250ms, assert `PowerToys.Settings` is still alive. Catches FailFast regressions in `ShellViewModel.Frame_NavigationFailed` that pure-logic unit tests can't reach (the failure path needs a `NavigationFailedEventArgs` which is a sealed WinRT projection). ### Product change **[`src/modules/colorPicker/ColorPickerUI/Views/MainView.xaml`](src/modules/colorPicker/ColorPickerUI/Views/MainView.xaml)** — adds a hidden `TextBlock` automation peer: ```xml <TextBlock x:Name="ColorHexAutomationPeer" AutomationProperties.AutomationId="ColorHexAutomationPeer" IsHitTestVisible="False" Opacity="0" Text="{Binding ColorText}" /> ``` The visible `ColorTextBlock` has `AutomationProperties.Name="{Binding ColorName}"`, which masks the HEX value in the UIA tree (you see "White" instead of `#FFFFFF`). This zero-impact peer mirrors `ColorText` so tests can read the actually-displayed HEX. `Opacity=0` + `IsHitTestVisible=False` keep it out of the visual layout and out of accessibility focus. ### Project wiring - [`PowerToys.slnx`](PowerToys.slnx) — registers `UITestAutomation.Next` under `/common/`, `ColorPicker.UITests` under `/modules/colorpicker/Tests/`, and `Settings.UITests` under `/settings-ui/Tests/`. Original `UITest-ColorPicker` stub csproj removed. - [`.github/actions/spell-check/expect.txt`](.github/actions/spell-check/expect.txt) — adds `winapp` / `winappcli`. ### Not in this PR - No pipeline changes. `winapp.exe` is expected to be pre-staged on the test agent image. If it's missing, `UITestBase` fails the first test with the install hint (`winget install Microsoft.winappcli`) rather than producing 30 opaque per-test errors. - No changes to the legacy `UITestAutomation` library or any of the existing `*.UITests` projects. ## Validation - All three projects build clean on `x64|Debug` (empty `build.<config>.<plat>.errors.log`): - `src/common/UITestAutomation.Next/` - `src/modules/colorPicker/ColorPicker.UITests/` - `src/settings-ui/Settings.UITests/` - Both tests run in Test Explorer / `dotnet test` via Microsoft.Testing.Platform (already enabled repo-wide in `Directory.Build.props`). - Local runs: ColorPicker E2E green; Settings smoke green across all 31 nav items. - `winapp 0.3.2` from `winget install Microsoft.winappcli`. ## Notes for reviewers - **`UseShellExecute = true`** in `SessionHelper.EnsureRunning` is intentional — `false` makes child processes inherit the test host's stdin/stdout/stderr handles, which keeps MTP/Test Explorer marking the run as "in progress" until the spawned PowerToys exits. - **Process-scope (`-a`) targeting** in the Settings smoke test handles single-instance handoff: the EXE you launch may exit with code 0 immediately after signalling an existing owner, so the alive check uses `Process.GetProcessesByName` rather than the launcher PID. - **AutomationId-only selectors** in the Settings smoke list keep the test localization-independent. Parent groups have `SelectsOnInvoked="False"` and only expand on click — `Element.Click` tries `InvokePattern → TogglePattern → SelectionItemPattern → ExpandCollapsePattern` so the same call works for both leaves and groups. - **Untitled-window discovery**: filtered `winapp ui list-windows -a <name>` returns windows that the unfiltered call drops (e.g. ColorPicker editor). `WindowsFinder.ListByApp` uses the filtered form. Reported upstream. ## Before Merge - Add the `winappcli` install step to the UI-test pipeline. |
||
|
|
f5c6f50e30 |
[Quick Accent] Add Belarusian Latin and Belarusian Cyrillic character sets (#48344)
<!-- 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 adds support for Łacinka (Belarusian Latin) and Belarusian Cyrillic character sets to Quick Accent. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #36571 <!-- - [ ] 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 - [x] **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 is a standard character set addition, with new entries in the Language enum, the sets themselves added to CharacterMappings.All and new resource strings for the user-facing names in the Settings page. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed (Manual tests.) - Confirmed that the new character set entries were present in the Quick Accent settings page list. - Tested that each of the characters in both the sets could be selected and typed. |
||
|
|
3ab6e182f8 |
CmdPal: fix the HWND frame on compact mode (#49184)
Admittedly, LLM discovered fix here. The window frame for compact mode in cmdpal is very very wackadoodle. User32 is dark and full of terrors, especially when we're trying to both keep the original resize handles but also make them hidden from view. TIL about [`RedrawWindow`](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-redrawwindow), which if you slather that about, helps make sure that the window frame is correctly repainted by DWM as transparent. The repro for this before was easy to see with a debug build with the debugger attached: * open cmdpal * make sure the frame is gone and the cmdpal window is focused * click on another window * PRESTO, window frame is back by adding more RedrawWindow calls, we can make sure that our frame is correctly erased even when DWM wants to put it back. Closes: oh no one filed this? |
||
|
|
c1ef511697 |
CmdPal: Add keyboard shortcuts to manually expand compact mode palette (#49177)
## Summary of the Pull Request This PR adds support for new keyboard shortcuts to expand CmdPal when in Compact mode. Both of them are "natural" - Down arrow key - Tab key <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #49112 <!-- - [ ] 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 |
||
|
|
188f6a58a8 |
CmdPal: Stop item action being executed when CmdPal is compact and collapsed (#49182)
## Summary of the Pull Request This PR prevents Command Palette in collapsed compact mode executing actions on a selected item. Since user is not aware what item is selected or what action are |
||
|
|
9449ae3686 |
Fix dock clock: show seconds, fix stale display, a11y (#48253)
Fixes the Command Palette Dock clock/date extension which showed time ~1 minute late and did not display seconds (unlike the taskbar clock). The problem was that `timeExtended` was hardcoded `false` in `NowDockBand.UpdateText()`. Fixed that by passing `true` to `TimeAndDateHelper.GetStringFormat()`, selecting the `"T"` (long time) format which includes seconds. Also, changed from using `PropertyChanged` on `Title` to using `RaiseItemsChanged` to mimic the behavior used for updating in the Performance Monitor extension. Fixes #46192 --------- Co-authored-by: root <root@io.bbq> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Hawk <hawk@example.com> |
||
|
|
a32c75928b |
CmdPal: Avoid unnecessary handler runs on settings changes (part 1) (#49171)
## Summary of the Pull Request This PR stops Command Palette subscribers from re-running their full hot-reload path on every SettingsChanged event. Previously any settings edit re-registered hotkeys, rebuilt the backdrop, and tore down/recreated dock windows even when nothing the subscriber consumed had changed. - `MainWindow`: added `MainWindowSettingsComparer `(IEqualityComparer<SettingsModel>); skips HotReloadSettings unless a consumed setting changed. - `DockWindowManager`: OnSettingsChanged bails unless EnableDock/DockSettings changed; monitor-topology path still always syncs. - `DockWindow `/ `DockViewModel`: guard reloads with _settings == args.DockSettings. - `DockSettings `/ `DockMonitorConfig`: list backing fields now use a new EquatableList<T> wrapper, giving record equality content-based (not reference-based) list comparison so guards hold after a reload rebuilds the lists. - Tests: EquatableListTests and DockSettingsEqualityTests cover the wrapper and structural DockSettings equality. - Public API and persisted JSON contract unchanged (EquatableList<T> is backing-field only; properties still expose ImmutableList<T>). <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #49168 - [ ] <!-- - [ ] 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 |
||
|
|
c7e53c6ad9 |
CmdPal: Fix issues related to deferred loading of pages in Compact mode (#49165)
## Summary of the Pull Request This PR fixes a navigation issue in Compact mode. When Compact mode is enabled, the frame might not always load the page right away, so the attached behavior does not trigger. - Search box visibility update - Search box visibility is now reliably re-evaluated when navigating to the home page. Until now, it was handled in the `Loaded` event handler, but since that is deferred in Compact mode, it was not evaluated in time and blocked the app. - A11Y announcements after navigation - Navigation announcements are now more consistent and reliable. As in the previous point, the announcement was previously triggered by the `Loaded` event. - Adds a note mentioning FocusState.Keyboard to Narrator annoucements. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #49116 <!-- - [ ] 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 |
||
|
|
52df5882a3 |
CmdPal: For each single-metric band, add a matching band in softdisabled state (#49162)
## Summary of the Pull Request This PR updates Performance Monitor safe mode to add a placeholder page for each Dock band that is available in normal mode. This way, when Performance Monitor is soft-disabled, the user still sees the Dock band and is informed that it is disabled. This PR does not fix the missing battery Dock band, since that should be moved to a separate extension soon(TM). ## Pictures? Pictures! <img width="1022" height="134" alt="image" src="https://github.com/user-attachments/assets/12bd33e6-041f-4f36-ad22-ed8287f19a3e" /> <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Related to: #49159 - [ ] 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 |
||
|
|
0790674ddf |
CmdPal: Subscribe DetailsViewModel to PropChanged for live pane updates (#48070)
## Summary Fixes #47745 — the details pane now updates live when an extension modifies its `IDetails` properties (Title, Body, HeroImage, Metadata) after initial display. ## Changes ### `DetailsViewModel.cs` - Subscribe to `INotifyPropChanged` at construction (runtime check, since `IDetails` doesn't require it) - `Model_PropChanged` → `FetchProperty` with switch on Title, Body, HeroImage, Metadata - `RebuildMetadata` rebuilds the metadata list from the model - `UnsafeCleanup` unsubscribes from PropChanged ### `ListItemViewModel.cs` - Call `Details?.SafeCleanup()` before replacing the DetailsViewModel in `FetchProperty("Details")`, ensuring the old subscription is cleaned up. ### `DetailsViewModelTests.cs` (new) - 6 unit tests covering PropChanged subscription, property updates, metadata rebuild, cleanup/unsubscribe, and non-observable IDetails handling. --------- Co-authored-by: root <root@io.bbq> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
fb656bf040 |
Add Launchy to third-party Run plugins (#49080)
## Summary of the Pull Request Adds Launchy to the third-party PowerToys Run plugins list. Launchy is a community PowerToys Run plugin that indexes and launches files from user-configured folders with per-folder extension, recursion depth, and folder inclusion rules. ## PR Checklist - [ ] Closes: #xxx - [ ] **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 - [x] **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 This updates the existing third-party PowerToys Run plugins list with a link to the Launchy plugin repository. No product code is changed. ## Validation Steps Performed - Verified the Launchy repository is public. - Verified the plugin README includes installation, usage, settings, screenshots, and release assets. - Verified this PR only changes doc/thirdPartyRunPlugins.md. --------- Co-authored-by: PsychodelEKS <konstantin.efremov@clickio.com> |
||
|
|
b329b3f243 |
Shortcut Guide: Add keyboard shortcut manifest for new Outlook (olk.exe) (#48821)
## Summary of the Pull Request Shortcut Guide had no manifest for the new Outlook for Windows app, so it showed no shortcuts when `olk.exe` was the foreground process. Adds a new YAML manifest (`Microsoft.OutlookForWindows.en-US.yml`) with `WindowFilter: "olk.exe"` covering email, navigation, text editing, formatting, and calendar shortcuts. ## PR Checklist - [ ] Closes: #48798 - [ ] **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 New file: `src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Manifests/Microsoft.OutlookForWindows.en-US.yml` - **PackageName:** `Microsoft.OutlookForWindows` (WinGet package ID) - **WindowFilter:** `olk.exe` — process name for the new Outlook app (distinct from classic `outlook.exe`) - **Display name:** `Outlook (new)` - **Shortcut categories:** Frequently used · Navigate Outlook · Text editing · Format text · Calendar The `.csproj` already globs `Assets\ShortcutGuide\Manifests\*.yml`, so no project file changes are needed. ## Validation Steps Performed - Verified the YAML structure matches existing manifests (e.g., `Microsoft.Outlook.en-US.yml`). - Confirmed `olk.exe` is the correct process name for new Outlook for Windows. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
b6f0a7ae91 |
Add Shortcut Guide manifest for the Godot editor (#48959)
## Summary of the Pull Request
Adds bundled Shortcut Guide support for the Godot editor so Godot
shortcuts can appear when `Godot.exe` is the active app.
- **Shortcut Guide manifest**
- Added `+Godot.Godot.en-US.yml` under the bundled Shortcut Guide
manifests
- Uses the no-WinGet-package Godot editor identity expected by Shortcut
Guide:
```yml
PackageName: +Godot.Godot
WindowFilter: "Godot.exe"
```
- **Shortcut coverage**
- Includes the reporter-provided Godot editor mappings across core
editor workflows, panels, 2D/3D editors, text editor, and project
manager
- **Schema compliance**
- Uses spec-compliant bracketed literal digit tokens such as `"<0>"`
- Uses spec-compliant bracketed special key tokens such as `"<Tab>"`,
`"<Space>"`, `"<Insert>"`, `"<Delete>"`, `"<Escape>"`, `"<PageUp>"`, and
`"<PageDown>"`
## 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
- [x] **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
Shortcut Guide already copies all bundled manifest assets at startup and
builds its app index from those files. This change only extends that
manifest set with a Godot definition and aligns the manifest data with
the keyboard shortcuts schema; no runtime logic changed.
## Validation Steps Performed
- Parsed the new `+Godot.Godot.en-US.yml` file to verify YAML validity
and required top-level fields
- Confirmed the manifest targets `Godot.exe` and contains the expected
`+Godot.Godot` package identity
- Confirmed literal digit shortcuts use bracketed tokens like `"<0>"`
- Confirmed special keys use bracketed schema-compliant tokens where
applicable
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
|
||
|
|
3df0535473 |
Add Obsidian manifest for Shortcut Guide (#48960)
## Summary of the Pull Request Adds built-in Shortcut Guide support for Obsidian by shipping an app manifest keyed to `Obsidian.exe`. This lets Shortcut Guide recognize Obsidian as the foreground app and show a curated set of common Obsidian shortcuts. Closes: #48596 ## 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 - **Shortcut Guide manifest** - Adds `src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Manifests/Obsidian.Obsidian.en-US.yml` - Uses `PackageName: Obsidian.Obsidian` - Matches the app via `WindowFilter: "Obsidian.exe"` - **Curated Obsidian shortcuts** - Adds common shortcuts across: - Navigation - Tabs - Editing - Includes key Obsidian actions such as command palette, quick switcher, tab navigation, reading/editing mode toggle, and core editing commands - **No code-path changes** - This is a data-only addition that plugs into the existing manifest-driven Shortcut Guide app support ```yml PackageName: Obsidian.Obsidian Name: Obsidian WindowFilter: "Obsidian.exe" BackgroundProcess: false ``` ## Validation Steps Performed - Verified the new manifest is the only repository change - Parsed the new manifest structure successfully - Confirmed the manifest follows existing Shortcut Guide key/token conventions used by other bundled app manifests --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
23a26428d3 |
Grab And Move mod click passthrough (#49121)
This lets Alt/Win + click/rclick (no drag) go through if no mouse movement is recorded. Now the target window goes either into the "all clicks go through" or "all clicks are considered resizes/moves" based on whether the first mouse action after the modifier is pressed is a click or the beginning of a mouse drag action. <!-- 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 |
||
|
|
6da052247f |
CmdPal: Prevent stealing focus from other apps (#49087)
## Summary of the Pull Request
Gate search bar focus updates so they only run when the window is
visible.
The search bar can update its focus after context changes, but that
update may be dispatched after the window has already been hidden. In
that case, focusing the search box can bring the window back into focus
and steal focus from another app.
This change prevents the focus update from running when the owning
window is no longer visible.
Also as a flyby, `FocusSearchBoxMessage` is now handled by the ShellPage
instead of SearchBar, and goes through the same gate.
Regressed with the new token based params
(
|
||
|
|
cccd2b7510 |
GrabAndMove drag maximized windows relative to the click point (#49118)
This aligns the behavior with resize. <!-- 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 When grabbing and moving a maximized icon, the old behavior was to first restore the window with its title bar under the cursor, then proceed with the move. Now the window is restored and moved proportionally around the cursor, exactly like in the case of the grab and resize behavior. <!-- 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 Ensure the window geometry/coordinates change exactly the same as for grab and resize on it, when starting from a maximized state. |
||
|
|
e4ef90d168 |
[Peek] Options for AlwaysOnTop and ShowOnTaskbar (#44645)
<!-- 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 * Add the option for Peek to allow the window to be always on top * Add the option for Peek to allow to not show its icon on the taskbar <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #26274 - [x] Closes: #43093 <!-- - [ ] 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 - [x] **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) - [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/5824 <!-- 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 AlwaysOnTop defaults to `false`, and ShowOnTaskbar defaults to `true` to match the current behavior. Peek settings after the change: <img width="1642" height="714" alt="image" src="https://github.com/user-attachments/assets/e9c8b390-8a8b-40aa-8990-c671b1fffd96" /> Peek window behavior with AlwaysOnTop set to `true` and ShowOnTaskbar set to `false`: <img width="1813" height="1161" alt="image" src="https://github.com/user-attachments/assets/e5fbda14-0ba8-4a70-840c-2e8493b7d920" /> <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed 1. Start PowerToys with Peek enabled 2. In settings, turn off close window on focus loss for ease of validation 3. Peek something 4. Turn on always on top, observe the window is now always on top 5. Turn off always on top, observe the window is no longer always on top 6. Turn off show icon on taskbar, observe the icon disappeared immediately from the taskbar 7. Turn on show icon on taskbar, observe the icon re-appeared on the taskbar |
||
|
|
e0fe3c48cf |
CmdPal: Stretch main window card vertically when in expanded mode (#49109)
## Summary of the Pull Request This PR updates the behavior of CmdPal's main window in expanded (non-compact) mode to match the previous behavior. The page content now stretches across the entire window instead of collapsing to the actual content height. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #48872 <!-- - [ ] 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 |
||
|
|
029dd04ce4 |
CmdPal: Fix compact mode not toggling the list/command bar at runtime (#49111)
<!-- 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 hooks `ShellPage` to `ISettingsService` and triggers update of expanded state when the Compact mode settings is changed. Toggling the compact-mode setting while the palette was open neverre-evaluated `ShellPage.ExpandedMode`, so disabling compact mode left the palette collapsed (only the search box visible). <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #48933 <!-- - [ ] 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 |
||
|
|
3d3cef73da |
Add Zoom Workspace keyboard shortcut manifest for Shortcut Guide (#49062)
## Summary of the Pull Request Adds a new Shortcut Guide manifest for Zoom Workspace so Zoom-specific shortcuts are available in the overlay when `zoom.exe` is active. The manifest follows existing in-repo schema and naming conventions for app-specific keyboard shortcut files. ## 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 - **Manifest addition** - Added `src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Manifests/Zoom.Zoom.en-US.yml`. - Targets `WindowFilter: "zoom.exe"` with `PackageName: Zoom.Zoom`. - **Shortcut coverage** - Added high-value Zoom shortcuts grouped by section: - `General` - `View` - `Meeting controls` - Includes core actions such as mute/unmute, start/stop video, share, full-screen, and meeting exit. - **Schema alignment** - Uses existing Shortcut Guide manifest structure (`SectionName` / `Properties` / `Shortcut`) and key token conventions already used in adjacent manifests. ```yaml PackageName: Zoom.Zoom Name: Zoom Workspace WindowFilter: "zoom.exe" BackgroundProcess: false ``` ## Validation Steps Performed - Manifest content was kept within existing Shortcut Guide manifest schema and repository conventions for built-in app manifests. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
03e5f3e837 |
feat(shortcut-guide): add 1Password manifest (#48793)
## Summary of the Pull Request Adds a Shortcut Guide manifest for the **1Password** desktop app. - **New manifest:** `src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Manifests/AgileBits.1Password.en-US.yml`: 26 shortcuts for `1Password.exe`, grouped into the same four sections 1Password uses in its in-app Keyboard Shortcuts reference: - **Basics:** View keyboard shortcuts, Show Quick Access, Lock 1Password - **Navigation:** Find, Switch to all accounts, Switch accounts & collections, Back, Forward, Focus next/previous row, Focus right/left section - **Selected item:** Copy primary field / password / one-time password, Open & fill in web browser, Open item in new window, Edit item, Save item, Reveal concealed fields, Archive item, Delete item - **View:** Show/hide sidebar, Zoom in, Zoom out, Actual size - **No code changes.** The manifest is auto-included via the existing `Manifests/*.yml` glob in `ShortcutGuide.Ui.csproj`, exactly like the existing Postman, Slack, Discord, and browser manifests. - The two literal-digit shortcuts (`Ctrl+1` switch to all accounts, `Ctrl+0` actual size) use the `<N>` token (`<1>` / `<0>`) per the manifest spec, and the "Switch accounts & collections" range renders as `2 - 9`. - **Documentation:** Added a note in `doc/specs/WinGet Manifest Keyboard Shortcuts schema.md` documenting the existing **sentence-case** naming convention for `Name` and `SectionName` (capitalize only the first word plus proper nouns / product feature names), so future contributors do not copy an application's title-case shortcut-list styling. The 1Password names in this PR follow that convention, keeping only feature/product names capitalized (Show Quick Access, Lock 1Password). ## PR Checklist - [x] Closes: #48792 - [ ] **Communication:** I've discussed this with core contributors already. <!-- Filed #48792; the v0.100 announcement invites app-shortcut contributions via PR. Follows the precedent set by #48461 (Postman). --> - [ ] **Tests:** Added/updated and all pass <!-- N/A: data-only change, no new code paths. The manifest was validated by deserializing it with YamlDotNet (the same `Deserializer` used by `ManifestInterpreter`), confirming all 26 entries and key tokens parse into `ShortcutFile`. --> - [x] **Localization:** All end-user-facing strings can be localized <!-- Shortcut names live in the per-language manifest (`*.en-US.yml`); other locales fall back to en-US, consistent with every existing manifest. --> - [x] **Dev docs:** Added/updated <!-- Documented the sentence-case naming convention for Name / SectionName in doc/specs/WinGet Manifest Keyboard Shortcuts schema.md. --> - [ ] **New binaries:** Added on the required places <!-- N/A: the new manifest is a data asset under an already-shipped, globbed folder. No new binaries or test projects. --> - [ ] **Documentation updated:** <!-- N/A: user-facing docs unchanged. --> - [x] **Local run:** Built the Shortcut Guide projects and ran the Debug build with 1Password focused (`Win+Shift+/`); screenshot of the rendered guide is attached below. ## Detailed Description of the Pull Request / Additional comments The Shortcut Guide displays per-app shortcuts from YAML manifests, matched to the foreground window via `WindowFilter`. Adding support for an app is purely additive: drop a `<PackageName>.<locale>.yml` file in the `Manifests` folder and it is picked up by the existing build glob and the index generator. - `PackageName: AgileBits.1Password` (the WinGet package identifier) and `WindowFilter: "1Password.exe"` (the desktop app process). - `Name: 1Password` is the display name shown in the Shortcut Guide app picker. - Shortcut names follow the repo's sentence-case convention (now documented in the schema spec). Recommended is set on the five highest-frequency / signature actions: Show Quick Access, Lock 1Password, Copy primary field, Copy password, Copy one-time password. ## Validation Steps Performed - **Schema/parse:** Deserialized the manifest with `YamlDotNet.Serialization.Deserializer` (the same path `ManifestInterpreter.YamlToShortcutList` uses). All four sections and 26 entries parse, with 5 marked Recommended. No parse errors. - **Key rendering:** Verified every key token against `KeyVisual` and `ShortcutDescriptionToKeysConverter`: `<Space>`/`<Delete>` strip to their labels, `<Left>`/`<Right>`/`<Up>`/`<Down>` map to arrow glyphs, `<1>`/`<0>` strip to the literal digit (matching the merged Postman `<9>`/`<0>` handling), `2 - 9` renders verbatim, and `+` / `-` render as the literal symbols (as in the bundled Windows Explorer and Shell manifests). - **Source fidelity:** The section grouping and every shortcut/modifier combination match 1Password's in-app Keyboard Shortcuts reference one-to-one. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <img width="1462" height="2260" alt="image" src="https://github.com/user-attachments/assets/e7824a38-cb56-4242-9a6a-31c7a93c03c9" /> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
9039451e2f |
[Quick Accent] Migrate UI to WinUI 3 (#48891)
## Summary of the Pull Request Migrates the **Quick Accent (PowerAccent)** module's UI from WPF (`System.Windows.*`) to **WinUI 3 (Windows App SDK)**, following the pattern used by other migrated modules (ImageResizer, PowerDisplay). The accent selector is now a self-contained WinUI 3 app (`PowerToys.PowerAccent.exe`) shipped under `WinUI3Apps`, and `PowerAccent.Core` is UI-framework-agnostic. demo: https://github.com/user-attachments/assets/400c33ee-0fc0-491e-841b-a546438edf91 ## PR Checklist - [x] Closes: #48889 - [x] **Communication:** Tracked task (#48889) agreed with core contributors - [x] **Tests:** Added/updated and all pass — new `PowerAccent.Core.UnitTests` (21 tests for the positioning / DPI math); existing `PowerAccent.Common.UnitTests` unaffected - [x] **Localization:** No new localizable end-user strings — new accessibility metadata uses non-localized `AutomationProperties.AutomationId`, and the window title is the brand name `"Quick Accent"` (literal, matching ColorPicker) - [x] **Dev docs:** Updated `doc/devdocs/modules/quickaccent.md` - [x] **New binaries:** Added on the required places - [x] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json): the `WinUI3Apps\` PowerAccent payloads are listed in `ESRPSigning_core.json` - [x] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs): no manual `Product.wxs` entry — the self-contained `WinUI3Apps` output (exe + `.pri` + Windows App SDK runtime) is harvested by the `WinUI3ApplicationsFiles` glob (same as ImageResizer) - [x] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml): no change needed — `PowerAccent.Core.UnitTests` is discovered by the existing `**\*UnitTest*.dll` VSTest glob - [x] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml): covered by `ESRPSigning_core.json`; no `release.yml` change needed - [ ] **Documentation updated:** N/A — internal UI-framework migration with no user-facing behavior change ## Detailed Description of the Pull Request / Additional comments The migration spans three areas (tracked in #48889): **UI (WPF → WinUI 3)** - `PowerAccent.UI` is now a WinUI 3 app shell (custom `Program.Main`, `WindowsPackageType=None`, `WindowsAppSDKSelfContained=true`). - The accent selector is a non-activating `TransparentWindow` overlay shown with `SW_SHOWNA` (never steals focus). It is made always-on-top only while shown — the WinUIEx `WindowEx.IsAlwaysOnTop` property is toggled `true` on show / `false` on hide in `OnChangeDisplay` (matching the WPF original's `Topmost = isActive`), so the dormant, never-destroyed overlay does not pin a discrete GPU awake on hybrid-graphics laptops (issue #34849 / PR #41044). - The accent "pill" selection visual is reproduced with `VisualStateManager` (WinUI 3 has no `Style.Triggers`). - **WinUI 3 gotcha:** x:Bind on a Window-rooted XAML initializes only on `Window.Activated`, which never fires for this `SW_SHOWNA` overlay — so the selector calls `Bindings.Update()` after `InitializeComponent()`; without it the `ListView` renders empty. - **Theme:** the long-lived, never-activated process follows the system app theme automatically — `App.xaml` leaves `Application.RequestedTheme` unset, so WinUI re-resolves the `{ThemeResource}` brushes (and retints the acrylic) on a live light/dark switch with no manual `ThemeListener` needed. - **Layout parity with the WPF original:** the bar width hugs its content (`itemCount × 48`, clamped to the monitor width — computed, not measured, to avoid a racy `ListView` measure), and each cell pins `MinWidth=48` (WinUI's `ListViewItem` defaults to 88, which would otherwise leave wide gaps). - **Accessibility:** UIA window name + `AutomationId`s on the character list and description. **Dependency** - `PowerAccent.Core` no longer depends on WPF — it raises events and takes an injected UI-thread marshaller. - WinForms `SendKeys` → `SendInput` (CsWin32 P/Invoke); WPF-UI (Lepo) removed; language data moved to the UI-/WinRT-agnostic `PowerAccent.Common`. - MVVM via CommunityToolkit.Mvvm with `[ObservableProperty]` **partial properties** (WinRT-correct, clears MVVMTK0045). **CI / Build / Installer** - Signing config, WinUI3Apps glob harvest, and the new unit-test project — see the checklist above. ## Validation Steps Performed - **Build:** `x64 Debug` builds with **0 warnings / 0 errors**. - **Unit tests:** `PowerAccent.Core.UnitTests` — **21/21 pass** (9 anchor positions × DPI 1.0/1.5/2.0, the offset and negative-origin monitors, caret centering + edge clamping + flip-below). - **XamlStyler:** `PowerAccentXAML/MainWindow.xaml` passes the passive format check (CI mode). - **Manual (single monitor, Top-center, light theme):** - Accent popup appears with the full accent list rendered. - Bar hugs the characters and is centered; cell spacing matches the WPF original. - Switching the system theme (light/dark) is followed live by the popup. - With `show_description` enabled, the description row is wide (≥600px) and readable, with the accent bar centered above it. - **Remaining manual validation** (tracked in #48889): multi-monitor, per-monitor DPI, all 9 `toolbar_position` values, and high-contrast theme. --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
af45c3ec7c |
Add press-and-hold activation mode to Quick Accent (#48937)
## Summary of the Pull Request Adds an opt-in **press-and-hold** activation mode to Quick Accent, like iOS / macOS: hold an accent-capable letter (e.g. `a`) and after a short, configurable delay the accent picker opens automatically — no separate trigger key (Space/arrows) required. This is purely additive. The existing trigger-key modes (`Left/Right arrow`, `Space`, `Both`) and all serialized settings values are unchanged. https://github.com/user-attachments/assets/faec298c-e42c-4fd1-84bd-6e74d1b481a0 ### What it does - Holding a letter types the base letter immediately, then arms the picker. After the **Hold duration** (default **500 ms**) the toolbar appears. - Navigate the options with the arrow keys / Space, then **release the letter** to insert the selected accent (it replaces the base letter). - A quick tap types just the letter. Holding and releasing without selecting leaves the base letter as-is. - `Ctrl` / `Alt` / `AltGr` / `Win` + letter combinations are left untouched, so shortcuts like `Ctrl+A` still work. ## PR Checklist - [ ] **Closes:** N/A — feature enhancement (happy to link a tracking issue if one is preferred) - [x] **Communication:** Discussed direction with maintainers; coordinated with #48891 (see below) - [ ] **Tests:** No automated tests added — the activation decision lives in the C++ low-level keyboard hook and isn't reachable from the existing managed unit-test project. Validated manually (steps below). Open to guidance on the preferred test surface. - [x] **Localization:** All new end-user strings are in `Settings.UI/Strings/en-us/Resources.resw` with translator comments. - [x] **Dev docs:** `doc/devdocs/modules/quickaccent.md` updated with the new mode. - [x] **New binaries:** None. - [x] **Documentation updated:** Dev docs updated; public Learn docs can follow once shipped. ## Detailed Description of the Pull Request / Additional comments - **`PowerAccentKeyboardService` (C++ hook):** - Append `PressAndHold` to the internal `PowerAccentActivationKey` enum (value `3`, appended to preserve serialized `0/1/2`). - Add a `holdDuration` setting and `UpdateHoldDuration(Int32)` to the WinRT projection (`.idl`). - In `OnKeyDown`, arm the picker on the held letter itself; the base letter still types on first press and auto-repeat is swallowed (reuses the existing `m_toolbarVisible` repeat guard from #36853). - In `OnKeyUp`, use the hold duration as the minimum-hold release threshold for this mode (trigger modes keep using `inputTime`). - Modifier guard: Ctrl/Alt/AltGr/Win do not arm the mode. - **Settings model (`Settings.UI.Library`):** append `PressAndHold` to `PowerAccentActivationKey`; add `hold_duration_ms` (`IntProperty`, default 500). Existing `settings.json` without the field falls back to the 500 ms default. - **`PowerAccent.Core`:** read and forward the hold duration to the hook, and use it as the popup delay when `PressAndHold` is active. - **Settings UI:** add the **"Press and hold the letter"** activation option and a **"Hold duration (ms)"** control that is shown only when that mode is selected. ### Enum sync note `PowerAccentActivationKey` exists in both the C++ hook and the managed settings library and is kept in sync by integer value. `PressAndHold` was **appended** (never reordered) so existing serialized settings (`0/1/2`) keep their meaning. ### Coordination with #48891 (Quick Accent WinUI migration) This lands as its own atomic change on `main`. The overlap with the in-progress WinUI migration (#48891) is tiny: only `PowerAccent.cs`'s mode-aware popup delay (a single `Task.Delay` line). The C++ hook, settings enum/model, and Settings UI are not touched by #48891, so it can rebase onto this with minimal effort. ## Validation Steps Performed - Built the full chain in `Debug|x64`: - `PowerAccent.UI.csproj` → rebuilds the C++ `PowerAccentKeyboardService` projection (incl. `UpdateHoldDuration`) + `PowerAccent.Core` + `Settings.UI.Library`. **0 errors.** - `PowerToys.Settings.csproj` → Settings UI XAML / ViewModel / `.resw` (XamlIndexBuilder search index regenerated). **0 errors.** - Manual trial of the running module (`PowerToys.PowerAccent.exe`) with `activation_key = 3`: - Hold `a` → base letter types immediately; picker opens after ~500 ms; arrows/Space navigate; releasing inserts the accent (replacing the base letter). - Quick tap → base letter only. Hold + release without selecting → base letter remains. - `Ctrl+A` / `Alt`+letter unaffected. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
de4859454c |
[PowerToys] Guard TitleBar windows against an empty window title (startup fault) (#49069)
## Summary Guard PowerToys' WinUI windows against an empty native window title, so the WinUI `TitleBar` control can't read an empty title during startup and fault the process. This fixes a class of bugs like https://github.com/microsoft/PowerToys/issues/48547 ## Background Spotted while reading through the Environment Variables `MainWindow` startup path. The WinUI `TitleBar` control (used with `ExtendsContentIntoTitleBar`) reads the owning window's `AppWindow.Title` during a deferred layout pass (`OnApplyTemplate` → `UpdateTitle`). When the native window title is empty at that instant, the windowing layer can fault while resolving the title and terminate the process during startup. The native title ends up empty in two ways: 1. The title is computed from `ResourceLoader.GetString(...)`, which returns an **empty string** (it doesn't throw) when the resource map can't be resolved at runtime. 2. The window sets `AppWindow.Title` only *later*, not before the title bar's first layout. ## Windows fixed Every PowerToys window that hosts the `TitleBar` control: | Window | Fix | |---|---| | Environment Variables | Non-empty fallback for the resource-based title | | Hosts | Non-empty fallback for the resource-based title | | File Locksmith | Non-empty fallback for the resource-based title | | Shortcut Guide | Non-empty fallback for the resource-based title | | Settings — shortcut-conflict window | Non-empty fallback for the resource-based title | | Registry Preview | Set `AppWindow.Title` to the app name in the constructor (previously only set later in `UpdateWindowTitle`) | | Keyboard Manager Editor | No change — already sets a hardcoded non-empty `Title` | ## Risk Very low. The only behavior change is that a previously-empty title becomes a non-empty fallback; the normal (resource-resolved) paths are unchanged. ## Validation Each affected project builds clean (`x64 | Release`): EnvironmentVariables, Hosts, FileLocksmithUI, ShortcutGuide.Ui, RegistryPreview, PowerToys.Settings. ## Related Root cause write-up (windowing/WinUI side): microsoft/microsoft-ui-xaml#11214. --- ADO: https://microsoft.visualstudio.com/DefaultCollection/OS/_workitems/edit/62685601/ --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
93669df118 |
TransparentWindow: opt-in Esc / focus-lost dismiss + multi-surface docs (#48950)
## Summary Hardens the shared `TransparentWindow` (in `src/common/Common.UI.Controls/`) with two **opt-in** dismissal behaviors and documents multi-surface hosting. No consumer changes; everything defaults off. ### 1. `DismissOnEscape` (default `false`) Pressing <kbd>Esc</kbd> while the window content has keyboard focus calls `Hide()`. Input is hooked lazily at show time because `Content` is assigned by the consumer after construction. ### 2. `DismissOnFocusLost` (default `false`) Light dismiss: hides when the window is deactivated. Guarded by a "seen activated" flag (reset on each `Show()`) so the transient deactivation that can occur during the show sequence doesn't dismiss prematurely. This mirrors the guards that **PowerDisplay** (`_isShowingWindow`) and **Quick Access** (`_hasSeenInteractiveActivation`) currently hand-roll — they can drop their bespoke logic once they derive from `TransparentWindow`. > Both properties are no-ops unless the consumer activates the window (it shows no-activate / `SW_SHOWNA`). ### 3. Multi-surface hosting (docs only — already works) Added class `<remarks>` documenting that multiple `TransientSurface`s can `SubscribeTo` one window: `HidingEventArgs` aggregates deferrals so the window hides only after **all** surfaces finish animating out, and plain `Show()` lets each surface play its own configured transition. ## Why no DWM "full-bleed" hardening here The extra DWM hardening Shortcut Guide uses (NCRENDERING disabled, `DwmExtendFrameIntoClientArea(-1)`, etc.) is only needed for **full-monitor, edge-to-edge** overlays. Content-sized surfaces (Quick Accent, CmdPal Toast) inset their acrylic card behind transparent padding, so any phantom border sits in the transparent margin and is invisible. Applying it universally would add compositing risk for zero benefit, so it's deferred to the Shortcut Guide refactor (where it's actually exercised) as an opt-in. ## Testing - `Common.UI.Controls` builds clean (Debug/x64). - Behavior is opt-in and off by default, so existing consumers are unaffected. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
56fabda79c |
[Chore] Remove outdated clean up tool (#48992)
<!-- 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 Remove outdated clean up tool and script <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #48991 <!-- - [ ] 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] **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 |
||
|
|
70555459ab |
[AlwaysOnTop] Guard m_frameDrawer in WindowBorder::UpdateBorderPosition (#48412)
## Summary
`WindowBorder::UpdateBorderPosition()` dereferences `m_frameDrawer`
without a null check when `GetFrameRect` fails on the tracked window:
```cpp
auto rectOpt = GetFrameRect(m_trackingWindow);
if (!rectOpt.has_value())
{
m_frameDrawer->Hide(); // <-- AV if m_frameDrawer == nullptr
return;
}
```
The sibling routine `WindowBorder::UpdateBorderProperties()` already
guards both `m_trackingWindow` and `m_frameDrawer` before doing any
work:
```cpp
if (!m_trackingWindow || !m_frameDrawer)
{
return;
}
```
`UpdateBorderPosition` was the only call site that didn't match that
pattern. This PR brings it in line, and also adds a guard for `m_window`
for symmetry (the subsequent `SetWindowPos(m_window, ...)` would
otherwise fail silently with `ERROR_INVALID_WINDOW_HANDLE` but it's
cleaner to early-return).
## Why `m_frameDrawer` can be null when `UpdateBorderPosition` runs
`WindowBorder` registers itself as a `SettingsObserver` in its
base-class constructor — *before* `Init()` finishes. `Init()` is what
actually allocates `m_frameDrawer` (via `FrameDrawer::Create`). So
between those two steps there is a window where the object is alive and
observable but `m_frameDrawer == nullptr`.
The destructor has a similar shape:
```cpp
WindowBorder::~WindowBorder()
{
if (m_frameDrawer)
{
m_frameDrawer->Hide();
m_frameDrawer = nullptr;
}
if (m_window)
{
SetWindowLongPtrW(m_window, GWLP_USERDATA, 0);
DestroyWindow(m_window);
}
}
```
`m_frameDrawer` is nulled before `GWLP_USERDATA` is cleared and before
`DestroyWindow` is called. Any `WM_TIMER` that fires through `s_WndProc`
in that window dispatches to `WndProc → UpdateBorderPosition()` on an
instance whose `m_frameDrawer` has already been released — same null
deref, same access violation.
`UpdateBorderPosition` is also invoked from
`EVENT_OBJECT_LOCATIONCHANGE` / `EVENT_SYSTEM_MOVESIZEEND` in
`AlwaysOnTop.cpp` and from `WM_TIMER` in `WndProc`; both run on the
message-loop thread and either path can land here while the object is in
a transient half-constructed or half-destructed state.
## Change
Add `!m_frameDrawer` (and `!m_window`) to the early-return guard at the
top of `UpdateBorderPosition`. Three-line patch.
## How this was found
While reviewing the `WindowBorder` lifecycle for an unrelated
AlwaysOnTop tweak, the asymmetry between `UpdateBorderPosition` and
`UpdateBorderProperties` jumped out — the former dereferences
`m_frameDrawer` without the null check the latter performs.
## Tests
`src/modules/alwaysontop` has no test project today — `WindowBorder` is
tightly bound to Win32 (`HWND`, `DwmGetWindowAttribute`, `SetWindowPos`)
and `FrameDrawer` (Direct2D / D3D), with no abstraction layer to mock.
Adding meaningful native unit tests here would require a substantial
refactor that's well out of scope for this fix.
Manual validation:
- Build clean: `MSBuild
src\modules\alwaysontop\AlwaysOnTop\AlwaysOnTop.vcxproj
/p:Configuration=Release /p:Platform=x64` produces
`PowerToys.AlwaysOnTop.exe` with no warnings.
- Behavioural: with the guard added, the early-return path for "tracked
window has no valid extended frame bounds" simply skips the `Hide()`
call instead of crashing — same end-state for the user (border position
is left as-is until the next timer tick recovers it).
If we want a runtime regression net here, the right level is a UI /
lifecycle test that creates and pins/unpins windows under churn; that's
a separate piece of work and not gated on this fix.
## Risk
Three guarded conditions on a path that was already guarding one of
them. The behavioural delta only fires when the dereference *would* have
crashed — anywhere else the function is unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
d6319516d0 |
[Skills] Fix wpf-to-winui3-migration SKILL.md failing to load (#49059)
## Summary of the Pull Request The `wpf-to-winui3-migration` agent skill failed to load. The `description` field in its `SKILL.md` YAML frontmatter was an **unquoted** plain scalar containing `Keywords: ` (a colon followed by a space). YAML interprets `: ` as a mapping key/value separator, so the skill loader failed with: > failed to parse YAML frontmatter: mapping values are not allowed in this context at line 2 column 651 Because `.claude/skills` is a symlink to `.github/skills`, the CLI enumerates the same file twice, so this single defect surfaced as **two** skill load errors (`skill_error_count: 2`). Fix: wrap the `description` value in single quotes so the colon is treated literally. No wording changes; the description stays 926 characters (well under the 1024 limit). ## PR Checklist - [ ] Closes: #xxx — N/A, trivial metadata fix, no tracking issue - [x] **Communication:** Metadata-only fix; no design discussion needed - [ ] **Tests:** N/A — no test harness for skill frontmatter; validated by YAML parsing (see below) - [x] **Localization:** N/A — not end-user-facing - [ ] **Dev docs:** N/A - [ ] **New binaries:** N/A ## Detailed Description of the Pull Request / Additional comments `.github/skills/wpf-to-winui3-migration/SKILL.md` line 3 changed from: ```yaml description: Guide for migrating ... after migration. Keywords: WPF, WinUI, ... SoftwareBitmap. ``` to: ```yaml description: 'Guide for migrating ... after migration. Keywords: WPF, WinUI, ... SoftwareBitmap.' ``` The three other top-level skills already quote (or avoid `: ` in) their descriptions, so only this one was affected. Single quotes are used because the description contains no quote characters, so no escaping is required. ## Validation Steps Performed - Reproduced the loader error from the Copilot CLI logs: `mapping values are not allowed in this context at line 2 column 651`. - Parsed the frontmatter of all 9 `SKILL.md` files with a YAML parser: before = 1 failure (this file), after = **0 failures**. - Confirmed parsed `name` (`wpf-to-winui3-migration`), `description` (926 chars, ≤ 1024), and `license` are intact and the literal `Keywords: WPF...` text is preserved. Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
53737cbe31 |
ZoomIt add snip and panorama save hotkeys (#49075)
<!-- 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 - Fixes #45808 — ZoomIt's "Snip Save" hotkey was auto-derived by XOR'ing the Shift modifier from the Snip hotkey, causing `Ctrl+S` to be stolen when Snip was set to `Ctrl+Shift+S` - The Snip Save hotkey is now a separate, independently configurable setting (default: `Ctrl+Shift+6`, complementing the default Snip hotkey `Ctrl+6`) - Updated both the PowerToys Settings UI and the standalone ZoomIt options dialog - The same is applied for the scrolling screenshot keys <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #45808 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [x] **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~~ N/A (no ZoomIt tests in repo) - [x] **Localization:** All end-user-facing strings can be localized - [x] ~~**Dev docs:** Added/updated~~ N/A in this case I think - [x] ~~**New binaries:** Added on the required places~~ N/A - [ ] [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 ZoomIt registered two hotkeys for Snip — the primary (`SNIP_HOTKEY`) and a "save to file" variant (`SNIP_SAVE_HOTKEY`) derived by toggling the Shift modifier via XOR: ```cpp RegisterHotKey(hWnd, SNIP_SAVE_HOTKEY, (g_SnipToggleMod ^ MOD_SHIFT), g_SnipToggleKey & 0xFF); ``` This worked fine for the default `Ctrl+6` (save became `Ctrl+Shift+6`), but when a user configured `Ctrl+Shift+S` as their Snip hotkey, the XOR removed Shift, making the save variant `Ctrl+S` — stealing a ubiquitous shortcut from every other application. ## Changes ### C++ Backend (ZoomIt core) - **`resource.h`** — Added `IDC_SNIP_SAVE_HOTKEY` control ID for the new dialog control - **`ZoomItSettings.h`** — Added `g_SnipSaveToggleKey` global variable (default: `Ctrl+Shift+6`) and its `RegSettings[]` entry for registry persistence - **`ZoomIt.rc`** — Added a second hotkey control ("Snip Save Toggle") to the standalone SNIP options dialog - **`Zoomit.cpp`** — Added `g_SnipSaveToggleMod` global; replaced all 4 XOR-derived `RegisterHotKey` calls with the new explicit setting; updated the options dialog init, read, validation, and save logic ### Settings Interop - **`ZoomItSettings.cpp`** — Added `SnipSaveToggleKey` to the `settings_with_special_semantics` map so it serializes as a hotkey JSON object ### C# Settings UI - **`ZoomItProperties.cs`** — Added `DefaultSnipSaveToggleKey` and `SnipSaveToggleKey` property - **`ZoomItViewModel.cs`** — Replaced the computed XOR-derived read-only getter with a full get/set property backed by the new `SnipSaveToggleKey` setting - **`ZoomItPage.xaml`** — Replaced the read-only markdown description with an editable `ShortcutControl` for the save hotkey - **`Resources.resw`** — Added "Save snip to file" header string; removed the old templated description <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Built and tested locally -- ✅ App shows additional shortcut for ZoomIt <img width="983" height="188" alt="image" src="https://github.com/user-attachments/assets/f73c1ecc-3aee-4dee-bfbb-b95764e7eb1c" /> ✅ I am able to save files via `CTRL + S` as normal ✅ I am able to use Snip activation with `CTRL + Shift + S` ✅ I am able to use Save snip to file with the assigned shortcut of `CTRL + Shift + 6` ✅ Other ZoomIt commands run as expected (e.g. LiveZoom with my mapping of `ALT + 4` --------- Co-authored-by: Sean Killeen <SeanKilleen@gmail.com> |
||
|
|
bf6ff579d3 |
[ZoomIt] Fix issue with recording filename suffixes (#43236)
<!-- 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 Fixes an issue where ZoomIt would always remove a numeric suffix from a suggested recording filename even when it was part of a user-chosen name. Also: appends a timestamp instead of a numeric suffix for the default filename, improving consistency with other tools and allowing for correct name ordering in Explorer views. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #43202 - [ ] **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 The `GetUniqueRecordingFilename()` function used regex to strip numeric suffixes, and incorrectly assumed that all `(N)` patterns were ZoomIt-generated. This broke user-provided filenames like "My Presentation (2025).mp4". ### Root cause ```cpp // Chop off index if it's there auto base = std::regex_replace( path.stem().wstring(), std::wregex( L" [(][0-9]+[)]$" ), L"" ); path.replace_filename( base + path.extension().wstring() ); ``` This code strips off _any_ numeric suffix. ### Solution The proposed solution tracks the user's chosen filename separately, using it as the base for the file renaming strategy. The new string `g_RecordingSaveBaseFilename` allows for additive suffix generation without using regex stripping. This change also allows us to remove **regex.h** as a dependency, reducing the application's file size. The code retains the addition of numeric suffixes for user-chosen filenames, but timestamp suffixes are now added when the filename is the default `Recording.mp4`; this is more consistent with tools like Windows Snipping Tool, and allows for correct ordering of files in Windows Explorer (previously, `Recording (11).mp4` would be sorted before `Recording (2).mp4`, for example). <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed ### Test Scenario 1: Default filename with timestamp suffix 1. Launch ZoomIt, start first recording with <kbd>Ctrl</kbd>+<kbd>5</kbd>. 2. Stop the recording. The Save dialog shows "Recording.mp4". 3. Select **Save** to Accept this default. The file is saved as "Recording 2025-11-03 180719.mp4" or similar. 4. Start and stop another recording. 5. The Save dialog shows "Recording 2025-11-03 180800.mp4" or similar, i.e. with a distinct timestamp from the last save. Accept this suggestion by selecting **Save**. 6. Verify both files exist on disk. By default, this will be in your **Videos** folder. ### Test Scenario 2: Custom filename (ascending numeric suffix) 1. Launch ZoomIt, and start recording. 2. Stop the recording and change the suggested filename to "My Presentation.mp4". Select **Save** to save the file. 3. Start and stop a second recording. 4. Confirm the dialog suggests "My Presentation (1).mp4" as the filename. Select **Save** to accept this filename. 5. Start and stop a third recording. 6. Confirm the dialog suggests "My Presentation (2).mp4" as the filename. Select **Save** to accept the suggestion. 7. Verify all files exist on disk with the correct names. ### Test Scenario 3: User filename with parenthetical number (bug repro) 1. Launch ZoomIt and start recording. 2. Stop the recording and change the suggested filename to "My Presentation (2025).mp4". Select **Save** to save the recording to disk. 3. Start and stop a second recording. 4. Confirm the dialog suggests "My Presentation (2025) (1).mp4" as the filename. (This was broken before - the prior version would suggest "My Presentation.mp4".) 5. Accept the suggestion by selecting **Save**. 6. Start and stop a third recording. 7. Confirm the save dialog suggests "My Presentation (2025) (2).mp4". 8. Verify all files exist on disk with the correct names. ### Test Scenario 4: User modifies suggested filename 1. Save first recording as "Test.mp4". 2. Start and stop a second recording. 3. Confirm the second recording has a suggested filename of "Test (1).mp4". 4. Change the suggested filename to "TestFinal.mp4" before saving. 5. Start and stop a third recording. 6. Confirm the save dialog suggests "TestFinal (1).mp4". (Verifies correct updating of the base filename.) ### Test Scenario 5: Existing files at the save location 1. Manually create "Video.mp4" and "Video (1).mp4" in the Videos folder. 2. Start ZoomIt and save a recording to the same folder as "Video.mp4". Confirm you are asked to overwrite the existing file. 3. Select "Yes" and save the file. 4. Start and stop another recording. 7. Confirm that the Save dialog's suggested filename is "Video (2).mp4", skipping the manually-added file. ## Code updates ### Additional clean-up - Clarified path construction in recording initialisation block (replaced `/=` with explicit path building for a more readable approach). - Changed `DEFAULT_RECORDING_FILE` from a `#define` to a `constexpr` instead. The new base filename variable is based upon it. Co-authored-by: Niels Laute <niels.laute@live.nl> |
||
|
|
0afe525f31 |
Fix memory leaks in Command Palette: unsubscribe event handlers and dispose resources (#48884)
## Summary Fixes 6 memory leaks in Command Palette caused by event handlers not being unsubscribed and disposable resources not being released. ## Changes | File | Fix | |------|-----| | `MainListPage.cs` | Replace lambda on static `AllAppsCommandProvider.Page.PropChanged` with named method; unsubscribe in `Dispose()` | | `WinRTExtensionService.cs` | Unsubscribe static `PackageCatalog` events (`PackageInstalling`/`Uninstalling`/`Updating`) in `Dispose()` | | `MainWindow.xaml.cs` | Unsubscribe all event handlers in `Dispose()` (`SizeChanged`, `SettingsChanged`, `ActualThemeChanged`, `XamlRoot.Changed`, `CardElement.SizeChanged`, timer `Tick`, `ThemeChanged`, `KeyPressed`); replace lambda with named method | | `ContentFormControl.xaml.cs` | Unsubscribe previous `RenderedAdaptiveCard.Action` before subscribing to new card | | `BlurImageControl.cs` | Track `LoadedImageSurface` and unsubscribe `LoadCompleted` before loading a new image | | `ShowFileInFolderCommand.cs` | Dispose `Process` object returned by `Process.Start()` (handle leak) | ## Validation - [x] Build clean (`tools\build\build.ps1 -Path src\modules\cmdpal -Platform x64 -Configuration Debug`) — exit code 0 - [x] All 1809 CmdPal unit tests pass (2 pre-existing skips) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
a43fb12d6f |
cmdpal: Support Enter key to submit FormContent (Adaptive Card) inputs (#48768)
## Summary Adds Enter key support for submitting Adaptive Card forms in the Command Palette. When a user presses Enter inside a single-line `Input.Text` field, the form is automatically submitted using the first `Action.Submit` or `Action.Execute` action on the card. ## Problem When extensions use `FormContent` with Adaptive Cards, pressing Enter inside an `Input.Text` field does not trigger submission. Users must click the submit button with their mouse (or tab to it), breaking keyboard-only workflows like login/unlock forms. ## Solution Added a `KeyDown` event handler on the rendered Adaptive Card's `FrameworkElement` in `ContentFormControl.xaml.cs`: - Intercepts `VirtualKey.Enter` when the source is a `TextBox` that doesn't accept returns (single-line) - Finds the first `AdaptiveSubmitAction` or `AdaptiveExecuteAction` on the card - Calls `HandleSubmit` with that action and the current user inputs via `RenderedAdaptiveCard.UserInputs.AsJson()` Multiline text inputs (`AcceptsReturn = true`) are excluded so Enter still inserts newlines. ## Validation - Single file change in `ContentFormControl.xaml.cs` - Uses existing `HandleSubmit` path — same behavior as clicking the submit button - No impact on cards without submit/execute actions - No impact on multiline text inputs Fixes #46003 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
bc56443443 |
New++ updated attribution (#49047)
## Summary of the Pull Request * Updated New+ attribution text and link after conversation with Niels * Text="Based on Christian Gaardmark's New++ from the Productivity Plus Pack" * Link="https://www.onegreatworld.com/products/productivity-plus-pack/?ref=settings_pt" ## PR Checklist - [ ] Closes: #xxx - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [n/a] **Tests:** Added/updated and all pass - [n/a] **Localization:** All end-user-facing strings can be localized - [n/a] **Dev docs:** Added/updated - [n/a] **New binaries:** Added on the required places - [n/a] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [n/a] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [n/a] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [n/a] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [n/a] **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 * Text="Based on Christian Gaardmark's New++ from the Productivity Plus Pack" * Link="https://www.onegreatworld.com/products/productivity-plus-pack/?ref=settings_pt" ## Validation Steps Performed 1. Manually confirmed visual layout 2. Manually confirmed link <img width="470" height="65" alt="image" src="https://github.com/user-attachments/assets/56d6e454-89cf-4a26-b570-b162df51f4a9" /> cc: @niels9001 |
||
|
|
3298625b67 |
Cancel stale Quick Accent toolbar render timer (#48944)
## Summary Quick Accent's ShowToolbar queues a delayed render of the accent menu through Task.Delay(...).ContinueWith(...). The continuation only checked _visible before rendering, so a timer started by an earlier key press could still fire for a **newer** summon — or one that had already been hidden — popping the accent menu earlier than the configured delay intended. This was surfaced while reviewing the press-and-hold work in #48937, but it is a pre-existing race independent of that feature, so it ships on its own. ## Fix - Tag each `ShowToolbar` summon with an incrementing `_showGeneration` id and capture it in the local closure. - The delayed continuation now renders only when it is still the most recent summon (`generation == _showGeneration`) **and** `_visible`. - Bump the generation when the toolbar hides, so any in-flight timer queued before the hide is cancelled. Everything runs on the UI thread (the dispatcher marshals `ShowToolbar`/hide and the continuation uses `FromCurrentSynchronizationContext`), so the counter needs no locking. ## Validation - Built `PowerAccent.UI` (C++ hook + Core) Debug|x64 — 0 warnings, 0 errors. - Manual: rapid repeated taps of an accent-capable letter no longer flash the menu early from a leftover timer; normal hold-to-open and navigation/commit are unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |