mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-07-09 20:09:28 +02:00
0d5eb84d4f93190b605aba9f8d3fec00779ccce9
9353 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
0d5eb84d4f | [PowerDisplay] Wire persisted VCP code maps through discovery/refresh | ||
|
|
8e8e4408ae | [PowerDisplay] Resolve and use per-feature VCP codes in DDC controller | ||
|
|
9c762c720c | [PowerDisplay] Add get/update/clear APIs for resolved VCP code maps | ||
|
|
f8bf1be06b | [PowerDisplay] Persist resolved VCP codes in monitor state | ||
|
|
b0059e2c1d | [PowerDisplay] Tighten VcpFeatureResolver caps contract and resolver tests | ||
|
|
a81effce10 | [PowerDisplay] Spec: clarify Phase 2 probe runs only on fresh discovery (persisted==null) | ||
|
|
5933cb9ece | [PowerDisplay] Add VcpFeatureResolver (cap-string-first, probe fallback) | ||
|
|
bf81179b35 | [PowerDisplay] Add VcpFeatureCodeMap with persistence round-trip | ||
|
|
6e7232862f | [PowerDisplay] Document VcpFeatureRegistry API; fix stale brightness comment | ||
|
|
0f434b5344 | [PowerDisplay] Add VcpFeature enum and candidate-code registry | ||
|
|
d7916e0457 | [PowerDisplay] Plan: use MSBuild/vstest toolchain (not dotnet CLI) | ||
|
|
649a1dda15 |
[PowerDisplay] Add implementation plan for VCP code resolution
TDD, bite-sized task plan covering the registry/resolver/map, persistence, DDC controller wiring, app orchestration (push/persist/clear-on-refresh), and the diagnostics surface. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
5487807d6f |
[PowerDisplay] Add design spec for per-feature VCP code resolution
Design for resolving each PowerDisplay feature to one of an ordered list of candidate VCP codes per monitor (cap-string-first, probe-as-fallback), persisting the decision (including a not-supported sentinel) until the user refreshes, and surfacing the resolved code in diagnostics. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
8bd5c1be6f |
[Quick Accent] Additions and reorg for IPA set. Additions to Special set (#49030)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #48840 - [x] Closes: #32437 - [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 - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments The following additions and changes were made in response to the feedback given in #48840 and also following an audit of the IPA set. #### IPA | Character | Action |--|--| | `ɱ` | Added to **M** | | `ʍ` | Added to **W** | | `ɚ` | Added to **E** | | ` ͡ ` and ` ͜ ` | Added to **PERIOD** | `ɡ` | Added to **G** | `ɫ` | Added to **I** | `ʱ` | Added to **H** | `◌̝`, `◌̥`, `◌̚`, `ˈ` and `ˌ` | added to **PERIOD** | `ʎ` | Added to **Y** | `ʔ` | Added to **COMMA** and **SLASH** | `æ` | Added to **A** and **E** | `œ` | Added to **O** and **E** | `ʘ` | Added to **B** and **O** | `β`, `ɓ` | Added to **B** | `χ` | Added to **C** and **X** | `ç`, `ǂ` | Added to **C** | `ð`, `ɗ`, `ɖ`, `ǀ` | Added to **D** | `ɠ`, `ʛ` | Added to **G** | `ħ`, `ɥ`, `ɧ` | Added to **H** | `ʄ` | Added to **J** | `ɫ`, `ǁ` | Added to **L** | `ø` | Added to **O** I removed the caron vowel characters `ǎ`, `ǒ` and `ǔ`, as they should not have been in the IPA set. These characters are available in the Pinyin set. A small number of keys had entries reordered where common mappings would have been towards the end. This IPA update includes: - Click Consonants (`ʘ`, `ǀ`, `ǃ`, `ǂ`, `ǁ`), which are used in the phonetic transcription of Southern and Eastern African languages, most notably the Khoisan language groups and several Bantu languages (like Zulu and Xhosa). - Implosives and Ejectives (`ɓ`, `ɗ`, `ʼ`, etc.), which are essential for transcribing languages across the globe, including Indigenous languages of the Americas (e.g., Navajo and Mayan), the Caucasus (e.g., Georgian), Southeast Asia (e.g., Vietnamese), and widely across the African continent. #### SPECIAL set | Character | Action | Notes |--|--|--| | `‽` and `⸘` | Added to **SLASH** | | `⟨`, `⟩`, `⟪` and `⟫` | Replaced full-width CJK brackets with the Western versions. | `‰` and `‱` | Added to **P** <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Manual testing, with specific tests to confirm that the new combining marks display OK in the UI. |
||
|
|
7b19b4c219 |
Add build-time guard for Windows long path support (#49028)
PowerToys has deeply nested source paths that exceed the legacy 260-character MAX_PATH limit. Contributors who haven't enabled Windows long path support hit cryptic 'path too long' / 'could not find file' errors during their first build. Add an EnsureLongPathsEnabled MSBuild target in Directory.Build.targets that reads HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled and fails fast with an actionable error (PTLONGPATH) pointing at tools\build\setup-dev-environment.ps1. Covers both Visual Studio and the command-line build scripts, skips design-time builds, and can be bypassed with /p:SkipLongPathsCheck=true. **What happens if Long file path isn't enabled.** <img width="824" height="916" alt="image" src="https://github.com/user-attachments/assets/30731f65-4011-48c0-94b9-e521b4c7d266" /> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
b73fd670be |
[CmdPal] Fix excessive Narrator announcements on More button open (#48928)
<!-- 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
Opening the More button caused Narrator to read a long cascade of
overlapping announcements — popup window, filter TextBox placeholder,
ListView item name, position ("1 of 4"), keyboard shortcut text — all
from a single keypress with no further input.
This PR replaces that cascade with a single, clean announcement:
**"Menu, {0} commands. {1}, {2} of {0}"**
(num of commands, first item in list, num of order in list, num of
commands)
**"Menu, 3 commands. Calculator, 1 of 3."**
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [x] Closes: #48899
<!-- - [ ] 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
- [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
| File | Change |
|------|--------|
| `ContextMenu.xaml` | Set `AccessibilityView="Raw"` on ListView and
TextBox; added `NarratorAnnouncer` TextBlock for raising UIA
notifications |
| `ContextMenu.xaml.cs` | Added `AnnounceOpened()`,
`AnnounceSelectedItem()`, and `_isOpening` guard to prevent programmatic
selection changes from triggering UIA events during the flyout
transition |
| `CommandBar.xaml.cs` | Call `AnnounceOpened()` on flyout open |
| `DockControl.xaml.cs` | Same for dock context menu |
| `Resources.resw` | Added `ScreenReader_Announcement_ContextMenuOpened`
localized format string |
## How it works
- ListView and TextBox are permanently `AccessibilityView="Raw"` —
invisible
to Narrator, preventing all system-driven UIA announcements
- A zero-size `NarratorAnnouncer` TextBlock
(`AccessibilityView="Content"`,
`LiveSetting="Assertive"`) serves as the sole notification source
- On open: a deferred `RaiseNotificationEvent` fires one consolidated
announcement
- On arrow navigation: `AnnounceSelectedItem()` fires item name and
position
<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
https://github.com/user-attachments/assets/4660741f-6b91-4a32-9a56-83c64343b67a
- [x] Build succeeds (0 errors)
- [x] 124 ViewModel unit tests pass
- [x] Manual Narrator testing: open, arrow navigate, close, reopen
- [x] Keyboard filtering (type to filter) still works
- [x] Enter to invoke selected command still works
- [x] Escape to close still works
|
||
|
|
a46a4437e5 |
Fix unreadable What's New titles/links when OS and PowerToys themes differ (#48910)
## Summary of the Pull Request When the OS theme differs from the PowerToys theme (e.g. OS in Light, PowerToys set to Dark), the **What's New / release-notes (Scoobe)** page renders heading titles and hyperlinks with brushes pinned to the wrong theme, making them unreadable. The system caption buttons (min/max/close) are also not tinted to match the window theme. The release-notes page uses the CommunityToolkit `MarkdownTextBlock`, which captures its heading and link brushes from `Application.Current.Resources` when its theme config is created. Those resolve against the **OS (application) theme** rather than the window's selected element theme, so headings/links break whenever the two themes differ. ## PR Checklist - [x] Closes: #43970 - [x] Closes: #48832 - [x] **Communication:** Local workaround for a known upstream control bug - [ ] **Tests:** Manually validated (UI/theming change) - [x] **Localization:** No new end-user-facing strings - [ ] **Dev docs:** N/A ## Detailed Description of the Pull Request / Additional comments These are deliberately **local workarounds** until the upstream control resolves brushes against the element theme via [CommunityToolkit/Labs-Windows#785](https://github.com/CommunityToolkit/Labs-Windows/pull/785). Comments + `TODO`s in the code point at that PR so the workaround can be removed once it ships. **`ScoobeReleaseNotesPage`** - Pin the `MarkdownTextBlock.RequestedTheme` to the selected app theme and reassign the `H1`–`H6` heading brushes and the link brush (resolved for that theme) before the markdown is rendered. The themed brushes are read from the control's own `Foreground` (`TextFillColorPrimaryBrush`) and a hidden `LinkBrushProvider` carrier element (`AccentTextFillColorPrimaryBrush`). - Re-run the workaround and force a re-render on runtime theme changes (subscribe to the page's `ActualThemeChanged`), so titles/links stay readable when the user switches Light/Dark while the window is open. **`TitleBarHelper` (new) + `ScoobeWindow`** - Add a small shared `TitleBarHelper.ApplySystemThemeToCaptionButtons(window, theme)` (port of the WinUI Gallery helper + PowerToys conventions) and drive the Scoobe window's caption-button colors from the content's actual theme, updating on `ActualThemeChanged`. `ScoobeWindow` uses the built-in WinUI `TitleBar`, which — unlike the custom PowerToys `TitleBar` control used by the other Settings windows — does not tint the system caption buttons to the app theme. ## Validation Steps Performed - OS Light + PowerToys Dark: opened What's New → headings, hyperlinks, body text and caption buttons all render readable/dark-themed (previously black/unreadable titles). Confirmed working. - Switched OS Light → Dark while the Scoobe window was open → markdown content and caption buttons update live. - OS Dark: content pane, tables and titles render with the dark theme (addresses the "light pane in a dark window" report). <img width="1673" height="929" alt="Screenshot 2026-06-26 130638" src="https://github.com/user-attachments/assets/1db7fb37-f5ee-485b-863e-fc1ba0d13f6f" /> _OS is in Light Mode, while the app settings are set to Dark mode_ Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
3bf682048e | Grab and Move: square overlay corners in remote sessions (#48999) | ||
|
|
28a9bbe8f0 |
[PowerDisplay] Add configurable mouse wheel increment for slider controls (#49002)
## Summary of the Pull Request Adds a Settings option that controls how much the PowerDisplay flyout sliders (brightness, contrast, volume) change per mouse-wheel notch. The value is chosen from a **preset dropdown** (`1, 2, 5, 10, 15, 20, 25`) and defaults to **5**, preserving today's behavior. Previously the per-notch step was hardcoded as `helpers:SliderExtensions.MouseWheelChange="5"` in four places in the flyout. <img width="1282" height="620" alt="image" src="https://github.com/user-attachments/assets/3b299a47-eb7b-4b53-b3dc-0540fbb25bfc" /> ## PR Checklist - [x] Closes: #48805 - [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 — _added `MouseWheelIncrementSettingsTests` to the existing `PowerDisplay.Lib.UnitTests`; passing via `vstest.console.exe`._ - [x] **Localization:** All end-user-facing strings can be localized — _new `PowerDisplay_MouseWheelIncrement.Header`/`.Description` in `en-us/Resources.resw`, surfaced via `x:Uid`._ - [ ] **Dev docs:** Added/updated — _N/A: small settings addition, no behavioral/architecture docs affected._ - [ ] **New binaries:** Added on the required places — _N/A: no new binaries or projects (the unit test was added to an existing test project)._ - [ ] [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:** _N/A._ ## Detailed Description of the Pull Request / Additional comments A single `int MouseWheelIncrement` is added to `PowerDisplayProperties` and persisted to `settings.json` under `mouse_wheel_increment`; it is edited in the Settings UI and read by the flyout app. The value applies uniformly to all four flyout sliders. **Data model** — `src/settings-ui/Settings.UI.Library/PowerDisplayProperties.cs` - `MouseWheelIncrement` (`int`, `[JsonPropertyName("mouse_wheel_increment")]`, default `5` set in the constructor, mirroring `MonitorRefreshDelay`). Old `settings.json` without the key deserializes to `5` (no migration). The whole type is already registered with the source-generated JSON contexts, so the new property serializes on both the Settings and flyout sides with no context change. **Settings UI (write side)** — `src/settings-ui/Settings.UI/...` - `PowerDisplayViewModel`: `MouseWheelIncrement` (get/set via `SetSettingsProperty`, calls `SignalSettingsUpdated()` so an open flyout updates live) and `MouseWheelIncrementOptions` = `{ 1, 2, 5, 10, 15, 20, 25 }`. - `PowerDisplayPage.xaml`: a `ComboBox` `SettingsCard` in the flyout-settings expander, immediately after "Monitor refresh delay", matching that card's markup. - `Strings/en-us/Resources.resw`: `Mouse wheel increment` + description. **Flyout (read side)** — `src/modules/powerdisplay/PowerDisplay/...` - `MainViewModel`: `[ObservableProperty] int MouseWheelIncrement` (default 5), loaded from settings in `LoadUIDisplaySettings()` (runs at startup and on the settings-updated IPC event, so the all-displays slider updates live). - `MonitorViewModel`: a read-only proxy `MouseWheelIncrement => _mainViewModel?.MouseWheelIncrement ?? 5` plus `RefreshMouseWheelIncrement()`, called from `ApplySettingsFromUI`'s per-monitor loop so the per-monitor sliders update live. - `MainWindow.xaml`: the four sliders' `SliderExtensions.MouseWheelChange` now bind to the setting — the all-displays slider to `ViewModel.MouseWheelIncrement`, the three per-monitor sliders (brightness/contrast/volume, inside the `MonitorViewModel` `DataTemplate`) to `MouseWheelIncrement`. ## Validation Steps Performed **Automated** - Unit tests (`PowerDisplay.Lib.UnitTests/MouseWheelIncrementSettingsTests.cs`), run via `vstest.console.exe` — passing: - default value is `5`; - legacy `settings.json` missing the key deserializes to `5` (no migration); - round-trip preserves a non-default value; - serialization emits the `mouse_wheel_increment` snake_case key. - `PowerToys.Settings` and the PowerDisplay flyout app both compile clean (the XAML compiler validates the new `x:Bind` bindings). - Confirmed the property flows through the source-generated JSON contexts (whole-type `[JsonSerializable(typeof(PowerDisplaySettings))]`) on both the Settings and flyout sides. **Pending (manual, on-device — reason this PR is a draft)** - [ ] Settings: the dropdown shows `5` on a fresh profile; changing it writes the new `mouse_wheel_increment` value to `settings.json`. - [ ] Flyout: scrolling each slider (all-displays brightness, per-monitor brightness/contrast/volume) steps by the selected value, including live update while the flyout is open. --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
536e768cac |
Extend MSIX context-menu icon sizing to the standard logo set (#48925)
## Summary Addresses #48924. Several MSIX context-menu items did not ship the full standard logo set (e.g. File Locksmith was missing the 44x44 logo), so Windows fell back to a default icon in some surfaces. This updates the MSIX assets for **File Locksmith**, **Image Resizer** and **PowerRename** to provide the full logo set: 44x44 logo, small/large/150x150 tiles, and store logo. ## PR Checklist - [x] Closes #48924 - [ ] Tested manually ## Validation Icon-asset only change; no code modified. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
70ff4013b9 |
Add Shortcut Guide V2 manifest spec link to copilot-instructions.md (#48967)
Adds a reference to the WinGet Manifest Keyboard Shortcuts schema spec in `.github/copilot-instructions.md` so AI agents know where to find the correct field definitions, file naming conventions, and the `+` prefix rule when creating or editing Shortcut Guide V2 manifest files. ## Summary of the Pull Request Adds a new `## Shortcut Guide V2 Manifests` section to `.github/copilot-instructions.md` linking to [`doc/specs/WinGet Manifest Keyboard Shortcuts schema.md`](../doc/specs/WinGet%20Manifest%20Keyboard%20Shortcuts%20schema.md). This ensures agents authoring new manifest files follow the correct schema and naming scheme (e.g., `<PackageId>.<locale>.yml`, `+` prefix for apps without a WinGet package). ## 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 `.github/copilot-instructions.md` gains a dedicated section: ```markdown ## Shortcut Guide V2 Manifests When creating or editing Shortcut Guide keyboard shortcut manifest files, follow the schema and naming conventions in the spec: - [WinGet Manifest Keyboard Shortcuts schema](<../doc/specs/WinGet Manifest Keyboard Shortcuts schema.md>) – manifest file format, field definitions, file naming, and the `+` prefix convention for apps without a WinGet package ``` No production code changes. ## Validation Steps Performed - Verified the relative link resolves to the correct spec file in the repository. - Confirmed the section is correctly placed before "Detailed Documentation". --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
7a04d4c270 |
[ShortcutGuide] Add DaVinci Resolve keyboard shortcut manifest (#48651) (#48652)
Adds a shortcut manifest for DaVinci Resolve (professional video editing and color grading application by Blackmagic Design) so it appears in the Shortcut Guide overlay when the app is focused. The manifest contains 88 of the most commonly used DaVinci Resolve keyboard shortcuts organized into 8 categories: | Section | Shortcuts | Highlights | |---------|-----------|------------| | Popular shortcuts | 25 | Page navigation (F5-F8), Playback (JKL, Space), Edit basics (Cut, Blade, Ripple Delete) | | Timeline navigation | 13 | Frame/clip/track navigation, zoom, edit point jumping | | Edit | 14 | Cut/Copy/Paste/Duplicate, Render in Place, Compound Clip | | Color | 17 | Node management (Alt+S/P/L), viewer modes (1-5), Grade/Keyframe | | Fairlight | 8 | Mute/Solo/Record/Automation, Bounce Mix | | Fusion | 8 | View switching (1-4), Merge, Keyframe | | Media | 8 | Import, Smart Bin, Reveal in Explorer, Rename | | Deliver | 5 | Render Queue, Start Render, Output settings | The manifest follows the same YAML schema as existing manifests. No code changes needed -- manifests are auto-discovered at startup. |
||
|
|
8c434cd6f4 |
CmdPal: Fix LayoutCycleException in gallery screenshot strip (#48090)
## Summary Extension Gallery detail pages crash with `LayoutCycleException` / `AG_E_LAYOUT_CYCLE` when scrolling the screenshot strip horizontally on extensions that have many screenshots. ## Root Cause The screenshot `ItemsView` uses a horizontal `StackLayout` and is placed in a Grid row with `Height="Auto"`, inside a vertical `ScrollViewer`. The `ItemsView` itself contains an internal `ScrollView` for horizontal scrolling. When screenshots load asynchronously (`BitmapImage` decode completes), this triggers a layout feedback loop: 1. Image decodes → `ItemContainer` re-measures 2. Auto-height Grid row re-measures, offering `ItemsView` new available height 3. `ItemsView`'s internal `ScrollView` recalculates extents 4. Parent Grid row invalidates → outer `ScrollViewer` re-layouts → re-measures children → back to step 1 ## Fix Two XAML-only changes to `ExtensionGalleryItemPage.xaml`: 1. **Fixed Grid row height**: Changed the screenshot strip row from `Height="Auto"` to `Height="232"` (200px image + 16px top/bottom padding). The parent no longer queries `ItemsView` for desired height, breaking the cycle. 2. **Fixed item width**: Added `Width="356"` to the screenshot `Border` template (16:9 ratio: 200 × 16/9 ≈ 356). Provides a stable size before async image decode, preventing re-measure triggers. Fixes #47901 Co-authored-by: root <root@io.bbq> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
d983dbc285 |
Fix VS Code workspace UNC paths (#48922)
## Summary of the Pull Request Fixes #47719 VS Code stores recently opened workspaces as URIs. A workspace on a Windows network share can be stored as `file://server/share/workspace.code-workspace`. The VS Code Workspaces plugin interpreted the server part of that URI as a VS Code remote authority. Because it was not a recognized remote authority, valid UNC workspaces were discarded. This change recognizes file URIs with a server authority as local UNC paths and converts them to the Windows UNC format: `\\server\share\...`. ## PR Checklist * [x] Closes #47719 * [x] **Communication:** This implementation follows the suggested direction in the issue discussion. * [ ] **Tests:** No automated regression test added. * [x] **Localization:** No user-facing strings were changed. * [x] **New binaries:** No binaries were added. * [x] **Documentation updated:** No documentation changes are required. ## Validation Steps Performed * Built the full PowerToys solution locally in `Release | x64` with 0 errors. * Started the locally built PowerToys instance. * Verified that the VS Code Workspaces plugin finds local workspaces. * Verified that UNC workspaces using both a hostname and an IP address appear in PowerToys Run. * Opened a UNC workspace successfully from PowerToys Run. |
||
|
|
fb6843b0f1 |
Refactor transparent overlay into TransparentWindow + TransientSurface (#48915)
## Summary Refactors the reusable transparent-overlay infrastructure in `src/common/Common.UI.Controls/` into a clean separation between a pure host window and a self-animating acrylic surface. ### What changed - **`TransparentWindow`** is now animation-agnostic. It raises `Showing` / `Hiding` events; `Hiding` exposes a deferral so the HWND stays visible until the surface's out-animation finishes. - **`TransientSurface`** (renamed from `TransparentCard`) is a self-animating "pseudo-window" content control. It owns all chrome — `ThemeShadow`, always-active desktop acrylic, 1px border, rounded corners — and its own show/hide slide animations. - `SlideFrom` (`None`/`Left`/`Top`/`Right`/`Bottom`) selects the slide edge. `None` is the default and plays **no animation at all** (instant show/hide). - `AcrylicKind` (new) is exposed and bound to the backdrop via `TemplateBinding`, defaulting to **thin acrylic**. Consumers can override to `Default`/`Base`. - **`AlwaysActiveDesktopAcrylicBackdrop`** gains a matching `Kind` dependency property. - **CmdPal `ToastWindow`** is migrated to the new pattern as the proving consumer (`Surface.SubscribeTo(this)`). ### Coordination model A module declares a `<TransientSurface>` as the window's content and calls `SubscribeTo(window)` once. The window raises `Showing`/`Hiding`; the surface animates itself in/out and uses the `Hiding` deferral to keep the window alive until the out-animation completes. ## Testing - `Common.UI.Controls` builds clean (x64 Debug, exit 0). - `Microsoft.CmdPal.UI` builds clean (x64 Debug, exit 0). - ToastWindow keeps its slide-up animation (`SlideFrom="Bottom"`). https://github.com/user-attachments/assets/a06b0f1a-740a-4fcd-bba8-6f7a64ed261b --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
6dd1ce5dd1 |
Dev/crutkas/ripple v2.1 + spelling allow-list follow-up (#48232)
## Summary of the Pull Request Adds a follow-up metadata fix to the existing Mouse Highlighter ripple v2.1 work by allowing the term `xhair` in repo spell-check configuration. ## 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 - Added `xhair` to `.github/actions/spell-check/expect.txt`. - This addresses spelling feedback on MouseHighlighter ripple/crosshair code without changing runtime behavior. - No functional changes to Mouse Highlighter logic were made in this follow-up commit. ## Validation Steps Performed - Verified the only content change is the new `xhair` entry in spell-check expected words. - Ran secret scanning on changed file (`.github/actions/spell-check/expect.txt`) with no findings. - Ran parallel validation: - Code Review: no issues. - CodeQL: skipped as trivial metadata-only change. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
9ea30ec523 |
CmdPal: Fix fallback results showing when disabled in Command Palette (#48777)
Fallback results were showing in Command Palette search results even when the user had disabled them in settings. When a fallback command is disabled (e.g., VS Code for Command Palette with `IsEnabled = false`), it is excluded from `configuredGlobalFallbackIds` (which only contains enabled + global fallbacks). However, during search filtering, all fallbacks NOT in `configuredGlobalFallbackIds` were unconditionally added to `commonFallbacks`, which gets scored and displayed in results. This means disabled fallbacks still appeared. To fix, I added an `IsEnabled` check when building the `commonFallbacks` list in `MainListPage.cs`. Disabled fallback commands are now properly excluded from search results. Fixes #48504 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
c777fcc1e4 |
Fix CmdPal gallery crash when extension has no homepage (#48869)
## Summary
Selecting an extension in the CmdPal Extension Gallery crashed the app
when that extension had **no `homepage`** defined.
## Root cause
In `ExtensionGalleryItemPage.xaml`, the "View repository"
`HyperlinkButton` bound its `NavigateUri` (a `System.Uri`) directly to
the raw string property `ViewModel.Homepage`:
```xml
NavigateUri="{x:Bind ViewModel.Homepage, Mode=OneWay}"
```
`x:Bind` evaluates **all** bindings on an element regardless of
`Visibility`, and to assign a `string` to a `Uri` target it generates a
`new Uri(value)` conversion. When `homepage` is undefined, `Homepage` is
`null`, so the binding executes `new Uri(null)` →
`ArgumentNullException` → the page crashes on load. The
`Visibility="{... HasHomepage}"` collapse did not help because the
`NavigateUri` binding still runs.
Every other `NavigateUri` x:Bind in the codebase (`Link`, `LinkUri`) is
already bound to a `Uri?`, so the homepage hyperlink was the lone
offender.
## Fix
- **`ExtensionGalleryItemViewModel.cs`** — Added a validated `Uri?
HomepageUri` property backed by the existing `_homepageHttpUri` (already
`null` for missing or non-web homepages).
- **`ExtensionGalleryItemPage.xaml`** — Bound `NavigateUri` to
`ViewModel.HomepageUri` instead of the raw string. `null` is valid for
`NavigateUri`, so no conversion occurs. The tooltip still shows the
`Homepage` string.
- **Tests** — Added coverage asserting `HomepageUri` is set for a web
homepage and `null` when missing.
## Verification
- `Microsoft.CmdPal.UI.ViewModels`, `Microsoft.CmdPal.UI` (XAML
compile), and the unit test project all built cleanly (x64/Release, exit
code 0).
- All 24 `ExtensionGalleryItemViewModelTests` pass, including the two
new cases.
- Manually verified in VS that opening an extension without a homepage
no longer crashes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
https://github.com/user-attachments/assets/b268bafb-6bee-4862-9fbf-7a0e06675e36
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
28e078897a |
[CmdPal] Fix memory leak in PerformanceWidgetsPage network band items (#48880)
## Summary Fixes a memory leak in the Performance Monitor dock extension where `GetItems()` created **new** `ListItem` instances for `_networkUpItem` and `_networkDownItem` on every call. ## Problem When the dock subscribes to `ItemsChanged` and calls `GetItems()` to refresh, the band page path allocates 2 new `ListItem` objects each time — the old ones are replaced in the fields but never collected (they remain referenced by the `DockItemViewModel` wrappers until the next refresh cycle). Under normal operation this leaks ~2 objects/second indefinitely. ## Fix Move `_networkUpItem`/`_networkDownItem` creation into the constructor (matching the pattern used by CPU, Memory, GPU, and Battery items). `GetItems()` now returns stable references. The `Updated` event handler already updates their `.Title` properties, which propagates to the UI via `PropChanged` → `CommandItemViewModel.Model_PropChanged`. ## Validation - Build succeeds (`Microsoft.CmdPal.Ext.PerformanceMonitor.csproj`) - Network up/down band items still receive title updates via the existing `Updated` handler - No `RaiseItemsChanged()` needed — `ListItem.Title` setter fires `PropChanged`, which `DockItemViewModel` already observes --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
64f1243bdf |
Skip auto-labeling PRs that already have labels (#48877)
## Summary The auto-labeler workflow now skips pull requests that already have labels applied before running the AI classification. This avoids overwriting or duplicating labels that were manually set by contributors or maintainers. ## Changes - Added a check in `labelIssue()` that returns early for PRs with existing labels, logging which labels are already present. - Issues continue to be labeled regardless (only PRs get the skip logic). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
e1074bc835 |
ZoomIt - Update notices (#48843)
<!-- 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 Update notices for ZoomIt dependency <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] 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 - [ ] **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 |
||
|
|
2390aacbfc |
CmdPal: Prevent same-page settings navigation (#48703)
Fixes #48698 by preventing the Command Palette settings frame from navigating to the same page again, which avoids adding a self-navigation entry to the back stack. Co-authored-by: root <root@io.bbq> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
a864d421fc |
[Keyboard Manager] Fix stuck modifiers and dropped key-to-text remaps (#48571)
## Summary Fixes stuck modifier keys and silently-dropped remaps on Keyboard Manager's **single key → text** path, and adds unit coverage (including a mockable injection-failure seam). ## What this changes 1. **Insert a dummy key event before releasing held modifiers.** Releasing a lone Win or Alt key-up otherwise triggers the Start Menu / menu bar. The dummy key absorbs it so the release is inert. The dummy + releases are only injected when a modifier is actually held. 2. **Accept `WM_SYSKEYDOWN` as well as `WM_KEYDOWN`.** While Alt is held the system delivers `WM_SYSKEYDOWN`, so the previous `WM_KEYDOWN`-only guard silently dropped the remap whenever Alt was down. 3. **Route `Helpers::SendTextInput` through `InputInterface`** instead of calling Win32 `SendInput` directly. Besides making the path mockable, this stops the existing unit tests from injecting real keystrokes into the OS during a test run. Text is still flushed per character to preserve the existing batching workaround. 4. **Never re-press released modifiers.** Once a modifier key-up is injected, `GetAsyncKeyState` reports it as up, so re-pressing risks leaving it stuck if the user let go during injection. Leaving it released is always safe. ## Testing - New `MockedInput` failure seam (`SetSendVirtualInputShouldFail`). - `RemappedKey_ShouldPassOriginalKeyThrough_WhenInjectionFails` — verifies the original key is passed through when injection fails (the core stuck-key behavior, previously untestable because the mock always succeeded). - `HandleSingleKeyToTextRemapEvent_ShouldFireAndReleaseAlt_WhenAltIsHeld` — covers fix #2 by asserting the remap still fires (and releases the held Alt) when the key arrives as `WM_SYSKEYDOWN`. - Full Keyboard Manager engine suite: **98/98 passing**, Release x64, against current `main`. This is one of a small set of related "stuck key" hardening fixes; each stands alone. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
3331bdf02a |
CmdPal: add support for compact mode (#48801)
This is a bear of a PR. Watch out. This PR adds support for compact mode to the command palette. In compact mode, the results of the command palette window are collapsed by default. And the only thing that is visible is the search bar. When the user types, the window is expanded only just enough to show the available results[^1] https://github.com/user-attachments/assets/fd11bbc9-1173-426f-8f44-b513baf2ac5f This is made possible by a fairly annoyingly substantial refactoring to how our windowing is done. Animating the size or bounds of an HWND on Windows is not fun. With pretty much any XAML application, you're going to get at least one frame of blackness when you resize your window. The trick then is to create an experience where it looks like your application is resizing, but the HWND never actually resizes. So the main bulk of this PR is actually just refactoring our window handling. Our `MainWindow` class now becomes a dummy holder of _some content_, and most of the main content is moved into the `CmdPalMainControl` class. `MainWindow`'s job then is to handle a transparent window that hosts some XAML content inside of it, and pretend that content is the real bounds of the window. We need to fake our NCHITTEST results, so that the edges of the XAML content act like they're the edge of the actual HWND. We need to hide our actual window frame and shadow, but then also re-create them in XAML around our content. Previously we've done work like this using a single full screen transparent window with XAML content inside of it. However that has the downside of not allowing the XAML content to be movable across different monitors. By faking out the NCHITTEST results, we allow users to resize and move the window using the normal user32 move size loop. Our HWND is also cropped (with SetWindowRgn to the bounds of the shadow around our XAML content. We need to include the shadow in the hit testable region, because if we don't, then the shadow will be visibly cropped on the edges. In compact mode, instead of centering our window in the middle of the monitor, the user can set a relative height where the search box opens on that monitor. This defaults to about 60% up from the bottom of the monitor, so that there's room for the results to expand downwards and feel centered within the screen. This position is a setting, so users can customize it to whatever they like. I've also added a developer only debug build only internal setting, which allows you to see the actual frame of our HWND. This makes it easier to visually debug where the bounds of the window are and understand a little bit more about the layout of our application. This setting and functionality is disabled in release builds. <img width="1334" height="1164" alt="cmdpal-compact-diagram" src="https://github.com/user-attachments/assets/cb1c273d-37cc-4cb7-8680-e1878aa20c9c" /> Closes #38423 [^1]: with some caveats: pages with details expand fully always. |
||
|
|
9ee0c7259b |
CmdPal: Dock Auto-hide (#48565)
This pull request introduces a new "Auto-hide" feature for the dock, allowing users to collapse the dock until they hover over its screen edge. The changes include updates to the settings model, UI, localization resources, and automated tests to support and verify this new functionality. **Show me:** https://github.com/user-attachments/assets/689625e8-9050-4a54-9c4b-9e303a3da63a **Conflicted?** "What if I have Taskbar and Dock on the same side and both with auto-hide turned on?" <img width="1437" height="264" alt="Screenshot 2026-06-14 144814" src="https://github.com/user-attachments/assets/bd037a11-0653-4b9a-bd21-625aca03b901" /> Closes #46239 --------- Co-authored-by: root <root@io.bbq> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
7e877558b9 |
Add powertoys-module-verification agent skill (#48717)
## Summary of the Pull Request
Adds a new **GitHub Copilot Agent Skill**,
`powertoys-module-verification`, under `.github/skills/`. It packages
the workflow, drive techniques, helper scripts, and per-module reference
data an AI agent uses to verify a single PowerToys module's
release-checklist items end-to-end (each checkbox → a structured PASS /
FAIL / BLOCKED verdict with evidence).
This is **docs/automation tooling only** — no product code, binaries, or
end-user strings are touched.
## PR Checklist
- [ ] Closes: #xxx
- [x] **Communication:** Internal tooling for release sign-off; happy to
adjust scope/placement based on review.
- [x] **Tests:** N/A — documentation/skill bundle only (no product code
paths). The 12 bundled `.ps1` helpers are agent utilities, not part of
the product build/test.
- [x] **Localization:** N/A — no end-user-facing strings.
- [x] **New binaries:** N/A — no binaries added.
- [x] **Dev docs:** This PR *is* developer-facing documentation/tooling.
## Detailed Description of the Pull Request / Additional comments
Layout follows the repo's Agent Skill guidelines
(`.github/instructions/agent-skills.instructions.md`) and matches the
existing skills under `.github/skills/`:
```
.github/skills/powertoys-module-verification/
├── SKILL.md # single entry doc (name/description/license frontmatter)
├── LICENSE.txt # Apache 2.0 (matches existing skills)
├── scripts/ # 12 PowerShell helper utilities used by the agent
└── references/
├── winapp-ui-testing.md # UIA-mechanics prerequisite doc
├── pre-flight.md / reporting-format.md / environment-setup.md / explorer-context-menu-flow.md
├── modules/ # per-module verification profiles
└── release-checklist/ # per-module checklists + index
```
Notes for reviewers:
- **`references/winapp-ui-testing.md`** is adapted from the
`winui-ui-testing` skill in
[microsoft/win-dev-skills](https://github.com/microsoft/win-dev-skills)
(MIT, © Microsoft Corporation and Contributors), with PowerToys-specific
edits. Provenance is recorded in the file header. Its skill frontmatter
was intentionally stripped so it is treated as a reference doc, not a
separately-discovered skill.
- **Checklist scope:** only modules already verified end-to-end (with a
sign-off report) are included for now — Environment Variables, File
Locksmith, Image Resizer, New+, Peek, PowerRename. Remaining modules'
checklists will be added as each is verified.
- No existing files are modified; this is purely additive under
`.github/skills/`.
## Validation Steps Performed
- Validated the bundle against the Agent Skill checklist in
`.github/instructions/agent-skills.instructions.md`: valid `name` (≤64
chars) + `description` + `license` frontmatter; `SKILL.md` body under
the 500-line guidance; single `SKILL.md`; `scripts/` + `references/`
resource buckets; all resource references use relative paths.
- Verified internal cross-references resolve after the migration (no
stale `helpers/`, `Winapp-SKILL.md`, or absolute-path tokens;
`src/modules/...` source citations left intact).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
386a16ff94 |
Revert "[CmdPal][Dock] Fix performance meter showing '???' after restart" (#48835)
Reverts microsoft/PowerToys#48682 I'm quite sure that OP did not build or test these changes, and they should not have merged. |
||
|
|
ada75d040a |
CmdPal: Hide uninstall option for system apps (#48804)
Command Palette currently shows the "Uninstall" context menu option for system apps like Windows Settings, Registry Editor, and Task Manager. Users can accidentally trigger uninstall on packages that should not be removable. This PR hides the uninstall option for system apps. It's probably not a perfect solution, but seemed to catch all I tried to test. Fixes #46826 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
086bd06eaf |
CmdPal: Accurate GPU usage in Dock (#48710)
Closes #48677. ## Root cause `GPUStats.GetData()` summed the cooked `Utilization Percentage` value of every `engtype=3D` GPU-Engine performance-counter instance for a given physical adapter. Each instance is a `(process, engine)` pair. Summing across processes for a single engine is correct (gives total engine utilization), but summing across **multiple 3D engines** on the same adapter compounds them and produces values >100% (the 104%/118% screenshots in the issue). The displayed value `sum / 100` therefore exceeded 1.0, and the chart fed the raw inflated `sum` directly. ## Fix Mirroring the bounded-counter approach used for CPU in #46381: 1. Bucket cooked values by `(physId, engineId)` rather than just `physId`. 2. Reduce per-adapter to the **maximum** engine utilization (what Task Manager surfaces as the overall GPU number). 3. Clamp the per-adapter value to `[0, 100]` before storing it as a 0–1 fraction in `Data.Usage` and pushing to the chart. 4. Defensive checks: skip `NaN` / `Infinity` / negative cooked values, and skip instances whose engine id can't be parsed. Co-authored-by: root <root@io.bbq> |
||
|
|
205ae601ce |
CmdPal: Fix bookmark dock bands disappearing on restart (#48092)
## Summary
Bookmarks pinned to the CmdPal dock disappear after a restart.
## Root Cause
`BookmarksCommandProvider` did not override `GetCommandItem(string id)`.
When `InitializeCommands` in `CommandProviderWrapper` processes pinned
dock band settings, the fallback path calls
`provider.GetCommandItem(commandId)`, which hit the base-class no-op
returning `null`. Any bookmark band that `GetDockBands()` failed to
return (due to a race, transient file error, or exception) was
irreversibly lost from the dock.
## Fix
Added `GetCommandItem` override to `BookmarksCommandProvider`. Given a
`"Bookmarks.Launch.{guid}"` ID, it:
1. Parses the GUID suffix
2. Looks up the `BookmarkData` in `_bookmarksManager` (under lock)
3. Constructs a `BookmarkListItem` (with `asBand: true`) and wraps it in
a `WrappedDockItem`
Uses `BookmarkTitle` (maps to `_bookmark.Name`, set synchronously in the
constructor) rather than `Title` (set asynchronously after
classification completes), matching the pattern used by
`AllAppsCommandProvider`, `SystemCommandExtensionProvider`, and others.
Fixes #47576
Co-authored-by: root <root@io.bbq>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
80f2b9b07d | CmdPal: Fix 1px gap between dock window and screen edge (#48091) | ||
|
|
5f1b496bf2 |
Shortcut Guide: Rename Win+Q to "Open Click to Do" for Copilot+ PCs (#48439)
Win+Q and Win+S were both labeled "Open search" in Shortcut Guide. On Copilot+ PCs, Win+Q launches Click to Do — not Search — so the duplicate label was misleading. ## Changes - `+WindowsNT.Shell.en-US.yml`: Renamed Win+Q entry from `Open search` → `Open Click to Do` with description `On Copilot+ PCs`; Win+S retains `Open search` ## 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 The Windows key shortcuts manifest had two entries with identical names (`Open search`) mapped to Win+Q and Win+S respectively. On Copilot+ PCs, Win+Q opens Click to Do, not Search. The Win+Q entry is corrected to `Open Click to Do` with a `On Copilot+ PCs` description to scope its applicability. ## Validation Steps Performed - Visually reviewed the YAML diff to confirm only the Win+Q entry name and description changed; Win+S entry is unchanged. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
a2218b3c3b |
[KeyboardManager] Fix sticky Ctrl caused by stale AltGr flag (#46672)
## Summary Fixes #46693 - The `static bool isAltRightKeyInvoked` flag in `HandleShortcutRemapEvent` is set when AltGr (RAlt+LCtrl) is pressed, but only reset inside Case 1's else branch — which requires a shortcut to be actively invoked (`isShortcutInvoked == true`) - If the user presses and releases AltGr when **no shortcut is active**, the flag stays `true` permanently across all future calls - Once stale, the flag blocks modifier key restoration and state resets at 13 locations throughout the function (lines 646, 670, 791, 800, 866, 880, 889, 907, 927, 978, 996), and causes LCtrl key-up events to `break` out of the handler loop (line 620-622) instead of being properly processed - This makes LCtrl permanently stuck for any shortcut remap that uses LCtrl as a modifier ## Fix Reset `isAltRightKeyInvoked` when `VK_RMENU` (Right Alt) is released, regardless of whether a shortcut is currently invoked. This is added as an `else if` right after the existing flag-set condition. ## Test plan - [ ] Configure a shortcut remap using LCtrl (e.g. LCtrl+Y → Backspace) - [ ] Press and release AltGr without triggering any shortcut - [ ] Use the LCtrl shortcut — verify Ctrl does not become stuck - [ ] Verify AltGr-based shortcuts still work correctly - [ ] Verify normal AltGr character input (e.g. AltGr+Q for @ on German layout) is unaffected --------- Co-authored-by: fluffyspace <fluffyspace@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
47335149f3 |
[Settings] Extract HandleNavigationFailure and test all null permutations (#48410)
## Summary Follow-up to #48409. That PR rewrote `ShellViewModel.Frame_NavigationFailed` to set `e.Handled = true` and log instead of re-throwing, but the unit tests it added only covered the `GetPageDisplayName` formatting helper. The actual contract that matters - "this handler must never throw, regardless of which fields on `NavigationFailedEventArgs` happen to be null" - was not directly testable because `NavigationFailedEventArgs` is a sealed WinRT type that cannot be constructed from MSTest. ## Change Tiny refactor: split the failure-handling logic out of `Frame_NavigationFailed` into a pure static `HandleNavigationFailure(Type sourcePageType, Exception exception)`. The WinUI-shaped handler now just sets `Handled = true` and delegates. This makes the "must not throw" invariant testable in isolation - no WinUI Frame, no Microsoft.UI.Xaml.Navigation types needed. ## Tests Added four new cases under `ShellViewModelTests`, exercising all four `(SourcePageType, Exception)` null permutations: | `sourcePageType` | `exception` | | - | - | | null | null | | typeof(...) | null | | null | new Exception(...) | | typeof(...) | new Exception(...) | Each test simply calls the helper and relies on MSTest's default "if it throws, the test fails" behavior. Any future change that re-introduces an unguarded dereference of `e.SourcePageType` or `e.Exception` will turn the corresponding test red. ## Validation All six tests pass: ``` Passed GetPageDisplayName_ReturnsFullName_ForKnownType Passed GetPageDisplayName_ReturnsPlaceholder_ForNullType Passed HandleNavigationFailure_DoesNotThrow_ForNullInputs Passed HandleNavigationFailure_DoesNotThrow_ForNullException Passed HandleNavigationFailure_DoesNotThrow_ForNullPageType Passed HandleNavigationFailure_DoesNotThrow_ForBothInputsPresent Total tests: 6, Passed: 6 ``` `PowerToys.Settings.csproj` and `Settings.UI.UnitTests.csproj` both build clean (Release|x64). ## Note This PR is stacked on top of #48409 (same branch lineage). If #48409 is merged first this PR will rebase cleanly to a small diff on `ShellViewModel.cs` + the additional test cases. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
5c63486dcb |
build(deps): bump actions/checkout from 6 to 7 (#48743)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/releases">actions/checkout's releases</a>.</em></p> <blockquote> <h2>v7.0.0</h2> <h2>What's Changed</h2> <ul> <li>block checking out fork pr for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> <li>getting ready for checkout v7 release by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2464">actions/checkout#2464</a></li> <li>update error wording by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2467">actions/checkout#2467</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.3...v7.0.0">https://github.com/actions/checkout/compare/v6.0.3...v7.0.0</a></p> <h2>v6.0.3</h2> <h2>What's Changed</h2> <ul> <li>Update changelog by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2357">actions/checkout#2357</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>Update changelog for v6.0.3 by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2446">actions/checkout#2446</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/yaananth"><code>@yaananth</code></a> made their first contribution in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6...v6.0.3">https://github.com/actions/checkout/compare/v6...v6.0.3</a></p> <h2>v6.0.2</h2> <h2>What's Changed</h2> <ul> <li>Add orchestration_id to git user-agent when ACTIONS_ORCHESTRATION_ID is set by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2355">actions/checkout#2355</a></li> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6.0.1...v6.0.2">https://github.com/actions/checkout/compare/v6.0.1...v6.0.2</a></p> <h2>v6.0.1</h2> <h2>What's Changed</h2> <ul> <li>Update all references from v5 and v4 to v6 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2314">actions/checkout#2314</a></li> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> <li>Clarify v6 README by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2328">actions/checkout#2328</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/checkout/compare/v6...v6.0.1">https://github.com/actions/checkout/compare/v6...v6.0.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/actions/checkout/blob/main/CHANGELOG.md">actions/checkout's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>v7.0.0</h2> <ul> <li>Block checking out fork PR for pull_request_target and workflow_run by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2454">actions/checkout#2454</a></li> <li>Bump actions/publish-immutable-action from 0.0.3 to 0.0.4 in the minor-actions-dependencies group across 1 directory by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2458">actions/checkout#2458</a></li> <li>Bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2460">actions/checkout#2460</a></li> <li>Bump js-yaml from 4.1.0 to 4.2.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2461">actions/checkout#2461</a></li> <li>Bump <code>@actions/core</code> and <code>@actions/tool-cache</code> and Remove uuid by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2459">actions/checkout#2459</a></li> <li>upgrade module to esm and update dependencies by <a href="https://github.com/aiqiaoy"><code>@aiqiaoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2463">actions/checkout#2463</a></li> <li>Bump the minor-npm-dependencies group across 1 directory with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/actions/checkout/pull/2462">actions/checkout#2462</a></li> </ul> <h2>v6.0.3</h2> <ul> <li>Fix checkout init for SHA-256 repositories by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2439">actions/checkout#2439</a></li> <li>fix: expand merge commit SHA regex and add SHA-256 test cases by <a href="https://github.com/yaananth"><code>@yaananth</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2414">actions/checkout#2414</a></li> </ul> <h2>v6.0.2</h2> <ul> <li>Fix tag handling: preserve annotations and explicit fetch-tags by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2356">actions/checkout#2356</a></li> </ul> <h2>v6.0.1</h2> <ul> <li>Add worktree support for persist-credentials includeIf by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2327">actions/checkout#2327</a></li> </ul> <h2>v6.0.0</h2> <ul> <li>Persist creds to a separate file by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2286">actions/checkout#2286</a></li> <li>Update README to include Node.js 24 support details and requirements by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2248">actions/checkout#2248</a></li> </ul> <h2>v5.0.1</h2> <ul> <li>Port v6 cleanup to v5 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2301">actions/checkout#2301</a></li> </ul> <h2>v5.0.0</h2> <ul> <li>Update actions checkout to use node 24 by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2226">actions/checkout#2226</a></li> </ul> <h2>v4.3.1</h2> <ul> <li>Port v6 cleanup to v4 by <a href="https://github.com/ericsciple"><code>@ericsciple</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2305">actions/checkout#2305</a></li> </ul> <h2>v4.3.0</h2> <ul> <li>docs: update README.md by <a href="https://github.com/motss"><code>@motss</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1971">actions/checkout#1971</a></li> <li>Add internal repos for checking out multiple repositories by <a href="https://github.com/mouismail"><code>@mouismail</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1977">actions/checkout#1977</a></li> <li>Documentation update - add recommended permissions to Readme by <a href="https://github.com/benwells"><code>@benwells</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2043">actions/checkout#2043</a></li> <li>Adjust positioning of user email note and permissions heading by <a href="https://github.com/joshmgross"><code>@joshmgross</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2044">actions/checkout#2044</a></li> <li>Update README.md by <a href="https://github.com/nebuk89"><code>@nebuk89</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2194">actions/checkout#2194</a></li> <li>Update CODEOWNERS for actions by <a href="https://github.com/TingluoHuang"><code>@TingluoHuang</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2224">actions/checkout#2224</a></li> <li>Update package dependencies by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/2236">actions/checkout#2236</a></li> </ul> <h2>v4.2.2</h2> <ul> <li><code>url-helper.ts</code> now leverages well-known environment variables by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1941">actions/checkout#1941</a></li> <li>Expand unit test coverage for <code>isGhes</code> by <a href="https://github.com/jww3"><code>@jww3</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1946">actions/checkout#1946</a></li> </ul> <h2>v4.2.1</h2> <ul> <li>Check out other refs/* by commit if provided, fall back to ref by <a href="https://github.com/orhantoy"><code>@orhantoy</code></a> in <a href="https://redirect.github.com/actions/checkout/pull/1924">actions/checkout#1924</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
|
|
bf6dbd8865 |
feat(Advanced Paste): Add setting to show/hide AI paste section (#45242)
## Summary of the Pull Request Adds a new "Show AI paste section" setting to Advanced Paste that allows users to hide the AI paste input box from the Advanced Paste window. This addresses user requests for a cleaner UI when the AI paste feature is not needed or desired. ## PR Checklist - [x] Closes: #32967 - [ ] **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 - [x] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **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 PR implements a new boolean setting `ShowAIPaste` that controls the visibility of the AI paste input box (PromptBox) in the Advanced Paste window. ### Changes Made **Settings UI Library:** - `src/settings-ui/Settings.UI.Library/AdvancedPasteProperties.cs` - Added `ShowAIPaste` property with JSON serialization **Settings UI:** - `src/settings-ui/Settings.UI/ViewModels/AdvancedPasteViewModel.cs` - Added view model property with change notification - `src/settings-ui/Settings.UI/SettingsXAML/Views/AdvancedPastePage.xaml` - Added checkbox setting in the UI Behavior section - `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw` - Added localized strings for header and description **Advanced Paste Module:** - `src/modules/AdvancedPaste/AdvancedPaste/Helpers/IUserSettings.cs` - Added interface property - `src/modules/AdvancedPaste/AdvancedPaste/Helpers/UserSettings.cs` - Implemented setting loading from properties - `src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs` - Added `ShowAIPasteSection` property combining user setting with GPO policy - `src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Pages/MainPage.xaml` - Bound PromptBox visibility to new property **Tests:** - `src/modules/AdvancedPaste/AdvancedPaste.UnitTests/Mocks/IntegrationTestUserSettings.cs` - Added mock property - `src/modules/AdvancedPaste/UITest-AdvancedPaste/TestFiles/settings.json` - Updated test settings file ### Behavior - Default value is `true` (AI paste section visible) to maintain backward compatibility - The setting respects GPO policy - if AI is disabled by GPO, the section will be hidden regardless of user preference - Setting is persisted in the Advanced Paste settings JSON file ## Validation Steps Performed - [x] Verified setting appears in Settings UI under Advanced Paste → UI Behavior - [x] Verified toggling the setting hides/shows the AI paste input box in the Advanced Paste window - [x] Verified setting persists after closing and reopening Settings - [x] Verified default value is `true` (visible) for new installations - [x] Verified existing unit tests pass with updated mock Fixes #32967 --------- Co-authored-by: Niels Laute <niels.laute@live.nl> |
||
|
|
3c942ae356 |
Quick Accent: Add ¡ and ¿ to ! and ? quick accent menu (#20618) (#48599)
<!-- 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 addresses issue #20618 by adding the inverted exclamation mark (**¡**) to the **!** key (`VK_1`) and the inverted question mark (**¿**) to the **?** key (`VK_SLASH_`) for both Spanish (`SP`) and Catalan (`CA`) character mappings in Quick Accent. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #20618 <!-- - [ ] 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 - [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 Adds the inverted punctuation marks `¡` (inverted exclamation mark) and `¿` (inverted question mark) to the character mappings of Spanish (`SP`) and Catalan (`CA`) languages in `CharacterMappings.cs`. - `LetterKey.VK_1` (`!`) now maps to `¡` - `LetterKey.VK_SLASH_` (`?`) now maps to `¿` This enables quick accent popups when pressing these respective keys, aligning with the expected behavior for these languages. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed 1. Verified character mapping changes build successfully. 2. Verified that the PowerToys CI pipeline checks completed successfully. |
||
|
|
be4c3a1afa |
ZoomIt: add WebP/JPG screenshot encoder (#48818)
<!-- 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 webp and jpg support for screenshots. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] 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 - [ ] **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 |
||
|
|
968a7ac4b6 |
[Peek] Stop fail-fast in AppWindow.Closing path; reset cached preview-handler factories on release (#48564)
## Summary
Harden Peek's `AppWindow.Closing` path so a stale cached preview-handler
factory can't fail-fast the Peek process. Also clean up the matching
path in RegistryPreview.
## Background
Spotted while reading through Peek's `MainWindow` teardown sequence and
the `ShellPreviewHandlerPreviewer` cache for an unrelated review of how
Peek manages out-of-process preview-handler lifetimes.
The Peek `MainWindow` subscribes to `AppWindow.Closing`. The handler
doesn't actually close the window — it sets `args.Cancel = true` and
calls `Uninitialize()`, which in turn calls
`ShellPreviewHandlerPreviewer.ReleaseHandlerFactories()`.
`ReleaseHandlerFactories()` looked like this:
```csharp
public static void ReleaseHandlerFactories()
{
foreach (var factory in HandlerFactories.Values)
{
try { Marshal.FinalReleaseComObject(factory); } catch { }
}
}
```
Two problems:
1. The static `HandlerFactories` dictionary is never cleared. After
`FinalReleaseComObject`, the entries still point at separated RCWs. A
subsequent activation that races with this cleanup (or a second close in
the same process) can pick up the dead RCW from the cache.
2. The cached factory had `LockServer(true)` called on it when it was
first cached, but the matching `LockServer(false)` was never paired.
Any managed exception that escapes a WinRT event callback is projected
back to CFlat as a failed HRESULT and the CsWinRT dispatcher fail-fasts
the process. So a single `InvalidComObjectException` (HRESULT
0x80131527) thrown out of `Uninitialize()` is enough to terminate Peek.
## Changes
* **`ShellPreviewHandlerPreviewer.ReleaseHandlerFactories`** — snapshot
then clear the dictionary up front so that a subsequent call (or a
concurrent `LoadPreviewAsync`) can't pick up a stale RCW. Call
`LockServer(false)` before `FinalReleaseComObject` to mirror the
cache-time `LockServer(true)`. Both COM calls remain individually
wrapped because the RCW may already be unreachable during process
teardown.
* **`Peek.UI/MainWindow.xaml.cs` — `AppWindow_Closing`** — wrap the body
in try/catch + `Logger.LogError`. Any future exception in
`Uninitialize()` (or its callees) will now log instead of fail-fasting
the process.
* **`RegistryPreview/MainWindow.Events.cs` — `AppWindow_Closing`** —
same defensive try/catch, plus null-guard `jsonWindowPlacement` before
`SetNamedValue`. The placement dictionary can legitimately be null on
first run or after a corrupt placement file; previously that would NRE →
fail-fast.
## Risk
Low. The `ReleaseHandlerFactories` change matches the documented
`LockServer`/`FinalReleaseComObject` pairing and only widens the
lifetime window of the cache by `Clear()`-ing earlier; nothing in Peek
calls this method outside of teardown. The two try/catch wrappers
strictly add defense — the success path is unchanged.
## Validation
Spot-built locally; this repo's `dotnet restore` runtime-pack issue
(unrelated to this PR — same NU1102 pattern that's affecting other open
PRs) prevents a full `Build.cmd` here. The C++ side of Peek is
untouched.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
ADO:
https://microsoft.visualstudio.com/DefaultCollection/OS/_workitems/edit/58765809/
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Boliang Zhang <122517415+LegendaryBlair@users.noreply.github.com>
|
||
|
|
dd26d86580 |
[FancyZones] Fix stuck drag state and swallowed keys when a window is destroyed mid-drag (#48569)
## Summary Fixes a class of "stuck drag" bugs in FancyZones where closing or destroying a window **while it is being dragged** leaves FancyZones in a half-dragging state — zone overlays stay on screen and subsequent keystrokes (notably number keys) are swallowed or misrouted. ## What this changes - **Subscribe to and dispatch `EVENT_OBJECT_DESTROY`.** `FancyZonesApp` never subscribed to the destroy event, and the consumer's `WM_PRIV_WINDOWDESTROYED` branch could therefore never fire. The event is now registered and routed through `HandleWinHookEvent`. - **Abort the drag (without snapping) when the dragged window is destroyed.** On `WM_PRIV_WINDOWDESTROYED`, if the destroyed HWND is the one being dragged, call the new `WindowMouseSnap::Abort()` (tears down overlays/highlights/transparency) instead of `MoveSizeEnd()`, which would try to snap the now-dead HWND and corrupt zone state. Dragging state is then disabled. - **Always clear dragging state in `MoveSizeEnd()`**, even when the snapper was already null, so the state can't get stranded. - **Require Win+Ctrl+Alt to switch layouts while dragging.** Previously any digit switched layouts while `dragging` was true; if drag state was stuck this "stole" number keys from the focused app. This is the root-cause fix for the number-key-stealing symptom. - **Only swallow the bare Shift key during a drag**, not `Shift+<other>` combos, so real keystrokes are no longer eaten by an in-progress drag. ## Testing - Builds Release x64 (FancyZones) clean against current `main`. - Manually verified drag → close window mid-drag no longer leaves overlays up or steals number keys. (FancyZones has no unit-test harness for this path.) This is one of a small set of related "stuck key / stuck state" hardening fixes; each stands alone. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Muyuan Li <116717757+MuyuanMS@users.noreply.github.com> |