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, )"
}
},