From 16603697a569620e568c42dffbd2957bce6890d0 Mon Sep 17 00:00:00 2001 From: Kevin Zhang <45326534+taooceros@users.noreply.github.com> Date: Tue, 22 Jul 2025 22:48:19 -0500 Subject: [PATCH 01/18] Add Srpski (Cyrillic) --- Flow.Launcher.Core/Resource/AvailableLanguages.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs index ecaecf646..3919e2227 100644 --- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs +++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs @@ -17,6 +17,7 @@ namespace Flow.Launcher.Core.Resource public static Language German = new Language("de", "Deutsch"); public static Language Korean = new Language("ko", "한국어"); public static Language Serbian = new Language("sr", "Srpski"); + public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српска"); public static Language Portuguese_Portugal = new Language("pt-pt", "Português"); public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)"); public static Language Spanish = new Language("es", "Spanish"); @@ -47,6 +48,7 @@ namespace Flow.Launcher.Core.Resource German, Korean, Serbian, + Serbian_Cyrillic, Portuguese_Portugal, Portuguese_Brazil, Spanish, @@ -79,7 +81,8 @@ namespace Flow.Launcher.Core.Resource "da" => "System", "de" => "System", "ko" => "시스템", - "sr" => "Систем", + "sr" => "Srpski", + "sr-Cyrl-RS" => "Систем", "pt-pt" => "Sistema", "pt-br" => "Sistema", "es" => "Sistema", From 7664944ff265febcd9192deb6e434626d3a8efda Mon Sep 17 00:00:00 2001 From: Kevin Zhang <45326534+taooceros@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:27:47 -0500 Subject: [PATCH 02/18] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Core/Resource/AvailableLanguages.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs index 3919e2227..34eaf29eb 100644 --- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs +++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs @@ -81,7 +81,7 @@ namespace Flow.Launcher.Core.Resource "da" => "System", "de" => "System", "ko" => "시스템", - "sr" => "Srpski", + "sr" => "Sistem", "sr-Cyrl-RS" => "Систем", "pt-pt" => "Sistema", "pt-br" => "Sistema", From 8c6f9c9875d549f123fe938da425931e93fdf9c3 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 13 Aug 2025 20:26:23 +0800 Subject: [PATCH 03/18] Add new api Result.QuerySuggestionText --- Flow.Launcher.Plugin/Result.cs | 6 ++++++ Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index a459e9ee6..b9f3ba45b 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -257,6 +257,12 @@ namespace Flow.Launcher.Plugin /// public bool ShowBadge { get; set; } = false; + /// + /// This holds the text which can be shown as a query suggestion. + /// + /// When a value is not set, the will be used. + public string QuerySuggestionText { get; set; } + /// /// Run this result, asynchronously /// diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs index eb492e334..270dac4dc 100644 --- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs +++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs @@ -33,15 +33,17 @@ public class QuerySuggestionBoxConverter : IMultiValueConverter { var selectedResult = selectedItem.Result; var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " "; - var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title; + var selectedResultPossibleSuggestion = selectedResultActionKeyword + + (string.IsNullOrEmpty(selectedResult.QuerySuggestionText) ? + selectedResult.Title : + selectedResult.QuerySuggestionText); if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase)) return string.Empty; - // For AutocompleteQueryCommand. // When user typed lower case and result title is uppercase, we still want to display suggestion - selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length); + selectedItem.QuerySuggestionText = string.Concat(queryText, selectedResultPossibleSuggestion.AsSpan(queryText.Length)); // Check if Text will be larger than our QueryTextBox Typeface typeface = new Typeface(queryTextBox.FontFamily, queryTextBox.FontStyle, queryTextBox.FontWeight, queryTextBox.FontStretch); From 2a1584e2dd38815111cd927aba4876946989f7ab Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 13 Aug 2025 20:43:51 +0800 Subject: [PATCH 04/18] Add code comments --- Flow.Launcher.Plugin/Result.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index b9f3ba45b..76d3d7d34 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -260,7 +260,11 @@ namespace Flow.Launcher.Plugin /// /// This holds the text which can be shown as a query suggestion. /// - /// When a value is not set, the will be used. + /// + /// When a value is not set, the will be used. + /// If the it does not start with the query text, it will not be shown as a suggestion. + /// So make sure to set this value to start with the query text. + /// public string QuerySuggestionText { get; set; } /// From 063836266decfce8ed31ab7113b6d06b6b4c8d7e Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 13 Aug 2025 20:44:00 +0800 Subject: [PATCH 05/18] Fix Result.Clone --- Flow.Launcher.Plugin/Result.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 76d3d7d34..fb4313e36 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -317,7 +317,8 @@ namespace Flow.Launcher.Plugin Preview = Preview, AddSelectedCount = AddSelectedCount, RecordKey = RecordKey, - ShowBadge = ShowBadge + ShowBadge = ShowBadge, + QuerySuggestionText = QuerySuggestionText }; } From c895b2acb0cc0364067c5fd89b3e7f6cb62630a0 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 13 Aug 2025 20:53:53 +0800 Subject: [PATCH 06/18] Improve selectedResultPossibleSuggestion check logic --- .../Converters/QuerySuggestionBoxConverter.cs | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs index 270dac4dc..c2d7d016c 100644 --- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs +++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs @@ -33,12 +33,34 @@ public class QuerySuggestionBoxConverter : IMultiValueConverter { var selectedResult = selectedItem.Result; var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " "; - var selectedResultPossibleSuggestion = selectedResultActionKeyword + - (string.IsNullOrEmpty(selectedResult.QuerySuggestionText) ? - selectedResult.Title : - selectedResult.QuerySuggestionText); - if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase)) + string selectedResultPossibleSuggestion = null; + + // Firstly check if the result has QuerySuggestionText + if (!string.IsNullOrEmpty(selectedResult.QuerySuggestionText)) + { + selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.QuerySuggestionText; + + // If this QuerySuggestionText does not start with the queryText, set it to null + if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase)) + { + selectedResultPossibleSuggestion = null; + } + } + + // Then check Title as suggestion + if (string.IsNullOrEmpty(selectedResultPossibleSuggestion)) + { + selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title; + + // If this QuerySuggestionText does not start with the queryText, set it to null + if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase)) + { + selectedResultPossibleSuggestion = null; + } + } + + if (string.IsNullOrEmpty(selectedResultPossibleSuggestion)) return string.Empty; // For AutocompleteQueryCommand. From bf07f2e72c9e4ffd660c8689cb478b99e291fe4f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 13 Aug 2025 21:00:17 +0800 Subject: [PATCH 07/18] Improve xml documents --- Flow.Launcher.Plugin/Result.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index fb4313e36..2c9b8d4fd 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -57,7 +57,10 @@ namespace Flow.Launcher.Plugin /// for user on the plugin result. If autocomplete action for example is tab, pressing tab will have /// the default constructed autocomplete text (result's Title), or the text provided here if not empty. /// - /// When a value is not set, the will be used. + /// + /// When a value is not set, the will be used. + /// Please include the action keyword prefix when necessary because Flow does not prepend it automatically. + /// public string AutoCompleteText { get; set; } /// @@ -262,6 +265,7 @@ namespace Flow.Launcher.Plugin /// /// /// When a value is not set, the will be used. + /// Do not include the action keyword prefix because Flow prepends it automatically. /// If the it does not start with the query text, it will not be shown as a suggestion. /// So make sure to set this value to start with the query text. /// From 4cbc9f18c78ef208a6851f9fb6f37ebc7b6ab1e7 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 14:24:54 +0800 Subject: [PATCH 08/18] Add error handler for DroplexPackage.Drop --- .../Environments/PythonEnvironment.cs | 17 +++++++++++++++-- .../Environments/TypeScriptEnvironment.cs | 17 +++++++++++++++-- .../Environments/TypeScriptV2Environment.cs | 17 +++++++++++++++-- Flow.Launcher/Languages/en.xaml | 4 ++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs index 455ee096d..89286dfb0 100644 --- a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs +++ b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs @@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments { internal class PythonEnvironment : AbstractPluginEnvironment { + private static readonly string ClassName = nameof(PythonEnvironment); + internal override string Language => AllowedLanguage.Python; internal override string EnvName => DataLocation.PythonEnvironmentName; @@ -39,9 +41,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments // Python 3.11.4 is no longer Windows 7 compatible. If user is on Win 7 and // uses Python plugin they need to custom install and use v3.8.9 - JTF.Run(() => DroplexPackage.Drop(App.python_3_11_4_embeddable, InstallPath)); + JTF.Run(async () => + { + try + { + await DroplexPackage.Drop(App.python_3_11_4_embeddable, InstallPath); - PluginsSettingsFilePath = ExecutablePath; + PluginsSettingsFilePath = ExecutablePath; + } + catch (System.Exception e) + { + API.ShowMsgError(API.GetTranslation("failToInstallPythonEnv")); + API.LogException(ClassName, "Failed to install Python environment", e); + } + }); } internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata) diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs index 12965286f..724ae20f4 100644 --- a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs +++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs @@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments { internal class TypeScriptEnvironment : AbstractPluginEnvironment { + private static readonly string ClassName = nameof(TypeScriptEnvironment); + internal override string Language => AllowedLanguage.TypeScript; internal override string EnvName => DataLocation.NodeEnvironmentName; @@ -34,9 +36,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments { FilesFolders.RemoveFolderIfExists(InstallPath, (s) => API.ShowMsgBox(s)); - JTF.Run(() => DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath)); + JTF.Run(async () => + { + try + { + await DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath); - PluginsSettingsFilePath = ExecutablePath; + PluginsSettingsFilePath = ExecutablePath; + } + catch (System.Exception e) + { + API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv")); + API.LogException(ClassName, "Failed to install TypeScript environment", e); + } + }); } internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata) diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs index 6960b79c9..6a32664a1 100644 --- a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs +++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs @@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments { internal class TypeScriptV2Environment : AbstractPluginEnvironment { + private static readonly string ClassName = nameof(TypeScriptV2Environment); + internal override string Language => AllowedLanguage.TypeScriptV2; internal override string EnvName => DataLocation.NodeEnvironmentName; @@ -34,9 +36,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments { FilesFolders.RemoveFolderIfExists(InstallPath, (s) => API.ShowMsgBox(s)); - JTF.Run(() => DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath)); + JTF.Run(async () => + { + try + { + await DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath); - PluginsSettingsFilePath = ExecutablePath; + PluginsSettingsFilePath = ExecutablePath; + } + catch (System.Exception e) + { + API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv")); + API.LogException(ClassName, "Failed to install TypeScript environment", e); + } + }); } internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index bf6cb674e..a9694eba8 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -34,6 +34,10 @@ Please try again Unable to parse Http Proxy + + Failed to install TypeScript environment. Please try again later + Failed to install Python environment. Please try again later. + Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program. Failed to unregister hotkey "{0}". Please try again or see log for details From 4a0f126c34b16ee6aa478faa4cdea98eea72c7a3 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 14:39:41 +0800 Subject: [PATCH 09/18] Use ShowMsgError instead of ShowMsgBox --- Flow.Launcher/PublicAPIInstance.cs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index e0ed105cf..37bc16d58 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -382,21 +382,17 @@ namespace Flow.Launcher catch (Win32Exception ex) when (ex.NativeErrorCode == 2) { LogError(ClassName, "File Manager not found"); - ShowMsgBox( + ShowMsgError( string.Format(GetTranslation("fileManagerNotFound"), ex.Message), - GetTranslation("fileManagerNotFoundTitle"), - MessageBoxButton.OK, - MessageBoxImage.Error + GetTranslation("fileManagerNotFoundTitle") ); } catch (Exception ex) { LogException(ClassName, "Failed to open folder", ex); - ShowMsgBox( + ShowMsgError( string.Format(GetTranslation("folderOpenError"), ex.Message), - GetTranslation("errorTitle"), - MessageBoxButton.OK, - MessageBoxImage.Error + GetTranslation("errorTitle") ); } } @@ -424,11 +420,9 @@ namespace Flow.Launcher { var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window"; LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e); - ShowMsgBox( + ShowMsgError( GetTranslation("browserOpenError"), - GetTranslation("errorTitle"), - MessageBoxButton.OK, - MessageBoxImage.Error + GetTranslation("errorTitle") ); } } From c00d8db5ade73f815507bfe9949c4e3bf1d76263 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 14:39:58 +0800 Subject: [PATCH 10/18] Handle E_ABORT --- Flow.Launcher/PublicAPIInstance.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 37bc16d58..002e3c58b 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -379,6 +380,21 @@ namespace Flow.Launcher explorer.Start(); } } + catch (COMException ex) when (ex.ErrorCode == unchecked((int)0x80004004)) + { + /* + * The COMException with HResult 0x80004004 is E_ABORT (operation aborted). + * Shell APIs often return this when the operation is canceled or the shell cannot complete it cleanly. + * It most likely comes from Win32Helper.OpenFolderAndSelectFile(targetPath). + * Typical triggers: + * The target file/folder was deleted/moved between computing targetPath and the shell call. + * The folder is on an offline network/removable drive. + * Explorer is restarting/busy and aborts the request. + * A selection request to a new/closing Explorer window is canceled. + * Because it is commonly user- or environment-driven and not actionable, + * we should treat it as expected noise and ignore it to avoid bothering users. + */ + } catch (Win32Exception ex) when (ex.NativeErrorCode == 2) { LogError(ClassName, "File Manager not found"); From cdd5bf1a763f2bf902d627d465624390e7a67495 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 14:51:50 +0800 Subject: [PATCH 11/18] Swap title/subtitle for ShowMsgError --- Flow.Launcher/PublicAPIInstance.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 002e3c58b..38ca18147 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -399,16 +399,16 @@ namespace Flow.Launcher { LogError(ClassName, "File Manager not found"); ShowMsgError( - string.Format(GetTranslation("fileManagerNotFound"), ex.Message), - GetTranslation("fileManagerNotFoundTitle") + GetTranslation("fileManagerNotFoundTitle"), + string.Format(GetTranslation("fileManagerNotFound"), ex.Message) ); } catch (Exception ex) { LogException(ClassName, "Failed to open folder", ex); ShowMsgError( - string.Format(GetTranslation("folderOpenError"), ex.Message), - GetTranslation("errorTitle") + GetTranslation("errorTitle"), + string.Format(GetTranslation("folderOpenError"), ex.Message) ); } } @@ -437,8 +437,8 @@ namespace Flow.Launcher var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window"; LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e); ShowMsgError( - GetTranslation("browserOpenError"), - GetTranslation("errorTitle") + GetTranslation("errorTitle"), + GetTranslation("browserOpenError") ); } } From 7264f5493f8a16bc36cfbc769dff3b5e232d0a92 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 18:34:03 +0800 Subject: [PATCH 12/18] Use ShowMsgError for plugin load fail message --- Flow.Launcher.Core/Plugin/PluginsLoader.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs index 9d511297e..fbd0d07be 100644 --- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs @@ -126,10 +126,9 @@ namespace Flow.Launcher.Core.Plugin _ = Task.Run(() => { - API.ShowMsgBox($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" + - $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" + - API.GetTranslation("referToLogs"), string.Empty, - MessageBoxButton.OK, MessageBoxImage.Warning); + API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" + + $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" + + API.GetTranslation("referToLogs")); }); } From 556dce9bed5345ab27679ba42ebe9fd258378c05 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 14 Aug 2025 19:22:03 +0800 Subject: [PATCH 13/18] Remove unnecessary Task.Run --- Flow.Launcher.Core/Plugin/PluginsLoader.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs index fbd0d07be..e9e5ee367 100644 --- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs @@ -124,12 +124,9 @@ namespace Flow.Launcher.Core.Plugin API.GetTranslation("pluginsHaveErrored") : API.GetTranslation("pluginHasErrored"); - _ = Task.Run(() => - { - API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" + - $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" + - API.GetTranslation("referToLogs")); - }); + API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" + + $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" + + API.GetTranslation("referToLogs")); } return plugins; From d8f8de2abe057f62ce60cfdffc24b27fa4ec8eac Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 16 Aug 2025 11:41:25 +0800 Subject: [PATCH 14/18] =?UTF-8?q?Use=20=D0=A1=D1=80=D0=BF=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=20instead=20of=20=D0=A1=D1=80=D0=BF=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Flow.Launcher.Core/Resource/AvailableLanguages.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs index 34eaf29eb..5534ea172 100644 --- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs +++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs @@ -17,7 +17,7 @@ namespace Flow.Launcher.Core.Resource public static Language German = new Language("de", "Deutsch"); public static Language Korean = new Language("ko", "한국어"); public static Language Serbian = new Language("sr", "Srpski"); - public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српска"); + public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српски"); public static Language Portuguese_Portugal = new Language("pt-pt", "Português"); public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)"); public static Language Spanish = new Language("es", "Spanish"); From 233f8cd0f3811f68029c05192fc3d9b280390a8f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 25 Aug 2025 19:02:04 +0800 Subject: [PATCH 15/18] Check plugin updates only for Release --- Flow.Launcher/App.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 6e053db29..0360c761e 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -297,6 +297,7 @@ namespace Flow.Launcher }); } + [Conditional("RELEASE")] private static void AutoPluginUpdates() { _ = Task.Run(async () => From 9ac32b0bee0f8ec3c2a2c22db87c8405b7a7f3ca Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 29 Aug 2025 11:40:33 +0800 Subject: [PATCH 16/18] Use 7.0.0 SystemEvents --- Flow.Launcher.Core/packages.lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json index caec08ebf..18488cb63 100644 --- a/Flow.Launcher.Core/packages.lock.json +++ b/Flow.Launcher.Core/packages.lock.json @@ -161,8 +161,8 @@ }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A==" + "resolved": "7.0.0", + "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" }, "Mono.Cecil": { "type": "Transitive", From afafd6dc0bc64846dbf1dcef5c9e42470764d6da Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 29 Aug 2025 11:44:20 +0800 Subject: [PATCH 17/18] Add Microsoft.Win32.SystemEvents --- Flow.Launcher.Core/packages.lock.json | 5 +++-- .../Flow.Launcher.Infrastructure.csproj | 1 + Flow.Launcher.Infrastructure/packages.lock.json | 11 ++++++----- Flow.Launcher/packages.lock.json | 5 +++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json index 18488cb63..09b9ef54d 100644 --- a/Flow.Launcher.Core/packages.lock.json +++ b/Flow.Launcher.Core/packages.lock.json @@ -161,8 +161,8 @@ }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" + "resolved": "9.0.8", + "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" }, "Mono.Cecil": { "type": "Transitive", @@ -258,6 +258,7 @@ "InputSimulator": "[1.0.4, )", "MemoryPack": "[1.21.4, )", "Microsoft.VisualStudio.Threading": "[17.14.15, )", + "Microsoft.Win32.SystemEvents": "[9.0.8, )", "NHotkey.Wpf": "[3.0.0, )", "NLog": "[6.0.1, )", "NLog.OutputDebugString": "[6.0.1, )", diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj index 51b1d5175..7d1d31461 100644 --- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj +++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj @@ -63,6 +63,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json index 87b4bb6da..606168fd3 100644 --- a/Flow.Launcher.Infrastructure/packages.lock.json +++ b/Flow.Launcher.Infrastructure/packages.lock.json @@ -56,6 +56,12 @@ "Microsoft.VisualStudio.Validation": "17.8.8" } }, + "Microsoft.Win32.SystemEvents": { + "type": "Direct", + "requested": "[9.0.8, )", + "resolved": "9.0.8", + "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" + }, "Microsoft.Windows.CsWin32": { "type": "Direct", "requested": "[0.3.183, )", @@ -154,11 +160,6 @@ "resolved": "17.8.8", "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A==" - }, "Microsoft.Windows.SDK.Win32Docs": { "type": "Transitive", "resolved": "0.1.42-alpha", diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json index 1047b1f3f..e4dfe0803 100644 --- a/Flow.Launcher/packages.lock.json +++ b/Flow.Launcher/packages.lock.json @@ -552,8 +552,8 @@ }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A==" + "resolved": "9.0.8", + "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" }, "Mono.Cecil": { "type": "Transitive", @@ -858,6 +858,7 @@ "InputSimulator": "[1.0.4, )", "MemoryPack": "[1.21.4, )", "Microsoft.VisualStudio.Threading": "[17.14.15, )", + "Microsoft.Win32.SystemEvents": "[9.0.8, )", "NHotkey.Wpf": "[3.0.0, )", "NLog": "[6.0.1, )", "NLog.OutputDebugString": "[6.0.1, )", From 054135df5522444939f2129a8ad958ca7da59a20 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 29 Aug 2025 13:03:34 +0800 Subject: [PATCH 18/18] Downgrade System.Drawing.Common version --- Flow.Launcher.Core/packages.lock.json | 13 ++++++------- .../Flow.Launcher.Infrastructure.csproj | 5 +++-- .../packages.lock.json | 19 +++++++++---------- Flow.Launcher/packages.lock.json | 13 ++++++------- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json index 09b9ef54d..5e9abc24c 100644 --- a/Flow.Launcher.Core/packages.lock.json +++ b/Flow.Launcher.Core/packages.lock.json @@ -161,8 +161,8 @@ }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "9.0.8", - "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" + "resolved": "7.0.0", + "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" }, "Mono.Cecil": { "type": "Transitive", @@ -222,10 +222,10 @@ }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==", + "resolved": "7.0.0", + "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==", "dependencies": { - "Microsoft.Win32.SystemEvents": "9.0.7" + "Microsoft.Win32.SystemEvents": "7.0.0" } }, "System.IO.Pipelines": { @@ -258,12 +258,11 @@ "InputSimulator": "[1.0.4, )", "MemoryPack": "[1.21.4, )", "Microsoft.VisualStudio.Threading": "[17.14.15, )", - "Microsoft.Win32.SystemEvents": "[9.0.8, )", "NHotkey.Wpf": "[3.0.0, )", "NLog": "[6.0.1, )", "NLog.OutputDebugString": "[6.0.1, )", "SharpVectors.Wpf": "[1.8.4.2, )", - "System.Drawing.Common": "[9.0.7, )", + "System.Drawing.Common": "[7.0.0, )", "ToolGood.Words.Pinyin": "[3.1.0.3, )" } }, diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj index 7d1d31461..c32c36248 100644 --- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj +++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj @@ -63,7 +63,6 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -75,7 +74,9 @@ all - + + + diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json index 606168fd3..abd250f7c 100644 --- a/Flow.Launcher.Infrastructure/packages.lock.json +++ b/Flow.Launcher.Infrastructure/packages.lock.json @@ -56,12 +56,6 @@ "Microsoft.VisualStudio.Validation": "17.8.8" } }, - "Microsoft.Win32.SystemEvents": { - "type": "Direct", - "requested": "[9.0.8, )", - "resolved": "9.0.8", - "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" - }, "Microsoft.Windows.CsWin32": { "type": "Direct", "requested": "[0.3.183, )", @@ -114,11 +108,11 @@ }, "System.Drawing.Common": { "type": "Direct", - "requested": "[9.0.7, )", - "resolved": "9.0.7", - "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==", "dependencies": { - "Microsoft.Win32.SystemEvents": "9.0.7" + "Microsoft.Win32.SystemEvents": "7.0.0" } }, "ToolGood.Words.Pinyin": { @@ -160,6 +154,11 @@ "resolved": "17.8.8", "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g==" }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" + }, "Microsoft.Windows.SDK.Win32Docs": { "type": "Transitive", "resolved": "0.1.42-alpha", diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json index e4dfe0803..32b78c334 100644 --- a/Flow.Launcher/packages.lock.json +++ b/Flow.Launcher/packages.lock.json @@ -552,8 +552,8 @@ }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "9.0.8", - "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA==" + "resolved": "7.0.0", + "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" }, "Mono.Cecil": { "type": "Transitive", @@ -677,10 +677,10 @@ }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==", + "resolved": "7.0.0", + "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==", "dependencies": { - "Microsoft.Win32.SystemEvents": "9.0.7" + "Microsoft.Win32.SystemEvents": "7.0.0" } }, "System.Globalization": { @@ -858,12 +858,11 @@ "InputSimulator": "[1.0.4, )", "MemoryPack": "[1.21.4, )", "Microsoft.VisualStudio.Threading": "[17.14.15, )", - "Microsoft.Win32.SystemEvents": "[9.0.8, )", "NHotkey.Wpf": "[3.0.0, )", "NLog": "[6.0.1, )", "NLog.OutputDebugString": "[6.0.1, )", "SharpVectors.Wpf": "[1.8.4.2, )", - "System.Drawing.Common": "[9.0.7, )", + "System.Drawing.Common": "[7.0.0, )", "ToolGood.Words.Pinyin": "[3.1.0.3, )" } },