diff --git a/PowerToys.sln b/PowerToys.sln index 4e42cc9e30..4d1a39dc58 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.32014.148 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11222.15 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runner", "src\runner\runner.vcxproj", "{9412D5C6-2CF2-4FC2-A601-B55508EA9B27}" ProjectSection(ProjectDependencies) = postProject @@ -838,6 +838,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.Remote EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests\Microsoft.CmdPal.Ext.RemoteDesktop.UnitTests.csproj", "{DB34808A-FF91-D06E-A426-AFB5A8BD583B}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deux", "Deux", "{023C058E-537A-4AB6-900A-36437EC17410}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{4F881A97-423A-4905-B219-677AD0184059}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CommandPalette.UI", "src\modules\Deux\UI\Microsoft.CommandPalette.UI\Microsoft.CommandPalette.UI.csproj", "{9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -3056,6 +3062,18 @@ Global {DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|ARM64.Build.0 = Release|ARM64 {DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|x64.ActiveCfg = Release|x64 {DB34808A-FF91-D06E-A426-AFB5A8BD583B}.Release|x64.Build.0 = Release|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.Build.0 = Debug|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.ActiveCfg = Debug|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.Build.0 = Debug|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Debug|x64.Deploy.0 = Debug|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.ActiveCfg = Release|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.Build.0 = Release|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|ARM64.Deploy.0 = Release|ARM64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.ActiveCfg = Release|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.Build.0 = Release|x64 + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB}.Release|x64.Deploy.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3389,6 +3407,9 @@ Global {A66E9270-5D93-EC9C-F06E-CE7295BB9A6C} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} {2B3FB837-23DE-629F-82C6-42304E7083C9} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} {DB34808A-FF91-D06E-A426-AFB5A8BD583B} = {8EF25507-2575-4ADE-BF7E-D23376903AB8} + {023C058E-537A-4AB6-900A-36437EC17410} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} + {4F881A97-423A-4905-B219-677AD0184059} = {023C058E-537A-4AB6-900A-36437EC17410} + {9EBE6DE4-58CD-CA14-7A21-B1E9DED261DB} = {4F881A97-423A-4905-B219-677AD0184059} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml new file mode 100644 index 0000000000..61e73ce648 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs new file mode 100644 index 0000000000..e55f07cec2 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/App.xaml.cs @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.CommandPalette.UI.Helpers; +using Microsoft.CommandPalette.UI.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.PowerToys.Telemetry; +using Microsoft.UI.Xaml; + +namespace Microsoft.CommandPalette.UI; + +/// +/// Provides application-specific behavior to supplement the default Application class. +/// +public partial class App : Application +{ + private readonly ILogger logger; + private readonly GlobalErrorHandler _globalErrorHandler; + + /// + /// Gets the current instance in use. + /// + public static new App Current => (App)Application.Current; + + public Window? AppWindow { get; private set; } + + public ETWTrace EtwTrace { get; private set; } = new ETWTrace(); + + /// + /// Gets the instance to resolve application services. + /// + public IServiceProvider Services { get; } + + public App(ILogger logger) + { + this.logger = logger; + _globalErrorHandler = new((CmdPalLogger)logger); + +#if !CMDPAL_DISABLE_GLOBAL_ERROR_HANDLER + _globalErrorHandler.Register(this); +#endif + + Services = ConfigureServices(); + + this.InitializeComponent(); + + // Ensure types used in XAML are preserved for AOT compilation + TypePreservation.PreserveTypes(); + + NativeEventWaiter.WaitForEventLoop( + "Local\\PowerToysCmdPal-ExitEvent-eb73f6be-3f22-4b36-aee3-62924ba40bfd", () => + { + EtwTrace?.Dispose(); + AppWindow?.Close(); + Environment.Exit(0); + }); + } + + private IServiceProvider ConfigureServices() + { + var services = new ServiceCollection(); + + // Register root services + services.AddSingleton(logger); + services.AddSingleton(TaskScheduler.FromCurrentSynchronizationContext()); + + // Register services + return services.BuildServiceProvider(); + } + + /// + /// Invoked when the application is launched. + /// + /// Details about the launch request and process. + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + AppWindow = new MainWindow(logger); + AppWindow.Activate(); + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png new file mode 100644 index 0000000000..5213f95d42 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png new file mode 100644 index 0000000000..f1a45ae53f Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png new file mode 100644 index 0000000000..47d7209367 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png new file mode 100644 index 0000000000..dc6f4c5dab Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png new file mode 100644 index 0000000000..692c4fcf44 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/BadgeLogo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png new file mode 100644 index 0000000000..e1f5d4159d Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png new file mode 100644 index 0000000000..a801edaf3d Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png new file mode 100644 index 0000000000..7a8f9c5c36 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png new file mode 100644 index 0000000000..ed75eb0af6 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png new file mode 100644 index 0000000000..d0cee0b395 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/LargeTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png new file mode 100644 index 0000000000..e006aa9874 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png new file mode 100644 index 0000000000..9ad48f0e3f Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png new file mode 100644 index 0000000000..d21c98d8c9 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png new file mode 100644 index 0000000000..ca49b8fef3 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png new file mode 100644 index 0000000000..f4ef1f3edb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SmallTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png new file mode 100644 index 0000000000..acbcca99c3 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png new file mode 100644 index 0000000000..457d0cecbc Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png new file mode 100644 index 0000000000..5eff7ac7de Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png new file mode 100644 index 0000000000..c1ccbf1c54 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png new file mode 100644 index 0000000000..ea228bd41f Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/SplashScreen.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000..a5e5760209 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000..2a233b3e47 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000..d8c8f75d79 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000..87517b0e1c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000..957cc5fec3 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square150x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000..4c8effcb66 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png new file mode 100644 index 0000000000..5213f95d42 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png new file mode 100644 index 0000000000..d03f01b191 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png new file mode 100644 index 0000000000..75dc33385b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000..f203724243 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-lightunplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000..4c8effcb66 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png new file mode 100644 index 0000000000..5213f95d42 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000..d03f01b191 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000000..75dc33385b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000..f203724243 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000..0a7be045ac Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000..8070174a5e Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000..6f1b9001a3 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000..d341612c39 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000..fcfc2ebded Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000..4c8effcb66 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png new file mode 100644 index 0000000000..cbb36d3be0 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-20.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000..5213f95d42 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000..d03f01b191 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000..75dc33385b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000..f203724243 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Square44x44Logo.targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png new file mode 100644 index 0000000000..bfec17df63 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png new file mode 100644 index 0000000000..bfec17df63 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png new file mode 100644 index 0000000000..a073540777 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png new file mode 100644 index 0000000000..4292fb4573 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png new file mode 100644 index 0000000000..84747da37d Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png new file mode 100644 index 0000000000..bda52f8d39 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/StoreLogo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000..cd469a3703 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png new file mode 100644 index 0000000000..3eb277505c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000..0add12322b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000..403f477ac3 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000..03f554d54f Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/Wide310x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico new file mode 100644 index 0000000000..ed0eedb67e Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.ico differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg new file mode 100644 index 0000000000..4ed904b502 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Dev/icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png new file mode 100644 index 0000000000..79c6a4c077 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png new file mode 100644 index 0000000000..cd5e093a6c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png new file mode 100644 index 0000000000..88fb0b9da1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png new file mode 100644 index 0000000000..efa7567286 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png new file mode 100644 index 0000000000..28a79c917e Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LargeTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000..7440f0d4bf Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/LockScreenLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png new file mode 100644 index 0000000000..b48a90fbde Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png new file mode 100644 index 0000000000..2c07454b3a Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png new file mode 100644 index 0000000000..e2e81a4e89 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png new file mode 100644 index 0000000000..de43005787 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png new file mode 100644 index 0000000000..f6442934ed Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SmallTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png new file mode 100644 index 0000000000..147cc74697 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png new file mode 100644 index 0000000000..fb12df0421 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png new file mode 100644 index 0000000000..527b0498ee Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png new file mode 100644 index 0000000000..c3faff7095 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png new file mode 100644 index 0000000000..4d5f7f8bbe Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/SplashScreen.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000..d21724785b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000..09f012d396 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000..79bfd3cdcd Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000..f7f10796e4 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000..937933c999 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square150x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-lightunplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000..53f75132c9 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000..098aadf8c5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000..16916b82f5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000..06e0f28497 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000..d31fda3de6 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Square44x44Logo.targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png new file mode 100644 index 0000000000..4f25bb2252 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png new file mode 100644 index 0000000000..4f25bb2252 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png new file mode 100644 index 0000000000..a872360054 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png new file mode 100644 index 0000000000..62e4b58af5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png new file mode 100644 index 0000000000..97126aeb92 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png new file mode 100644 index 0000000000..f21049bec0 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/StoreLogo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000..8b23cfc097 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png new file mode 100644 index 0000000000..718f4f4eb1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000..7b5e96f4c1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000..a22e20a06d Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000..fa4ba31e0a Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/Wide310x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico new file mode 100644 index 0000000000..e40c7086e7 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.ico differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg new file mode 100644 index 0000000000..41bba03405 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/Stable/icon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg new file mode 100644 index 0000000000..ec3cb933d8 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.dark.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg new file mode 100644 index 0000000000..9d74683716 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/StoreLogo.light.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg new file mode 100644 index 0000000000..0bf3ebbaff --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Assets/WinGetLogo.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props new file mode 100644 index 0000000000..2d228c36bf --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.Branding.props @@ -0,0 +1,48 @@ + + + + + Stable + Stable + Stable + Dev + + + + Assets\Stable\icon.ico + + + Assets\Stable\icon.ico + + + Assets\Stable\icon.ico + + + Assets\Dev\icon.ico + + + + + + + true + Assets\%(RecursiveDir)%(FileName)%(Extension) + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props new file mode 100644 index 0000000000..21c2e7d8d1 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/CmdPal.pre.props @@ -0,0 +1,15 @@ + + + + + + Release + + + + $(SolutionDir)$(Platform)\$(Configuration)\WinUI3Apps\CmdPal + + $(OutputPath)\AppPackages\ + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs new file mode 100644 index 0000000000..1e86514d6d --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/BeginInvokeEvent.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class BeginInvokeEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public BeginInvokeEvent() + { + EventName = "CmdPal_BeginInvokeEvent"; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs new file mode 100644 index 0000000000..d1e07f78b7 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ColdLaunchEvent.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class ColdLaunchEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public ColdLaunchEvent() + { + EventName = "CmdPal_ColdLaunch"; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs new file mode 100644 index 0000000000..e9d6d6f60f --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnEscEvent.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class DismissedOnEscEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs new file mode 100644 index 0000000000..bc654c0e6e --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/DismissedOnLostFocusEvent.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class DismissedOnLostFocusEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs new file mode 100644 index 0000000000..3a6bce661f --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/HotkeySummonedEvent.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class HotkeySummonedEvent : TelemetryEventBase, IEvent +{ + public bool Global { get; set; } + + public HotkeySummonedEvent(bool global) + { + Global = global; + } + + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs new file mode 100644 index 0000000000..360c8fb410 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenPageEvent.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class OpenPageEvent : TelemetryEventBase, IEvent +{ + public int PageDepth { get; set; } + + public string Id { get; set; } + + public OpenPageEvent(int pageDepth, string id) + { + PageDepth = pageDepth; + Id = id; + + EventName = "CmdPal_OpenPage"; + } + + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs new file mode 100644 index 0000000000..8bcb7f08c2 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/OpenUriEvent.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CommandPalette.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class OpenUriEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public string Uri { get; set; } + + public bool IsWeb { get; set; } + + public bool Success { get; set; } + + public OpenUriEvent(string uri, bool isWeb, bool success) + { + EventName = "CmdPal_OpenUri"; + Uri = uri; + IsWeb = isWeb; + Success = success; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs new file mode 100644 index 0000000000..4b38b43b0a --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ProcessStartedEvent.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class ProcessStartedEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs new file mode 100644 index 0000000000..abbba6a67f --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/ReactivateInstanceEvent.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class ReactivateInstanceEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public ReactivateInstanceEvent() + { + EventName = "CmdPal_ReactivateInstance"; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs new file mode 100644 index 0000000000..e100cf642f --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunCommandEvent.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CommandPalette.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class RunCommandEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public string Command { get; set; } + + public bool AsAdmin { get; set; } + + public bool Success { get; set; } + + public RunCommandEvent(string command, bool asAdmin, bool success) + { + EventName = "CmdPal_RunCommand"; + Command = command; + AsAdmin = asAdmin; + Success = success; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs new file mode 100644 index 0000000000..64c1701a63 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Events/RunQueryEvent.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CmdPal.UI.Events; + +[EventData] +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] +public class RunQueryEvent : TelemetryEventBase, IEvent +{ + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public string Query { get; set; } + + public int ResultCount { get; set; } + + public ulong DurationMs { get; set; } + + public RunQueryEvent(string query, int resultCount, ulong durationMs) + { + EventName = "CmdPal_RunQuery"; + Query = query; + ResultCount = resultCount; + DurationMs = durationMs; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs new file mode 100644 index 0000000000..563ec1ba93 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/DiagnosticsHelper.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation +// 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.Runtime.InteropServices; + +namespace Microsoft.CommandPalette.UI.Helpers; + +/// +/// Provides utility methods for building diagnostic and error messages. +/// +public static class DiagnosticsHelper +{ + /// + /// Builds a comprehensive exception message with timestamp and detailed diagnostic information. + /// + /// The exception that occurred. + /// A hint about which extension caused the exception to help with debugging. + /// A string containing the exception details, timestamp, and source information for diagnostic purposes. + public static string BuildExceptionMessage(Exception exception, string? extensionHint) + { + var locationHint = string.IsNullOrWhiteSpace(extensionHint) ? "application" : $"'{extensionHint}' extension"; + + // let's try to get a message from the exception or inferred it from the HRESULT + // to show at least something + var message = exception.Message; + if (string.IsNullOrWhiteSpace(message)) + { + var temp = Marshal.GetExceptionForHR(exception.HResult)?.Message; + if (!string.IsNullOrWhiteSpace(temp)) + { + message = temp + $" (inferred from HRESULT 0x{exception.HResult:X8})"; + } + } + + if (string.IsNullOrWhiteSpace(message)) + { + message = "[No message available]"; + } + + // note: keep date time kind and format consistent with the log + return $""" + ============================================================ + 😢 An unexpected error occurred in the {locationHint}. + + Summary: + Message: {message} + Type: {exception.GetType().FullName} + Source: {exception.Source ?? "N/A"} + Time: {DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss.fffffff} + HRESULT: 0x{exception.HResult:X8} ({exception.HResult}) + + Stack Trace: + {exception.StackTrace ?? "[No stack trace available]"} + + ------------------ Full Exception Details ------------------ + {exception} + + ℹ️ If you need further assistance, please include this information in your support request. + ℹ️ Before sending, take a quick look to make sure it doesn't contain any personal or sensitive information. + ============================================================ + + """; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs new file mode 100644 index 0000000000..a2c405c288 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GlobalErrorHandler.cs @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.CommandPalette.UI.Services; +using Microsoft.Extensions.Logging; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; +using SystemUnhandledExceptionEventArgs = System.UnhandledExceptionEventArgs; +using XamlUnhandledExceptionEventArgs = Microsoft.UI.Xaml.UnhandledExceptionEventArgs; + +namespace Microsoft.CommandPalette.UI.Helpers; + +/// +/// Global error handler for Command Palette. +/// +internal sealed partial class GlobalErrorHandler +{ + private readonly CmdPalLogger logger; + + public GlobalErrorHandler(CmdPalLogger logger) + { + ArgumentNullException.ThrowIfNull(logger); + this.logger = logger; + } + + // GlobalErrorHandler is designed to be self-contained; it can be registered and invoked before a service provider is available. + internal void Register(App app) + { + ArgumentNullException.ThrowIfNull(app); + + app.UnhandledException += App_UnhandledException; + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + } + + private void App_UnhandledException(object sender, XamlUnhandledExceptionEventArgs e) + { + // Exceptions thrown on the main UI thread are handled here. + if (e.Exception != null) + { + HandleException(e.Exception, Context.MainThreadException); + } + } + + private void CurrentDomain_UnhandledException(object sender, SystemUnhandledExceptionEventArgs e) + { + // Exceptions thrown on background threads are handled here. + if (e.ExceptionObject is Exception ex) + { + HandleException(ex, Context.AppDomainUnhandledException); + } + } + + private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) + { + // This event is raised only when a faulted Task is garbage-collected + // without its exception being observed. It is NOT raised immediately + // when the Task faults; timing depends on GC finalization. + e.SetObserved(); + HandleException(e.Exception, Context.UnobservedTaskException); + } + + private void HandleException(Exception ex, Context context) + { + Log_UnhandledException(ex, context); + + if (context == Context.MainThreadException) + { + var error = DiagnosticsHelper.BuildExceptionMessage(ex, null); + var report = $""" + This is an error report generated by Microsoft Command Palette. + If you are seeing this message, it means the application has encountered an unexpected issue. + You can help us fix it by filing a report at https://aka.ms/powerToysReportBug. + {error} + """; + + StoreReport(report, storeOnDesktop: false); + + string message; + string caption; + try + { + message = ResourceLoaderInstance.GetString("GlobalErrorHandler_CrashMessageBox_Message"); + caption = ResourceLoaderInstance.GetString("GlobalErrorHandler_CrashMessageBox_Caption"); + } + catch + { + // The resource loader may not be available if the exception occurred during startup. + // Fall back to hardcoded strings in that case. + message = "Command Palette has encountered a fatal error and must close."; + caption = "Command Palette - Fatal error"; + } + + PInvoke.MessageBox( + HWND.Null, + message, + caption, + MESSAGEBOX_STYLE.MB_ICONERROR); + } + } + + private string? StoreReport(string report, bool storeOnDesktop) + { + // Generate a unique name for the report file; include timestamp and a random zero-padded number to avoid collisions + // in case of crash storm. + var name = FormattableString.Invariant($"CmdPal_ErrorReport_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{Random.Shared.Next(100000):D5}.log"); + + // Always store a copy in log directory, this way it is available for Bug Report Tool + string? reportPath = null; + if (logger.CurrentVersionLogDirectoryPath != null) + { + reportPath = Save(report, name, () => logger.CurrentVersionLogDirectoryPath); + } + + // Optionally store a copy on the desktop for user (in)convenience + if (storeOnDesktop) + { + var path = Save(report, name, () => Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)); + + // show the desktop copy if both succeeded + if (path != null) + { + reportPath = path; + } + } + + return reportPath; + + string? Save(string reportContent, string reportFileName, Func directory) + { + try + { + var logDirectory = directory(); + Directory.CreateDirectory(logDirectory); + var reportFilePath = Path.Combine(logDirectory, reportFileName); + File.WriteAllText(reportFilePath, reportContent); + return reportFilePath; + } + catch (Exception ex) + { + Log_FailureToSaveExceptionReport(ex); + return null; + } + } + } + + private enum Context + { + Unknown = 0, + MainThreadException, + BackgroundThreadException, + UnobservedTaskException, + AppDomainUnhandledException, + } + + [LoggerMessage(Level = LogLevel.Error, Message = "Unhandled exception detected in context {context}")] + partial void Log_UnhandledException(Exception exception, Context context); + + [LoggerMessage(Level = LogLevel.Error, Message = "Failed to save exception report")] + partial void Log_FailureToSaveExceptionReport(Exception exception); +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs new file mode 100644 index 0000000000..f137e38e5a --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/GpoValueChecker.cs @@ -0,0 +1,93 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Win32; + +namespace Microsoft.CommandPalette.UI.Helpers; + +internal enum GpoRuleConfiguredValue +{ + WrongValue = -3, + Unavailable = -2, + NotConfigured = -1, + Disabled = 0, + Enabled = 1, +} + +/* + * Contains methods extracted from PowerToys gpo.h + * The idea is to keep CmdPal codebase take as little dependences on the PowerToys codebase as possible. + * Having this class to check GPO being contained in CmdPal means we don't need to depend on GPOWrapper. + */ +internal static class GpoValueChecker +{ + private const string PoliciesPath = @"SOFTWARE\Policies\PowerToys"; + private static readonly RegistryKey PoliciesScopeMachine = Registry.LocalMachine; + private static readonly RegistryKey PoliciesScopeUser = Registry.CurrentUser; + private const string PolicyConfigureEnabledCmdPal = @"ConfigureEnabledUtilityCmdPal"; + private const string PolicyConfigureEnabledGlobalAllUtilities = @"ConfigureGlobalUtilityEnabledState"; + + private static GpoRuleConfiguredValue GetConfiguredValue(string registryValueName) + { + // For GPO policies, machine scope should take precedence over user scope + var value = ReadRegistryValue(PoliciesScopeMachine, PoliciesPath, registryValueName); + + if (!value.HasValue) + { + // If not found in machine scope, check user scope + value = ReadRegistryValue(PoliciesScopeUser, PoliciesPath, registryValueName); + if (!value.HasValue) + { + return GpoRuleConfiguredValue.NotConfigured; + } + } + + return value switch + { + 0 => GpoRuleConfiguredValue.Disabled, + 1 => GpoRuleConfiguredValue.Enabled, + _ => GpoRuleConfiguredValue.WrongValue, + }; + } + + // Reads an integer registry value if it exists. + private static int? ReadRegistryValue(RegistryKey rootKey, string subKeyPath, string valueName) + { + using (RegistryKey? key = rootKey.OpenSubKey(subKeyPath, false)) + { + if (key is null) + { + return null; + } + + var value = key.GetValue(valueName); + if (value is int intValue) + { + return intValue; + } + + return null; + } + } + + private static GpoRuleConfiguredValue GetUtilityEnabledValue(string utilityName) + { + var individualValue = GetConfiguredValue(utilityName); + + if (individualValue == GpoRuleConfiguredValue.Disabled || individualValue == GpoRuleConfiguredValue.Enabled) + { + return individualValue; + } + else + { + // If the individual utility value is not set, check the global all utilities policy value. + return GetConfiguredValue(PolicyConfigureEnabledGlobalAllUtilities); + } + } + + internal static GpoRuleConfiguredValue GetConfiguredCmdPalEnabledValue() + { + return GetUtilityEnabledValue(PolicyConfigureEnabledCmdPal); + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs new file mode 100644 index 0000000000..85cab883c6 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/NativeEventWaiter.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.UI.Dispatching; + +namespace Microsoft.CommandPalette.UI.Helpers; + +public static partial class NativeEventWaiter +{ + public static void WaitForEventLoop(string eventName, Action callback) + { + var dispatcherQueue = DispatcherQueue.GetForCurrentThread(); + var t = new Thread(() => + { + var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventName); + while (true) + { + if (eventHandle.WaitOne()) + { + dispatcherQueue.TryEnqueue(() => callback()); + } + } + }); + + t.IsBackground = true; + t.Start(); + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs new file mode 100644 index 0000000000..5cbd067a1c --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/ResourceLoaderInstance.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.Windows.ApplicationModel.Resources; + +namespace Microsoft.CommandPalette.UI.Helpers; + +internal static class ResourceLoaderInstance +{ + internal static ResourceLoader ResourceLoader { get; private set; } + + static ResourceLoaderInstance() + { + ResourceLoader = new ResourceLoader("resources.pri"); + } + + internal static string GetString(string resourceId) => ResourceLoader.GetString(resourceId); +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs new file mode 100644 index 0000000000..637ccbe539 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Helpers/WindowExtensions.cs @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.UI; +using Microsoft.UI.Windowing; +using Microsoft.UI.Xaml; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.Graphics.Dwm; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace Microsoft.CommandPalette.UI.Helpers; + +internal static class WindowExtensions +{ + public static void SetIcon(this Window window) + { + var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window); + WindowId windowId = Win32Interop.GetWindowIdFromWindow(hWnd); + AppWindow appWindow = AppWindow.GetFromWindowId(windowId); + appWindow.SetIcon(@"Assets\icon.ico"); + } + + public static HWND GetWindowHwnd(this Window window) + { + return window is null + ? throw new ArgumentNullException(nameof(window)) + : new HWND(WinRT.Interop.WindowNative.GetWindowHandle(window)); + } + + /// + /// Toggles the specified extended window style on or off for the supplied . + /// + /// The whose extended window styles will be modified. Cannot be null. + /// The flag(s) to set or clear. + /// When true, the specified bit(s) will be set (added). When false, the bit(s) will be cleared (removed). + /// True if the call to SetWindowLong succeeded and the style was applied; otherwise false. + /// Thrown if is null. + internal static bool ToggleExtendedWindowStyle(this Window window, WINDOW_EX_STYLE style, bool isStyleSet) + { + var hWnd = GetWindowHwnd(window); + var currentStyle = PInvoke.GetWindowLong(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE); + + if (isStyleSet) + { + currentStyle |= (int)style; + } + else + { + currentStyle &= ~(int)style; + } + + var wasSet = PInvoke.SetWindowLong(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, currentStyle) != 0; + + // SWP_FRAMECHANGED - invalidate cached window style + PInvoke.SetWindowPos(hWnd, new HWND(IntPtr.Zero), 0, 0, 0, 0, SET_WINDOW_POS_FLAGS.SWP_FRAMECHANGED | SET_WINDOW_POS_FLAGS.SWP_NOMOVE | SET_WINDOW_POS_FLAGS.SWP_NOSIZE | SET_WINDOW_POS_FLAGS.SWP_NOZORDER | SET_WINDOW_POS_FLAGS.SWP_NOOWNERZORDER); + + return wasSet; + } + + /// + /// Sets the window corner preference + /// + /// The window + /// The desired corner preference + /// True if the operation succeeded + public static bool SetCornerPreference(this Window window, DWM_WINDOW_CORNER_PREFERENCE cornerPreference) + { + return window.GetWindowHwnd().SetDwmWindowAttribute(DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE, cornerPreference); + } + + /// + /// Unified wrapper for DwmSetWindowAttribute calls with enum values + /// + private static bool SetDwmWindowAttribute(this HWND hwnd, DWMWINDOWATTRIBUTE attribute, T value) + where T : unmanaged, Enum + { + unsafe + { + var result = PInvoke.DwmSetWindowAttribute(hwnd, attribute, &value, (uint)sizeof(T)); + return result.Succeeded; + } + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs new file mode 100644 index 0000000000..4f93e935e2 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/HiddenOwnerWindowBehavior.cs @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.CommandPalette.UI.Helpers; +using Microsoft.UI.Xaml; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.Graphics.Dwm; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace Microsoft.CommandPalette.UI; + +/// +/// Provides behavior to control taskbar and Alt+Tab presence by assigning a hidden owner +/// and toggling extended window styles for a target window. +/// +internal sealed class HiddenOwnerWindowBehavior +{ + private HWND _hiddenOwnerHwnd; + private Window? _hiddenWindow; + + /// + /// Shows or hides a window in the taskbar (and Alt+Tab) by updating ownership and extended window styles. + /// + /// The to update. + /// True to show the window in the taskbar (and Alt+Tab); false to hide it from both. + /// + /// When hiding the window, a hidden owner is assigned and + /// is enabled to keep it out of the taskbar and Alt+Tab. When showing, the owner is cleared and + /// is enabled to ensure taskbar presence. Since tool + /// windows use smaller corner radii, the normal rounded corners are enforced via + /// . + /// + /// + public void ShowInTaskbar(Window target, bool isVisibleInTaskbar) + { + /* + * There are the three main ways to control whether a window appears on the taskbar: + * https://learn.microsoft.com/en-us/windows/win32/shell/taskbar#managing-taskbar-buttons + * + * 1. Set the window's owner. Owned windows do not appear on the taskbar: + * Turns out this is the most reliable way to hide a window from the taskbar and ALT+TAB. WinForms and WPF uses this method + * to back their ShowInTaskbar property as well. + * + * 2. Use the WS_EX_TOOLWINDOW extended window style: + * This mostly works, with some reports that it silently fails in some cases. The biggest issue + * is that for certain Windows settings (like Multitasking -> Show taskbar buttons on all displays = On all desktops), + * the taskbar button is always shown even for tool windows. + * + * 3. Using ITaskbarList: + * This is what AppWindow.IsShownInSwitchers uses, but it's COM-based and more complex, and can + * fail if Explorer isn't running or responding. It could be a good backup, if needed. + */ + + var visibleHwnd = target.GetWindowHwnd(); + + if (isVisibleInTaskbar) + { + // remove any owner window + PInvoke.SetWindowLongPtr(visibleHwnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, HWND.Null); + } + else + { + // Set the hidden window as the owner of the target window + var hiddenHwnd = EnsureHiddenOwner(); + PInvoke.SetWindowLongPtr(visibleHwnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, hiddenHwnd); + } + + // Tool windows don't show up in ALT+TAB, and don't show up in the taskbar + // Tool window and app window styles are mutually exclusive, change both just to be safe + target.ToggleExtendedWindowStyle(WINDOW_EX_STYLE.WS_EX_TOOLWINDOW, !isVisibleInTaskbar); + target.ToggleExtendedWindowStyle(WINDOW_EX_STYLE.WS_EX_APPWINDOW, isVisibleInTaskbar); + + // Since tool windows have smaller corner radii, we need to force the normal ones + target.SetCornerPreference(DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND); + } + + private HWND EnsureHiddenOwner() + { + if (_hiddenOwnerHwnd.IsNull) + { + _hiddenWindow = new Window(); + _hiddenOwnerHwnd = _hiddenWindow.GetWindowHwnd(); + } + + return _hiddenOwnerHwnd; + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs new file mode 100644 index 0000000000..1b456f66d7 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/LocalSuppressions.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.DestroyIconSafeHandle")] +[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.DestroyMenuSafeHandle")] +[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.FreeLibrarySafeHandle")] +[assembly: SuppressMessage("Interoperability", "CsWinRT1028: Class should be marked partial", Justification = "CsWin32 generated code; not used across WinRT boundary", Scope = "type", Target = "~T:Windows.Win32.UnhookWindowsHookExSafeHandle")] diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml new file mode 100644 index 0000000000..61d209f7e3 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs new file mode 100644 index 0000000000..8473b4253f --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/MainWindow.xaml.cs @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft Corporation +// 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.Runtime.InteropServices; +using Microsoft.Extensions.Logging; +using Microsoft.UI.Xaml; +using Microsoft.Windows.AppLifecycle; +using Windows.ApplicationModel.Activation; + +namespace Microsoft.CommandPalette.UI; + +/// +/// An empty window that can be used on its own or navigated to within a Frame. +/// +public sealed partial class MainWindow : Window +{ + private readonly ILogger logger; + + public MainWindow(ILogger logger) + { + InitializeComponent(); + this.logger = logger; + } + + public void HandleLaunchNonUI(AppActivationArguments? activatedEventArgs) + { + // LOAD BEARING + // Any reading and processing of the activation arguments must be done + // synchronously in this method, before it returns. The sending instance + // remains blocked until this returns; afterward it may quit, causing + // the activation arguments to be lost. + if (activatedEventArgs is null) + { + // Summon(string.Empty); + return; + } + + try + { + if (activatedEventArgs.Kind == ExtendedActivationKind.StartupTask) + { + return; + } + + if (activatedEventArgs.Kind == ExtendedActivationKind.Protocol) + { + if (activatedEventArgs.Data is IProtocolActivatedEventArgs protocolArgs) + { + if (protocolArgs.Uri.ToString() is string uri) + { + // was the URI "x-cmdpal://background" ? + if (uri.StartsWith("x-cmdpal://background", StringComparison.OrdinalIgnoreCase)) + { + // we're running, we don't want to activate our window. bail + return; + } + else if (uri.StartsWith("x-cmdpal://settings", StringComparison.OrdinalIgnoreCase)) + { + // WeakReferenceMessenger.Default.Send(new()); + return; + } + else if (uri.StartsWith("x-cmdpal://reload", StringComparison.OrdinalIgnoreCase)) + { + // var settings = App.Current.Services.GetService(); + // if (settings?.AllowExternalReload == true) + // { + // Logger.LogInfo("External Reload triggered"); + // WeakReferenceMessenger.Default.Send(new()); + // } + // else + // { + // Logger.LogInfo("External Reload is disabled"); + // } + return; + } + } + } + } + } + catch (COMException ex) + { + // https://learn.microsoft.com/en-us/windows/win32/rpc/rpc-return-values + const int RPC_S_SERVER_UNAVAILABLE = -2147023174; + const int RPC_S_CALL_FAILED = 2147023170; + + // Accessing properties activatedEventArgs.Kind and activatedEventArgs.Data might cause COMException + // if the args are not valid or not passed correctly. + if (ex.HResult is RPC_S_SERVER_UNAVAILABLE or RPC_S_CALL_FAILED) + { + // Logger.LogWarning( + // $"COM exception (HRESULT {ex.HResult}) when accessing activation arguments. " + + // $"This might be due to the calling application not passing them correctly or exiting before we could read them. " + + // $"The application will continue running and fall back to showing the Command Palette window."); + } + else + { + // Logger.LogError( + // $"COM exception (HRESULT {ex.HResult}) when activating the application. " + + // $"The application will continue running and fall back to showing the Command Palette window.", + // ex); + } + } + + // Summon(string.Empty); + } + + // public void Summon(string commandId) => + // The actual showing and hiding of the window will be done by the + // ShellPage. This is because we don't want to show the window if the + // user bound a hotkey to just an invokable command, which we can't + // know till the message is being handled. + // WeakReferenceManager.Default.Send(new(commandId, _hwnd)); +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj new file mode 100644 index 0000000000..5a4b0cb148 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Microsoft.CommandPalette.UI.csproj @@ -0,0 +1,161 @@ + + + + + + + + + WinExe + Microsoft.CommandPalette.UI + app.manifest + win-$(Platform).pubxml + true + true + enable + enable + true + preview + + $(CmdPalVersion) + + + + false + false + + + + + + + + true + false + false + true + + + + true + Never + $(OutputPath)\AppPackages\Microsoft.CommandPalette.UI_$(Version)_Test\ + + + + + + DISABLE_XAML_GENERATED_MAIN + + + + + + + $(ApplicationManifest.Replace("$(MSBuildProjectDirectory)\","")) + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + + + + true + + + + + + PreserveNewest + + + Never + + + Never + + + Never + + + + + + + <_Parameter1>PublishTrimmed + <_Parameter2>$(PublishTrimmed) + + + <_Parameter1>PublishAot + <_Parameter2>$(PublishAot) + + + <_Parameter1>CIBuild + <_Parameter2>$(CIBuild) + + + <_Parameter1>CommandPaletteBranding + <_Parameter2>$(CommandPaletteBranding) + + + + + + Never + + + Never + + + Never + + + + + + \ No newline at end of file diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt new file mode 100644 index 0000000000..fc5a608199 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/NativeMethods.txt @@ -0,0 +1,66 @@ +GetPhysicallyInstalledSystemMemory +GlobalMemoryStatusEx +GetSystemInfo +GetForegroundWindow +SetForegroundWindow +GetWindowRect +GetCursorPos +SetWindowPos +HWND_TOPMOST +HWND_BOTTOM +IsIconic +RegisterHotKey +UnregisterHotKey +SetWindowLongPtr +CallWindowProc +ShowWindow +SetForegroundWindow +EnableWindow +IsWindowEnabled +SetFocus +SetActiveWindow +MonitorFromWindow +GetMonitorInfo +GetDpiForMonitor +WM_HOTKEY +WM_NCLBUTTONDBLCLK + +Shell_NotifyIcon +LoadIcon +WM_USER +WM_WINDOWPOSCHANGING +RegisterWindowMessageW +ExtractIconEx +TRACK_POPUP_MENU_FLAGS +WM_COMMAND +WM_RBUTTONUP +WM_LBUTTONUP +WM_LBUTTONDBLCLK +CreatePopupMenu +TrackPopupMenuEx +InsertMenu + +MessageBox +DwmGetWindowAttribute +DwmSetWindowAttribute +DWM_CLOAKED_APP +DWM_WINDOW_CORNER_PREFERENCE + +CoWaitForMultipleObjects +INFINITE +CWMO_FLAGS + +GetCurrentThreadId +SetWindowsHookEx +UnhookWindowsHookEx +CallNextHookEx +GetModuleHandle + +GetWindowLong +SetWindowLong +WINDOW_EX_STYLE +CreateWindowEx +WNDCLASSEXW +RegisterClassEx +GetStockObject +GetModuleHandle \ No newline at end of file diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest new file mode 100644 index 0000000000..f8a16a433b --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package-Dev.appxmanifest @@ -0,0 +1,89 @@ + + + + + + + + + + ms-resource:AppNameDev + A Lone Developer + Assets\StoreLogo.png + disabled + + + + + + + + + + + + + + + + + + + + + + + com.microsoft.commandpalette + + + + + + + + + + Assets\StoreLogo.png + Command Palette Dev URI scheme + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest new file mode 100644 index 0000000000..4020c10ead --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Package.appxmanifest @@ -0,0 +1,91 @@ + + + + + + + + + + ms-resource:AppName + Microsoft Corporation + Assets\StoreLogo.png + disabled + + + + + + + + + + + + + + + + + + + + + + + com.microsoft.commandpalette + + + + + + + + + + + Assets\StoreLogo.png + Command Palette URI scheme + + + + + + + + + + + + + + diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs new file mode 100644 index 0000000000..98e97936c5 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Program.cs @@ -0,0 +1,140 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.CmdPal.UI.Events; +using Microsoft.CommandPalette.UI.Services; +using Microsoft.CommandPalette.UI.Services.Telemetry; +using Microsoft.Extensions.Logging; +using Microsoft.UI.Dispatching; +using Microsoft.Windows.AppLifecycle; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.System.Com; + +namespace Microsoft.CommandPalette.UI; + +// cribbed heavily from +// +// https://github.com/microsoft/WindowsAppSDK-Samples/tree/main/Samples/AppLifecycle/Instancing/cs2/cs-winui-packaged/CsWinUiDesktopInstancing +internal sealed partial class Program +{ + private static DispatcherQueueSynchronizationContext? uiContext; + private static App? app; + private static ILogger logger = new CmdPalLogger(); + + // LOAD BEARING + // + // Main cannot be async. If it is, then the clipboard won't work, and neither will narrator. + // That means you, the person thinking about making this a MTA thread. Don't + // do it. It won't work. That's not the solution. + [STAThread] + private static int Main(string[] args) + { + if (Helpers.GpoValueChecker.GetConfiguredCmdPalEnabledValue() == Helpers.GpoRuleConfiguredValue.Disabled) + { + // There's a GPO rule configured disabling CmdPal. Exit as soon as possible. + return 0; + } + + Log_AppStart(logger, DateTime.UtcNow); + TelemetryService.WriteEvent(new ProcessStartedEvent()); + + WinRT.ComWrappersSupport.InitializeComWrappers(); + var isRedirect = DecideRedirection(); + if (!isRedirect) + { + Microsoft.UI.Xaml.Application.Start((p) => + { + uiContext = new DispatcherQueueSynchronizationContext(DispatcherQueue.GetForCurrentThread()); + SynchronizationContext.SetSynchronizationContext(uiContext); + app = new App(logger); + }); + } + + return 0; + } + + private static bool DecideRedirection() + { + var isRedirect = false; + var args = AppInstance.GetCurrent().GetActivatedEventArgs(); + var keyInstance = AppInstance.FindOrRegisterForKey("randomKey"); + + if (keyInstance.IsCurrent) + { + TelemetryService.WriteEvent(new ColdLaunchEvent()); + keyInstance.Activated += OnActivated; + } + else + { + isRedirect = true; + TelemetryService.WriteEvent(new ReactivateInstanceEvent()); + RedirectActivationTo(args, keyInstance); + } + + return isRedirect; + } + + private static void RedirectActivationTo(AppActivationArguments args, AppInstance keyInstance) + { + // Do the redirection on another thread, and use a non-blocking + // wait method to wait for the redirection to complete. + using var redirectSemaphore = new Semaphore(0, 1); + var redirectTimeout = TimeSpan.FromSeconds(32); + + _ = Task.Run(() => + { + using var cts = new CancellationTokenSource(redirectTimeout); + try + { + keyInstance.RedirectActivationToAsync(args) + .AsTask(cts.Token) + .GetAwaiter() + .GetResult(); + } + catch (OperationCanceledException) + { + Log_FailedToActivateTimeout(logger, redirectTimeout); + } + catch (Exception ex) + { + Log_FailedToActivate(logger, ex); + } + finally + { + redirectSemaphore.Release(); + } + }); + + _ = PInvoke.CoWaitForMultipleObjects( + (uint)CWMO_FLAGS.CWMO_DEFAULT, + PInvoke.INFINITE, + [new HANDLE(redirectSemaphore.SafeWaitHandle.DangerousGetHandle())], + out _); + } + + private static void OnActivated(object? sender, AppActivationArguments args) + { + // If we already have a form, display the message now. + // Otherwise, add it to the collection for displaying later. + if (App.Current?.AppWindow is MainWindow mainWindow) + { + // LOAD BEARING + // This must be synchronous to ensure the method does not return + // before the activation is fully handled and the parameters are processed. + // The sending instance remains blocked until this returns; afterward it may quit, + // causing the activation arguments to be lost. + mainWindow.HandleLaunchNonUI(args); + } + } + + [LoggerMessage(Level = LogLevel.Debug, Message = "Starting at {startTime}")] + static partial void Log_AppStart(ILogger logger, DateTime startTime); + + [LoggerMessage(Level = LogLevel.Error, Message = "Failed to activate existing instance; timed out after {redirectTimeout}.")] + static partial void Log_FailedToActivateTimeout(ILogger logger, TimeSpan redirectTimeout); + + [LoggerMessage(Level = LogLevel.Error, Message = "Failed to activate existing instance")] + static partial void Log_FailedToActivate(ILogger logger, Exception ex); +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000..79c6a4c077 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png new file mode 100644 index 0000000000..cd5e093a6c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png new file mode 100644 index 0000000000..88fb0b9da1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png new file mode 100644 index 0000000000..efa7567286 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000..28a79c917e Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LargeTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000..7440f0d4bf Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/LockScreenLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000..b48a90fbde Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png new file mode 100644 index 0000000000..2c07454b3a Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png new file mode 100644 index 0000000000..e2e81a4e89 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000..de43005787 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000..f6442934ed Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SmallTile.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000..147cc74697 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000000..fb12df0421 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000000..527b0498ee Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000..c3faff7095 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000..4d5f7f8bbe Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/SplashScreen.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000..d21724785b Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000..09f012d396 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000..79bfd3cdcd Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000..f7f10796e4 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000..937933c999 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square150x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000..53f75132c9 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000..098aadf8c5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000..16916b82f5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000..06e0f28497 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000..d31fda3de6 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000..bdba6e8bfb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-16.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000000..902d164632 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000..0c0601612c Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-256.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000000..c603fcaeeb Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-32.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000..06491e5d51 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Square44x44Logo.targetsize-48.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png new file mode 100644 index 0000000000..4f25bb2252 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000000..4f25bb2252 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png new file mode 100644 index 0000000000..a872360054 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000..62e4b58af5 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png new file mode 100644 index 0000000000..97126aeb92 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000000..f21049bec0 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/StoreLogo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000..8b23cfc097 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-100.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png new file mode 100644 index 0000000000..718f4f4eb1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-125.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000..7b5e96f4c1 Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-150.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000..a22e20a06d Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-200.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000..fa4ba31e0a Binary files /dev/null and b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Release-Assets/Wide310x150Logo.scale-400.png differ diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs new file mode 100644 index 0000000000..36a204b2cb --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/CmdPalLogger.cs @@ -0,0 +1,167 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using ManagedCommon; +using Microsoft.Extensions.Logging; + +namespace Microsoft.CommandPalette.UI.Services; + +// Adapter implementing Microsoft.Extensions.Logging.ILogger, +// delegating to ManagedCommon.Logger. +internal sealed partial class CmdPalLogger : ILogger +{ + private static readonly AsyncLocal> _scopeStack = new(); + private readonly LogLevel _minLevel; + + public string CurrentVersionLogDirectoryPath => Logger.CurrentVersionLogDirectoryPath; + + public CmdPalLogger(LogLevel minLevel = LogLevel.Information) + { + _minLevel = minLevel; + + // Ensure underlying logger initialized (idempotent if already done elsewhere). + Logger.InitializeLogger("\\CmdPal\\Logs\\"); + } + + public bool IsEnabled(LogLevel logLevel) => logLevel != LogLevel.None && logLevel >= _minLevel; + + public IDisposable? BeginScope(TState state) + where TState : notnull + { + var stack = _scopeStack.Value; + if (stack is null) + { + stack = new Stack(); + _scopeStack.Value = stack; + } + + stack.Push(state); + return new Scope(stack); + } + + public void Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception? exception, + Func formatter) + { + if (!IsEnabled(logLevel)) + { + return; + } + + ArgumentNullException.ThrowIfNull(formatter); + var message = formatter(state, exception); + if (string.IsNullOrEmpty(message) && exception is null) + { + return; + } + + var scopeSuffix = BuildScopeSuffix(); + var eventPrefix = eventId.Id != 0 ? $"[{eventId.Id}/{eventId.Name}] " : string.Empty; + var finalMessage = $"{eventPrefix}{message}{scopeSuffix}"; + + switch (logLevel) + { + case LogLevel.Trace: + // Existing stack: Trace logs an empty line; append message via Debug. + Logger.LogTrace(); + + if (!string.IsNullOrEmpty(message)) + { + Logger.LogDebug(finalMessage); + } + + if (exception is not null) + { + Logger.LogError(exception.Message, exception); + } + + break; + + case LogLevel.Debug: + Logger.LogDebug(finalMessage); + + if (exception is not null) + { + Logger.LogError(exception.Message, exception); + } + + break; + + case LogLevel.Information: + Logger.LogInfo(finalMessage); + + if (exception is not null) + { + Logger.LogError(exception.Message, exception); + } + + break; + + case LogLevel.Warning: + Logger.LogWarning(finalMessage); + + if (exception is not null) + { + Logger.LogError(exception.Message, exception); + } + + break; + + case LogLevel.Error: + case LogLevel.Critical: + if (exception is not null) + { + Logger.LogError(finalMessage, exception); + } + else + { + Logger.LogError(finalMessage); + } + + break; + + case LogLevel.None: + default: + break; + } + } + + private static string BuildScopeSuffix() + { + var stack = _scopeStack.Value; + if (stack is null || stack.Count == 0) + { + return string.Empty; + } + + // Show most-recent first. + return $" [Scopes: {string.Join(" => ", stack.ToArray())}]"; + } + + private sealed partial class Scope : IDisposable + { + private readonly Stack _stack; + private bool _disposed; + + public Scope(Stack stack) => _stack = stack; + + public void Dispose() + { + if (_disposed) + { + return; + } + + if (_stack.Count > 0) + { + _stack.Pop(); + } + + _disposed = true; + } + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryEventBase.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryEventBase.cs new file mode 100644 index 0000000000..52f201b9af --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryEventBase.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.PowerToys.Telemetry; +using Microsoft.PowerToys.Telemetry.Events; + +namespace Microsoft.CommandPalette.UI.Services.Telemetry; + +public abstract class TelemetryEventBase : EventBase, IEvent +{ + // Overridden in derived classes + public abstract PartA_PrivTags PartA_PrivTags { get; } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryService.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryService.cs new file mode 100644 index 0000000000..5cb202c423 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/Services/Telemetry/TelemetryService.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.PowerToys.Telemetry; + +namespace Microsoft.CommandPalette.UI.Services.Telemetry; + +internal static class TelemetryService +{ + public static void WriteEvent(TelemetryEventBase telemetryEvent) => PowerToysTelemetry.Log.WriteEvent(telemetryEvent); +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/TypePreservation.cs b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/TypePreservation.cs new file mode 100644 index 0000000000..51e66e4d26 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/TypePreservation.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation +// 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.Diagnostics.CodeAnalysis; + +namespace Microsoft.CommandPalette.UI; + +/// +/// This class ensures types used in XAML are preserved during AOT compilation. +/// Framework types cannot have attributes added directly to their definitions since they're external types. +/// Application types that require runtime type checking should also be preserved here if needed. +/// +internal static class TypePreservation +{ + /// + /// This method ensures critical types are preserved for AOT compilation. + /// These types are used dynamically in XAML and would otherwise be trimmed. + /// + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Microsoft.UI.Xaml.Controls.FontIconSource))] + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Microsoft.UI.Xaml.Controls.PathIcon))] + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Microsoft.UI.Xaml.DataTemplate))] + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Microsoft.UI.Xaml.Controls.DataTemplateSelector))] + [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Microsoft.UI.Xaml.Controls.ListViewItem))] + public static void PreserveTypes() + { + // This method exists only to hold the DynamicDependency attributes above. + // It must be called to ensure the types are not trimmed during AOT compilation. + + // Note: We cannot add [DynamicallyAccessedMembers] directly to framework types + // since we don't own their source code. DynamicDependency is the correct approach + // for preserving external types that are used dynamically (e.g., in XAML). + + // For application types that require runtime type checking (e.g., in template selectors), + // prefer adding [DynamicallyAccessedMembers] attributes directly on the type definitions. + // Only use DynamicDependency here for types we cannot modify directly. + } +} diff --git a/src/modules/Deux/UI/Microsoft.CommandPalette.UI/app.manifest b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/app.manifest new file mode 100644 index 0000000000..f5dd7ff036 --- /dev/null +++ b/src/modules/Deux/UI/Microsoft.CommandPalette.UI/app.manifest @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + true/PM + PerMonitorV2 + + + \ No newline at end of file