From 534b91c064f2864fb61a008f4e14984b955ce988 Mon Sep 17 00:00:00 2001 From: Yu Chieh Victor Lin Date: Thu, 18 Apr 2024 17:04:25 +0800 Subject: [PATCH] LibraryImport code cleanup --- .github/README.md | 3 +- ...ity.PowerToys.Run.Plugin.Everything.csproj | 51 ++++++--------- ContextMenuLoader.cs | 26 +++----- Everything.cs | 24 +++---- EverythingARM64.dll | Bin 0 -> 91696 bytes GlobalSuppressions.cs | 1 - Interop/NativeMethods.cs | 59 +++++++++--------- Main.cs | 12 +--- NSIS/exeCreator.nsi | 23 ++++--- SearchHelper/IconLoader.cs | 23 ------- Settings.cs | 8 +-- Update.cs | 12 +--- plugin.json | 2 +- 13 files changed, 84 insertions(+), 160 deletions(-) create mode 100644 EverythingARM64.dll delete mode 100644 SearchHelper/IconLoader.cs diff --git a/.github/README.md b/.github/README.md index 25b690a..35f034b 100644 --- a/.github/README.md +++ b/.github/README.md @@ -16,8 +16,7 @@ Dev instructions are in the wiki. There are 4 different methods of installation, chose the one you prefer: 1) WinGet : `winget install lin-ycv.EverythingPowerToys` 2) Chocolatey : `choco install everythingpowertoys` -3) ~Scoop : `scoop install everythingpowertoys`~ -4) Self-Extraction Installer (EXE) : [Download from release page](https://github.com/lin-ycv/EverythingPowerToys/releases/latest) +3) Self-Extraction Installer (EXE) : [Download from release page](https://github.com/lin-ycv/EverythingPowerToys/releases/latest) 5) Manual Installation (ZIP) : [Download from release page](https://github.com/lin-ycv/EverythingPowerToys/releases/latest) Detailed explanations and instructions are on the [release page](https://github.com/lin-ycv/EverythingPowerToys/releases/latest) diff --git a/Community.PowerToys.Run.Plugin.Everything.csproj b/Community.PowerToys.Run.Plugin.Everything.csproj index 4aa90f4..2463b76 100644 --- a/Community.PowerToys.Run.Plugin.Everything.csproj +++ b/Community.PowerToys.Run.Plugin.Everything.csproj @@ -2,59 +2,34 @@ - net8.0-windows7.0 + net8.0-windows {64467D32-4786-4ADD-9B77-FBF3C965D3D1} Properties Community.PowerToys.Run.Plugin.Everything Community.PowerToys.Run.Plugin.Everything $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)plugin.json').Split(',')[5].Split(':')[1].Trim().Trim('"')) - true false false - Yu Chieh (Victor) Lin - https://github.com/lin-ycv/EverythingPowerToys - README.md - Everything.light.png - True - $(NoWarn),1573,1591,1712 - AnyCPU + true lin-ycv Copyright (C) lin-ycv - https://github.com/lin-ycv/EverythingPowerToys - PowerToys;Everything;EverythingPowerToys; + True + enable true - ..\..\..\..\..\$(Platform)\$(Configuration)\RunPlugins\Everything\ DEBUG;TRACE full false - ..\..\..\..\..\$(Platform)\$(Configuration)\RunPlugins\Everything\ - TRACE + TRACE true none - - False - - - - False - - - - False - - - - False - - @@ -149,8 +124,22 @@ + + + True + + + + + + + + + + + - + diff --git a/ContextMenuLoader.cs b/ContextMenuLoader.cs index a4d2f23..bc8d1fc 100644 --- a/ContextMenuLoader.cs +++ b/ContextMenuLoader.cs @@ -1,13 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Threading.Tasks; -using System.Windows; using System.Windows.Input; using Wox.Infrastructure; -using Wox.Plugin; -using Wox.Plugin.Logger; namespace Community.PowerToys.Run.Plugin.Everything { @@ -43,7 +35,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.open_containing_folder, + Title = Resources.open_containing_folder, Glyph = "\xE838", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.E, @@ -52,7 +44,7 @@ namespace Community.PowerToys.Run.Plugin.Everything { if (!Helper.OpenInShell("explorer.exe", $"/select,\"{record.Path}\"")) { - var message = $"{Properties.Resources.folder_open_failed} {Path.GetDirectoryName(record.Path)}"; + var message = $"{Resources.folder_open_failed} {Path.GetDirectoryName(record.Path)}"; _context.API.ShowMsg(message); return false; } @@ -70,7 +62,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.run_as_admin, + Title = Resources.run_as_admin, Glyph = "\xE7EF", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.Enter, @@ -99,7 +91,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.run_as_user, + Title = Resources.run_as_user, Glyph = "\xE7EE", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.U, @@ -126,7 +118,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.copy_file + (_swapCopy ? Properties.Resources.copy_shortcut : Properties.Resources.copy_shortcutAlt), + Title = Resources.copy_file + (_swapCopy ? Resources.copy_shortcut : Resources.copy_shortcutAlt), Glyph = "\xE8C8", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.C, @@ -141,7 +133,7 @@ namespace Community.PowerToys.Run.Plugin.Everything } catch (Exception e) { - var message = Properties.Resources.clipboard_failed; + var message = Resources.clipboard_failed; Log.Exception(message, e, GetType()); _context.API.ShowMsg(message); @@ -155,7 +147,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.copy_path + (_swapCopy ? Properties.Resources.copy_shortcutAlt : Properties.Resources.copy_shortcut), + Title = Resources.copy_path + (_swapCopy ? Resources.copy_shortcutAlt : Resources.copy_shortcut), Glyph = "\xE71B", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.C, @@ -170,7 +162,7 @@ namespace Community.PowerToys.Run.Plugin.Everything } catch (Exception e) { - var message = Properties.Resources.clipboard_failed; + var message = Resources.clipboard_failed; Log.Exception(message, e, GetType()); _context.API.ShowMsg(message); @@ -184,7 +176,7 @@ namespace Community.PowerToys.Run.Plugin.Everything contextMenus.Add(new ContextMenuResult { PluginName = Assembly.GetExecutingAssembly().GetName().Name, - Title = Properties.Resources.open_in_console, + Title = Resources.open_in_console, Glyph = "\xE756", FontFamily = "Segoe MDL2 Assets", AcceleratorKey = Key.C, diff --git a/Everything.cs b/Everything.cs index d041cef..53a1c9c 100644 --- a/Everything.cs +++ b/Everything.cs @@ -1,12 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.Text; -using Community.PowerToys.Run.Plugin.Everything.Properties; -using Wox.Plugin; -using static Community.PowerToys.Run.Plugin.Everything.Interop.NativeMethods; +using System.ComponentModel; namespace Community.PowerToys.Run.Plugin.Everything { @@ -14,8 +6,8 @@ namespace Community.PowerToys.Run.Plugin.Everything { internal Everything(Settings setting) { - Everything_SetRequestFlags(Request.FULL_PATH_AND_FILE_NAME); - UpdateSettings(setting); + Everything_SetRequestFlags(Request.FULL_PATH_AND_FILE_NAME); + UpdateSettings(setting); } internal void UpdateSettings(Settings setting) @@ -57,7 +49,7 @@ namespace Community.PowerToys.Run.Plugin.Everything } } - _ = Everything_SetSearchW(query); + Everything_SetSearchW(query); if (!Everything_QueryW(true)) { throw new Win32Exception("Unable to Query"); @@ -72,9 +64,9 @@ namespace Community.PowerToys.Run.Plugin.Everything for (uint i = 0; i < resultCount; i++) { - StringBuilder buffer = new(260); - Everything_GetResultFullPathName(i, buffer, 260); - string fullPath = buffer.ToString(); + char[] buffer = new char[260]; + uint length = Everything_GetResultFullPathName(i, buffer, (uint)buffer.Length); + string fullPath = new(buffer, 0, (int)length); string name = Path.GetFileName(fullPath); bool isFolder = Everything_IsFolderResult(i); string path = isFolder ? fullPath : Path.GetDirectoryName(fullPath); @@ -87,7 +79,7 @@ namespace Community.PowerToys.Run.Plugin.Everything SubTitle = Resources.plugin_name + ": " + fullPath, IcoPath = isFolder ? "Images/folder.png" : (setting.Preview ? - fullPath : (SearchHelper.IconLoader.Icon(ext) ?? "Images/file.png")), + fullPath : "Images/file.png"), ContextData = new SearchResult() { Path = fullPath, diff --git a/EverythingARM64.dll b/EverythingARM64.dll new file mode 100644 index 0000000000000000000000000000000000000000..49f487d469b9d9e1146202e3c219ce1a1ab5f762 GIT binary patch literal 91696 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

j1l&yOU_ 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 Ps>^)MulqC#Z|eOB0X5J! literal 0 HcmV?d00001 diff --git a/GlobalSuppressions.cs b/GlobalSuppressions.cs index 056e223..85d842b 100644 --- a/GlobalSuppressions.cs +++ b/GlobalSuppressions.cs @@ -12,5 +12,4 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1602:Enumeration items should be documented", Justification = "Reviewed")] [assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1633:File should have header", Justification = "Reviewed")] [assembly: SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1636:FileHeaderCopyrightTextMustMatch", Justification = "Reviewed.")] -[assembly: SuppressMessage("Performance", "CA1838:Avoid 'StringBuilder' parameters for P/Invokes", Justification = "breaks icon preview for some reason when using char[]")] [assembly: SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1010:Opening square brackets should be spaced correctly", Justification = "Reviewed")] diff --git a/Interop/NativeMethods.cs b/Interop/NativeMethods.cs index 5cb6d4d..42aa2a7 100644 --- a/Interop/NativeMethods.cs +++ b/Interop/NativeMethods.cs @@ -1,10 +1,8 @@ -using System; -using System.Runtime.InteropServices; -using System.Text; +using System.Runtime.InteropServices; namespace Community.PowerToys.Run.Plugin.Everything.Interop { - public sealed class NativeMethods + public sealed partial class NativeMethods { #region FlagsEnums [Flags] @@ -106,32 +104,33 @@ namespace Community.PowerToys.Run.Plugin.Everything.Interop MAX, } #endregion - internal const string dllName = "Everything64.dll"; - [DllImport(dllName)] - internal static extern uint Everything_GetNumResults(); - [DllImport(dllName, CharSet = CharSet.Unicode)] - internal static extern void Everything_GetResultFullPathName(uint nIndex, StringBuilder lpString, uint nMaxCount); - [DllImport(dllName, CharSet = CharSet.Unicode)] - internal static extern uint Everything_IncRunCountFromFileName(string lpFileName); - [DllImport(dllName)] - internal static extern bool Everything_IsFolderResult(uint index); - [DllImport(dllName)] - internal static extern bool Everything_QueryW(bool bWait); - [DllImport(dllName)] - internal static extern void Everything_SetMax(uint dwMax); - [DllImport(dllName)] - internal static extern void Everything_SetRegex(bool bEnable); - [DllImport(dllName)] - internal static extern void Everything_SetRequestFlags(Request RequestFlags); - [DllImport(dllName, CharSet = CharSet.Unicode)] - internal static extern uint Everything_SetSearchW(string lpSearchString); - [DllImport(dllName)] - internal static extern bool Everything_SetMatchPath(bool bEnable); - [DllImport(dllName)] - internal static extern void Everything_SetSort(Sort SortType); - - [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] - internal static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] char[] pszOut, [In][Out] ref uint pcchOut); + [LibraryImport(dllName)] + internal static partial uint Everything_GetLastError(); + [LibraryImport(dllName)] + internal static partial uint Everything_GetNumResults(); + [LibraryImport(dllName, EntryPoint = "Everything_GetResultFullPathNameW", StringMarshalling = StringMarshalling.Utf16)] + internal static partial uint Everything_GetResultFullPathName(uint nIndex, [Out] char[] lpString, uint nMaxCount); + [LibraryImport(dllName, StringMarshalling = StringMarshalling.Utf16)] + internal static partial uint Everything_IncRunCountFromFileName(string lpFileName); + [LibraryImport(dllName)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static partial bool Everything_IsFolderResult(uint index); + [LibraryImport(dllName)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static partial bool Everything_QueryW([MarshalAs(UnmanagedType.Bool)] bool bWait); + [LibraryImport(dllName)] + internal static partial void Everything_SetMax(uint dwMax); + [LibraryImport(dllName)] + internal static partial void Everything_SetRegex([MarshalAs(UnmanagedType.Bool)] bool bEnable); + [LibraryImport(dllName)] + internal static partial void Everything_SetRequestFlags(Request RequestFlags); + [LibraryImport(dllName, StringMarshalling = StringMarshalling.Utf16)] + internal static partial void Everything_SetSearchW(string lpSearchString); + [LibraryImport(dllName)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static partial bool Everything_SetMatchPath([MarshalAs(UnmanagedType.Bool)] bool bEnable); + [LibraryImport(dllName)] + internal static partial void Everything_SetSort(Sort SortType); } } diff --git a/Main.cs b/Main.cs index 3150859..6a4fa8d 100644 --- a/Main.cs +++ b/Main.cs @@ -1,14 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using System.Windows.Controls; -using Community.PowerToys.Run.Plugin.Everything.Properties; -using Microsoft.PowerToys.Settings.UI.Library; -using Wox.Plugin; -using Wox.Plugin.Logger; -using static Community.PowerToys.Run.Plugin.Everything.Interop.NativeMethods; +using Microsoft.PowerToys.Settings.UI.Library; namespace Community.PowerToys.Run.Plugin.Everything { diff --git a/NSIS/exeCreator.nsi b/NSIS/exeCreator.nsi index d25d5e9..2208e98 100644 --- a/NSIS/exeCreator.nsi +++ b/NSIS/exeCreator.nsi @@ -36,28 +36,27 @@ Page instfiles Section "" - ; Don't terminate processes, helps reduce AV FP ;ExecWait '"$%SystemRoot%\system32\TaskKill.exe" /F /IM ${PT}' - ;ExecWait 'wmic process where name="${PT}" call terminate' - ;Sleep 3000 SetOutPath $INSTDIR GetFullPathName $0 "$EXEDIR\" GetFullPathName $0 $0 - File /r ".\..\..\..\..\..\..\x64\Release\RunPlugins\Everything\*" + File /r "${direct}\*" - ; Also don't launch processes, helps reduce AV FP - ;IfFileExists "$LOCALAPPDATA\PowerToys\${PT}" 0 +2 - ;Exec '"$LOCALAPPDATA\PowerToys\${PT}"' + IfFileExists "$LOCALAPPDATA\PowerToys\${PT}" 0 +2 + Exec '"$LOCALAPPDATA\PowerToys\${PT}"' - ;IfFileExists "$PROGRAMFILES64\PowerToys\${PT}" 0 +2 - ;Exec '"$PROGRAMFILES64\PowerToys\${PT}"' + IfFileExists "$PROGRAMFILES64\PowerToys\${PT}" 0 +2 + Exec '"$PROGRAMFILES64\PowerToys\${PT}"' SectionEnd ;-------------------------------- -; Don't query proceses, helps reduce AV FP -;Function .onInit +Function .onInit + +ExecWait 'wmic process where name="${PT}" call terminate' + ExecWait 'wmic process where name="PowerToys.PowerLauncher.exe" call terminate' + Sleep 200 ; System::Call 'kernel32::CreateMutex(p 0, i 0, t "ACFEF7F6-7856-4BB3-82E3-0877CBB4E9C7") p .r1 ?e' ; Pop $R0 @@ -66,4 +65,4 @@ SectionEnd ; MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running." ; Abort -; FunctionEnd \ No newline at end of file +FunctionEnd \ No newline at end of file diff --git a/SearchHelper/IconLoader.cs b/SearchHelper/IconLoader.cs deleted file mode 100644 index 50f16ae..0000000 --- a/SearchHelper/IconLoader.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.IO; -using static Community.PowerToys.Run.Plugin.Everything.Interop.NativeMethods; - -namespace Community.PowerToys.Run.Plugin.Everything.SearchHelper -{ - internal sealed class IconLoader - { - internal static readonly char[] Separator = ['\"', ',']; -#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. - internal static string? Icon(string doctype) -#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. - { - uint pcchOut = 0; - _ = AssocQueryString(AssocF.NONE, AssocStr.DEFAULTICON, doctype, null, null, ref pcchOut); - char[] pszOut = new char[pcchOut]; - if (AssocQueryString(AssocF.NONE, AssocStr.DEFAULTICON, doctype, null, pszOut, ref pcchOut) != 0) return null; - string doc = Environment.ExpandEnvironmentVariables(new string(pszOut).Split(Separator, StringSplitOptions.RemoveEmptyEntries)[0].Replace("\"", string.Empty, StringComparison.CurrentCulture).Trim()); - - return File.Exists(doc) ? doc : null; - } - } -} diff --git a/Settings.cs b/Settings.cs index cce36c0..d239417 100644 --- a/Settings.cs +++ b/Settings.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text; - -namespace Community.PowerToys.Run.Plugin.Everything +namespace Community.PowerToys.Run.Plugin.Everything { public class Settings { diff --git a/Update.cs b/Update.cs index cf532e0..66bc9e6 100644 --- a/Update.cs +++ b/Update.cs @@ -1,17 +1,11 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Net.Http; +using System.Globalization; using System.Text.Json; -using System.Threading.Tasks; -using System.Windows; -using Community.PowerToys.Run.Plugin.Everything.Properties; namespace Community.PowerToys.Run.Plugin.Everything { internal sealed class Update { + private readonly CompositeFormat updateAvailable = CompositeFormat.Parse(Resources.UpdateAvailable); internal async Task UpdateAsync(Version v, Settings s) { string apiUrl = "https://api.github.com/repos/lin-ycv/EverythingPowerToys/releases/latest"; @@ -30,7 +24,7 @@ namespace Community.PowerToys.Run.Plugin.Everything : Version.Parse(root.GetProperty("tag_name").GetString()); if (latest > v && latest.ToString() != s.Skip) { - MessageBoxResult mbox = MessageBox.Show(string.Format(CultureInfo.InvariantCulture, Resources.UpdateAvailable, v, latest), "Updater", MessageBoxButton.YesNoCancel); + MessageBoxResult mbox = MessageBox.Show(string.Format(CultureInfo.InvariantCulture, updateAvailable, v, latest), "Updater", MessageBoxButton.YesNoCancel); if (mbox == MessageBoxResult.Yes && root.TryGetProperty("assets", out JsonElement assets)) { string[] nameUrl = [string.Empty, string.Empty]; diff --git a/plugin.json b/plugin.json index d6580f3..97b7498 100644 --- a/plugin.json +++ b/plugin.json @@ -4,7 +4,7 @@ "IsGlobal": true, "Name": "Everything", "Author": "Yu Chieh (Victor) Lin", - "Version": "0.80.0", + "Version": "0.80.1", "Language": "csharp", "Website": "https://github.com/Lin-ycv/EverythingPowerToys", "ExecuteFileName": "Community.PowerToys.Run.Plugin.Everything.dll",