mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-07-09 12:00:14 +02:00
03c97e036699eabb100bcd0be879d7c262bb87ff
1057 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ab4947579b |
[QuickAccess] Suppress unhandled XAML exceptions in flyout host (#48457)
## Summary Adds the two missing top-level exception handlers in the QuickAccess (Preview) flyout host so that an unhandled XAML exception during launch or page navigation no longer FailFasts `PowerToys.QuickAccess.exe`. Spotted while reading through `App.OnLaunched` and `ShellPage` for an unrelated review of the flyout startup path — none of the existing handlers exist yet, so any throw during `MainWindow` construction, `ShellHost.Initialize`, or `ContentFrame.Navigate(typeof(LaunchPage) | typeof(AppsListPage), …)` bubbles all the way out to the Windows App SDK runtime and is stowed as a XAML failure. Compare with `src\settings-ui\Settings.UI\SettingsXAML\App.xaml.cs`, which already wires `UnhandledException += App_UnhandledException`. ## Changes **`src\settings-ui\QuickAccess.UI\QuickAccessXAML\App.xaml.cs`** - Hook `Application.UnhandledException` in the constructor. The handler logs the exception via `ManagedCommon.Logger.LogError` (same logger Settings uses) and sets `e.Handled = true`. QuickAccess is a transient launcher flyout owned by the runner, so swallowing a stray XAML error and keeping the host alive for the next summon is the correct trade-off — the failure is still recorded for diagnostics. - Wrap the body of `OnLaunched` in a try/catch. If `MainWindow` (which sets up window chrome, listener threads, the IPC coordinator, and the XAML shell) fails to construct, log the exception and call `Exit()` cleanly rather than letting the throw escape into the Windows App SDK launch path. **`src\settings-ui\QuickAccess.UI\QuickAccessXAML\Flyout\ShellPage.xaml.cs`** - Subscribe to `ContentFrame.NavigationFailed` after `InitializeComponent`. A page constructor or XAML-load failure in `LaunchPage` / `AppsListPage` would otherwise bubble out of the `Frame` and crash the launcher. The handler logs the failure (`SourcePageType.FullName` + the exception) and marks it handled so the next summon retries navigation. No production behaviour changes when things work — only the failure paths are different. No public API surface changes. ## Why both handlers, not just one - `Application.UnhandledException` does not fire for `Frame.NavigationFailed`. The Frame raises its own event first and, if no handler runs or `e.Handled` is left `false`, then it rethrows on the dispatcher. - Conversely, `Frame.NavigationFailed` only fires for navigation failures — not for an exception thrown directly in `OnLaunched` before any navigation happens. The two events are complementary, so both need a handler to fully cover the launch + navigation paths. ## Testing - The local NuGet feed on my dev box currently can't restore `Microsoft.NETCore.App.Runtime.win-x64 = 10.0.9` (the feed only has `11.0.0-preview.1.26104.118`), which fails the project restore for every WinUI project including this one. That's the same environment issue I called out on #48414 — pipeline restore uses a different feed and is fine. - All three patterns added here are copy-paste analogues of code that already exists in `Settings.UI` (`App.xaml.cs:96, 106-109`, `ShellViewModel.cs:86, 136`), so namespace and signature drift risk is minimal. The only behavioural difference is `e.Handled = true`, which is the actual goal of this PR. ## Risk - Low. Two new event handlers and one try/catch. No behaviour change on the success path. - Worst-case regression is that a real, repeatable XAML failure becomes silent in the runner's eyes (no process crash) instead of loud — but it's logged via `Logger.LogError` so the user can still find the trace in `%LOCALAPPDATA%\Microsoft\PowerToys\Logs\`. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ADO: https://microsoft.visualstudio.com/DefaultCollection/OS/_workitems/edit/61258633/ --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
14152672c5 |
Add defensive error handling for Settings navigation and search (#46688)
## Summary Addresses the **root cause chain** behind the NullReferenceException crash in Settings navigation. Crash dump analysis with WinDbg revealed that `Frame.Navigate()` can throw native WinUI ABI exceptions that propagate unhandled through multiple code paths. ### Changes (3 files) **NavigationService.cs** — Defensive try-catch for all `Frame.Navigate()` call sites: - `Navigate()`: Wrap in try-catch, log via `Logger.LogError()`, return `false` on failure - `EnsurePageIsSelected()`: Add matching try-catch for consistency (also calls `Frame.Navigate()` unprotected) - Protects **all** navigation in the Settings app **ShellViewModel.cs** — Fix the crash-causing `Frame_NavigationFailed` handler: - Replace `throw e.Exception` with `e.Handled = true` + `Logger.LogError()` - The original code threw `NullReferenceException` when `e.Exception` was null (native WinUI errors don't always marshal to managed Exception objects) - Mark the event as handled to prevent framework error propagation **ShellPage.xaml.cs** — Protect `async void SearchBox_QuerySubmitted`: - Wrap entire method body in try-catch - `async void` methods that throw after `await` produce unhandled exceptions that crash the process - Covers both search indexing (`Task.Run`) and navigation failures ### Crash Dump Evidence Analysis of `PowerToys.Settings_2025_03_26_48636.dmp` with WinDbg: - 4 stowed exception records found at `0x000001c60d3b9100` - Exception chain: `SearchBox_QuerySubmitted` → `Frame.Navigate()` fails at native ABI → `NavigationFailed` fires with null Exception → `throw null` → `NullReferenceException` → `FailFastWithStowedExceptions` - Root failure in `Microsoft.UI.Xaml.dll!DirectUI::Frame::Navigate` ### Review Notes - `catch (Exception)` pattern matches 92.5% of Settings.UI codebase convention - `Logger.LogError()` with `using ManagedCommon` matches standard import pattern - No security concerns: logged page type names are not sensitive data - Build verified locally (38/38 applicable tests pass; 111 COM-dependent tests fail identically on main) Co-authored-by: Tucker Burns <tuck.burns@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
272b725ff0 |
Add ZoomIt webcam backgroun (blur) and microphone noise cancellation (#48266)
<!-- 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 adds the [RNNoise](https://github.com/xiph/rnnoise) filter for noise cancellation (audio) and the [Google mediapipe](https://github.com/google-ai-edge/mediapipe/tree/master) `selfie_segmentation_cpu` model for webcam background detection and blurring. It also fixes an issue introduced with |
||
|
|
92014c81b9 |
[PowerDisplay] Add linked brightness control (#48207)
## Summary of the Pull Request Adds linked brightness control to PowerDisplay so multiple brightness-capable monitors can be controlled from a single "All Displays" slider. This PR: - Adds a linked brightness mode with one master brightness slider. - Seeds the master slider from the linked display with the lowest Windows DISPLAY number, falling back to monitor ID for determinism. - Persists linked mode enabled/disabled state. - Persists per-monitor exclusions by monitor ID. - Keeps individual display cards available under an expandable section while linked mode is enabled. - Shows linked-state guidance in the link icon tooltip instead of a separate info banner. - Allows excluded displays to keep their own independent brightness slider. - Keeps profiles as per-monitor snapshots; applying a profile turns linked brightness off before applying the profile values. - Adds unit tests for linked-brightness selection/seed behavior and settings compatibility. ## PR Checklist - [x] Closes: #47319 - [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 ## Detailed Description of the Pull Request / Additional comments **Screenshots** | State | Light | Dark | | --- | --- | --- | | Linked mode off | <img width="519" height="817" alt="image" src="https://github.com/user-attachments/assets/bdfae94b-b2e2-4ad3-a45c-7925bb9e5dcd" /> | <img width="520" height="817" alt="image" src="https://github.com/user-attachments/assets/69290a70-0375-480d-957c-c9e0af43d18e" /> | | Linked mode on | <img width="520" height="307" alt="image" src="https://github.com/user-attachments/assets/a2b3572b-e51f-4bdc-9209-23ad2f96d27a" /> | <img width="520" height="307" alt="image" src="https://github.com/user-attachments/assets/8b14b665-b641-4256-a15b-eced82e62728" /> | | Linked mode on — individual displays expanded | <img width="520" height="895" alt="image" src="https://github.com/user-attachments/assets/0b40e60d-e78a-4814-baf6-00be7e283edd" /> | <img width="520" height="895" alt="image" src="https://github.com/user-attachments/assets/4f59bbfa-d6e5-4cb7-af84-cb484f922a7c" /> | The first version is intentionally scoped to brightness-only linked control. Contrast, volume, color temperature, input source, and LightSwitch-specific behavior remain independent. Linked brightness is stored as global PowerDisplay settings: - `linked_levels_active` - `excluded_from_sync_monitor_ids` Newly connected brightness-capable monitors are included by default, because the exclusion list is the explicit exception. Hotplugging a monitor does not immediately write brightness; linked hardware writes happen only after the user changes the master slider. Profiles remain per-monitor snapshots. This PR does not add profile-level linked brightness configuration. If linked brightness is active when a profile is applied, linked mode is turned off first, then the saved per-monitor profile values are applied. That avoids leaving the master linked slider active while hardware brightness has been changed independently per monitor. When linked mode is turned on, the master slider is seeded from the linked brightness-capable display with the lowest Windows DISPLAY number, falling back to monitor ID for determinism. Excluded displays and displays without brightness support are ignored; if no linked target remains, the master slider stays disabled. The seed only positions the slider; it is never written to hardware, so the first user gesture is the first broadcast. ## Validation Steps Performed - Built `PowerDisplay.Lib.UnitTests` Debug x64: ```powershell .\tools\build\build.ps1 -Platform x64 -Configuration Debug -Path src\modules\powerdisplay\PowerDisplay.Lib.UnitTests ``` - Ran `PowerDisplay.Lib.UnitTests` with `vstest.console.exe` - Ran the XAML styling script: ```powershell .\.pipelines\applyXamlStyling.ps1 -Main ``` - Result: the XAML styling script completed successfully and processed `src/modules/powerdisplay/PowerDisplay/PowerDisplayXAML/MainWindow.xaml`. |
||
|
|
87fa204fd6 |
Disable Shortcut Guide by default on clean installs (#48383)
## Summary Flips the default for the `Shortcut Guide` entry in `enabledModules` from `true` to `false`. New PowerToys installs (no prior `settings.json`) will start with Shortcut Guide disabled, matching how other newer modules (PowerToys Run, MouseJump, AdvancedPaste, MouseWithoutBorders, CropAndLock, QuickAccent, TextExtractor, MousePointerCrosshairs, KeyboardManager) already ship off-by-default in `EnabledModules.cs`. ## Why Shortcut Guide has been on-by-default since the early days, but it is an opt-in style utility (overlay launched on hotkey). It should not be active for users who never asked for it on a fresh install. ## Changes - `src/settings-ui/Settings.UI.Library/EnabledModules.cs` -- flip `shortcutGuide` backing field from `= true` to bare declaration with the file's `// defaulting to off` comment convention. - `src/settings-ui/Settings.UI.UnitTests/ViewModelTests/General.cs` -- update the corresponding `AllModulesAreEnabledByDefault` assertion. ## Compatibility Existing installs are unaffected: their `settings.json` already persists the user's prior value (`true`), so anyone who has it on today keeps it on. Only freshly created `EnabledModules` instances pick up the new default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
76eb6eaac5 |
Add copy monitor diagnostics button to Power Display (#48209)
<!-- 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: #47572 <!-- - [ ] 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 In the powerdisplay tool, Added a new button, that allows to copy the current display configuration, to allow to share for troubleshooting, or just sharing. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed |
||
|
|
7f19817182 |
Rework Power Display warning dialog (#48249)
## Summary of the Pull Request Rework the confirmation dialog shown when enabling Power Display (and its potentially-destructive sub-features) so it is shorter, friendlier, and consistent across all entry points. The five separate prefix-driven variants are now a single `PowerDisplayWarningDialog` user control selected via an enum, sharing the title, learn-more link, and Enable/Cancel buttons. The previous hand-rolled red warning text is replaced with a Fluent `InfoBar Severity=""Warning""`. ## 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 - [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 ## Detailed Description of the Pull Request / Additional comments ### Before - `DangerousFeatureWarningDialog` took a resource-key prefix string and probed up to five optional keys per variant (`_WarningHeader`, `_WarningConfirm`, `_WarningList_Item1/2`, etc.). - Each of the five flows (EnableModule, ColorTemperature, PowerState, InputSource, MaxCompatibility) had a slightly different title (some questions, some statements, mixed `Warning:` prefixes) and a hand-rolled red `TextBlock` warning header with a `⚠️` emoji and `SystemFillColorCriticalBrush`. - ~30 fragmented `PowerDisplay_*_Warning*` resw keys. ### After - New `PowerDisplayWarningDialog` selected via `PowerDisplayWarningKind` enum (`EnableModule`, `ColorTemperature`, `PowerState`, `InputSource`, `MaxCompatibility`). - Shared chrome lives in the control: - Single title `Before you continue` for every variant. - `InfoBar Severity=""Warning""` replaces the hand-rolled red header. - Learn-more `HyperlinkButton` pointing at `aka.ms/powerToysOverview_PowerDisplay_Note` (URL is a `private const` so translators don't see it). - Consistent Enable / Cancel buttons. - Per-variant content collapses to one InfoBar message + one body paragraph in resw (12 keys total, down from ~30). Bullets are inlined as `• ` + newlines with `xml:space=""preserve""`. - `PowerDisplayViewModel.ConfirmDangerousFeatureAsync` and `TryCommitDangerousChangeAsync` now take the enum instead of a magic string. ### Files - **Added:** `ViewModels/PowerDisplayWarningKind.cs`, `SettingsXAML/Views/PowerDisplayWarningDialog.xaml{,.cs}` - **Removed:** `SettingsXAML/Views/DangerousFeatureWarningDialog.xaml{,.cs}` - **Updated:** `Strings/en-us/Resources.resw`, `ViewModels/PowerDisplayViewModel.cs`, `SettingsXAML/Views/PowerDisplayPage.xaml.cs` ## Validation Steps Performed - Built `PowerToys.Settings.csproj` (Debug arm64) — clean. - Manually exercised the EnableModule and MaxCompatibility flows; verified the new title, InfoBar, body paragraph, learn-more link, and Enable/Cancel button behavior. - Verified `aka.ms/powerToysOverview_PowerDisplay_Note` opens in the default browser. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
a33fd3c474 |
[KBM] Enable new editor by default (#48245)
## Summary Make the new WinUI 3 Keyboard Manager editor the default by flipping `useNewEditor` from `false` to `true` everywhere a default is supplied. ## Behavior - **New installs / new `settings.json`** → new editor enabled - **Upgrades from a version before the `useNewEditor` key existed** → new editor enabled (the key is missing, so the default kicks in) - **Users who have explicitly toggled the setting** → unchanged (we only change the default, not stored values) - The "Go back to classic" button in the KBM settings page is untouched ## Changes - `src/settings-ui/Settings.UI.Library/KeyboardManagerProperties.cs` — `UseNewEditor` property initializer now `true` - `src/modules/keyboardmanager/dll/dllmain.cpp` — `m_useNewEditor` member init + `GetNamedBoolean` fallback now `true`; warn-log message updated to match - `src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys/Modules/KeyboardManagerModuleCommandProvider.cs` — both fallback paths in `IsUseNewEditorEnabled` (file missing / unreadable) now return `true`, so the "Open New Editor" CmdPal command surfaces by default ## Validation Built locally on ARM64 Debug (exit code 0): - `src/modules/keyboardmanager/dll` - `src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.PowerToys` - `src/settings-ui/Settings.UI.Library` Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
b712fa4d85 |
Reword Shortcut Guide module and OOBE descriptions (#48248)
## Summary of the Pull Request Reword the Shortcut Guide module description and OOBE description so they describe the feature without referring to `your apps`. The module description now reads as a single sentence covering Windows and the active app; the OOBE description is shortened to one paragraph and refers to `various applications` instead of enumerating the bundled apps. ## 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 - [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 ## Detailed Description of the Pull Request / Additional comments Two strings in `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw` changed: - `ShortcutGuide.ModuleDescription` — now: `Shows an on-screen overlay of keyboard shortcuts for Windows and the active application.` - `Oobe_ShortcutGuide.Description` — collapsed to one sentence describing Windows + various applications, no longer enumerating bundled apps or mentioning future additions. No code or behavioral changes. ## Validation Steps Performed - Built Settings.UI (Debug arm64) – clean. - Verified the Shortcut Guide module card in Settings UI shows the new description and the OOBE Shortcut Guide page shows the new paragraph. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
0cb6fe250b |
Rename Settings UI label from “Shortcut Guide V2” to “Shortcut Guide” (#48151)
## Summary of the Pull Request This updates PowerToys Settings to remove the obsolete “V2” suffix from the Shortcut Guide module name. The UI now consistently shows **Shortcut Guide**. ## 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 - **Settings navigation label** - Updated `Shell_ShortcutGuide.Content` to `Shortcut Guide`. - **Module title** - Updated `ShortcutGuide.ModuleTitle` to `Shortcut Guide`. - **OOBE title** - Updated `Oobe_ShortcutGuide.Title` to `Shortcut Guide`. ```xml <data name="Shell_ShortcutGuide.Content" xml:space="preserve"> <value>Shortcut Guide</value> </data> ``` ## Validation Steps Performed - N/A for behavior-level validation in this description (change is limited to localized display strings). --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
c0cb9417ad |
Remove "NEW" tag from Power Display and Grab and Move (#48174)
## Summary of the Pull Request Both Power Display and Grab and Move have matured beyond their initial release phase. This removes the "NEW" `InfoBadge` from their navigation items in Settings, the two parent navigation groups (Windowing & Layouts, Input / Output) that surfaced the badge when collapsed, and clears the `IsNew` flag for Power Display in the OOBE shell. <img width="1867" height="973" alt="image" src="https://github.com/user-attachments/assets/533f271c-c70f-414f-a76a-43fd9ffbbd44" /> <img width="497" height="575" alt="image" src="https://github.com/user-attachments/assets/fe1e97c3-c806-4f42-a836-76e042630d61" /> <img width="1619" height="1027" alt="image" src="https://github.com/user-attachments/assets/f5db715b-bc69-4505-803a-18a9b2716280" /> ## PR Checklist - [x] Closes: #48153 - [x] **Communication:** Tracked by the linked issue - [x] **Tests:** Markup-only change; Settings.UI builds clean with WinUI markup compiler (no XAML errors) - [x] **Localization:** No end-user-facing strings changed - [ ] **Dev docs:** N/A - [ ] **New binaries:** N/A - [ ] **Documentation updated:** N/A ## Detailed Description of the Pull Request / Additional comments Files touched: - `src/settings-ui/Settings.UI/SettingsXAML/Views/ShellPage.xaml` — removed four `<InfoBadge Style="{StaticResource NewInfoBadge}" />` blocks on `GrabAndMoveNavigationItem`, `PowerDisplayNavigationItem`, and on the two parent group headers `WindowingAndLayoutsNavigationItem` and `InputOutputNavigationItem` (the parent badges existed only to surface a NEW child when the group was collapsed; with no NEW children left in those groups, the parent badges are now stale). - `src/settings-ui/Settings.UI/OOBE/ViewModel/OobeShellViewModel.cs` — flipped `(PowerToysModules.PowerDisplay, true)` to `(PowerToysModules.PowerDisplay, false)`. Grab and Move was already `false`. No other modules or strings affected. ## Validation Steps Performed - Built `src\settings-ui\Settings.UI\PowerToys.Settings.csproj` (Release|x64) with MSBuild from VS 18 Enterprise; `PowerToys.Settings.dll` produced with 0 errors related to this change. WinUI markup compiler would have aborted before producing the DLL if the XAML had syntax issues. - Diff inspected: only the five intended deletions/edits, no collateral changes. - Visual run-time verification of the Settings navigation pane is recommended before merge. Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
7da62cdb0a |
Rename OOBE overview Learn link label to “Documentation” (#48155)
## Summary of the Pull Request Renames the OOBE welcome/overview hyperlink label from **“Documentation on Microsoft Learn”** to **“Documentation”** for brevity and consistency. Scope is limited to the localized string resource used by the OOBE overview page. ## 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 - **Resource update (OOBE Overview)** - Updated `Oobe_Overview_DescriptionLinkText.Text` in `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw`. ```xml <data name="Oobe_Overview_DescriptionLinkText.Text" xml:space="preserve"> <value>Documentation</value> </data> ``` ## Validation Steps Performed - Confirmed the OOBE overview string key now resolves to **“Documentation”**. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
8a7933c0b2 |
Migrate spdlog from submodule to vcpkg (#48039)
## Summary Migrate `deps/spdlog` from a git submodule to **vcpkg manifest mode** with an overlay port pinned to the **exact same commit** (`gabime/spdlog@616866fc`). Replaces the polyfill shim added in #47910 with a proper port-level patch. This is the follow-up to PR #47928, which I closed after @zadjii-msft / @DHowett clarified that the intended direction was a single combined "move to vcpkg **and** apply a patch file" (one change, not two stepping stones). ## Guidance honored Per @zadjii-msft (offline): - ✅ Convert each submodule to vcpkg **one at a time** — this PR is **spdlog only**. `deps/expected-lite` stays a submodule (separate PR next). - ✅ Atomic commit per dep (multiple commits on the branch for review traceability; squash on merge gives the requested single commit). - ✅ **Don't bump the version.** Only variable changed: submodule → vcpkg. Same commit (`616866fc`, v1.8.5 + 38) the submodule pointed at. Per @DHowett ([review](https://github.com/microsoft/PowerToys/pull/48039#pullrequestreview-4338835150)): - ✅ No vcpkg submodule — vswhere-first detection via a Terminal-style `steps-install-vcpkg.yml` template; three-tier `VcpkgRoot` fallback (env var → VS-shipped → runtime clone pinned to manifest baseline). ## Design - **Repo-root manifest**: `vcpkg.json` declares only `spdlog`, with `builtin-baseline` pinned. `vcpkg-configuration.json` registers `deps/vcpkg-overlays/` as overlay-ports. - **Overlay port** `deps/vcpkg-overlays/spdlog/`: `vcpkg_from_github(REF 616866fc...)` with bundled fmt preserved (`-DSPDLOG_FMT_EXTERNAL=OFF`); the MSVC 14.51 fix from #47910 carried as a proper vcpkg patch on `include/spdlog/fmt/bundled/format.h`. - **vcpkg integration is global** (set in `Cpp.Build.props`, imported via `ForceImportBeforeCppProps` for every `.vcxproj`). An earlier attempt to make vcpkg per-project-opt-in via `deps/spdlog.props` failed because ~85 PowerToys `.vcxproj` files import `spdlog.props` AFTER `Microsoft.Cpp.targets`, by which point `vcpkg.props`' `ClCompile` hook is dead-on-arrival. The trade-off (every C++ project invokes `vcpkg install` once at build time, ~0.5 s on cache hits, manifest declares only spdlog so install set is fixed) is documented in the expanded `Cpp.Build.props` comment. - **`deps/spdlog.props`** is now a thin shim that only sets the historical `SPDLOG_*` preprocessor defines for source-compat. - **`Cpp.Build.targets`** is a new file imported via `ForceImportAfterCppTargets` to load `vcpkg.targets` after `Microsoft.Cpp.targets`. A fail-fast `<Target>` errors with a clear message if `vcpkg.props` can't be found at the resolved `VcpkgRoot`. - **Removes** `deps/spdlog-msvc-fix/` polyfill, in-tree wrapper `src/logging/`, spdlog submodule, the single `<ProjectReference>` in `logger.vcxproj`, plus 3 `.slnf` refs and 2 `.slnx` refs (`PowerToys.slnx` + `installer/PowerToysSetup.slnx`), plus 3 hard-coded `..\deps\spdlog\include` entries in `<AdditionalIncludeDirectories>`. - **CI**: new reusable `.pipelines/v2/templates/steps-install-vcpkg.yml` (vswhere-first, manifest-baseline-pinned fallback clone, respects `useVSPreview`). Gated `Cache@2` for `%LOCALAPPDATA%\vcpkg\archives` keyed on overlay-port contents. Same vcpkg detection added to `tools\build\build-essentials.ps1` for local devs. ## Verification Local build matrix (all 4 configs of `logger.vcxproj` and a representative late-import consumer): | Config | Result | Notes | |--------|--------|-------| | Release \| x64 | ✅ | vcpkg install ~21 s, `logger.lib` produced | | Debug \| x64 | ✅ | **Validates patch fixes the actual MSVC 14.51 bug** (`_ITERATOR_DEBUG_LEVEL > 0` → `_SECURE_SCL`) | | Release \| ARM64 | ✅ | vcpkg cross-installs `arm64-windows-static` spdlog in ~16 s | | Debug \| ARM64 | ✅ | **Previously DISABLED for the in-tree spdlog** (per `<Build Solution="Debug\|ARM64" Project="false" />` in `PowerToysSetup.slnx`); this migration FIXES that latent gap | | FancyZonesLib (Release \| x64) | ✅ | Late-import-pattern consumer; previously broke in v2 | Full PowerToys CI (x64 + arm64 + CmdPal SDK + all GitHub Actions checks) green. **Consumer audit**: 72 `.vcxproj` files reference `logger.vcxproj`; all 72 also import `deps/spdlog.props`. No transitive-link breakage. ## Out of scope (intentional) - `deps/expected-lite` migration — next PR per "one-at-a-time" rule. - Remote vcpkg binary cache (Azure Artifacts NuGet feed). Local pipeline `Cache@2` works for now, but a remote feed survives across pipelines and is the long-term answer. Happy to split this into a follow-up. ## Notes for review - Patch in the overlay port is identical content to PR #47928's patch but regenerated with LF line endings (vcpkg's `vcpkg_apply_patches` is strict; no `--ignore-whitespace`). - Once PowerToys eventually bumps spdlog past v1.14 (which ships fmt 10.2 and drops the affected code path), the overlay port can be deleted and we can use upstream vcpkg's `spdlog` directly. - Re. official-release pipelines and terrapin / less-restricted network isolation: VS-shipped vcpkg is the primary path (no network); the fallback clone is only exercised when VS doesn't ship vcpkg. Happy to wire terrapin into the fallback as a follow-up if the official build template needs it. Closes the work tracked in #47928 (which was closed unmerged). --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Dustin L. Howett <dustin@howett.net> |
||
|
|
273d735a8b |
[PowerDisplay] Confirm before enabling module; log EdidId in Phase 0 (#48111)
## Summary of the Pull Request Two crash-correlation aids for the kernel-side DDC/CI BSOD mitigated by #47734: 1. Log EDID hardware ID (manufacturer + product code, e.g. `DELD1A8`) during Phase 0 monitor classification, before any DDC/CI capability fetch enters the BSOD risk window. 2. Show a confirmation dialog before turning the Power Display module on from the Settings page, so the user understands the BSOD risk before the first capability fetch runs. ## 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 - [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 ## Detailed Description of the Pull Request / Additional comments ### 1. Phase 0 EdidId logging `MonitorIdentity.EdidIdFromDevicePath` parses the EDID hardware ID segment from a DevicePath of the form ``\?\DISPLAY#DELD1A8#5&abc&0&UID12345#{guid}`` and returns ``DELD1A8``. The 3-letter PNP manufacturer code + 4-hex product code is identical for every physical unit of the same model, so it identifies the *model* without leaking per-unit identifiers. `MonitorManager` logs the EdidId on the existing Phase 0 classification line. Phase 0 uses `QueryDisplayConfig`, which reads OS-cached EDID and cannot BSOD, so this line is guaranteed on disk before the crash-prone Phase 2 capability fetch starts. If a machine crashes during enumeration, the recovered log identifies every attached model (including same-model duplicates), which makes it possible to correlate crash reports to specific monitor models even when the user can't tell us which monitor caused the crash. ### 2. Enable-module confirmation dialog `PowerDisplayViewModel.IsEnabled` setter is refactored to follow the same two-phase pattern already used by `MaxCompatibilityMode`: - `false → true` does not commit immediately; it kicks off `ConfirmAndEnableModuleAsync`, which awaits the existing `DangerousFeatureWarningDialog` (resource prefix `PowerDisplay_EnableModule`) and either commits or reverts the ToggleSwitch via `OnPropertyChanged`. - `true → false` commits unconditionally — we never block a user who wants to turn the module off. - App-startup loads via `InitializeEnabledValue()` / `RefreshEnabledState()` assign the `_isEnabled` field directly, bypassing the setter, so the dialog never fires on settings restore or GPO refresh. - GPO-configured state still short-circuits before any dialog logic. The dialog reuses the existing `DangerousFeatureWarningDialog` injected by `PowerDisplayPage.xaml.cs`. The 5 new `PowerDisplay_EnableModule_*` strings explain that the BSOD is in Windows (not Power Display), that Power Display will auto-disable itself after a detected crash, and that the user has to re-enable + dismiss the warning each time. ## Validation Steps Performed - Built `src/settings-ui` and `src/modules/powerdisplay` locally. - Unit tests: added `EdidIdFromDevicePath_*` cases to `MonitorIdentityTests`, all green. - Settings UI manual: toggling Power Display ON now shows the warning dialog. Pressing Cancel reverts the ToggleSwitch visually; pressing Enable commits and the module starts. Toggling OFF does not prompt. Restarting Settings UI with PowerDisplay enabled does not prompt. GPO-disabled state still locks the toggle. - Log inspection: `MonitorManager` Phase 0 log now shows `EdidId=...` for each path before any capability fetch. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
33cf6995fc |
[Settings UI] Remove duplicate QuickAccent_SelectedLanguage_Greek_Polytonic resource (#48054)
## Summary Fixes the **"Build PowerToys main project"** failure on every PR/CI build off current `main` (e.g. Dart build [`147597426`](https://microsoft.visualstudio.com/Dart/_build/results?buildId=147597426)): ``` WINAPPSDKGENERATEPROJECTPRIFILE: Error PRI175: Processing Resources failed with error: Duplicate Entry. WINAPPSDKGENERATEPROJECTPRIFILE: Error PRI277: Conflicting values for resource 'Resources/QuickAccent_SelectedLanguage_Greek_Polytonic' ``` ## Root cause `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw` contained two `<data name="QuickAccent_SelectedLanguage_Greek_Polytonic">` entries: - Line 3597 — original, added by #47021 (*"[PowerAccent] adding greek polytonic"*), placed in the alphabetized QuickAccent block. - Line 6175 — duplicate, appended at the file tail by #47211 (*"[Quick Accent] Move language data to PowerAccent.Common library, refactor"*). The two entries are byte-identical (same value `Greek Polytonic`, same `xml:space="preserve"`). The WinAppSDK PRI generator (`MakePri`) rejects duplicates, so every build off current `main` fails before reaching the compile step. ## Fix Remove the tail duplicate (3-line block right before `</root>`). Keeps the original entry in its alphabetized location. ## Validation - `git diff` shows exactly 3 deleted lines. - `[xml](Get-Content … -Raw)` round-trip succeeds — file is still well-formed XML. - `Select-String` count of `QuickAccent_SelectedLanguage_Greek_Polytonic` in the file is now **1** (was 2). - Only `en-us` has this key (other localized `.resw` files are populated later via Touchdown), so no other file needs touching. ## Note Discovered while investigating a CI failure unrelated to my other PR #48050 (signing of `WinUI3Apps\YamlDotNet.dll`). Both fixes are needed for the 0.100 release pipeline; this PR unblocks PR builds off `main`, and #48050 unblocks the signed release pipeline once both are merged to `main` and the next `main → stable` sync happens. Co-authored-by: Copilot <Copilot@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
81e251c2de |
[Quick Accent] Move language data to PowerAccent.Common library, refactor (#47211)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Language data for Quick Accent was previously defined in **PowerAccent.Core/Languages.cs**, internal to the Quick Accent application itself. The Settings application had no access to the list and had to maintain a parallel, manually-synchronised list of the language names and groups, and there was no single place to look up the complete set of languages. This PR resolves this and extracts the language data into a new **PowerAccent.Common** project with no external or UI dependencies, making it the single source of truth for both the character popup and Settings UI. The implicit and non-obvious ordering of the old **Languages.cs** has been replaced with explicit ordering of the language groups and languages list. A new unit test project for the application has also been added. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47159 - [x] Closes: #30000 - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments The following changes and additions have been made: New project **PowerAccent.Common** contains: - **Language.cs** - an enum of Quick Accent's pseudo-ISO identifiers for each of the supported languages - **LetterKey.cs** - mirrors the LetterKey enum defined in the KeyboardListener.idl, and must be kept in sync with that. This exposes the VK_* data to the Settings UI without it having to reference the PowerAccentKeyboardService project - **LanguageGroup.cs** - classifies languages as `Language` (for spoken languages), `Special` (for sets like Currency and International Phonetic Alphabet), or `UserDefined` (reserved for future work) - **LanguageInfo.cs** - a record which combines a language's identity, group, resource identifier, and character mappings - **CharacterMappings.cs** - a new version of the old **Languages.cs**, providing: - `All` - the canonical registry of every `LanguageInfo` entry - `DisplayOrder` - the explicit within-group ordering for languages, for the default popup ordering, i.e. when the user has not got frequency-based ordering enabled. This is a culturally-neutral alphabetical ordering by our pseudo-ISO language IDs, and close to the previous order, minimising any impact to users' muscle memory - `GroupDisplayOrder` - the explicit ordering of language groups for both the popup and the Settings UI - `LanguageLookup` - new _O(1)_ `Language` to `LanguageInfo` dictionary - `GetCharacters(LetterKey, Language[])` - a deduplicating character collector and sorter A significant improvement over the old **Languages.cs** is that language ordering is now explicit and in one place. Previously, popup ordering was an implicit side-effect of a large Union chain across all language mappings, with the enum, the language mapping declarations and the union all carrying different orderings. This was a source of confusion and made adding new languages fragile. The original **Languages.cs** has been deleted. There's now a thin `CharacterMappings` adapter that casts the `LetterKey` to the managed equivalent by numeric value. This is another effort to decouple the Settings UI and Quick Accent and only share the required elements. In Settings, the `PowerAccentViewModel` class has been updated. It now derives the language list directly from `CharacterMappings.All`; the `InitializeLanguages()` call handles localisation, sorting and grouping in a single place using `GroupDisplayOrder`. A new unit test project covers `CharacterMappings`, the `LetterKey` IDL-to-managed code bridge and general language declaration checks. The application is now much more robust against changes which alter the declared order, introduce empty/null elements, and so on. It is now impossible to add a new language and forget a constituent part (the enum entry, its place in the display order, the character mappings themselves) without a test failing. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed See new unit test project for comprehensive tests. Manually confirmed: - Triggering Quick Accent with no language selected does not report an error - Language order is consistent in the popup, no matter what order the languages are selected in Settings - The order of languages in Settings is consistent, alphabetically by localised name - All declared languages are present in Settings and no resource IDs were missed --------- Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
f02b66c88d |
Fix auto-update relaunch, add config backup, enable auto-download by default (#46889)
## Summary Addresses three critical issues with the PowerToys update experience that cause user fragmentation across old versions. ### Changes **1. Fix relaunch after update (Fixes #42004, #43011, #44071)** - Stage 1 now passes the PowerToys install directory to Stage 2 as an argument - After successful install, Stage 2 relaunches `PowerToys.exe` with `-report_update_success` - Users will see a 'successfully updated' toast and PT resumes automatically **2. Config backup/restore (Fixes #46179)** - `BackupConfigFiles()` snapshots all JSON configs to `ConfigBackup/` before update begins - `RestoreCorruptedConfigs()` checks for null-byte corruption after install and auto-restores - Protects Workspaces, FancyZones, Keyboard Manager, and all other module settings **3. Enable auto-download by default** - New installations default `AutoDownloadUpdates` to `true` (was `false`) - Existing users' preferences are preserved — this only affects first-run defaults - The runner already defaulted to `true`; this aligns the C# settings model ### Why this matters The current updater kills all PowerToys processes, runs the installer, then **exits without relaunching**. Users lose keyboard remappings, FancyZones layouts, and Awake settings with no indication why. Combined with auto-download being off by default, most users are multiple versions behind. ### Testing - Verified update flow: Stage 1 → Stage 2 → PT relaunches with success toast - Config backup creates mirror of all JSON settings before update - Corruption detection catches null-byte pattern from #46179 - Graceful fallback: if install dir not provided (old Stage 1), logs warning but doesn't crash --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com> Co-authored-by: Niels Laute <niels.laute@live.nl> |
||
|
|
8af6a99136 |
Settings UX tweaks (#48024)
This PR: - Adds a MaxWidth to the SCOOBE and OOBE pages, inline with Fluent design guidance - Updates the imagery for PowerToys - Tweaks some small nits in the General settings page: re-ordering, adding icons, replacing a ToggleSwitch with a CheckBox <img width="1774" height="1325" alt="image" src="https://github.com/user-attachments/assets/d825047a-27be-4e8b-a6ce-7f1a71f39dfe" /> |
||
|
|
9699d8a802 |
Shortcut Guide V2 (#40834)
## Summary of the Pull Request https://github.com/user-attachments/assets/f4afdaf8-2830-4993-82ea-1ee9a6978e4c <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: Status: #890 #15405 #179 #129 #22419 #31289 #47297 #47464 #44816 - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [x] **Localization:** All end-user-facing strings can be localized - [x] **Dev docs:** Added/updated - [x] **New binaries:** Added on the required places - [x] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [x] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [x] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: https://github.com/MicrosoftDocs/windows-dev-docs/pull/5717 <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments Work for future PRs: - [ ] Localization of built-in shortcut files - [ ] Further customization (we can wait on user feedback for that) - [ ] Reimplement holding windows key - [ ] Search bar <details> <summary>Images</summary> https://github.com/user-attachments/assets/f923daa4-d713-463b-ba33-ede72b986c12 <img width="726" height="1388" alt="image" src="https://github.com/user-attachments/assets/781eff9a-2863-44be-bbe2-25371ef8838e" /> <img width="624" height="351" alt="image" src="https://github.com/user-attachments/assets/ec8a44db-afbc-4e28-8285-ba2a9e345fb9" /> <img width="712" height="1086" alt="image" src="https://github.com/user-attachments/assets/5a3775fc-36e9-4971-8d3f-491e8f8da45a" /> <img width="726" height="134" alt="image" src="https://github.com/user-attachments/assets/7d0a8b1f-d10e-4466-820c-b3efdc5f3c84" /> </details> <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Gordon Lam (SH) <yeelam@microsoft.com> Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Muyuan Li <116717757+MuyuanMS@users.noreply.github.com> Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com> |
||
|
|
94b7e3eea2 |
[Image Resizer] Automatically reload settings changes (#45266)
## Summary of the Pull Request This PR introduces real-time settings synchronisation for Image Resizer. External changes to `settings.json` (via the Settings application or manual edits to the file) are detected and reloaded immediately without requiring a restart. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #36943 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments ### Reload updates The reload detection is via an `IFileSystemWatcher` (as file system operations are abstracted in Image Resizer), which monitors the `settings.json` file for creation and changes. There is a half second debounce for changes, as the settings file can rapidly change when the user is editing the preset name field. Hot reloading of the properties required refactoring `ReloadCore`, which replaces the `Sizes` preset collection and updates the Custom and AI presets, in addition to the application-wide properties like compression options and the fallback encoder choice. I changed the combo box data binding from the `SelectedSize` object to the int `SelectedSizeIndex`. This was required to resolve a specific WPF issue where reloading the `Sizes` collection would cause issues with restoring the current combo box selection to the prior value. Binding to the index decouples the selection state from the object lifecycle during the reload process. Selection preservation is based on the preset ID (for user presets) and preset type (for Custom and AI presets). This ensures that matches are robust even if the user is in the process of renaming an entry in the Settings application. If the preset cannot be matched (for example, if the user deletes the item or changes the ID manually in the file), the Custom preset is selected. Selection range checks are maintained from the old code, and additional checks have been added to ensure that Custom and AI presets will be present even if they're deleted from the settings file. The AI preset check from before has been inlined; this guarantees that the AI resize option will not display if the facility is unavailable on the current PC, even if it's present in the settings file. The reload routine is dispatched to the UI thread, as changes involve updates to the combo box. ### ID recovery Preset IDs are key to preserving the combo box selection between reloads, and a couple of changes were necessary to ensure round-tripping changes were robust. 1. IDs are not reused. The old code could reuse IDs under certain circumstances, for example if a preset was deleted and re-added via Settings. 2. The ID Recovery Helper routine sorted the supplied presets by ID before performing duplicate conflict resolution. This is not required and it is more natural to assume that the order in the settings file and the client UI is the source of truth. New ID assignment is now based on a monotonically increasing ID (seeded at application start) rather than `Current Maximum ID + 1`. This means that IDs cannot be reused in the same Settings application session. This makes the matching process in the client application more reliable. A small update was made to the ID Recovery Helper to use `HashSet.Add()` instead of splitting up the check and addition steps (`Add` will return false if the value already exists), which saves a massive one line of code. There were comments about the ID Recovery Helper resolving "empty" or "invalid" entries; this was inaccurate, as IDs are ints, which must by definition always have a valid value. The routine only guards against duplicates, so the comments have been updated to reflect this. ### Miscellaneous The `Default` Settings property getter previously called `Reload` every time it was accessed. This is fine when the file is only read at application startup, but I changed this to lazily instantiate and call `Reload` a single time. I refactored duplicate code related to settings file/folder strings, and also the creation of the Custom and AI size instances. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Manual testing: 1. Add new preset in the Settings application. The new entry is reflected in the client application as it is running. 2. Delete new preset. The entry is removed in the client application list. 3. Edit an existing preset. The property change is reflected in the client application. 4. Add new preset in the Settings application. Select the new preset in the client application. Edit the properties of the new preset in the Settings application and confirm that the updates appear in the client application. 5. Add new preset in the Settings application. Select the new preset in the client application. Delete the new preset in Settings. Confirm that the current preset is removed and the selection changes to the default in the client application. 6. Change one or more application-wide properties in the settings file which are represented in the client application, too, e.g. "Make pictures smaller but not larger" (`imageresizer_shrinkOnly`) or "Overwrite files" (`imageresizer_replace`). Upon saving, confirm the checkbox changes immediately in the client application. 7. Edit the `settings.json` file manually by e.g. adding a new Size preset or editing the width or height property of an existing preset. Upon saving, the change(s) should be reflected in the client application. 8. Make a change to an existing or new preset which affects the resize operation itself, e.g. the dimensions or the "Make pictures smaller but not larger" setting. Proceed with the resize operation and confirm that the new changes have been applied. 14 new unit tests have been added to `SetingsTests.cs` to exercise the `Settings` and `IDRecoveryHelper` functionality. --------- Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
8e74eb2ba8 |
[PowerDisplay] Auto-disable on detected DDC/CI capability fetch crash (#47556) (#47734)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary Mitigation for issue #47556 — `KERNEL_SECURITY_CHECK_FAILURE` BSOD originating in `win32kfull!DdcciGetCapabilitiesStringFromMonitor` when PowerDisplay calls DDC/CI capability APIs against monitors with malformed capability strings. After a detected crash, PowerDisplay auto-disables itself via `settings.json`, shows an error InfoBar at the top of the PowerDisplay settings page (page is locked except the Ignore button), so users can avoid getting stuck in an infinite reboot loop after a crash. And the user must explicitly dismiss the warning before re-enabling the module. The actual kernel-side fix is the Windows team's responsibility — this PR only prevents users from BSOD-ing repeatedly on the same monitor without warning. settings page: <img width="1743" height="1475" alt="image" src="https://github.com/user-attachments/assets/8cf1b72f-c51a-4955-82d7-213cae49fd4e" /> ## Mechanism 1. `CrashDetectionScope` IDisposable wraps Phase 2 capability fetch in `DdcCiController.DiscoverMonitorsAsync`, writing `discovery.lock` (`WriteThrough` + `Flush(flushToDisk: true)`) before, deleting it on Dispose. 2. If the process is killed externally (BSOD, FailFast), the lock survives. 3. On next PowerDisplay.exe startup (Phase 0), `CrashRecovery` detects the orphan lock and runs a strict fail-fast sequence: write `crash_detected.flag` → set `enabled.PowerDisplay=false` in global `settings.json` → signal the new `POWER_DISPLAY_AUTO_DISABLE_EVENT` → delete the lock (commit point). 4. The runner-loaded `PowerDisplayModuleInterface.dll` runs a one-shot listener thread that wakes on the event and calls `disable()` to sync `m_enabled`. 5. `PowerDisplayViewModel` reads the flag at construction and binds `IsCrashLockActive` to lock the page. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47556 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
6e9b3b1536 |
[PowerAccent] adding greek polytonic (#47021)
Adds Greek Polytonic characters set to power accent, based on https://github.com/microsoft/PowerToys/pull/29709 ### PR Checklist - [x] Closes #46941 - [x] Communication: I've discussed this with core contributors already. - [ ] Tests: Not sure if there are specific tests for this - [ ] Documentation updated: Power accent docs ### Detailed Description of the Pull Request / Additional comments Added all greek polytonic letters to their corresponding english letter (some duplicated) (if you wondered about GRC -> ISO 639-3) ### Validation Steps Performed Compiled and Observed Power Accent --------- Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: Dave Rayment <dave.rayment@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
4e8c7aa3a6 |
Fix: Quick Access flyout shortcut editor crashes on Reset (#47407)
## Summary of the Pull Request Clicking **Reset** in the Quick Access hotkey shortcut dialog crashes PowerToys Settings. The root cause is that `C_ResetClick` sets the `HotkeySettingsProperty` DependencyProperty to `null`, which causes the WinUI3 XAML runtime to dereference a null pointer during two-way binding property-change notification — a native E_POINTER crash (0x80004003). ## 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 ### Root Cause `C_ResetClick` previously did: ```csharp hotkeySettings = null; SetValue(HotkeySettingsProperty, null); ``` The `HotkeySettingsProperty` is bound two-way (`{x:Bind Mode=TwoWay}`) to the ViewModel. `SetValue(null)` synchronously triggers the binding chain: ViewModel setter → `NotifyPropertyChanged` → XAML runtime reads back the DP value → null pointer → **native E_POINTER crash** in `CoreMessagingXP.dll`. ### Fix Use `new HotkeySettings()` instead of `null` — matching the existing `C_ClearClick` pattern that never crashes: ```csharp // C_ResetClick — fixed hotkeySettings = new HotkeySettings(); SetValue(HotkeySettingsProperty, hotkeySettings); SetKeys(); lastValidSettings = hotkeySettings; shortcutDialog.Hide(); ``` An empty `HotkeySettings` (`IsEmpty() == true`) semantically means "no shortcut configured" — the same intent as null, but the XAML binding chain always has a valid object to dereference. Also added null-conditional guards in `OpenDialogButton_Click` as defense-in-depth: - `HotkeySettings?.GetKeysList() ?? new List<object>()` ensures `c.Keys` is never null, preventing `{x:Bind Keys.Count}` in `ShortcutDialogContentControl.xaml` from throwing. - `hotkeySettings?.HasConflict ?? false` and `hotkeySettings?.ConflictDescription` guard the remaining property accesses. - A null guard in `Hotkey_KeyDown` prevents a crash if the user presses keys after Reset. ## Validation Steps Performed - Reproduced crash: Settings → General → Quick Access shortcut → Edit → Reset → crash (before fix) - Verified fix: Same steps → no crash, dialog closes cleanly, shortcut shows as empty - Verified reopening dialog after Reset works without crash - Verified pressing keys in dialog after Reset works without crash - Built and tested with full Runner IPC (debug PowerToys.exe → Settings) --------- Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: MuyuanMS <116717757+MuyuanMS@users.noreply.github.com> |
||
|
|
49cdb9249d |
Peek: Add setting to disable file metadata tooltip (#46624)
Adds a **"Show file preview tooltip"** toggle to Peek's Behavior
settings, letting users disable the metadata tooltip (filename, type,
date modified, size) shown on hover over the preview.
## Changes
- **`PeekProperties`** — new `ShowFilePreviewTooltip: BoolProperty`
(default `true`)
- **`IUserSettings` / `UserSettings`** — expose the setting; updated by
the existing file watcher on settings change
- **`FilePreview.xaml`** — `ImagePreview` and `VideoPreview` now bind
`ToolTipService.ToolTip` directly to `InfoTooltip` (the same
attached-property form already used by `AudioControl`). The previous
explicit `<ToolTip Content="{x:Bind InfoTooltip}"/>` element form left a
`ToolTip` instance permanently attached, so nulling the content still
produced an empty popup on hover. With the attached-property form, a
`null` `InfoTooltip` detaches the tooltip entirely and no popup is
shown.
- **`FilePreview.xaml.cs`** — new `ShowFilePreviewTooltip`
DependencyProperty; sets `InfoTooltip = null` when disabled; re-triggers
`UpdateTooltipAsync` when re-enabled with a file loaded; `infoTooltip`
field changed to `string?`
- **`MainWindow.xaml.cs`** — reads setting from `IUserSettings` and
pushes it to `FilePreviewer.ShowFilePreviewTooltip` on each
`Initialize()` call, picking up the latest user preference each time
Peek activates
- **`PeekViewModel`** — `ShowFilePreviewTooltip` property for two-way
Settings UI binding
- **`PeekPage.xaml`** — toggle in the Behavior group, consistent with
existing toggles
- **`Resources.resw`** — localizable strings for header and description
## PR Checklist
- [x] Closes: #46621
- [ ] **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
Setting defaults to `true` — no behavior change for existing users.
The tooltip is suppressed by setting `InfoTooltip` to `null` while bound
through `ToolTipService.ToolTip` as an attached property. A `null` value
on the attached property prevents WinUI from creating a tooltip popup at
all (this is the same pattern `AudioControl` already used and behaves
correctly with null). The earlier explicit `<ToolTip>` element form did
*not* behave this way — the `ToolTip` instance stayed attached and an
empty popup appeared on hover — so the XAML was switched to the
attached-property form on `ImagePreview` and `VideoPreview`. The custom
tooltip placement logic (top/bottom based on cursor Y) is unaffected.
## Validation Steps Performed
- Verified toggle appears in Peek Settings > Behavior
- Toggling off fully suppresses the hover tooltip on image, video, and
audio previews (no empty bubble)
- Toggling back on restores tooltip with file metadata on next file load
- Default `true` preserves existing behavior
<img width="688" height="99" alt="image"
src="https://github.com/user-attachments/assets/369d0ba7-fc9a-495e-9603-f4b2b95ba68e"
/>
<img width="692" height="305" alt="image"
src="https://github.com/user-attachments/assets/cb5dfc69-a445-46b0-9c0a-041fbf4c89c2"
/>
<img width="684" height="73" alt="image"
src="https://github.com/user-attachments/assets/8088caa7-9536-4384-91dc-dbdbbe0ae755"
/>
<img width="686" height="430" alt="image"
src="https://github.com/user-attachments/assets/0d9d2d6f-bc42-4497-89c5-06ac9c18a2b7"
/>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
34e78bd8c3 |
Add validation to prevent empty names in ImageResizer size presets (#45425)
## Summary of the Pull Request Prevents users from clearing the name field in ImageResizer size preset edit dialog. Empty names made the UI confusing without causing errors. ## PR Checklist - [ ] **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 ## Detailed Description of the Pull Request / Additional comments Added validation guard in `ImageSize.Name` property setter: ```csharp public string Name { get => _name; set { if (!string.IsNullOrWhiteSpace(value)) { SetProperty(ref _name, value); } } } ``` Invalid assignments (empty, null, whitespace) are silently ignored, preserving the existing value. This matches the existing pattern used for `FileName` validation in `ImageResizerViewModel`. TwoWay binding in UI causes the TextBox to revert when users attempt to clear the field—standard behavior for required fields. ## Validation Steps Performed - Added unit test `ImageSizeNameShouldNotBeSetToEmptyOrNull()` covering all rejection and acceptance cases - Verified silent rejection behavior matches `FileName` property pattern > [!WARNING] > > <details> > <summary>Firewall rules blocked me from connecting to one or more addresses (expand for details)</summary> > > #### I tried to connect to the following addresses, but was blocked by firewall rules: > > - `i1qvsblobprodcus353.vsblob.vsassets.io` > - Triggering command: `/usr/bin/dotnet dotnet build /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/ResultHelper.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/RegistryHelper.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Enumerations/TruncateSide.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Constants/KeyName.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Constants/MaxTextLength.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Commands/CopyRegistryInfoCommand.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Commands/OpenKeyInEditorCommand.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Re /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/CopyType.cs /home/REDACTED/work/PowerToys/PowerToys/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Icons.cs` (dns block) > > If you need me to access, download, or install something from one of these locations, you can either: > > - Configure [Actions setup steps](https://gh.io/copilot/actions-setup-steps) to set up my environment, which run before the firewall is enabled > - Add the appropriate URLs or hosts to the custom allowlist in this repository's [Copilot coding agent settings](https://github.com/microsoft/PowerToys/settings/copilot/coding_agent) (admins only) > > </details> <!-- START COPILOT ORIGINAL PROMPT --> <details> <summary>Original prompt</summary> > > ---- > > *This section details on the original issue you should resolve* > > <issue_title>[Settings: ImageResizer] Edit size dialog: Add validation against empty name</issue_title> > <issue_description>There is one small thing we should add. (But I don't know how.) > The data in the name field of the edit dialog should be validated against `.NullOrEmpty`! > _Originally posted by @htcfreek in https://github.com/microsoft/PowerToys/pull/13285#issuecomment-924113251_ > > **Detailed description:** > While users edit an image size in the ImageResizer settings on PT's settings ux they are able to clear the name of the image size. This doesn't lead to errors/exceptions, but it also doesn't make sense to have sizes without a name. So we should prevent user from doing this in the edit dialog. > > _**Note:**_ > This is the second and last change that is needed to prevent the users from having incorrect image size settings (#8698). But I think this is not as relevant, because a missing name won't break image resizing._ > > --- > > cc: @niels9001 </issue_description> > > <agent_instructions>Implement a proper fix for this issue. Do NOT create placeholder stub files. Create actual working code that addresses the issue described. Follow PowerToys coding guidelines and conventions.</agent_instructions> > > ## Comments on the Issue (you are @copilot in this section) > > <comments> > <comment_new><author>@TheJoeFin</author><body> > does this issue still happen with v0.73.0? /needinfo</body></comment_new> > </comments> > </details> <!-- START COPILOT CODING AGENT SUFFIX --> - Fixes microsoft/PowerToys#13336 <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/microsoft/PowerToys/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: yeelam-gordon <73506701+yeelam-gordon@users.noreply.github.com> |
||
|
|
c5d17913e4 |
[PowerDisplay] Add max compatibility mode setting (#47875)
<!-- 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 1. Adds an opt-in Max compatibility mode in PowerDisplay's Advanced settings. When enabled, DDC discovery probes monitors that don't advertise capabilities, picking up displays that would otherwise be skipped. 2. Toggling the setting triggers an immediate rescan via a new RescanPowerDisplayMonitorsEvent IPC event from Settings to PowerDisplay. 3. Hides the brightness slider on monitors that lack VCP 0x10. Also fixed animation issue #47868 <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47878 <!-- - [ ] 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 --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com> |
||
|
|
ba68b88ca1 |
Fix ZoomIt Record hotkey ignoring Alt modifier when Alt is the only modifier key (#47388)
## Summary of the Pull Request
ZoomIt derives three recording hotkeys from one base key via XOR:
fullscreen (base), crop (base XOR Shift), window (base XOR Alt). When
Alt is the sole modifier, `base XOR Alt = 0`, registering a
modifier-less hotkey that captures every bare keypress (e.g., pressing
`5` triggers window recording).
**`Zoomit.cpp`** — 4 hotkey registration sites:
- Guard `RECORD_CROP_HOTKEY` registration behind `(g_RecordToggleMod ^
MOD_SHIFT) != 0`
- Guard `RECORD_WINDOW_HOTKEY` registration behind `(g_RecordToggleMod ^
MOD_ALT) != 0`
```cpp
// Before (all 4 sites):
registerHotkey( RECORD_CROP_HOTKEY, ( g_RecordToggleMod ^ MOD_SHIFT ) | MOD_NOREPEAT, ... );
registerHotkey( RECORD_WINDOW_HOTKEY, ( g_RecordToggleMod ^ MOD_ALT ) | MOD_NOREPEAT, ... );
// After:
if ( g_RecordToggleMod ^ MOD_SHIFT ) {
registerHotkey( RECORD_CROP_HOTKEY, ( g_RecordToggleMod ^ MOD_SHIFT ) | MOD_NOREPEAT, ... );
}
if ( g_RecordToggleMod ^ MOD_ALT ) {
registerHotkey( RECORD_WINDOW_HOTKEY, ( g_RecordToggleMod ^ MOD_ALT ) | MOD_NOREPEAT, ... );
}
```
**`ZoomItViewModel.cs`** — `RecordToggleKeyCrop` /
`RecordToggleKeyWindow` computed properties:
- Return `null` when the derived hotkey would have no modifier keys, so
the Settings UI omits the inapplicable shortcut description rather than
displaying a bare-key shortcut.
## 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
ZoomIt registers crop and window recording variants by XOR-ing the base
modifier with `MOD_SHIFT` and `MOD_ALT` respectively. This design breaks
when the base modifier equals the XOR target — the result is `0`, and
`RegisterHotKey` with no modifiers intercepts every bare keypress of
that key system-wide.
The fix is symmetric across all 4 registration sites (standalone
`registerHotkey()` in `RegisterAllHotkeys`, the legacy dialog OK path,
and two `WM_CREATE`-adjacent paths): skip the derived hotkey
registration when the computed modifier is zero. The Settings UI
ViewModel mirrors this logic by returning `null` for the affected
computed properties, causing the converter to emit an empty string
instead of a modifier-less shortcut label.
## Validation Steps Performed
- Code review confirmed fix is applied consistently across all 4
`RegisterHotKey` call sites in `Zoomit.cpp`
- Verified `HotkeySettingsToLocalizedStringConverter` returns
`string.Empty` for `null` input — no display regression in Settings UI
- Confirmed the default `Ctrl+5` hotkey is unaffected (`MOD_CONTROL ^
MOD_ALT = MOD_CONTROL | MOD_ALT ≠ 0`)
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MuyuanMS <116717757+MuyuanMS@users.noreply.github.com>
Co-authored-by: Muyuan Li (from Dev Box) <muyuanli@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
||
|
|
af1c0a313c |
Fix Korean mistranslation of "Activation modifier key" in Grab And Move settings (#47352)
The Korean translation of "Activation modifier key"
(`GrabAndMove_ModifierKey.Header`) was rendered as "정품인증 보조키" ("product
authentication/genuine certification modifier key") — conflating feature
activation with Windows product licensing. The correct translation is
"활성화 보조 키".
## Change
- **`src/settings-ui/Settings.UI/Strings/en-us/Resources.resw`**:
Expanded the `<comment>` on `GrabAndMove_ModifierKey.Header` to
explicitly disambiguate "Activation" for translators:
```xml
<comment>Drop-down to choose which modifier key (Alt or Win) activates Grab And Move drag and resize.
"Activation" here means to enable/trigger the feature (활성화 in Korean),
NOT product authentication/genuine certification (정품인증 in Korean).</comment>
```
## 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
The word "Activation" is ambiguous in Korean: it can refer to Windows
product license activation (정품인증) or feature enablement (활성화). The
localization pipeline picked the wrong interpretation. Adding an
explicit in-source comment with both the correct and incorrect Korean
terms guides the translation tooling and human reviewers to use "활성화 보조
키" going forward.
## Validation Steps Performed
- Verified the updated comment appears correctly in the `.resw` file.
- No runtime behavior changes; comment-only modification to the resource
file.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
|
||
|
|
3b76597981 |
Power Display: Add "do not translate" comments to all product name references (#47351)
The German locale translated the system tray tooltip `AppName` ("Power
Display") to "Leistungsanzeige", despite the Settings UI keeping the
utility name untranslated. The affected resource entries had no
translator guidance, so "Power Display" was treated as a localizable
phrase rather than a fixed product name. This PR adds consistent "do not
translate" comments across all touchpoints in both resource files.
## Summary of the Pull Request
- `src/modules/powerdisplay/PowerDisplay/Strings/en-us/Resources.resw`:
Added `Product name, do not translate.` comment to the `AppName` entry
(system tray tooltip)
- `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw`: Added
`{Locked="Power Display"}` comments to all 15 entries containing "Power
Display" — including the module title, enable/toggle/open/launch
strings, OOBE title/description/activation text, LearnMore link,
QuickProfiles description, group header, and flyout header — following
the same convention already used for FancyZones and other product names
in that file
## 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
The system tray tooltip is populated via `GetString("AppName")` in
`TrayIconService.cs`. Because the resource had no comment, translators
localized "Power Display" as a common phrase ("performance display")
rather than treating it as a fixed product name.
To ensure consistency across all touchpoints, `{Locked="Power Display"}`
comments have been added to every entry in the Settings UI resource file
that contains the product name, matching the convention already in use
for `Shell_PowerDisplay.Content` (`Product name: Navigation view item
name for Power Display`) and for other utilities such as FancyZones
(`{Locked="FancyZones"}`).
## Validation Steps Performed
Verified that all `AppName` and Settings UI resource entries containing
"Power Display" now carry the appropriate translator comment. No runtime
behavior changes — the English values are unchanged; the comments solely
guide translators to leave the product name as-is in all locales.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com>
|
||
|
|
e193509e65 |
[Settings] Fix double-period suffix for "No shortcuts to show" message (#47287)
The nittiest of nits: "No shortcuts to show.." message should be "No shortcuts to show." when no modules are enabled. <!-- 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) --> - [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 This one is pretty self-explanatory. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed (Manual testing.) <img width="240" height="141" alt="image" src="https://github.com/user-attachments/assets/a036d345-dc1d-4040-9111-187619453dcd" /> |
||
|
|
a33f984027 |
Add Refresh Connections (Mouse Without Borders) to Quick Access (#46025)
## Summary of the Pull Request Adds the Mouse Without Borders "Refresh connections" action to both the Quick Access tray flyout and the Settings Dashboard, so users can trigger a reconnect without navigating into MWB settings. ## 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 ### Quick Access flyout (`Settings.UI.Controls`) - **`QuickAccessViewModel`**: Added `MouseWithoutBorders` to `InitializeItems()`; tooltip shows the configured `ReconnectShortcut`. - **`QuickAccessLauncher`**: Added `case ModuleType.MouseWithoutBorders` — signals `MWBReconnectEvent` (same named Windows event used by the CmdPal `MWBReconnectCommand`). ### Settings Dashboard (`Settings.UI`) - **`DashboardViewModel`**: Added `GetModuleItemsMouseWithoutBorders()` returning a `DashboardModuleButtonItem` wired to a new `MouseWithoutBordersReconnectClicked` handler that fires `MWBReconnectEvent`. Added the module to the `GetModuleItems()` switch. Added `using System.Threading` and `using PowerToys.Interop`. No new strings — reuses existing `MouseWithoutBorders_ReconnectButton.Text` ("Refresh connections") and `MouseWithoutBorders_ReconnectTooltip.Text` for the button label and description. ## Validation Steps Performed - Verified `MWBReconnectEvent` is the same event used by `MWBReconnectCommand` in the CmdPal extension. - Confirmed `MouseWithoutBorders.png` icon exists in `Assets/Settings/Icons/`. - Confirmed `PowerToys.Interop` is already referenced by `PowerToys.Settings.csproj`. > [!WARNING] > > <details> > <summary>Firewall rules blocked me from connecting to one or more addresses (expand for details)</summary> > > #### I tried to connect to the following addresses, but was blocked by firewall rules: > > - `o3svsblobprodcus318.vsblob.vsassets.io` > - Triggering command: `/usr/bin/dotnet dotnet build Settings.UI/PowerToys.Settings.csproj -c Debug` (dns block) > > If you need me to access, download, or install something from one of these locations, you can either: > > - Configure [Actions setup steps](https://gh.io/copilot/actions-setup-steps) to set up my environment, which run before the firewall is enabled > - Add the appropriate URLs or hosts to the custom allowlist in this repository's [Copilot coding agent settings](https://github.com/microsoft/PowerToys/settings/copilot/coding_agent) (admins only) > > </details> <!-- START COPILOT ORIGINAL PROMPT --> <details> <summary>Original prompt</summary> > > ---- > > *This section details on the original issue you should resolve* > > <issue_title>Add Refresh Connections (from Mouse Without Borders) to Quick Access</issue_title> > <issue_description>### Description of the new feature / enhancement > > As per subject ... add Refresh Connections (_from Mouse Without Borders_) to Quick Access > > ### Scenario when this would be used? > > There are a number of scenarios (_in my use case_) where I have one of my machines connected to a business VPN .... which in 90% of the cases triggers a small network drop resulting in the machine dropping off mouse w/o borders - a refresh connections fixes it - but is currently a bit annoying to get to. > > ### Supporting information > > _No response_</issue_description> > > ## Comments on the Issue (you are @copilot in this section) > > <comments> > </comments> > </details> <!-- START COPILOT CODING AGENT SUFFIX --> - Fixes microsoft/PowerToys#45935 <!-- START COPILOT CODING AGENT TIPS --> --- 🔒 GitHub Advanced Security automatically protects Copilot coding agent pull requests. You can protect all pull requests by enabling Advanced Security for your repositories. [Learn more about Advanced Security.](https://gh.io/cca-advanced-security) --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com> Co-authored-by: Niels Laute <niels.laute@live.nl> |
||
|
|
95b70555bb |
[PowerDisplay] Stable monitor Id + survive transient discovery failures (#47712)
<!-- 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 #47665 — users report the per-monitor "Show input source control" / "Show power state control" toggles silently revert to off over time. Three independent log captures pin the root cause to two layers in `MainViewModel`: - **Data-loss layer**: `SaveMonitorsToSettings` rebuilds `settings.Properties.Monitors` from the currently-discovered list and only re-adds entries with `IsHidden=true`. Whenever monitor discovery transiently fails (DDC `GetPhysicalMonitors` NULL handle, DDC `empty capabilities string`, WMI 4200 — all common in production logs), affected monitors get **deleted** from settings.json. Next successful discovery initialises them with the post-#47303 defaults (`EnableInputSource=false`, `EnableColorTemperature=false`, `EnablePowerState=false`), and `ApplyPreservedUserSettings` cannot recover what is no longer there. - **Identity layer**: `Monitor.Id` is `{Source}_{EdidId}_{MonitorNumber}` — `EdidId` is not unique for identical-model monitors, and `MonitorNumber` is OS-assigned and changes after sleep/wake / GPU reset / display reorder. Even fixing the data-loss layer would still apply preserved settings to the wrong physical monitor for users with multiple identical displays. This PR addresses both layers: - **30-day retention** — `MonitorSettingsRebuilder` (in `PowerDisplay.Lib`) replaces the inline `IsHidden`-only loop. Currently-discovered monitors get a fresh `LastSeenUtc` stamp; missing-but-recent (< 30 days) entries are preserved with all `Enable*` flags intact; missing-and-stale entries are dropped with a single info log. `IsHidden=true` entries are still preserved unconditionally. - **DevicePath-based Id** — `Monitor.Id` is now the Windows `DevicePath` minus the trailing device-class GUID (e.g. `\\?\DISPLAY#DELD1A8#5&abc&0&UID12345`). The middle PnP-instance segment is unique per (physical device × physical port) and stable across reboots, sleep/wake, and OS-level reordering — `MonitorDisplayInfo.DevicePath` already carries this value from `QueryDisplayConfig`; it just wasn't being used as the Id. The order of commits keeps the app behaviourally identical to today through the first 8 commits (only adds dormant helpers / fields / wiring); the actual ID-format flip is the very last commit. Bisect-friendly. #47599 <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: # <!-- - [ ] 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 - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
2aedb932e5 |
Add aspect ratio checkbox to ZoomIt UI (#47695)
<!-- 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 Exposes the 16:9 aspect ratio toggle for the ZoomIt screen region recording (default: `Ctrl`+`Shift`+`5`) in the settings UI. <img width="1047" height="817" alt="image" src="https://github.com/user-attachments/assets/4117a6a1-9f57-44c5-9a21-1b1b65bc2992" /> <!-- 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 Checked that the toggle works and that it's compatible with the standalone ZoomIt, too. |
||
|
|
b93fd97e80 |
Add ZoomIt webcam and append clip functionality (#47529)
<!-- 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 adds the capability to include a webcam in the ZoomIt recording. Also, the trim editor now supports appending multiple clips with selectable transitions. <img width="451" height="570" alt="image" src="https://github.com/user-attachments/assets/025a7840-2e40-424c-af57-5ed523af8646" /> Also fixed some minor bugs in the ZoomIt settings within PowerToys and added the options there, too. <img width="1556" height="962" alt="image" src="https://github.com/user-attachments/assets/dfe4209c-1b59-47c3-9170-36832d37f880" /> There was a bug in the microphone selection, fixed it together with the webcam selection dialog, too. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47230 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: markrussinovich <markrussinovich@users.noreply.github.com> Co-authored-by: Copilot <copilot@github.com> |
||
|
|
05cd66c9bc |
[Dev][Build] .NET 10 Upgrade (#41280)
## Summary of the Pull Request .NET 10 Upgrade. Requires Visual Studio 2026. ## PR Checklist - [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 ## Detailed Description of the Pull Request / Additional comments - Upgraded target framework from `net9.0` to `net10.0` across all projects - Removed redundant package references now included by default in .NET 10 - Updated package versions to .NET 10 releases - Modernized regex usage with source generators for better performance - Added `vbcscompiler` to the spell-check allowlist (`.github/actions/spell-check/expect.txt`) ## Validation Steps Performed <!-- START COPILOT CODING AGENT TIPS --> --- 🔒 GitHub Advanced Security automatically protects Copilot coding agent pull requests. You can protect all pull requests by enabling Advanced Security for your repositories. [Learn more about Advanced Security.](https://gh.io/cca-advanced-security) --------- Co-authored-by: Jeroen van Warmerdam <jeronevw@hotmail.com> Co-authored-by: Copilot <copilot@github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> |
||
|
|
e6d346a59b |
[PowerDisplay] Default-off and confirm dialog for InputSource/ColorTemp/PowerState (#47303)
<!-- 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 Three per-monitor PowerDisplay features have failure modes recoverable only via physical buttons: Input Source — switching to an input with no signal goes black; PowerToys can no longer drive a panel that isn't displaying its own signal Color Temperature — some monitors apply changes that cannot be reset via DDC/CI; OSD reset required Power State — VCP 0xD6 standby may not respond to subsequent DDC/CI wake commands This PR: Defaults all three features off for newly-discovered monitors. Supports* derivation from VCP capabilities is unchanged — unsupported checkboxes are still greyed out. Pops a confirmation dialog when a user toggles any of them on in Settings, mirroring the existing Color Temperature warning. Cancel reverts the checkbox; Enable keeps it. Refactors the existing Color Temperature click handler into a shared HandleDangerousFeatureClickAsync(sender, resourceKeyPrefix, setter) helper. All three feature handlers now reuse it. Renames PowerDisplay_ColorTemperature_EnableButton → PowerDisplay_Dialog_Enable so the three dialogs share one button-text resource (paralleling the existing shared PowerDisplay_Dialog_Cancel) <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
fde1599f7d |
[Grab And Move] Add touchpad compatibility InfoBar to settings page (#47213)
## Summary Adds an informational InfoBar at the top of the Grab And Move settings page noting that the utility may not work with some touchpads and is intended to be used with a physical mouse device. <img width="1180" height="460" alt="image" src="https://github.com/user-attachments/assets/4999d2f5-c785-41ab-b5fc-9dd8b7e72c7d" /> ## Changes - `src/settings-ui/Settings.UI/SettingsXAML/Views/GrabAndMovePage.xaml` — new `InfoBar` (Severity=Informational, IsClosable=False) placed at the top of the page's `StackPanel`. - `src/settings-ui/Settings.UI/Strings/en-us/Resources.resw` — added two resource strings: - `GrabAndMove_TouchpadInfoBar.Title` — "Touchpad compatibility" - `GrabAndMove_TouchpadInfoBar.Message` — explanatory text. Follows the existing InfoBar pattern (e.g., `MouseUtilsPage.xaml`). --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
7ac16118c8 |
Settings UX tweaks (#47197)
<!-- 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 Before: <img width="779" height="333" alt="image" src="https://github.com/user-attachments/assets/92f7346f-11a3-4407-b26e-efc8196be59c" /> After: <img width="766" height="268" alt="image" src="https://github.com/user-attachments/assets/3d12676b-a245-4b53-8078-abcef4efbdab" /> Before: <img width="766" height="310" alt="image" src="https://github.com/user-attachments/assets/09e436da-317c-46e1-92c0-2c3200908b28" /> After: <img width="772" height="175" alt="image" src="https://github.com/user-attachments/assets/9f1024e5-0451-4577-b31f-366cde61d21c" /> <!-- 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 |
||
|
|
2d9dfff444 |
Fix for mouse jump crash (#47198)
<!-- 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 |
||
|
|
9de2e5298a |
[GrabAndMove] excluded apps example text should use 'outlook' instead of 'outlook.exe' (#47194)
PR changes example text to outlook instead of outlook.exe, which can match both old version and new version. The placeholder text suggested 'outlook.exe', but new Outlook runs as olk.exe so the .exe-based entry fails both path and title matching. Using 'outlook' (without .exe) works correctly via window title matching. Fixes #47103 <!-- 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: #47103 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
ca1ffebc26 |
[Light Switch] Fix PowerDisplay profile integration (#47190)
<!-- 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 two bugs in the Light Switch ↔ PowerDisplay integration: 1. **Settings UI was hidden.** The "Apply monitor settings" expander (dark/light profile pickers) and the "PowerDisplay disabled" warning InfoBar were temporarily commented out in PR #46160. Users had no way to configure which profile to bind to each theme. 2. **Hotkey only applied one profile.** On every hotkey press ModuleInterface flips the Windows theme, but the service only notified PowerDisplay when `isManualOverride` toggled from `false` to `true`. Every even-numbered press was silently dropped, so the monitor profile stayed stuck on whichever direction the user pressed first. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed --------- Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
2e5c7d2ee6 |
Refresh check-spelling 0.0.26 (#47119)
This is a refresh based on
|
||
|
|
1eecf46c51 |
Fix missing images in Settings (#47165)
<!-- 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 ⚠️ I'm not sure if this is the actual fix.. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47150 <!-- - [ ] 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 |
||
|
|
98c5b45a30 |
[Settings] Make GrabAndMove strings modifier-agnostic (#47178)
## Summary of the Pull Request [PR #47052](https://github.com/microsoft/PowerToys/pull/47052) introduced a **Win** option alongside **Alt** for the GrabAndMove activation modifier (`GrabAndMove_ModifierKey` dropdown, `Alt` / `Win`). However several user-facing strings in Settings still hardcode `Alt`, which now misrepresents the feature when a user has selected `Win` as the modifier. This PR updates the wording of those strings to be modifier-agnostic. ### Strings changed (en-us) | Key | Before | After | |---|---|---| | `GrabAndMove.ModuleDescription` | Move and resize windows with **Alt+Drag**. Left-click to move, right-click to resize. | Move and resize windows by holding **a modifier key** and dragging. Left-click to move, right-click to resize. | | `Oobe_GrabAndMove_HowToUse.Text` | Hold **Alt** and left-click drag... Hold **Alt** and right-click drag... | Hold the **activation modifier key** and left-click drag... Hold the **activation modifier key** and right-click drag... | | `GrabAndMove_UseAltResize.Header` | Enable **Alt + Right-click** to resize | Enable **modifier + right-click** to resize | | `GrabAndMove_UseAltResize.Description` | Hold **Alt** and right-click to resize... | Hold the **activation modifier key** and right-click to resize... | | `GrabAndMove_ExcludeApps.Description` | Excludes an application from being moved or resized **with Alt+Drag** - add one application name per line | Excludes an application from being moved or resized **by Grab And Move** - add one application name per line | `GrabAndMove_ShouldAbsorbAlt` strings are intentionally left unchanged ΓÇö that toggle is genuinely Alt-specific (it suppresses the window-menu activation triggered by Alt). ## PR Checklist - [x] **Closes:** follow-up to #47052 - [x] **Communication:** no additional comms needed - [x] **Tests:** N/A (en-us resource strings only) - [x] **Manual Tests:** Launched Settings UI, verified the GrabAndMove page renders the new strings correctly (module description, `Enable modifier + right-click` toggle header/description, excluded-apps description). Verified OOBE `How to use` text renders with the updated phrasing. - [x] **Localization:** Only `en-us/Resources.resw` updated; other locales will pick up the new English strings via the standard localization pipeline. - [x] **No dev docs required** ## Detailed Description of the Pull Request / Additional comments - Scope is deliberately kept to wording only ΓÇö no logic, IPC, or XAML bindings touched. Resource keys are preserved, so nothing else needs to change. - CC @GordonLamMSFT as the GrabAndMove / #47052 author. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
a255493c68 |
Settings string updates (#47164)
<!-- 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 - Small tweaks to a few setting strings <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #47151 <!-- - [ ] 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 |
||
|
|
c6a79360f3 |
Unstick GrabAndMove keys, add Win modifier and improve coords (#47052)
<!-- 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 brings some quality of life fixes: - Alt won't stick when pressing Ctrl+Alt+Del or Alt+Tab into an admin process. - Add Win as an option for the move/resize modifier. - The box window geometry box is opaque now. <!-- 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 - Tested that Ctrl+Alt+Del doesn't stick the Alt key. - Tested that the Win key works as expected as a modifier. - Compared the last commit for performance with the previous one (the opaque geometry info box is drawn with an increased number of calls). |
||
|
|
b0ccc2394a |
Add update-available badge to system tray icon (#47030)
When an update is available (readyToDownload or readyToInstall), the tray icon switches to a badged variant with an orange dot. Works for both default mode (color icon.ico) and theme-adaptive mode (light/dark variants). Closes: #19222 Closes: #25497 ## Changes ### Tray icon update badge - Add 3 badged icon variants - Extend get_icon() to select badged variant based on update_available state - Add set_tray_icon_update_available() for runtime icon switching - Hook into UpdateUtils.cpp state transitions via dispatch_run_on_main_ui_thread - Check UpdateState at startup to show badge immediately if update pending - Add 'Update available' context menu item at top of tray menu when active ### Fix: update icons not deployed (bug fix) - Add APPICON_UPDATE icon resource to runner.base.rc (iconUpdate.ico was missing) - Add CopyFileToFolders entries for iconUpdate.ico, PowerToysDarkUpdate.ico, and PowerToysWhiteUpdate.ico in runner.vcxproj - Add all update icon files to installer Core.wxs so they ship in releases ### UX improvements - 'Update available' tray menu item now navigates to General page (Overview) instead of opening Settings to Dashboard - Update InfoBar severity changed from Success/Informational to Warning across GeneralPage, LaunchPage, and CheckUpdateControl - Dashboard update badge gradient and icon refreshed (orange theme, exclamation glyph) - AccentButtonStyle applied to 'Install Now' button - Fixed casing: 'Update Available' to 'Update available' - Added UpdateAvailableInfoBar.Title resource string - Add orange update dot to the General navview item ### Screenshots Before: <img width="146" height="78" alt="image" src="https://github.com/user-attachments/assets/c80b8b5f-da94-4cba-92c9-3fcca685653c" /> After: <img width="184" height="104" alt="image" src="https://github.com/user-attachments/assets/13fc6b34-6e2a-4060-a2f7-f0b6b0d15363" /> <img width="150" height="84" alt="image" src="https://github.com/user-attachments/assets/2673239c-8ce3-437b-947a-1d66803a87ec" /> <img width="150" height="100" alt="image" src="https://github.com/user-attachments/assets/c321deda-770d-47ff-9600-c395f466d444" /> <img width="189" height="104" alt="image" src="https://github.com/user-attachments/assets/2c56d1b7-6615-4d85-80b9-a1cee6413b75" /> <img width="473" height="218" alt="image" src="https://github.com/user-attachments/assets/b0fb59ed-f8bd-40a0-aefd-816a71fc231f" /> <img width="1048" height="288" alt="image" src="https://github.com/user-attachments/assets/29d34e01-f6a9-46c3-a56e-2c50a07718a1" /> <img width="206" height="155" alt="image" src="https://github.com/user-attachments/assets/80e9f77e-aae5-429a-b6be-f0e9f296e929" /> <img width="434" height="163" alt="image" src="https://github.com/user-attachments/assets/7c9d6cd5-fdaa-4b70-a2c0-cff87f5fcf1c" /> <img width="379" height="270" alt="image" src="https://github.com/user-attachments/assets/03e0f60d-a901-45e7-a03a-18be28ec87ed" /> ## How to test Since local dev builds use version `0.0.1` which blocks update checks, you need to temporarily fake an older version: 1. In `src/Version.props`, change `<Version>0.0.1</Version>` to `<Version>0.87.0</Version>` 2. Optionally, in `src/runner/UpdateUtils.cpp`, change both interval constants to `1` (minute) for faster testing: ```cpp constexpr int64_t UPDATE_CHECK_INTERVAL_MINUTES = 1; constexpr int64_t UPDATE_CHECK_AFTER_FAILED_INTERVAL_MINUTES = 1; ``` 3. Build and run the runner 4. Within ~1 minute (with the interval change) or after clicking 'Check for updates' in Settings > General, the runner will query GitHub and find a newer version ### Verify - [ ] Tray icon changes to the update variant (badged with orange dot) - [ ] Right-clicking the tray icon shows 'Update available' at the top of the context menu - [ ] Clicking 'Update available' opens Settings directly to the General page - [ ] Settings General page shows the update InfoBar with Warning severity - [ ] Dashboard shows the update badge with orange gradient and exclamation icon - [ ] Quick Access flyout shows update InfoBar with Warning severity **Remember to revert Version.props and UpdateUtils.cpp before committing!** --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
fcfbf83b55 |
Settings design tweaks + fixes (#47132)
This PR: - Fixed a UI regression on the ZoomIt page - Updates the CmdPal settings page to make sure it has the latest links and imagery - Updates the New+ assets so they fit inline with all other screenshots and assets - Adds missing screenshots to the `docs` folder Closes: #44521 |
||
|
|
de6ba922fd |
Fixing OOBE and assets for Power Display and Grab And Move (#47033)
## Summary Adds the out-of-box experience (OOBE) for the new **Grab And Move** module and refreshes related assets across the repo. ## Changes ### Grab And Move OOBE - New `OobeGrabAndMove.xaml` / `.xaml.cs` page following the standard PowerToys OOBE pattern (hero image, How to use, Tips & tricks, Settings button, Learn more link) - Wired into `OobeWindow.xaml(.cs)` as a new `NavigationViewItem` so it appears in the OOBE wizard - Added localized resource strings (Title, Description, How to use, Tips and tricks) in `Resources.resw` - New OOBE animation: `Assets/Settings/Modules/OOBE/GrabAndMove.gif` ### Settings UI polish - Moved the Grab And Move nav item under *Windowing & Layouts* into its proper alphabetical position (after FancyZones, before Workspaces) - Added a "NEW" `InfoBadge` to both the Grab And Move item and its parent *Windowing & Layouts* group so users can discover the new utility ### Asset refresh - High-res `GrabAndMove.ico` (replaces the placeholder) - Updated Settings module icons (`Assets/Settings/Icons/GrabAndMove.png`, `Assets/Settings/Modules/GrabAndMove.png`) - New overview/marketing PNGs under `doc/images/overview/` (large, small, and original) ### README - Added **Grab And Move** and **PowerDisplay** to the utilities table in `README.md`, reflowed alphabetically into a clean 10x3 grid - New `doc/images/icons/GrabAndMove.png` and `doc/images/icons/PowerDisplay.png` for the table ## Validation - Settings UI builds cleanly - Grab And Move appears in the OOBE wizard navigation and renders correctly - "NEW" badges visible on first launch - README table renders with all 30 utilities, no empty trailing cells <img width="1307" height="807" alt="image" src="https://github.com/user-attachments/assets/f8d2ef96-a9f3-4307-9714-c308e216c044" /> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|
|
71cb9bc54e |
[Quick Accent] Fix issue where default "All available" setting is not parsed correctly (#47117)
## Summary of the Pull Request
When first enabled in the Settings application, Quick Accent defaults to
**All available** character sets, but the persisted "ALL" option in the
settings.json file is not understood by the application itself. This
leads to the fallback SPECIAL character set being selected - unbeknownst
to the user - which only contains a small subset of the available
mappings.
This PR also adds two new characters to the Hungarian language, as
requested under #47085.
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [x] Closes: #47113
- [x] Closes: #47085
- [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 cause of the issue is:
1. The default `SelectedLang` value for a new Quick Accent settings file
is "ALL", set in `PowerAccentProperties.cs`:
|