Compare commits

..

2 Commits

Author SHA1 Message Date
Shawn Yuan (from Dev Box)
b71bce9c6c Prevent from winuiEx crash 2026-02-06 15:22:08 +08:00
Jiří Polášek
753689309e CmdPal: Fix alias UI clearing when toggling Direct/Indirect combobox (#45381)
## Summary of the Pull Request

This PR fixes the settings UI for the top-level command alias.



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


https://github.com/user-attachments/assets/0d1e1392-0293-4482-97cb-e8e8c0ed0dd5


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

<!-- Provide a more detailed description of the PR, other things fixed,
or any additional comments/features here -->
## Detailed Description of the Pull Request / Additional comments

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
2026-02-05 16:47:45 -06:00
9 changed files with 17 additions and 60 deletions

View File

@@ -1 +0,0 @@
.

View File

@@ -107,7 +107,7 @@ public partial class AliasManager : ObservableObject
}
// Look for the alias belonging to another command, and remove it
if (newAlias is not null && kv.Value.Alias == newAlias.Alias)
if (newAlias is not null && kv.Value.Alias == newAlias.Alias && kv.Value.CommandId != commandId)
{
toRemove.Add(kv.Value);

View File

@@ -13,7 +13,6 @@
#include <common/utils/resources.h>
#include <Settings.h>
#include <trace.h>
#include <ImageResizerConstants.h>
#include <wil/win32_helpers.h>
#include <wrl/module.h>
@@ -121,16 +120,6 @@ public:
return E_FAIL;
}
// Check if the extension is actually supported by Image Resizer
// This prevents showing the menu for file types like .psd that Windows
// perceives as images but Image Resizer cannot process
if (!ImageResizerConstants::IsSupportedImageExtension(pszExt))
{
CoTaskMemFree(pszPath);
*cmdState = ECS_HIDDEN;
return S_OK;
}
// TODO: Instead, detect whether there's a WIC codec installed that can handle this file
AssocGetPerceivedType(pszExt, &type, &flag, NULL);

View File

@@ -1,7 +1,5 @@
#pragma once
#include <string>
#include <vector>
#include <algorithm>
namespace ImageResizerConstants
{
@@ -12,27 +10,4 @@ namespace ImageResizerConstants
inline const std::wstring ModuleOldSaveFolderKey = L"ImageResizer";
inline const std::wstring ModuleSaveFolderKey = L"Image Resizer";
inline const std::wstring ModulePackageDisplayName = L"ImageResizerContextMenu";
// List of supported image extensions that Image Resizer can process
// This must match the list in RuntimeRegistration.h
// Note: All extensions must be in lowercase for case-insensitive comparison
inline const std::vector<std::wstring> SupportedImageExtensions = {
L".bmp", L".dib", L".gif", L".jfif", L".jpe", L".jpeg", L".jpg",
L".jxr", L".png", L".rle", L".tif", L".tiff", L".wdp"
};
// Helper function to check if a file extension is supported by Image Resizer
inline bool IsSupportedImageExtension(LPCWSTR extension)
{
if (extension == nullptr || wcslen(extension) == 0)
{
return false;
}
// Convert to lowercase for case-insensitive comparison
std::wstring ext(extension);
std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);
return std::find(SupportedImageExtensions.begin(), SupportedImageExtensions.end(), ext) != SupportedImageExtensions.end();
}
}

View File

@@ -5,7 +5,6 @@
#include <Settings.h>
#include <trace.h>
#include <ImageResizerConstants.h>
#include <common/themes/icon_helpers.h>
#include <common/utils/process_path.h>
@@ -98,15 +97,6 @@ HRESULT CContextMenuHandler::QueryContextMenu(_In_ HMENU hmenu, UINT indexMenu,
return E_FAIL;
}
// Check if the extension is actually supported by Image Resizer
// This prevents showing the menu for file types like .psd that Windows
// perceives as images but Image Resizer cannot process
if (!ImageResizerConstants::IsSupportedImageExtension(pszExt))
{
free(pszPath);
return S_OK;
}
// TODO: Instead, detect whether there's a WIC codec installed that can handle this file
AssocGetPerceivedType(pszExt, &type, &flag, NULL);
@@ -427,16 +417,6 @@ HRESULT __stdcall CContextMenuHandler::GetState(IShellItemArray* psiItemArray, B
return E_FAIL;
}
// Check if the extension is actually supported by Image Resizer
// This prevents showing the menu for file types like .psd that Windows
// perceives as images but Image Resizer cannot process
if (!ImageResizerConstants::IsSupportedImageExtension(pszExt))
{
CoTaskMemFree(pszPath);
*pCmdState = ECS_HIDDEN;
return S_OK;
}
// TODO: Instead, detect whether there's a WIC codec installed that can handle this file
AssocGetPerceivedType(pszExt, &type, &flag, NULL);

View File

@@ -8,7 +8,6 @@
IsMaximizable="False"
IsMinimizable="False"
IsResizable="False"
IsShownInSwitchers="False"
IsTitleBarVisible="False"
mc:Ignorable="d">
<Grid Background="#1A000000">

View File

@@ -2,6 +2,7 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Threading.Tasks;
using Microsoft.UI.Windowing;
using Windows.Graphics;
@@ -24,6 +25,17 @@ namespace PowerDisplay.PowerDisplayXAML
{
InitializeComponent();
NumberText.Text = displayText;
try
{
this.SetIsShownInSwitchers(false);
}
catch (NotImplementedException)
{
// WinUI will throw if explorer is not running, safely ignore
}
catch (Exception)
{
}
// Configure window style
ConfigureWindow();

View File

@@ -15,7 +15,6 @@
IsMaximizable="False"
IsMinimizable="False"
IsResizable="False"
IsShownInSwitchers="False"
IsTitleBarVisible="False">
<winuiex:WindowEx.SystemBackdrop>
<DesktopAcrylicBackdrop />

View File

@@ -71,6 +71,10 @@ namespace PowerDisplay
_hotkeyService.Initialize(this);
Logger.LogTrace("MainWindow constructor: HotkeyService initialized");
Logger.LogTrace("MainWindow constructor: Setting IsShownInSwitchers property");
this.SetIsShownInSwitchers(false);
Logger.LogTrace("MainWindow constructor: Set IsShownInSwitchers property successfully");
// Note: ViewModel handles all async initialization internally.
// We listen to InitializationCompleted event to know when data is ready.
// No duplicate initialization here - single responsibility in ViewModel.