Compare commits

...

7 Commits

Author SHA1 Message Date
Leilei Zhang
0befdaed5d add more 2025-09-01 15:52:06 +08:00
Leilei Zhang
bd333ffc29 find all pr 2025-08-29 10:36:25 +08:00
Leilei Zhang
693a131036 refine sentence 2025-08-28 22:23:57 +08:00
Leilei Zhang
fc87f03fd5 remove next item 2025-08-28 18:17:59 +08:00
Leilei Zhang
9850a19aac fix spelling check 2025-08-28 16:55:03 +08:00
Leilei Zhang
9c3df634b4 update readme 2025-08-28 16:40:54 +08:00
Leilei Zhang
13731e8af1 update README.md 2025-08-28 16:26:38 +08:00
9 changed files with 2326 additions and 109 deletions

View File

@@ -1315,6 +1315,7 @@ PRODUCTVERSION
Progman
programdata
projectname
projitems
PROPERTYKEY
Propset
PROPVARIANT

196
README.md
View File

@@ -35,19 +35,19 @@ Microsoft PowerToys is a set of utilities for power users to tune and streamline
Go to the [Microsoft PowerToys GitHub releases page][github-release-link] and click on `Assets` at the bottom to show the files available in the release. Please use the appropriate PowerToys installer that matches your machine's architecture and install scope. For most, it is `x64` and per-user.
<!-- items that need to be updated release to release -->
[github-next-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.94%22
[github-current-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.93%22
[ptUserX64]: https://github.com/microsoft/PowerToys/releases/download/v0.93.0/PowerToysUserSetup-0.93.0-x64.exe
[ptUserArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.93.0/PowerToysUserSetup-0.93.0-arm64.exe
[ptMachineX64]: https://github.com/microsoft/PowerToys/releases/download/v0.93.0/PowerToysSetup-0.93.0-x64.exe
[ptMachineArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.93.0/PowerToysSetup-0.93.0-arm64.exe
[github-next-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.95%22
[github-current-release-work]: https://github.com/microsoft/PowerToys/issues?q=is%3Aissue+milestone%3A%22PowerToys+0.94%22
[ptUserX64]: https://github.com/microsoft/PowerToys/releases/download/v0.94.0/PowerToysUserSetup-0.94.0-wix5-x64.exe
[ptUserArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.94.0/PowerToysUserSetup-0.94.0-wix5-arm64.exe
[ptMachineX64]: https://github.com/microsoft/PowerToys/releases/download/v0.94.0/PowerToysSetup-0.94.0-wix5-x64.exe
[ptMachineArm64]: https://github.com/microsoft/PowerToys/releases/download/v0.94.0/PowerToysSetup-0.94.0-wix5-arm64.exe
| Description | Filename |
|----------------|----------|
| Per user - x64 | [PowerToysUserSetup-0.93.0-x64.exe][ptUserX64] |
| Per user - ARM64 | [PowerToysUserSetup-0.93.0-arm64.exe][ptUserArm64] |
| Machine wide - x64 | [PowerToysSetup-0.93.0-x64.exe][ptMachineX64] |
| Machine wide - ARM64 | [PowerToysSetup-0.93.0-arm64.exe][ptMachineArm64] |
| Per user - x64 | [PowerToysUserSetup-0.94.0-wix5-x64.exe][ptUserX64] |
| Per user - ARM64 | [PowerToysUserSetup-0.94.0-wix5-arm64.exe][ptUserArm64] |
| Machine wide - x64 | [PowerToysSetup-0.94.0-wix5-x64.exe][ptMachineX64] |
| Machine wide - ARM64 | [PowerToysSetup-0.94.0-wix5-arm64.exe][ptMachineArm64] |
This is our preferred method.
@@ -93,118 +93,142 @@ For guidance on developing for PowerToys, please read the [developer docs](./doc
Our [prioritized roadmap][roadmap] of features and utilities that the core team is focusing on.
### 0.93 - Aug 2025 Update
### 0.94 - Sep 2025 Update
In this release, we focused on new features, stability, optimization improvements, and automation.
**✨Highlights**
- PowerToys settings debuts a modern, card-based dashboard with clearer descriptions and faster navigation for a streamlined user experience.
- Command Palette had over 99 issues resolved, including bringing back Clipboard History, adding context menu shortcuts, pinning favorite apps, and supporting history in Run.
- Command Palette reduced its startup memory usage by ~15%, load time by ~40%, built-in extensions loading time by ~70%, and installation size by ~55%—all due to using the full Ahead-of-Time (AOT) compilation mode in Windows App SDK.
- Peek now supports instant previews and embedded thumbnails for Binary G-code (.bgcode) 3D printing files, making it easy to inspect models at a glance. Thanks [@pedrolamas](https://github.com/pedrolamas)!
- Mouse Utilities introduces a new spotlight highlighting mode that dims the screen and draws attention to your cursor, perfect for presentations.
- Test coverage improvements for multiple PowerToys modules including Command Palette, Advanced Paste, Peek, Text Extractor, and PowerRename — ensuring better reliability and quality, with over 600 new unit tests (mostly for Command Palette) and doubled UI automation coverage.
- The installer was upgraded to WiX 5 after WiX 3 reached end-of-life; this move improved installer security, reliability, and community support.
- PowerToys Settings added a Settings search with fuzzy matching, suggestions, a results page, and UX polish to make finding options faster.
- A comprehensive hotkey conflict detection system was introduced in Settings to surface and help resolve conflicting shortcuts.
- Command Palette received stability, accessibility, and UX improvements — fixed singleclick activation; added support for path shortcuts (~, /, \\) in file search; fixed race conditions and cancellation issues; and improved diagnostics to reduce memory leaks.
- Peek added XML syntax support for .shproj and .projitems in its Monaco preview. Thanks [@rezanid](https://github.com/rezanid)!
- Context menu registration was moved from the installer to runtime to avoid loading disabled modules (runtime registrations).
- Mouse Utilities added a “Gliding cursor” accessibility feature to Mouse Pointer Crosshairs for singlebutton cursor movement and clicking. Thanks [@mikehall-ms](https://github.com/mikehall-ms)!
### Always On Top
- Fixed the border hover cursor so it shows the arrow instead of the wait cursor. Thanks [@davidegiacometti](https://github.com/davidegiacometti)!
### Command Palette
- Ensured screen readers are notified when the selected item in the list changes for better accessibility.
- Fixed command title changes not being properly notified to screen readers. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Made icon controls excluded from keyboard navigation by default for better accessibility. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Improved UI design with better text sizing and alignment.
- Fixed keyboard shortcuts to work better in text boxes and context menus.
- Added right-click context menus with critical command styling and separators.
- Improved various context menu issues, improving item selection, handling of long titles, search bar text scaling, initial item behavior, and primary button functionality.
- Fixed context menu crashes with better type handling.
- Fixed "Reload" command to work with both uppercase and lowercase letters.
- Added mouse back button support for easier navigation. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed Alt+Left Arrow navigation not working when search box contains text. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Updated back button tooltip to show keyboard shortcut information. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed Command Palette window not appearing properly when activated. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed Command Palette window staying hidden from taskbar after File Explorer restarts. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed window focus not returning to previous app properly.
- Fixed Command Palette window to always appear on top when shown and move to bottom when hidden. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed window hiding to properly work on UI thread. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Fixed crashes and improved stability with better synchronization of Command list updates. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Improved extension disposal with better error handling to prevent crashes. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Improved stability by fixing a UI threading issue when loading more results, preventing possible crashes and ensuring the loading state resets if loading fails. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Enhanced icon loading stability with better exception handling. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Added thread safety to recent commands to prevent crashes. Thanks [@MaoShengelia](https://github.com/MaoShengelia)!
- Fixed acrylic (frosted glass) system backdrop display issues by ensuring proper UI thread handling. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Applied single-click activation only to pointer input; keyboard always activates immediately. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Let context menus open at the cursor by removing window-bound constraints. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Made error messages clearer with timestamps, HRESULTs, and full details for easier diagnosis. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Prevented crashes and improved robustness when updating providers without commands. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Ensured the Settings window reliably comes to the front when opened. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Replaced the Clipboard History icon with a colorful Fluent icon. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Hardened ContentIcon to avoid duplicate parenting and improve diagnostics. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Standardized null checks using C# pattern matching for safer behavior.
- Improved accessibility by focusing the activation shortcut dialog and making text reachable. Thanks [@chatasweetie](https://github.com/chatasweetie)!
- Moved the extension SDK to a stable Windows SDK and cleaned up message namespaces.
- Added path shortcuts: ~ to home, and / or \\ to system root, plus UNC support. Thanks [@davidegiacometti](https://github.com/davidegiacometti)!
- Fixed a race in cancellation handling to avoid InvalidOperationException. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Aligned separator styling with WinUI 3 for consistent visuals. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Added ARM64 PDBs to the Extensions SDK NuGet for better debugging.
- Added single-select filters to DynamicListPage and updated Windows Services sample.
- Updated main page placeholder text to better describe what can be searched. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Removed explicit WinAppSDK/WebView2 dependencies from toolkit and API. Thanks [@rluengen](https://github.com/rluengen)!
- Added a local keyboard hook to handle the GoBack key reliably. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Propagated alias changes safely and resolved conflicts across view models.
- Allowed providers to override Dispose with a virtual method.
- Fixed memory leaks by cleaning up removed or cancelled list items.
- Sorted DateTime extension results by relevance for better usability.
- Reduced search text “jiggling” by avoiding redundant change notifications.
- Centralized automation notifications in a UIHelper for better accessibility. Thanks [@chatasweetie](https://github.com/chatasweetie)!
- Preserved Adaptive Card action types during trimming via DynamicDependency.
- Added an acrylic backdrop and refined styling to the context menu. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Prevented disposed pages and Settings windows from handling stale messages. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Made the extension API easier to evolve without breaking clients.
- Added “evil” sample pages to help reproduce tricky bugs.
- Fixed WinGet trim-safety issues by replacing LINQ with manual iteration.
- Cancelled stale list fetches to avoid older results overwriting newer ones in CmdPal.
### Command Palette extensions
- Added settings to each provider to control which fallback commands are enabled. Thanks [@jiripolasek](https://github.com/jiripolasek)! for fixing a regression in this feature.
- Added sample code showing how Command Palette extensions can track when their pages are loaded or unloaded. [Check it out here](./src/modules/cmdpal/ext/SamplePagesExtension/OnLoadPage.cs).
- Fixed *Calculator* to accept regular spaces in numbers that use space separators. Thanks [@PesBandi](https://github.com/PesBandi)!
- Added a new setting to *Calculator* to make "Copy" the primary button (replacing “Save”) and enable "Close on Enter", streamlining the workflow. Thanks [@PesBandi](https://github.com/PesBandi)!
- Improved *Apps* indexing error handling and removed obsolete code. Thanks [@davidegiacometti](https://github.com/davidegiacometti)!
- Prevented apps from showing in search when the *Apps* extension is disabled. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Added ability to pin/unpin *Apps* using Ctrl+P shortcut.
- Added keyboard shortcuts to the *Apps* context menu items for faster access.
- Added all file context menu options to the *Apps* items context menu, making all file actions available there for better functionality.
- Streamlined All *Apps* extension settings by removing redundant descriptions, making the UI clearer.
- Added command history to the *Run* page for easier access to previous commands.
- Fixed directory path handling in *Run* fallback for better file navigation.
- Fixed URL fallback item hiding properly in *Web Search* extension when search query becomes invalid. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Added proper empty state message for *Web Search* extension when no results found. Thanks [@jiripolasek](https://github.com/jiripolasek)!
- Added fallback command to *Windows Settings* extension for better search results.
- Re-enabled *Clipboard History* feature with proper window handling.
- Improved *Add Bookmark* extension to automatically detect file, folder, or URL types without manual input.
- Updated terminology from "Kill process" to "End task" in *Window Walker* for consistency with Windows.
- Fixed minor grammar error in SamplePagesExtension code comments. Thanks [@purofle](https://github.com/purofle)!
- Improved empty states and ranking logic for multiple extensions. Thanks [@htcfreek](https://github.com/htcfreek)!
- Added app icons to the All Apps "Run" context command when available.
- Restored missing builtin icons by standardizing extension dependencies.
- Unblocked local deployment by adding WinAppSDK to two sample extensions.
### Hosts File Editor
- Added a "No leading spaces" option so active hosts entries can start at column 0 even when others are disabled. Thanks [@mohammed-saalim](https://github.com/mohammed-saalim)!
### Image Resizer
- Fixed Image Resizer localization by installing satellite resources under the WinUI 3 apps culture path.
### Mouse Utilities
- Added a new spotlight highlighting mode that creates a large transparent circle around your cursor with a backdrop effect, providing an alternative to the traditional circle highlight. Perfect for presentations where you want to focus attention on a specific area while dimming the rest of the screen.
- Introduced "Gliding cursor" to control the pointer and click with a single hotkey for better accessibility. Thanks [@mikehall-ms](https://github.com/mikehall-ms)!
### Mouse Without Borders
- Blocked Easy Mouse from switching machines during fullscreen apps, with an allow-list for exceptions. Thanks [@dot-tb](https://github.com/dot-tb)!
### Peek
- Added preview and thumbnail support for Binary G-code (.bgcode) files used in 3D printing. You can now see embedded thumbnails and preview these compressed 3D printing files directly in Peek and File Explorer. Thanks [@pedrolamas](https://github.com/pedrolamas)!
- Added Visual Studio shared project file types to XML preview and fixed bgcode handler registration. Thanks [@rezanid](https://github.com/rezanid)!
- Fixes bgcode preview handler registration and events for reliable previews. Thanks [@pedrolamas](https://github.com/pedrolamas)!
### PowerRename
- Changed the Explorer accelerator key to PowErRename to avoid clashing with the New menu. Thanks [@aaron-ni](https://github.com/aaron-ni)!
### Quick Accent
- Added Vietnamese language support to Quick Accent, mappings for Vietnamese vowels (a, e, i, o, u, y) and the letter d. Thanks [@octastylos-pseudodipteros](https://github.com/octastylos-pseudodipteros)!
- Remembered character usage across sessions so frequently used accents appear first. Thanks [@davidegiacometti](https://github.com/davidegiacometti)!
- Added Maltese language support with specific characters and the Euro symbol. Thanks [@rovercoder](https://github.com/rovercoder)!
- Reduced GPU usage issues by making the window Topmost only when the picker is visible. Thanks [@daverayment](https://github.com/daverayment)!
### Settings
- Completely redesigned the Settings dashboard with a modern card-based layout featuring organized sections for quick actions and shortcuts overview, replacing the old module list.
- Rewrote setting descriptions to be more concise and follow Windows writing style guidelines, making them easier to understand.
- Improved formatting and readability of release notes in the "What's New" section with better typography and spacing.
- Added missing deep link support for various settings pages (Peek, Quick Accent, PowerToys Run, etc.) so you can jump directly to specific settings.
- Resolved an issue where the settings page header would drift away from its position when resizing the settings window.
- Resolved a settings crash related to incompatible property names in ZoomIt configuration.
- Added telemetry to track usage of the new shortcut conflict detection workflow.
- Moved the shutdown action from the title bar to a footer menu item with confirmation. Thanks [@davidegiacometti](https://github.com/davidegiacometti)!
- Implemented comprehensive hotkey conflict detection with a dedicated resolution dialog.
- Added branded visuals for Office and Copilot keys in the KeyVisual control.
- Introduced Settings search with fuzzy matching and navigation to specific controls.
- Corrected Spanish localization so product names like Awake remain in English across Settings and OOBE.
- Simplified the Advanced Paste description in Settings for quicker reading and consistent capitalization. Thanks [@OldUser101](https://github.com/OldUser101)!
- Localized conflict messages in the conflict window and dialog.
### Installer
- Upgraded the installer to WiX 5 with silent "Files in Use" handling for smoother winget installs.
- Switched Win10 context menu modules to runtime registration and added cleanup on uninstall to avoid stale entries.
### Documentation
- Added detailed step-by-step instructions for first-time developers building the Command Palette module, including prerequisites and Visual Studio setup guidance. Thanks [@chatasweetie](https://github.com/chatasweetie)!
- **Fixed Broken SDK Link**: Corrected a broken markdown link in the Command Palette SDK README that was pointing to an incorrect directory path. Thanks [@ChrisGuzak](https://github.com/ChrisGuzak)!
- Added documentation for the "Open With Cursor" plugin that enables opening Visual Studio and VS Code recent files using Cursor AI. Thanks [@VictorNoxx](https://github.com/VictorNoxx)!
- Added documentation for two new community plugins - Hotkeys plugin for creating custom keyboard shortcuts, and RandomGen plugin for generating random data like passwords, colors, and placeholder text. Thanks [@ruslanlap](https://github.com/ruslanlap)!
- Adds docs for building the installer locally and testing winget installs.
- Fixed a broken style guide link in developer documentation. Thanks [@denizmaral](https://github.com/denizmaral)!
### Development
- Updated .NET libraries to 9.0.8 for performance and security. Thanks [@snickler](https://github.com/snickler)!
- Updated the spell check system to version 0.0.25 with better GitHub integration and SARIF reporting, plus fixed numerous spelling errors throughout the codebase including property names and documentation. Thanks [@jsoref](https://github.com/jsoref)!
- Cleaned up spelling check configuration to eliminate false positives and excessive noise that was appearing in every pull request, making the development process smoother.
- Replaced NuGet feed with Azure Artifacts for better package management.
- Implemented configurable UI test pipeline that can use pre-built official releases instead of building everything from scratch, reducing test execution time from 2+ hours.
- Replaced brittle pixel-by-pixel image comparison with perceptual hash (pHash) technology that's more robust to minor rendering differences - no more test failures due to anti-aliasing or compression artifacts.
- Reduced CI/fuzzing/UI test timeouts from 4 hours to 90 minutes, dramatically improving developer feedback loops and preventing long waits when builds get stuck.
- Standardized test project naming across the entire codebase and improved pipeline result identification by adding platform/install mode context to test run titles. Thanks [@khmyznikov](https://github.com/khmyznikov)!
- Added comprehensive UI test suites for multiple PowerToys modules including Command Palette, Advanced Paste, Peek, Text Extractor, and PowerRename - ensuring better reliability and quality.
- Enhanced UI test automation with command-line argument support, better session management, and improved element location methods using pattern matching to avoid failures from minor differences in exact matches.
- Excluded test and coverage DLLs from BinSkim scans to cut false positives and speed up security analysis.
- Simplified NOTICE maintenance by removing version numbers and filtering out Microsoft/System packages.
- Improved NuGet dependency validation to prevent package downgrades and catch issues during restore.
- Updated UTF.Unknown to a modern version to improve compatibility without breaking changes. Thanks [@304NotModified](https://github.com/304NotModified)!
- Refreshed package catalog in CI before installing dependencies to prevent Linux workflow failures.
- Refactored CmdPal tests with dependency injection and added coverage for queries and settings.
- Added unit tests to verify Close on Enter swaps Copy/Save as expected. Thanks [@mohammed-saalim](https://github.com/mohammed-saalim)!
- Added accessibility IDs to CmdPal UI for stable UI tests.
- Rewrote system command tests with a new test base and cleaner patterns.
- Added unit tests for WebSearch and Shell extensions with mockable settings.
- Added unit tests and abstractions for Apps and Bookmarks extensions.
- Cleans up AIgenerated tests; adds meaningful query tests across extensions.
- Removed the obsolete debug dialog from Settings for a smoother developer loop.
### What is being planned over the next few releases
For [v0.94][github-next-release-work], we'll work on the items below:
For [v0.95][github-next-release-work], we'll work on the items below:
- Continued Command Palette polish
- Working on Shortcut Guide v2 (Thanks [@noraa-junker](https://github.com/noraa-junker)!)
- Working on upgrading the installer to WiX 5
- Working on shortcut conflict detection
- Working on setting search
- Upgrading Keyboard Manager's editor UI
- UI tweaking utility with day/night theme switcher
- DSC v3 support for top utilities
- New UI automation tests
- Stability, bug fixes

View File

@@ -0,0 +1,211 @@
param(
[Parameter(Mandatory=$true)]
[string]$StartCommit
)
Write-Host "Combining PR data with AI Pull Request Overview..." -ForegroundColor Green
Write-Host "Start commit: $StartCommit" -ForegroundColor Yellow
# Check if required files exist
$prFile = "stable_branch_prs_filtered.txt"
$copilotFile = "stable_branch_copilot_reviews.json"
if (-not (Test-Path $prFile)) {
Write-Host "Error: $prFile not found. Please run get_stable_branch_prs.ps1 first." -ForegroundColor Red
exit 1
}
if (-not (Test-Path $copilotFile)) {
Write-Host "Error: $copilotFile not found. Please run get_copilot_reviews.ps1 first." -ForegroundColor Red
exit 1
}
# Read the Copilot reviews data
$copilotData = Get-Content $copilotFile -Raw | ConvertFrom-Json
Write-Host "Loaded $($copilotData.reviews.Count) Copilot reviews" -ForegroundColor Cyan
# Create a hashtable to store PR Overview by PR number
$prOverviews = @{}
# Extract Pull Request Overview from Copilot reviews
Write-Host "Processing $($copilotData.reviews.Count) reviews..." -ForegroundColor Yellow
$reviewCount = 0
foreach ($review in $copilotData.reviews) {
$reviewCount++
if ($reviewCount % 20 -eq 0) {
Write-Host " Processed $reviewCount reviews..." -ForegroundColor Gray
}
$prNumber = $review.pr_number
$reviewBody = $review.review_body
$commentBody = $review.comment_body
# Look for "## Pull Request Overview" in review body
if ($reviewBody -and $reviewBody.Contains("## Pull Request Overview")) {
# Extract content after "## Pull Request Overview"
$startIndex = $reviewBody.IndexOf("## Pull Request Overview") + "## Pull Request Overview".Length
$remaining = $reviewBody.Substring($startIndex).Trim()
# Find the end of the overview section
$endPatterns = @("### ", "## ", "---", "<details>")
$endIndex = $remaining.Length
foreach ($pattern in $endPatterns) {
$index = $remaining.IndexOf($pattern)
if ($index -gt 0 -and $index -lt $endIndex) {
$endIndex = $index
}
}
$overview = $remaining.Substring(0, $endIndex).Trim()
if ($overview -and -not $prOverviews.ContainsKey($prNumber)) {
Write-Host "Found overview for PR $prNumber" -ForegroundColor Green
$prOverviews[$prNumber] = @{
Content = $overview
Source = "Review"
Reviewer = $review.reviewer
SubmittedAt = $review.submitted_at
}
}
}
# Also check comment body if no overview found yet
if (-not $prOverviews.ContainsKey($prNumber) -and $commentBody -and $commentBody -match "## Pull Request Overview\\n\\n(.*?)(?=\\n###|\\n##|\\n---|\z)") {
$overview = $matches[1].Trim() -replace '\\n', "`n"
if ($overview) {
$prOverviews[$prNumber] = @{
Content = $overview
Source = "Comment"
Reviewer = $review.reviewer
CreatedAt = $review.created_at
}
}
}
}
Write-Host "Found Pull Request Overviews for $($prOverviews.Count) PRs" -ForegroundColor Cyan
# Read PR data from filtered file
$prContent = Get-Content $prFile -Raw
# Extract PR information using simpler approach
$prBlocks = $prContent -split "={80}" | Where-Object { $_.Trim() -and $_.Contains("PR #") }
Write-Host "Processing $($prBlocks.Count) PR blocks..." -ForegroundColor Yellow
foreach ($block in $prBlocks) {
if ($block -match "PR #(\d+) \[MERGED\]") {
$prNumber = [int]$matches[1]
# Extract other fields
if ($block -match "Title: (.*?)(?=\r?\n|\r)") { $title = $matches[1].Trim() }
if ($block -match "Author: (.*?)(?=\r?\n|\r)") { $author = $matches[1].Trim() }
if ($block -match "Created: (.*?)(?=\r?\n|\r)") { $created = $matches[1].Trim() }
if ($block -match "Base: (.*?) \| Head: (.*?)(?=\r?\n|\r)") {
$base = $matches[1].Trim()
$head = $matches[2].Trim()
}
if ($block -match "URL: (.*?)(?=\r?\n|\r)") { $url = $matches[1].Trim() }
# Extract description
if ($block -match "Description:\r?\n(.*?)$") {
$description = $matches[1].Trim()
} else {
$description = ""
}
$prInfo = @{
PRNumber = $prNumber
Title = $title
Author = $author
Created = $created
Base = $base
Head = $head
URL = $url
Description = $description
AIOverview = $null
HasAIOverview = $false
}
# Check if we have AI overview for this PR
if ($prOverviews.ContainsKey($prNumber)) {
$overview = $prOverviews[$prNumber]
$prInfo.AIOverview = $overview.Content
$prInfo.HasAIOverview = $true
}
$combinedData += $prInfo
}
}
$combinedData = @()
Write-Host "Processed $($combinedData.Count) PRs total" -ForegroundColor Cyan
$prsWithOverview = ($combinedData | Where-Object { $_.HasAIOverview }).Count
Write-Host "PRs with AI Overview: $prsWithOverview" -ForegroundColor Green
# Generate combined output
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$outputContent = @"
PowerToys PRs with AI Pull Request Overview from stable branch after $StartCommit
Generated: $timestamp
Total PRs: $($combinedData.Count)
PRs with AI Overview: $prsWithOverview
================================================================================
"@
foreach ($pr in $combinedData) {
$outputContent += @"
PR #$($pr.PRNumber): $($pr.Title)
URL: $($pr.URL)
Author: $($pr.Author)
Created: $($pr.Created)
## Original PR Description
$($pr.Description)
"@
if ($pr.HasAIOverview) {
$outputContent += @"
## AI Pull Request Overview
Reviewer: $($pr.AIReviewer)
Review Date: $($pr.AIReviewDate)
$($pr.AIOverview)
"@
} else {
$outputContent += @"
## AI Pull Request Overview
(No AI overview available for this PR)
"@
}
$outputContent += "`n" + "="*80 + "`n`n"
}
# Save outputs
$jsonFile = "combined_prs_with_ai_overview.json"
$txtFile = "combined_prs_with_ai_overview.txt"
$combinedData | ConvertTo-Json -Depth 10 | Out-File -FilePath $jsonFile -Encoding UTF8
$outputContent | Out-File -FilePath $txtFile -Encoding UTF8
Write-Host "`nFiles generated:" -ForegroundColor Green
Write-Host "JSON: $(Resolve-Path $jsonFile)" -ForegroundColor Yellow
Write-Host "TXT: $(Resolve-Path $txtFile)" -ForegroundColor Yellow
Write-Host "`nSummary:" -ForegroundColor Green
Write-Host "--------"
Write-Host "Start commit: $StartCommit"
Write-Host "Total PRs processed: $($combinedData.Count)"
Write-Host "PRs with AI Overview: $prsWithOverview"
if ($prsWithOverview -gt 0) {
Write-Host "`nSample PRs with AI Overview:" -ForegroundColor Cyan
$samplesWithOverview = $combinedData | Where-Object { $_.HasAIOverview } | Select-Object -First 3
foreach ($sample in $samplesWithOverview) {
Write-Host " PR #$($sample.PRNumber): $($sample.Title)"
}
}

File diff suppressed because it is too large Load Diff

367
get_stable_branch_prs.ps1 Normal file
View File

@@ -0,0 +1,367 @@
param(
[Parameter(Mandatory=$true)]
[string]$StartCommit
)
Write-Host "Getting PR data from stable branch after commit: $StartCommit" -ForegroundColor Green
# Check if we're in a git repository
if (-not (Test-Path ".git")) {
Write-Host "Error: This script must be run from a git repository root" -ForegroundColor Red
exit 1
}
# Check if stable branch exists
$stableBranchExists = git branch -r | Where-Object { $_ -match "origin/stable" }
if (-not $stableBranchExists) {
Write-Host "Error: stable branch not found in remote" -ForegroundColor Red
exit 1
}
# Fetch latest changes
Write-Host "Fetching latest changes..." -ForegroundColor Yellow
git fetch origin
# Get commits from stable branch after the start commit
Write-Host "Getting commits from stable branch after $StartCommit..." -ForegroundColor Yellow
$commits = git log origin/stable --oneline --format="%H %s" "$StartCommit..origin/stable"
if (-not $commits) {
Write-Host "No commits found after $StartCommit on stable branch" -ForegroundColor Yellow
# Create empty file
@() | Out-File -FilePath "stable_branch_prs_filtered.txt" -Encoding UTF8
exit 0
}
$commitArray = $commits | ForEach-Object {
if ($_ -match "^([a-f0-9]+)\s+(.+)$") {
@{
Hash = $matches[1]
Message = $matches[2]
}
}
}
Write-Host "Found $($commitArray.Count) commits to process" -ForegroundColor Cyan
# Extract PR numbers from commit messages
$prNumbers = @()
foreach ($commit in $commitArray) {
# Look for PR numbers in commit messages (common patterns)
if ($commit.Message -match "#(\d+)" -or $commit.Message -match "PR\s*#?(\d+)" -or $commit.Message -match "\(#(\d+)\)") {
$prNumber = [int]$matches[1]
if ($prNumbers -notcontains $prNumber) {
$prNumbers += $prNumber
Write-Host "Found PR #$prNumber from commit: $($commit.Message.Substring(0, [Math]::Min(60, $commit.Message.Length)))" -ForegroundColor Gray
}
}
}
if ($prNumbers.Count -eq 0) {
Write-Host "No PR numbers found in commit messages" -ForegroundColor Yellow
# Create empty file
@() | Out-File -FilePath "stable_branch_prs_filtered.txt" -Encoding UTF8
exit 0
}
Write-Host "Found $($prNumbers.Count) unique PR numbers" -ForegroundColor Cyan
# Function to clean PR description
function Remove-PRChecklistSection {
param([string]$description)
if (-not $description) { return "(No description provided)" }
# Remove the entire "## PR Checklist" section but keep other sections
$result = $description
# Remove HTML comments
$result = $result -replace '<!--.*?-->', ''
# Split into sections and filter out PR Checklist
if ($result -match '##\s+PR\s+Checklist') {
# Find the start and end of the PR Checklist section
$sections = $result -split '(?=##\s+)'
$filteredSections = @()
foreach ($section in $sections) {
# Skip PR Checklist section and Validation Steps section if empty
if ($section -match '^##\s+PR\s+Checklist' -or
$section -match '^##\s+Validation\s+Steps\s+Performed\s*$') {
continue
}
$section = $section.Trim()
if ($section) {
$filteredSections += $section
}
}
$result = $filteredSections -join "`r`n`r`n"
}
# Clean up extra whitespace
$result = $result -replace '\r\n\s*\r\n+', "`r`n`r`n"
$result = $result.Trim()
return $result
}
# Function to extract AI Overview from PR comments and reviews
function Get-AIOverviewFromComments {
param([int]$prNumber)
try {
# Get PR reviews first (Copilot reviews are usually here)
$reviewsJson = gh pr view $prNumber --json reviews
$reviewsData = $reviewsJson | ConvertFrom-Json
foreach ($review in $reviewsData.reviews) {
# Check if this is a GitHub Copilot review
$isGitHubCopilot = $review.author.login -match "copilot|github-actions|app/github-copilot" -or
$review.body -match "github copilot|copilot|AI.*overview|AI.*summary" -or
$review.authorAssociation -eq "APP"
if ($isGitHubCopilot -and $review.body) {
# Look for various AI Overview patterns
$overviewPatterns = @(
'##\s*Pull\s*Request\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*AI\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Summary\s*([\s\S]*?)(?=##|$)',
'##\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Pull\s*Request\s*Summary\s*([\s\S]*?)(?=##|$)'
)
foreach ($pattern in $overviewPatterns) {
if ($review.body -match $pattern) {
$aiOverview = $matches[1].Trim()
if ($aiOverview -and $aiOverview.Length -gt 20) {
# Additional validation - make sure it's not just a header
if ($aiOverview -match '\w+.*\w+') {
return $aiOverview
}
}
}
}
}
}
# Get PR comments
$commentsJson = gh pr view $prNumber --json comments
$commentsData = $commentsJson | ConvertFrom-Json
foreach ($comment in $commentsData.comments) {
# Check if this is a GitHub Copilot comment
$isGitHubCopilot = $comment.author.login -match "github-actions|copilot|app/github-copilot" -or
$comment.body -match "github copilot|copilot|AI.*overview|AI.*summary" -or
$comment.authorAssociation -eq "APP"
if ($isGitHubCopilot) {
# Look for various AI Overview patterns
$overviewPatterns = @(
'##\s*Pull\s*Request\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*AI\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Summary\s*([\s\S]*?)(?=##|$)',
'##\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Pull\s*Request\s*Summary\s*([\s\S]*?)(?=##|$)'
)
foreach ($pattern in $overviewPatterns) {
if ($comment.body -match $pattern) {
$aiOverview = $matches[1].Trim()
if ($aiOverview -and $aiOverview.Length -gt 20) {
# Additional validation - make sure it's not just a header
if ($aiOverview -match '\w+.*\w+') {
return $aiOverview
}
}
}
}
}
}
# If not found in comments/reviews, also check the main PR body for AI-generated sections
$prJson = gh pr view $prNumber --json body
$prData = $prJson | ConvertFrom-Json
if ($prData.body) {
$overviewPatterns = @(
'##\s*Pull\s*Request\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*AI\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Overview\s*([\s\S]*?)(?=##|$)',
'##\s*Pull\s*Request\s*Summary\s*([\s\S]*?)(?=##|$)'
)
foreach ($pattern in $overviewPatterns) {
if ($prData.body -match $pattern) {
$aiOverview = $matches[1].Trim()
if ($aiOverview -and $aiOverview.Length -gt 20 -and $aiOverview -match '\w+.*\w+') {
return $aiOverview
}
}
}
}
return $null
} catch {
Write-Host " Warning: Could not fetch comments/reviews for PR #$prNumber : $($_.Exception.Message)" -ForegroundColor Yellow
return $null
}
}
# Check if GitHub CLI is available
$ghAvailable = $false
try {
$null = gh --version
$ghAvailable = $true
Write-Host "GitHub CLI (gh) is available" -ForegroundColor Green
} catch {
Write-Host "GitHub CLI (gh) is not available. Will use simplified format." -ForegroundColor Yellow
}
$combinedData = @()
$processedPRs = 0
foreach ($prNumber in $prNumbers | Sort-Object) {
$processedPRs++
Write-Host "Processing PR #$prNumber ($processedPRs/$($prNumbers.Count))..." -ForegroundColor Yellow
if ($ghAvailable) {
try {
# Get PR information using GitHub CLI
$prJson = gh pr view $prNumber --json number,title,author,createdAt,baseRefName,headRefName,url,body,state,labels
$prData = $prJson | ConvertFrom-Json
# Only process merged PRs
if ($prData.state -eq "MERGED") {
$author = $prData.author.login
$created = $prData.createdAt
$base = $prData.baseRefName
$head = $prData.headRefName
$description = Remove-PRChecklistSection -description $prData.body
# Get AI Overview from comments
Write-Host " Fetching AI Overview..." -ForegroundColor Gray
$aiOverview = Get-AIOverviewFromComments -prNumber $prNumber
$hasAiOverview = $null -ne $aiOverview
if ($hasAiOverview) {
Write-Host " ✓ Found AI Overview" -ForegroundColor Green
} else {
Write-Host " - No AI Overview found" -ForegroundColor Gray
}
# Process labels
$labelNames = @()
if ($prData.labels -and $prData.labels.Count -gt 0) {
$labelNames = $prData.labels | ForEach-Object { $_.name }
}
$prInfo = @{
PRNumber = $prData.number
Title = $prData.title
Author = $author
Created = $created
Base = $base
Head = $head
URL = $prData.url
Description = $description
AIOverview = $aiOverview
HasAIOverview = $hasAiOverview
Labels = $labelNames
}
$combinedData += $prInfo
Write-Host " ✓ PR #${prNumber}: $($prData.title)" -ForegroundColor Green
} else {
Write-Host " - PR #${prNumber}: Skipped (not merged, state: $($prData.state))" -ForegroundColor Gray
}
} catch {
Write-Host " × Error getting PR #$prNumber : $($_.Exception.Message)" -ForegroundColor Red
# Fallback: create basic entry from commit information
$relatedCommits = $commitArray | Where-Object { $_.Message -match "#$prNumber|PR\s*#?$prNumber|\(#$prNumber\)" }
if ($relatedCommits) {
$firstCommit = $relatedCommits[0]
$title = $firstCommit.Message -replace "#$prNumber|\(#$prNumber\)|PR\s*#?$prNumber", "" -replace "^\s+|\s+$", ""
$prInfo = @{
PRNumber = $prNumber
Title = $title
Author = "(Unknown)"
Created = "(Unknown)"
Base = "stable"
Head = "(Unknown)"
URL = "https://github.com/microsoft/PowerToys/pull/$prNumber"
Description = "(Unable to fetch PR details - inferred from commit message)"
AIOverview = $null
HasAIOverview = $false
Labels = @()
}
$combinedData += $prInfo
}
}
} else {
# Fallback when GitHub CLI is not available
$relatedCommits = $commitArray | Where-Object { $_.Message -match "#$prNumber|PR\s*#?$prNumber|\(#$prNumber\)" }
if ($relatedCommits) {
$firstCommit = $relatedCommits[0]
$title = $firstCommit.Message -replace "#$prNumber|\(#$prNumber\)|PR\s*#?$prNumber", "" -replace "^\s+|\s+$", ""
# Get commit date
$commitDate = git show -s --format="%ci" $firstCommit.Hash
$prInfo = @{
PRNumber = $prNumber
Title = $title
Author = "(Unknown - GitHub CLI required)"
Created = $commitDate
Base = "stable"
Head = "(Unknown)"
URL = "https://github.com/microsoft/PowerToys/pull/$prNumber"
Description = "(GitHub CLI not available - inferred from commit: $($firstCommit.Message))"
AIOverview = $null
HasAIOverview = $false
Labels = @()
}
$combinedData += $prInfo
Write-Host " ✓ PR #${prNumber}: $title (basic info)" -ForegroundColor Yellow
}
}
}
# Generate JSON output
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$outputData = @{
generated_at = $timestamp
start_commit = $StartCommit
total_prs = $combinedData.Count
commits_analyzed = $commitArray.Count
unique_prs_found = $prNumbers.Count
prs = $combinedData
}
# Save the JSON file
$jsonFile = "stable_branch_prs.json"
$outputData | ConvertTo-Json -Depth 10 | Out-File -FilePath $jsonFile -Encoding UTF8
Write-Host "`nGenerated file: $(Resolve-Path $jsonFile)" -ForegroundColor Green
Write-Host "Total PRs processed: $($combinedData.Count)" -ForegroundColor Cyan
Write-Host "Start commit: $StartCommit" -ForegroundColor Yellow
# Display summary
Write-Host "`nSummary:" -ForegroundColor Green
Write-Host "--------"
Write-Host "Commits analyzed: $($commitArray.Count)"
Write-Host "Unique PRs found: $($prNumbers.Count)"
Write-Host "Merged PRs included: $($combinedData.Count)"
if ($combinedData.Count -gt 0) {
Write-Host "`nFirst few PRs:" -ForegroundColor Cyan
$samplePRs = $combinedData | Select-Object -First 3
foreach ($pr in $samplePRs) {
Write-Host " - PR #$($pr.PRNumber): $($pr.Title)"
}
}

97
pr_summary.json Normal file
View File

@@ -0,0 +1,97 @@
{
"generated_at": "2025-08-27 15:30:00",
"summary": "PowerToys Release Notes - Feature Changes Summary",
"total_analyzed_prs": 69,
"prs_with_ai_overview": 33,
"release_notes_format": {
"Settings": [
"Added comprehensive search functionality for PowerToys settings, enabling users to quickly find and navigate to specific settings and modules with live suggestions and dedicated search results page. Thanks [@vanzue](https://github.com/vanzue)! #41285",
"Moved the shutdown button from title bar to navigation view footer menu item, only visible when system tray icon is hidden, with confirmation dialog added. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! #40714",
"Simplified and fixed styling issues in the Advanced Paste module description. Thanks [@OldUser101](https://github.com/OldUser101)! #37563"
],
"Installer": [
"Upgraded installer from deprecated WiX3 to WiX5, improving security, service quality, and community support while maintaining backward compatibility during the transition. Thanks [@zhaopy536](https://github.com/zhaopy536)! #40877",
"Refactored shell extension registration from static WiX installer registration to conditional runtime registration, addressing issues where DLLs load even when modules are disabled. Thanks [@lei9444](https://github.com/lei9444)! #41275",
"Fixed localization issues for ImageResizer component by correcting satellite resource DLL installation path to WinUI3Apps directory. Thanks [@lei9444](https://github.com/lei9444)! #41152",
"Ensured Windows 11 adds registry entries for the old context menu so that 'Show more options'/classic menu always includes them. Thanks [@lei9444](https://github.com/lei9444)! #41351"
],
"Command Palette": [
"Fixed WinGet functionality issues in release builds by addressing trim-safety problems, replacing LINQ operations with manual iteration. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41183",
"Fixed missing icons by introducing shared dependency management to ensure all extensions include required dependencies. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41298",
"Added infrastructure to make it easier to extend Command Palette's WinRT APIs with type cache pre-loading mechanism. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41056",
"Fixed race condition causing search text to 'jiggle' or bounce during rapid updates. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41165",
"Added cancellation support to prevent race conditions when multiple fetch operations are triggered. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41166",
"Addressed memory leaks by ensuring proper cleanup of ListItemViewModel objects when no longer needed. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41169",
"Added support for special path prefixes, allowing users to search paths starting with ~ (home directory), / or \\\\ (system root directory). Thanks [@davidegiacometti](https://github.com/davidegiacometti)! #40887",
"Added comprehensive unit test coverage for WebSearch and Shell extensions with interface abstractions for better testability. Thanks [@moooyo](https://github.com/moooyo)! #41272",
"Added comprehensive unit test coverage for Apps and Bookmarks extensions with interface abstractions for better testability. Thanks [@moooyo](https://github.com/moooyo)! #41238",
"Added unit tests to verify 'Close on Enter' behavior in Calculator extension. Thanks [@mohammed-saalim](https://github.com/mohammed-saalim)! #41202",
"Added local keyboard listener to handle GoBack key that cannot be captured through standard WinUI input handling. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41122",
"Improved page exception details for users with timestamp, HRESULT, and full exception information. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41035",
"Honored 'Single-click activation' only for pointer clicks and not for keyboard activation. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41119",
"Added acrylic backdrop to context menus and tweaked styling to match CmdPal aesthetics. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41136",
"Removed constraints that kept context menu flyout within window bounds, allowing proper positioning. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41133",
"Replaced brush used for menu item separator with WinUI 3 standard flyout menu brush. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41130",
"Fixed race condition in cancellation handling to prevent InvalidOperationException. Thanks [@jiripolasek](https://github.com/jiripolasek)! #40983",
"Made it easier to add APIs in the future by working around metadata-based marshalling limitations. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41056",
"Used empty content for WindowWalker, Windows Settings, and Windows Search extensions when no results. Thanks [@htcfreek](https://github.com/htcfreek)! #40722",
"Modernized null checking patterns using 'is null' and 'is not null' expressions. Thanks [@michaeljolley](https://github.com/michaeljolley)! #40972",
"Added filters support for DynamicListPage functionality. Thanks [@michaeljolley](https://github.com/michaeljolley)! #40783",
"Ensured alias changes are propagated to related TopLevelViewModels. Thanks [@michaeljolley](https://github.com/michaeljolley)! #40970",
"Replaced Clipboard History extension outline icon with colorful Fluent UI System icon. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41012",
"Brought existing Settings window to foreground when opened. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41087",
"Fixed regression when updating command provider without commands. Thanks [@jiripolasek](https://github.com/jiripolasek)! #40984",
"Checked icon parent before adding in ContentIcon to prevent duplicate parenting issues. Thanks [@jiripolasek](https://github.com/jiripolasek)! #40931",
"Prevented disposed ContentPage from handling messages to avoid zombie processes. Thanks [@jiripolasek](https://github.com/jiripolasek)! #41083",
"Made CommandProvider.Dispose virtual for better extensibility. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41184",
"Added evil samples for testing edge cases. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41158",
"Setting activation shortcut now auto-focuses on window and delivers dialog for screen readers. Thanks [@chatasweetie](https://github.com/chatasweetie)! #40968",
"Added app icon to run context menu item in all apps extension. Thanks [@michaeljolley](https://github.com/michaeljolley)! #40991",
"Added WinAppSDK dependency in SamplePageExtension and ProcessMonitorExtension. Thanks [@moooyo](https://github.com/moooyo)! #41274",
"Removed all explicit dependencies from toolkit and extensions API on WinAppSDK. Thanks [@rluengen](https://github.com/rluengen)! #41261",
"Used DynamicDependency to preserve trimmed Adaptive Card action types. Thanks [@lei9444](https://github.com/lei9444)! #41027",
"Added the pdb's for Extensions too. Thanks [@zadjii-msft](https://github.com/zadjii-msft)! #41306"
],
"Mouse Utilities": [
"Added new feature to prevent Easy Mouse from switching machines when foreground application is running in fullscreen mode, including toggle and per-app exclusion list. Thanks [@dot-tb](https://github.com/dot-tb)! #39854",
"Implemented gliding cursor accessibility feature, extending Mouse Pointer Crosshairs functionality to enable single-button cursor control through guided horizontal and vertical lines. Thanks [@mikehall-ms](https://github.com/mikehall-ms)! #41221",
"Fixed GPU performance issues in Mouse Highlighter's spotlight mode by replacing GPU-intensive border-based spotlight with resource-friendly radial gradient mask implementation. Thanks [@vanzue](https://github.com/vanzue)! #41079"
],
"QuickAccent": [
"Implemented persistence for character usage data, allowing frequently used characters to maintain sort order between application runs. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! #37577",
"Fixed hybrid graphics issue on laptops with Optimus technology by changing Topmost behavior from permanently enabled to conditionally applied only when selection window is displayed. Thanks [@daverayment](https://github.com/daverayment)! #41044",
"Added Maltese language support, enabling users to select Maltese and type its unique accented letters. Thanks [@rovercoder](https://github.com/rovercoder)! #39473"
],
"UI and Accessibility": [
"Added accessibility IDs to FancyZones UI elements to improve reliability of UI tests by replacing text-based element selection with accessibility ID-based selection. Thanks [@lei9444](https://github.com/lei9444)! #41316",
"Added accessibility IDs to Command Palette UI components to make UI tests more reliable. Thanks [@lei9444](https://github.com/lei9444)! #41295",
"Moved automation notification functionality to UIHelper and implemented it in ListPage and SettingsWindow. Thanks [@chatasweetie](https://github.com/chatasweetie)! #41016",
"Fixed issue where wait cursor was incorrectly displayed when hovering over Always On Top window border, ensuring proper arrow cursor is shown. Thanks [@davidegiacometti](https://github.com/davidegiacometti)! #41091"
],
"Localization": [
"Fixed Spanish localization issues by preventing 'Awake' product name from being translated to 'Activo' throughout PowerToys Settings interface. Thanks [@Copilot](https://github.com/Copilot)! #41252",
"Changed PowerRename context menu accelerator key from 'W' to 'E' to resolve conflict with Windows Explorer 'New' command accelerator. Thanks [@aaron-ni](https://github.com/aaron-ni)! #39291"
],
"Development and Testing": [
"Implemented comprehensive hotkey conflict detection and resolution system, providing real-time conflict checking and centralized management interface for resolving conflicts. Thanks [@shuaiyuanxx](https://github.com/shuaiyuanxx)! #41029",
"Added comprehensive telemetry tracking for shortcut conflict detection functionality, capturing user interactions and conflict resolution patterns. Thanks [@shuaiyuanxx](https://github.com/shuaiyuanxx)! #41271",
"Updated UTF.Unknown dependency from 2.5.1 to 2.6.0, fixing old framework targeting issues. Thanks [@304NotModified](https://github.com/304NotModified)! #41042",
"Improved NuGet dependency version validation process via dotnet restore. Thanks [@yeelam-gordon](https://github.com/yeelam-gordon)! #40646",
"Removed versions and MS/System packages from NOTICE. Thanks [@DHowett](https://github.com/DHowett)! #40620",
"Removed *tests* and all coverage/DIA DLLs from binskim. Thanks [@DHowett](https://github.com/DHowett)! #41108",
"Updated package catalog before running install for store submissions. Thanks [@DHowett](https://github.com/DHowett)! #41121",
"Refactored some CmdPal extension unit tests and improved test cases. Thanks [@moooyo](https://github.com/moooyo)! #40896"
],
"File Handling": [
"Fixed registration of bgcode handlers by adding missing registry entries and correcting event handler references. Thanks [@pedrolamas](https://github.com/pedrolamas)! #40985",
"Added support for Microsoft Visual Studio Shared Project file extensions (.shproj and .projitems) for XML syntax highlighting. Thanks [@rezanid](https://github.com/rezanid)! #39246",
"Added 'No leading spaces' option to Hosts File Editor that prevents prepending spaces to active lines when saving hosts file, with comprehensive test coverage. Thanks [@mohammed-saalim](https://github.com/mohammed-saalim)! #41206"
],
"Documentation": [
"Updated PowerToys README.md to prepare release notes for version 0.94, transitioning from current release information. Thanks [@yeelam-gordon](https://github.com/yeelam-gordon)! #41036",
"Fixed incorrect path for styling link in developer documentation. Thanks [@denizmaral](https://github.com/denizmaral)! #41150",
"Added Office/Copilot templates to KeyVisual. Thanks [@niels9001](https://github.com/niels9001)! #41167",
"Removed debug dialog components. Thanks [@niels9001](https://github.com/niels9001)! #41250"
]
}
}

View File

@@ -43,32 +43,11 @@ private:
//contains the non localized key of the powertoy
std::wstring app_key;
// Update registration based on enabled state
void UpdateRegistration(bool enabled)
{
if (enabled)
{
#if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
ImageResizerRuntimeRegistration::EnsureRegistered();
Logger::info(L"ImageResizer context menu registered");
#endif
}
else
{
#if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
ImageResizerRuntimeRegistration::Unregister();
Logger::info(L"ImageResizer context menu unregistered");
#endif
}
}
public:
// Constructor
ImageResizerModule()
{
m_enabled = CSettingsInstance().GetEnabled();
UpdateRegistration(m_enabled);
app_name = GET_RESOURCE_STRING(IDS_IMAGERESIZER);
app_key = ImageResizerConstants::ModuleKey;
LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::imageResizerLoggerName);
@@ -133,7 +112,10 @@ public:
package::RegisterSparsePackage(path, packageUri);
}
}
UpdateRegistration(m_enabled);
#if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
ImageResizerRuntimeRegistration::EnsureRegistered();
#endif
Trace::EnableImageResizer(m_enabled);
}
@@ -141,8 +123,11 @@ public:
virtual void disable()
{
m_enabled = false;
UpdateRegistration(m_enabled);
Trace::EnableImageResizer(m_enabled);
#if defined(ENABLE_REGISTRATION) || defined(NDEBUG)
ImageResizerRuntimeRegistration::Unregister();
Logger::info(L"ImageResizer context menu unregistered (Win10)");
#endif
}
// Returns if the powertoys is enabled

130
stable_branch_prs.json Normal file
View File

@@ -0,0 +1,130 @@
{
"generated_at": "2025-09-01 12:54:31",
"unique_prs_found": 8,
"prs": [
{
"Created": "2025-08-26T06:43:09Z",
"PRNumber": 41378,
"Author": "shuaiyuanxx",
"AIOverview": "This PR fixes localization issues for shortcut conflict messages by replacing hardcoded English strings with localizable resource strings.\n\n- Replaces hardcoded conflict messages with localized strings from resource files\n- Adds new localization keys for shortcut conflict warnings in the UI\n- Updates both the shortcut conflict window and shortcut dialog to use proper localization",
"Labels": [
"Product-Settings",
"In for .94"
],
"Head": "shawn/fixConflictMessage",
"Description": "## Summary of the Pull Request\r\nAdded localization for conflict message shown in shortcut conflict window and shortcut dialog.\r\n\r\n## Detailed Description of the Pull Request / Additional comments",
"Base": "main",
"Title": "Fix localization issue for shortcut conflict window",
"HasAIOverview": true,
"URL": "https://github.com/microsoft/PowerToys/pull/41378"
},
{
"Created": "2025-08-26T07:41:01Z",
"PRNumber": 41381,
"Author": "vanzue",
"AIOverview": "This pull request fixes 3 search-related issues in the PowerToys Settings UI, focusing on improving the search functionality and user experience.\n\nKey changes:\n- Fixes embedded resource loading with case-insensitive matching to prevent lookup failures\n- Adds proper search result header with localized \"Results for\" text\n- Improves navigation and accessibility with better focus management and element finding",
"Labels": [
"Product-Settings",
"In for .94"
],
"Head": "dev/vanzue/search-fix",
"Description": "## Summary of the Pull Request\r\nFix 3 issues\r\n\r\n## Detailed Description of the Pull Request / Additional comments\r\n\r\n## Validation Steps Performed\r\n\r\nhttps://github.com/user-attachments/assets/0e0df9fb-5aca-4b26-9d53-e6ddc49cab04",
"Base": "main",
"Title": "Settings: Settings search fixes",
"HasAIOverview": true,
"URL": "https://github.com/microsoft/PowerToys/pull/41381"
},
{
"Created": "2025-08-26T12:30:44Z",
"PRNumber": 41383,
"Author": "niels9001",
"AIOverview": null,
"Labels": [],
"Head": "niels9001/removing-titlebar-package",
"Description": "Temp fix for a VS bug when building the `PowerToys.Settings` project. \r\n\r\nThere seems to be something wrong with the Labs TitleBar package, so following up with the team to get it resolved. Meanwhile, I've moved the Toolkit's source code for TitleBar to Settings as a custom control.\r\n\r\nOnce the package is fixed we can revert this change.",
"Base": "main",
"Title": "[Fix] Adding Toolkit's TitleBar manually",
"HasAIOverview": false,
"URL": "https://github.com/microsoft/PowerToys/pull/41383"
},
{
"Created": "2025-08-26T13:57:58Z",
"PRNumber": 41386,
"Author": "niels9001",
"AIOverview": "This PR implements several search user experience improvements focused on visual polish and consistency. The changes address visual glitches in search templates, enhance search result presentation, and improve search highlighting behavior.\n\n- Fixes visual glitch in the 'Show all results' template by adjusting margins and removing unnecessary padding\n- Adds \"Results for\" prefix display on search results pages with localized string support\n- Improves search highlight animation with better sizing and accent color usage",
"Labels": [
"Product-Settings",
"In for .94"
],
"Head": "niels9001/search-UX-improvements",
"Description": "### Fixing visual glitch in the 'Show all results' template:\r\n\r\nBefore\r\n<img width=\"588\" height=\"103\" alt=\"image\" src=\"https://github.com/user-attachments/assets/00da60ea-d0ab-4ffe-8f69-75be7e537d63\" />\r\n\r\nAfter\r\n<img width=\"598\" height=\"70\" alt=\"image\" src=\"https://github.com/user-attachments/assets/dc859731-8783-494a-b561-ea6396ca69b3\" />\r\n\r\n### Displaying \"Show results for * search term *\" on search results page\r\nBefore\r\n<img width=\"716\" height=\"239\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a80e6e58-df88-47b2-85ab-c39cbdc88690\" />\r\n\r\nAfter\r\n<img width=\"349\" height=\"264\" alt=\"image\" src=\"https://github.com/user-attachments/assets/99029ee6-94f7-4454-a443-640c22f9e6f3\" />\r\n\r\n### Using Accent Color for the search highlight for better visibility and fixing a bug\r\nBefore\r\n![highlight-bug](https://github.com/user-attachments/assets/2d4c0f5b-4030-4c10-a4ec-c7c5023034f0)\r\n\r\nAfter\r\n\r\n![fix-accent](https://github.com/user-attachments/assets/62a223a9-9360-4297-9127-5aaef82c162f)",
"Base": "main",
"Title": "Search UX improvements",
"HasAIOverview": true,
"URL": "https://github.com/microsoft/PowerToys/pull/41386"
},
{
"Created": "2025-08-26T15:28:38Z",
"PRNumber": 41389,
"Author": "michaeljolley",
"AIOverview": "This PR adds sorting functionality to the DateTime extension results to improve user experience by displaying the most relevant results first. The change modifies the search result generation to sort items by their relevance score in descending order.",
"Labels": [
"Product-Command Palette",
"In for .94"
],
"Head": "dev/mjolley/datetime-sort",
"Description": "Closes #41385\r\n\r\nAdds a sort to the DateTime extension results.\r\n\r\n<img width=\"1001\" height=\"602\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ccccae6a-c4a4-460f-a6d3-3325ecfc53da\" />\r\n\r\n<img width=\"992\" height=\"606\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b8af51bd-cbd0-4341-ac46-0fb3e97ec2ac\" />",
"Base": "main",
"Title": "Adding sort to DateTime extension results",
"HasAIOverview": true,
"URL": "https://github.com/microsoft/PowerToys/pull/41389"
},
{
"Created": "2025-08-27T09:56:36Z",
"PRNumber": 41411,
"Author": "lei9444",
"AIOverview": "This PR fixes an issue where context menu runtime registration wasn't properly cleaned up when GPO policies disabled PowerToys modules. The problem was that module constructors didn't consider GPO policies when determining their initial enabled state, leaving stale registry entries.\n\n- Introduces a centralized `UpdateRegistration` helper method across four modules to handle context menu registration/unregistration\n- Ensures context menu registration state is properly synchronized with module enabled state during initialization\n- Adds calls to `UpdateRegistration` in `init_settings` methods to handle GPO policy changes",
"Labels": [
"Product-PowerRename",
"Product-Image Resizer",
"Product-File Locksmith",
"Product-New+"
],
"Head": "leilzh/gpofix",
"Description": "## Summary of the Pull Request\r\nThis PR fixes an issue where context menu runtime registration wasn't properly cleaned up when GPO (Group Policy Object) policies disabled the module. The problem occurred because the module constructor didn't consider GPO policies when determining its initial enabled state.\r\n\r\n## Detailed Description of the Pull Request / Additional comments\r\n\r\n## Validation Steps Performed\r\n\r\nThis pull request refactors how context menu registration and unregistration are handled across several PowerToys modules. The main improvement is the introduction of a new `UpdateRegistration` helper method in each module, which centralizes and simplifies the logic for registering or unregistering context menus when the module is enabled or disabled. This reduces code duplication and ensures consistent behavior.\r\n\r\n**Context menu registration logic refactor:**\r\n\r\n* Added a private `UpdateRegistration` method to each of the following modules to handle context menu registration and unregistration based on the enabled state:\r\n - `FileLocksmithModule` in `PowerToysModule.cpp`\r\n - `NewModule` in `powertoys_module.cpp`\r\n - `ImageResizerModule` in `dllmain.cpp`\r\n - `PowerRenameModule` in `dllmain.cpp`\r\n\r\n* Replaced direct calls to registration/unregistration functions in `enable`, `disable`, and `init_settings` methods with calls to the new `UpdateRegistration` method in all affected modules, ensuring consistent and centralized handling [[1]](diffhunk://#diff-256ed936dafec1bf6ff17849b4797dd276f5b07bebe2e483bc1580c8f06e92d9L91-R122) [[2]](diffhunk://#diff-256ed936dafec1bf6ff17849b4797dd276f5b07bebe2e483bc1580c8f06e92d9R155) [[3]](diffhunk://#diff-4a3942d548f3daec02a833983ed9b2b69f75e2cd1b74a8ce1b874f3fd33fde55L101-R125) [[4]](diffhunk://#diff-4a3942d548f3daec02a833983ed9b2b69f75e2cd1b74a8ce1b874f3fd33fde55L153-R177) [[5]](diffhunk://#diff-0c0a89e812ff4625d165417da14f1c3f203e5ac7907555ae4fde122f3dddcf7aL115-L130) [[6]](diffhunk://#diff-34581ec47c37b0d2e1d9b59696225c47342930694e732db06cbdf653ceb2c2d7L205-R234) [[7]](diffhunk://#diff-34581ec47c37b0d2e1d9b59696225c47342930694e732db06cbdf653ceb2c2d7R334).\r\n\r\nThese changes improve maintainability and reduce the risk of inconsistent registration behavior across modules.",
"Base": "main",
"Title": "fix: Context menu registry entries are not cleaned up when disabled via GPO",
"HasAIOverview": true,
"URL": "https://github.com/microsoft/PowerToys/pull/41411"
},
{
"Created": "2025-08-28T01:59:14Z",
"PRNumber": 41437,
"Author": "vanzue",
"AIOverview": null,
"Labels": [],
"Head": "dev/vanzue/fancy-zone-search",
"Description": "## Summary of the Pull Request\r\nThis pull request primarily improves the maintainability and robustness of the FancyZones settings UI by assigning unique `Name` attributes to `SettingsCard` controls in the `FancyZonesPage.xaml` file. Additionally, it enhances the logic for retrieving element UIDs and improves fallback behavior for missing localizations. There is also a minor usability fix in the shell page to prevent unintended navigation when focusing the search box.\r\n\r\n**FancyZones settings UI improvements:**\r\n\r\n* Added unique `Name` attributes to all `tkcontrols:SettingsCard` elements in `FancyZonesPage.xaml` to facilitate easier referencing and future maintainability. This affects all relevant settings groups and controls in the file. [[1]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL73-R85) [[2]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL109-R109) [[3]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL121-R121) [[4]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL167-R188) [[5]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL202-R202) [[6]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL251-R251) [[7]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL265-R265) [[8]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL280-R280)\r\n\r\n**Element UID retrieval and localization:**\r\n\r\n* Improved `GetElementUid` in `Program.cs` to fall back to the first child's `x:Uid` if the element itself lacks one, increasing robustness when parsing XAML.\r\n* Updated `GetLocalizedSettingHeaderAndD` in `SearchIndexService.cs` to provide a fallback for missing localizations by trying the `\"{elementUid}/Content\"` resource key.\r\n\r\n**Shell page usability:**\r\n\r\n* Modified `CtrlF_Invoked` in `ShellPage.xaml.cs` to mark the event as handled, preventing unintended navigation when the search box is focused with Ctrl+F.\r\n\r\n## Detailed Description of the Pull Request / Additional comments\r\n\r\n## Validation Steps Performed\r\n\r\nhttps://github.com/user-attachments/assets/9cf15605-1114-4c6d-923c-d05c2733a274",
"Base": "main",
"Title": "Settings: Search fancy zone settings and swallow the ctrl+f event",
"HasAIOverview": false,
"URL": "https://github.com/microsoft/PowerToys/pull/41437"
},
{
"Created": "2025-08-28T11:06:55Z",
"PRNumber": 41442,
"Author": "zadjii-msft",
"AIOverview": null,
"Labels": [],
"Head": "dev/migrie/bump-05",
"Description": "title",
"Base": "main",
"Title": "CmdPal: Bump version to 0.5",
"HasAIOverview": false,
"URL": "https://github.com/microsoft/PowerToys/pull/41442"
}
],
"start_commit": "HEAD~5",
"commits_analyzed": 8,
"total_prs": 8
}

View File

@@ -0,0 +1,358 @@
PR #40915 [MERGED]
Title: CmdPal: Added settings for limiting apps on top level searches
Author: michaeljolley
Created: 2025-07-31 22:15:00
Base: main | Head: dev/mjolley/top-level-apps-limit
URL: https://github.com/microsoft/PowerToys/pull/40915
Description:
Closes #40062
Adds a setting to limit the number of apps returned on top level searches.
Can limit to none, 1, 5, 10, or 20.
https://github.com/user-attachments/assets/de60111f-fb02-4db6-9ae9-2f636c171b5b
================================================================================
PR #41251 [MERGED]
Title: CmdPal: Make debugging extension load errors easier
Author: zadjii-msft
Created: 2025-08-19 10:43:37
Base: main | Head: dev/migrie/b/more-extension-logging
URL: https://github.com/microsoft/PowerToys/pull/41251
Description:
Turns out we didn't log all the HRESULTs for failing to load an extension. This adds more logging.
It also adds a context command on the log command to make it easier to get to the log files
================================================================================
PR #41347 [MERGED]
Title: [CmdPal] Eliminate `CopyTextCommand` duplicates
Author: PesBandi
Created: 2025-08-24 21:00:49
Base: main | Head: cmdpal-copycommand
URL: https://github.com/microsoft/PowerToys/pull/41347
Description:
## Summary of the Pull Request
Removes redundant CopyCommands and replaces their usage with `CopyTextCommand` from the toolkit. This is actually recommend by the [docs](https://learn.microsoft.com/en-us/windows/powertoys/command-palette/command-results#showtoast-command-result), we should probably lead by example 😄
> Consider the CopyTextCommand in the helpers - this command will show a toast with the text "Copied to clipboard", then dismiss the palette.
Only functionality change is that they now display *Copied to clipboard!* after copying.
## PR Checklist
- [x] Closes: #41346
- [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected
- [x] **Tests:** All pass
- [x] **Localization:** All end-user-facing strings can be localized
- [x] **Dev docs:** No need
- [x] **New binaries:** None
- [x] **Documentation updated:** No need
## Detailed Description of the Pull Request / Additional comments
Custom command names (e.g. *Copy path* instead of *Copy*) are preserved.
Strings put out of use have been deleted.
CopyCommands from the Registry and Clipboard plugins are left untouched, as they contain special logic.
The error handling in `CopyPathCommand` from Apps was unnecessary, since it's already taken care of by `ClipboardHelper`.
## Validation Steps Performed
Manual testing
================================================================================
PR #41361 [MERGED]
Title: CmdPal: Fix resource key name NavigationPaneClosed to match literal in code and prevent crash
Author: jiripolasek
Created: 2025-08-25 18:40:35
Base: main | Head: feature/fix-typo-in-resource-key-navigationpaneclosed
URL: https://github.com/microsoft/PowerToys/pull/41361
Description:
## Summary of the Pull Request
Corrects a mismatch between the resource key and the actual literal used in code. The key was incorrectly named `NavigationPageOpened`; it now correctly uses `NavigationPaneClosed`. Introduced in #41016.
## PR Checklist
- [x] Closes: #41362
- [ ] **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
================================================================================
PR #41378 [MERGED]
Title: Fix localization issue for shortcut conflict window
Author: shuaiyuanxx
Created: 2025-08-26 06:43:09
Base: main | Head: shawn/fixConflictMessage
URL: https://github.com/microsoft/PowerToys/pull/41378
Description:
<!-- 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
Added localization for conflict message shown in shortcut conflict window and shortcut dialog.
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [x] Closes: #41373
- [ ] **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
================================================================================
PR #41381 [MERGED]
Title: Settings: Settings search fixes
Author: vanzue
Created: 2025-08-26 07:41:01
Base: main | Head: dev/vanzue/search-fix
URL: https://github.com/microsoft/PowerToys/pull/41381
Description:
<!-- 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
Fix 3 issues
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [x] Closes: #41369, #41374, #41380
- [ ] **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
https://github.com/user-attachments/assets/0e0df9fb-5aca-4b26-9d53-e6ddc49cab04
================================================================================
PR #41383 [MERGED]
Title: [Fix] Adding Toolkit's TitleBar manually
Author: niels9001
Created: 2025-08-26 12:30:44
Base: main | Head: niels9001/removing-titlebar-package
URL: https://github.com/microsoft/PowerToys/pull/41383
Description:
Temp fix for a VS bug when building the `PowerToys.Settings` project.
There seems to be something wrong with the Labs TitleBar package, so following up with the team to get it resolved. Meanwhile, I've moved the Toolkit's source code for TitleBar to Settings as a custom control.
Once the package is fixed we can revert this change.
================================================================================
PR #41386 [MERGED]
Title: Search UX improvements
Author: niels9001
Created: 2025-08-26 13:57:58
Base: main | Head: niels9001/search-UX-improvements
URL: https://github.com/microsoft/PowerToys/pull/41386
Description:
### Fixing visual glitch in the 'Show all results' template:
Before
<img width="588" height="103" alt="image" src="https://github.com/user-attachments/assets/00da60ea-d0ab-4ffe-8f69-75be7e537d63" />
After
<img width="598" height="70" alt="image" src="https://github.com/user-attachments/assets/dc859731-8783-494a-b561-ea6396ca69b3" />
### Displaying "Show results for * search term *" on search results page
Before
<img width="716" height="239" alt="image" src="https://github.com/user-attachments/assets/a80e6e58-df88-47b2-85ab-c39cbdc88690" />
After
<img width="349" height="264" alt="image" src="https://github.com/user-attachments/assets/99029ee6-94f7-4454-a443-640c22f9e6f3" />
### Using Accent Color for the search highlight for better visibility and fixing a bug
Before
![highlight-bug](https://github.com/user-attachments/assets/2d4c0f5b-4030-4c10-a4ec-c7c5023034f0)
After
![fix-accent](https://github.com/user-attachments/assets/62a223a9-9360-4297-9127-5aaef82c162f)
================================================================================
PR #41389 [MERGED]
Title: Adding sort to DateTime extension results
Author: michaeljolley
Created: 2025-08-26 15:28:38
Base: main | Head: dev/mjolley/datetime-sort
URL: https://github.com/microsoft/PowerToys/pull/41389
Description:
Closes #41385
Adds a sort to the DateTime extension results.
<img width="1001" height="602" alt="image" src="https://github.com/user-attachments/assets/ccccae6a-c4a4-460f-a6d3-3325ecfc53da" />
<img width="992" height="606" alt="image" src="https://github.com/user-attachments/assets/b8af51bd-cbd0-4341-ac46-0fb3e97ec2ac" />
================================================================================
PR #41403 [MERGED]
Title: Settings UI: Fix spelling error and make spell checker happy
Author: jiripolasek
Created: 2025-08-27 00:17:17
Base: main | Head: feature/make-spellchecker-happy
URL: https://github.com/microsoft/PowerToys/pull/41403
Description:
## Summary of the Pull Request
- Renames `NavigatablePage` to `NavigablePage` to fix a spelling error.
- Reverts related entries in `exclude.txt` that triggered a forbidden pattern error in the spell checker.
- The spell checker does not allow PascalCase words like `NavigatablePage` in `exclude.txt` because of its automatic casing rules.
Regression: #41285
================================================================================
PR #41411 [MERGED]
Title: fix: Context menu registry entries are not cleaned up when disabled via GPO
Author: lei9444
Created: 2025-08-27 09:56:36
Base: main | Head: leilzh/gpofix
URL: https://github.com/microsoft/PowerToys/pull/41411
Description:
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? -->
## Summary of the Pull Request
This PR fixes an issue where context menu runtime registration wasn't properly cleaned up when GPO (Group Policy Object) policies disabled the module. The problem occurred because the module constructor didn't consider GPO policies when determining its initial enabled state.
<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist
- [x] Closes: #41387
- [ ] **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
This pull request refactors how context menu registration and unregistration are handled across several PowerToys modules. The main improvement is the introduction of a new `UpdateRegistration` helper method in each module, which centralizes and simplifies the logic for registering or unregistering context menus when the module is enabled or disabled. This reduces code duplication and ensures consistent behavior.
**Context menu registration logic refactor:**
* Added a private `UpdateRegistration` method to each of the following modules to handle context menu registration and unregistration based on the enabled state:
- `FileLocksmithModule` in `PowerToysModule.cpp`
- `NewModule` in `powertoys_module.cpp`
- `ImageResizerModule` in `dllmain.cpp`
- `PowerRenameModule` in `dllmain.cpp`
* Replaced direct calls to registration/unregistration functions in `enable`, `disable`, and `init_settings` methods with calls to the new `UpdateRegistration` method in all affected modules, ensuring consistent and centralized handling [[1]](diffhunk://#diff-256ed936dafec1bf6ff17849b4797dd276f5b07bebe2e483bc1580c8f06e92d9L91-R122) [[2]](diffhunk://#diff-256ed936dafec1bf6ff17849b4797dd276f5b07bebe2e483bc1580c8f06e92d9R155) [[3]](diffhunk://#diff-4a3942d548f3daec02a833983ed9b2b69f75e2cd1b74a8ce1b874f3fd33fde55L101-R125) [[4]](diffhunk://#diff-4a3942d548f3daec02a833983ed9b2b69f75e2cd1b74a8ce1b874f3fd33fde55L153-R177) [[5]](diffhunk://#diff-0c0a89e812ff4625d165417da14f1c3f203e5ac7907555ae4fde122f3dddcf7aL115-L130) [[6]](diffhunk://#diff-34581ec47c37b0d2e1d9b59696225c47342930694e732db06cbdf653ceb2c2d7L205-R234) [[7]](diffhunk://#diff-34581ec47c37b0d2e1d9b59696225c47342930694e732db06cbdf653ceb2c2d7R334).
These changes improve maintainability and reduce the risk of inconsistent registration behavior across modules.
================================================================================
PR #41437 [MERGED]
Title: Settings: Search fancy zone settings and swallow the ctrl+f event
Author: vanzue
Created: 2025-08-28 01:59:14
Base: main | Head: dev/vanzue/fancy-zone-search
URL: https://github.com/microsoft/PowerToys/pull/41437
Description:
<!-- 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 pull request primarily improves the maintainability and robustness of the FancyZones settings UI by assigning unique `Name` attributes to `SettingsCard` controls in the `FancyZonesPage.xaml` file. Additionally, it enhances the logic for retrieving element UIDs and improves fallback behavior for missing localizations. There is also a minor usability fix in the shell page to prevent unintended navigation when focusing the search box.
**FancyZones settings UI improvements:**
* Added unique `Name` attributes to all `tkcontrols:SettingsCard` elements in `FancyZonesPage.xaml` to facilitate easier referencing and future maintainability. This affects all relevant settings groups and controls in the file. [[1]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL73-R85) [[2]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL109-R109) [[3]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL121-R121) [[4]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL167-R188) [[5]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL202-R202) [[6]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL251-R251) [[7]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL265-R265) [[8]](diffhunk://#diff-93623d4db1d295dde0ef793053c9db0d9f673d753b787ad12fd71b8e9e40a79fL280-R280)
**Element UID retrieval and localization:**
* Improved `GetElementUid` in `Program.cs` to fall back to the first child's `x:Uid` if the element itself lacks one, increasing robustness when parsing XAML.
* Updated `GetLocalizedSettingHeaderAndD` in `SearchIndexService.cs` to provide a fallback for missing localizations by trying the `"{elementUid}/Content"` resource key.
**Shell page usability:**
* Modified `CtrlF_Invoked` in `ShellPage.xaml.cs` to mark the event as handled, preventing unintended navigation when the search box is focused with Ctrl+F.
<!-- Please review the items on the PR checklist before submitting-->
## 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
- [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
https://github.com/user-attachments/assets/9cf15605-1114-4c6d-923c-d05c2733a274
================================================================================
PR #41442 [MERGED]
Title: CmdPal: Bump version to 0.5
Author: zadjii-msft
Created: 2025-08-28 11:06:55
Base: main | Head: dev/migrie/bump-05
URL: https://github.com/microsoft/PowerToys/pull/41442
Description:
title
================================================================================