mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 10:16:24 +02:00
This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24). A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur. There's a new accessibility forbidden pattern: > Do not use `(click) here` links > For more information, see: > * https://www.w3.org/QA/Tips/noClickHere > * https://webaim.org/techniques/hypertext/link_text > * https://granicus.com/blog/why-click-here-links-are-bad/ > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021 ```pl (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\() ``` There are some minor bugs that I'm aware of and which I've fixed since this release, but I don't expect to make another release this month. I've added a pair of patterns for includes and pragmas. My argument is that the **compiler** will _generally_ tell you if you've misspelled an include and the **linker** will _generally_ tell you if you misspell a lib. - There's a caveat here: If your include case-insensitively matches the referenced file (but doesn't properly match it), then unless you either use a case-sensitive file system (as opposed to case-preserving) or beg clang to warn, you won't notice when you make this specific mistake -- this matters in that a couple of Windows headers (e.g. Unknwn.h) have particular case and repositories don't tend to consistently/properly write them.
110 lines
5.0 KiB
C#
110 lines
5.0 KiB
C#
// 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;
|
|
using System.Collections.Generic;
|
|
using System.Windows;
|
|
using System.Windows.Input;
|
|
|
|
using Microsoft.Plugin.WindowWalker.Properties;
|
|
using Wox.Plugin;
|
|
using Wox.Plugin.Logger;
|
|
|
|
namespace Microsoft.Plugin.WindowWalker.Components
|
|
{
|
|
internal class ContextMenuHelper
|
|
{
|
|
/// <summary>
|
|
/// Returns a list of all <see cref="ContextMenuResult"/>s for the selected <see cref="Result"/>.
|
|
/// </summary>
|
|
/// <param name="result">Selected result</param>
|
|
/// <returns>List of context menu results</returns>
|
|
internal static List<ContextMenuResult> GetContextMenuResults(in Result result)
|
|
{
|
|
if (!(result?.ContextData is Window windowData))
|
|
{
|
|
return new List<ContextMenuResult>(0);
|
|
}
|
|
|
|
var contextMenu = new List<ContextMenuResult>()
|
|
{
|
|
new ContextMenuResult
|
|
{
|
|
AcceleratorKey = Key.F4,
|
|
AcceleratorModifiers = ModifierKeys.Control,
|
|
FontFamily = "Segoe Fluent Icons,Segoe MDL2 Assets",
|
|
Glyph = "\xE8BB", // E8B8 => Symbol: ChromeClose
|
|
Title = $"{Resources.wox_plugin_windowwalker_Close} (Ctrl+F4)",
|
|
Action = _ =>
|
|
{
|
|
if (!windowData.IsWindow)
|
|
{
|
|
Log.Debug($"Cannot close the window '{windowData.Title}' ({windowData.Hwnd}), because it doesn't exist.", typeof(ContextMenuHelper));
|
|
return false;
|
|
}
|
|
|
|
windowData.CloseThisWindow();
|
|
|
|
return !WindowWalkerSettings.Instance.OpenAfterKillAndClose;
|
|
},
|
|
},
|
|
};
|
|
|
|
// Hide menu if Explorer.exe is the shell process or the process name is ApplicationFrameHost.exe
|
|
// In the first case we would crash the windows ui and in the second case we would kill the generic process for uwp apps.
|
|
if (!windowData.Process.IsShellProcess && !(windowData.Process.IsUwpApp && string.Equals(windowData.Process.Name, "ApplicationFrameHost.exe", StringComparison.OrdinalIgnoreCase))
|
|
&& !(windowData.Process.IsFullAccessDenied && WindowWalkerSettings.Instance.HideKillProcessOnElevatedProcesses))
|
|
{
|
|
contextMenu.Add(new ContextMenuResult
|
|
{
|
|
AcceleratorKey = Key.Delete,
|
|
AcceleratorModifiers = ModifierKeys.Control,
|
|
FontFamily = "Segoe Fluent Icons,Segoe MDL2 Assets",
|
|
Glyph = "\xE74D", // E74D => Symbol: Delete
|
|
Title = $"{Resources.wox_plugin_windowwalker_Kill} (Ctrl+Delete)",
|
|
Action = _ => KillProcessCommand(windowData),
|
|
});
|
|
}
|
|
|
|
return contextMenu;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Method to initiate killing the process of a window
|
|
/// </summary>
|
|
/// <param name="window">Window data</param>
|
|
/// <returns>True if the PT Run window should close, otherwise false.</returns>
|
|
private static bool KillProcessCommand(Window window)
|
|
{
|
|
// Validate process
|
|
if (!window.IsWindow || !window.Process.DoesExist || !window.Process.Name.Equals(WindowProcess.GetProcessNameFromProcessID(window.Process.ProcessID), StringComparison.Ordinal))
|
|
{
|
|
Log.Debug($"Cannot kill process '{window.Process.Name}' ({window.Process.ProcessID}) of the window '{window.Title}' ({window.Hwnd}), because it doesn't exist.", typeof(ContextMenuHelper));
|
|
return false;
|
|
}
|
|
|
|
// Request user confirmation
|
|
if (WindowWalkerSettings.Instance.ConfirmKillProcess)
|
|
{
|
|
string messageBody = $"{Resources.wox_plugin_windowwalker_KillMessage}\n"
|
|
+ $"{window.Process.Name} ({window.Process.ProcessID})\n\n"
|
|
+ $"{(window.Process.IsUwpApp ? Resources.wox_plugin_windowwalker_KillMessageUwp : Resources.wox_plugin_windowwalker_KillMessageQuestion)}";
|
|
MessageBoxResult messageBoxResult = MessageBox.Show(
|
|
messageBody,
|
|
Resources.wox_plugin_windowwalker_plugin_name + " - " + Resources.wox_plugin_windowwalker_KillMessageTitle,
|
|
MessageBoxButton.YesNo,
|
|
MessageBoxImage.Warning);
|
|
|
|
if (messageBoxResult == MessageBoxResult.No)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Kill process
|
|
window.Process.KillThisProcess(WindowWalkerSettings.Instance.KillProcessTree);
|
|
return !WindowWalkerSettings.Instance.OpenAfterKillAndClose;
|
|
}
|
|
}
|
|
}
|