From d2f86633b07a5b615d980904038c00edb22d9a82 Mon Sep 17 00:00:00 2001 From: egotting Date: Sun, 15 Mar 2026 13:22:13 -0300 Subject: [PATCH 01/32] feat(search): add unicode character removal for fuzzy matching Introduced a string preprocessing step in FuzzySearch that removes unicode characters. This improves the search experience by allowing users to find results regardless of accents or special formatting. --- Flow.Launcher.Infrastructure/StringMatcher.cs | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index 2882cb8f03e..738f1c8e525 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -2,7 +2,9 @@ using Flow.Launcher.Plugin.SharedModels; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; +using System.Text; using Flow.Launcher.Infrastructure.UserSettings; namespace Flow.Launcher.Infrastructure @@ -67,6 +69,8 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption return new MatchResult(false, UserSettingSearchPrecision); query = query.Trim(); + query = RemoveAccents(query); + stringToCompare = RemoveAccents(stringToCompare); TranslationMapping translationMapping = null; if (_alphabet is not null && _alphabet.ShouldTranslate(query)) { @@ -98,7 +102,9 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption var indexList = new List(); List spaceIndices = new List(); - for (var compareStringIndex = 0; compareStringIndex < fullStringToCompareWithoutCase.Length; compareStringIndex++) + for (var compareStringIndex = 0; + compareStringIndex < fullStringToCompareWithoutCase.Length; + compareStringIndex++) { // If acronyms matching successfully finished, this gets the remaining not matched acronyms for score calculation if (currentAcronymQueryIndex >= query.Length && acronymsMatched == query.Length) @@ -160,7 +166,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption var startIndexToVerify = compareStringIndex - currentQuerySubstringCharacterIndex; if (AllPreviousCharsMatched(startIndexToVerify, currentQuerySubstringCharacterIndex, - fullStringToCompareWithoutCase, currentQuerySubstring)) + fullStringToCompareWithoutCase, currentQuerySubstring)) { matchFoundInPreviousLoop = true; @@ -205,7 +211,8 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption if (acronymScore >= (int)UserSettingSearchPrecision) { - acronymMatchData = acronymMatchData.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList(); + acronymMatchData = acronymMatchData.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x) + .Distinct().ToList(); return new MatchResult(true, UserSettingSearchPrecision, acronymMatchData, acronymScore); } } @@ -218,19 +225,39 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption // firstMatchIndex - nearestSpaceIndex - 1 is to set the firstIndex as the index of the first matched char // preceded by a space e.g. 'world' matching 'hello world' firstIndex would be 0 not 6 // giving more weight than 'we or donald' by allowing the distance calculation to treat the starting position at after the space. - var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1, spaceIndices, + var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1, + spaceIndices, lastMatchIndex - firstMatchIndex, allSubstringsContainedInCompareString); - var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList(); + var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct() + .ToList(); return new MatchResult(true, UserSettingSearchPrecision, resultList, score); } return new MatchResult(false, UserSettingSearchPrecision); } + private static string RemoveAccents(string value) + { + if (string.IsNullOrEmpty(value)) + return value; + string normalized = value.Normalize(NormalizationForm.FormD); + StringBuilder sb = new(); + + foreach (char c in normalized) + { + var unicodedCategory = Char.GetUnicodeCategory(c); + if (unicodedCategory != UnicodeCategory.NonSpacingMark) + sb.Append(c); + } + + return sb.ToString().Normalize(NormalizationForm.FormC); + } + private static bool IsAcronym(string stringToCompare, int compareStringIndex) { - if (IsAcronymChar(stringToCompare, compareStringIndex) || IsAcronymNumber(stringToCompare, compareStringIndex)) + if (IsAcronymChar(stringToCompare, compareStringIndex) || + IsAcronymNumber(stringToCompare, compareStringIndex)) return true; return false; @@ -312,7 +339,8 @@ private static bool AllQuerySubstringsMatched(int currentQuerySubstringIndex, in return currentQuerySubstringIndex >= querySubstringsLength; } - private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, List spaceIndices, int matchLen, + private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, + List spaceIndices, int matchLen, bool allSubstringsContainedInCompareString) { // A match found near the beginning of a string is scored more than a match found near the end From 03164fbdf91aa01e2e22573df7a102a6f77f4232 Mon Sep 17 00:00:00 2001 From: Jack Ye Date: Mon, 16 Mar 2026 01:17:33 +0800 Subject: [PATCH 02/32] Fix typos Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- Flow.Launcher.Infrastructure/StringMatcher.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index 738f1c8e525..9ae3759d088 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -246,8 +246,8 @@ private static string RemoveAccents(string value) foreach (char c in normalized) { - var unicodedCategory = Char.GetUnicodeCategory(c); - if (unicodedCategory != UnicodeCategory.NonSpacingMark) + var unicodeCategory = char.GetUnicodeCategory(c); + if (unicodeCategory != UnicodeCategory.NonSpacingMark) sb.Append(c); } From f9055309fcc00f9d8f40b9ad322e92e629923d68 Mon Sep 17 00:00:00 2001 From: Jack Ye Date: Mon, 16 Mar 2026 01:17:56 +0800 Subject: [PATCH 03/32] Check query nullability Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- Flow.Launcher.Infrastructure/StringMatcher.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index 9ae3759d088..ee3cbff3846 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -71,6 +71,8 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption query = query.Trim(); query = RemoveAccents(query); stringToCompare = RemoveAccents(stringToCompare); + if (string.IsNullOrWhiteSpace(query) || string.IsNullOrEmpty(stringToCompare)) + return new MatchResult(false, UserSettingSearchPrecision); TranslationMapping translationMapping = null; if (_alphabet is not null && _alphabet.ShouldTranslate(query)) { From 17b2970f89ab960690595253fff3ab353dc8bfc6 Mon Sep 17 00:00:00 2001 From: egotting Date: Thu, 26 Mar 2026 23:59:21 -0300 Subject: [PATCH 04/32] feat: add accent normalization with optimized memory usage and toggle option Implemented a string normalization method to handle accented characters, improving search consistency and preventing query mismatches. Added an accent mapping dictionary for common diacritics Implemented normalization using Span and stackalloc to reduce heap allocations and improve performance Introduced a user-controlled toggle (SensitiveAccents) to enable or disable normalization dynamically Prepared the system for cache-aware queries based on normalization settings --- Flow.Launcher.Infrastructure/StringMatcher.cs | 59 +++++++++++-------- .../UserSettings/Settings.cs | 14 +++++ Flow.Launcher/Languages/en.xaml | 2 + Flow.Launcher/Languages/pt-br.xaml | 2 + .../SettingsPaneGeneralViewModel.cs | 13 ++++ .../Views/SettingsPaneGeneral.xaml | 9 ++- 6 files changed, 74 insertions(+), 25 deletions(-) diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index 738f1c8e525..ac1dd621eac 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -12,7 +12,7 @@ namespace Flow.Launcher.Infrastructure public class StringMatcher { private readonly MatchOption _defaultMatchOption = new(); - + private readonly Settings _settings; public SearchPrecisionScore UserSettingSearchPrecision { get; set; } private readonly IAlphabet _alphabet; @@ -21,6 +21,7 @@ public StringMatcher(IAlphabet alphabet, Settings settings) { _alphabet = alphabet; UserSettingSearchPrecision = settings.QuerySearchPrecision; + _settings = settings; } // This is a workaround to allow unit tests to set the instance @@ -69,8 +70,6 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption return new MatchResult(false, UserSettingSearchPrecision); query = query.Trim(); - query = RemoveAccents(query); - stringToCompare = RemoveAccents(stringToCompare); TranslationMapping translationMapping = null; if (_alphabet is not null && _alphabet.ShouldTranslate(query)) { @@ -84,10 +83,16 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption int acronymsTotalCount = 0; int acronymsMatched = 0; + var fullStringToCompareAndNormalize = opt.IgnoreCase ? Normalize(stringToCompare) : stringToCompare; + var queryWithoutCaseAndNormalize = opt.IgnoreCase ? Normalize(query) : query; + var fullStringToCompareWithoutCase = opt.IgnoreCase ? stringToCompare.ToLower() : stringToCompare; var queryWithoutCase = opt.IgnoreCase ? query.ToLower() : query; - var querySubstrings = queryWithoutCase.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + var fullStringToCompare = _settings.SensitiveAccents ? fullStringToCompareAndNormalize : fullStringToCompareWithoutCase; + var queryToCompare = _settings.SensitiveAccents ? queryWithoutCaseAndNormalize : queryWithoutCase; + + var querySubstrings = queryToCompare.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int currentQuerySubstringIndex = 0; var currentQuerySubstring = querySubstrings[currentQuerySubstringIndex]; var currentQuerySubstringCharacterIndex = 0; @@ -103,7 +108,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption List spaceIndices = new List(); for (var compareStringIndex = 0; - compareStringIndex < fullStringToCompareWithoutCase.Length; + compareStringIndex < fullStringToCompare.Length; compareStringIndex++) { // If acronyms matching successfully finished, this gets the remaining not matched acronyms for score calculation @@ -120,14 +125,14 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption // To maintain a list of indices which correspond to spaces in the string to compare // To populate the list only for the first query substring - if (fullStringToCompareWithoutCase[compareStringIndex] == ' ' && currentQuerySubstringIndex == 0) + if (fullStringToCompare[compareStringIndex] == ' ' && currentQuerySubstringIndex == 0) spaceIndices.Add(compareStringIndex); // Acronym Match if (IsAcronym(stringToCompare, compareStringIndex)) { - if (fullStringToCompareWithoutCase[compareStringIndex] == - queryWithoutCase[currentAcronymQueryIndex]) + if (fullStringToCompare[compareStringIndex] == + queryToCompare[currentAcronymQueryIndex]) { acronymMatchData.Add(compareStringIndex); acronymsMatched++; @@ -139,7 +144,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption if (IsAcronymCount(stringToCompare, compareStringIndex)) acronymsTotalCount++; - if (allQuerySubstringsMatched || fullStringToCompareWithoutCase[compareStringIndex] != + if (allQuerySubstringsMatched || fullStringToCompare[compareStringIndex] != currentQuerySubstring[currentQuerySubstringCharacterIndex]) { matchFoundInPreviousLoop = false; @@ -166,7 +171,7 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption var startIndexToVerify = compareStringIndex - currentQuerySubstringCharacterIndex; if (AllPreviousCharsMatched(startIndexToVerify, currentQuerySubstringCharacterIndex, - fullStringToCompareWithoutCase, currentQuerySubstring)) + fullStringToCompare, currentQuerySubstring)) { matchFoundInPreviousLoop = true; @@ -237,23 +242,29 @@ public MatchResult FuzzyMatch(string query, string stringToCompare, MatchOption return new MatchResult(false, UserSettingSearchPrecision); } - private static string RemoveAccents(string value) - { - if (string.IsNullOrEmpty(value)) - return value; - string normalized = value.Normalize(NormalizationForm.FormD); - StringBuilder sb = new(); - foreach (char c in normalized) + private static readonly Dictionary AccentMap = new() + { + ['á'] = 'a', ['à'] = 'a', ['ã'] = 'a', ['â'] = 'a', ['ä'] = 'a', ['å'] = 'a', + ['é'] = 'e', ['è'] = 'e', ['ê'] = 'e', ['ë'] = 'e', + ['í'] = 'i', ['ì'] = 'i', ['î'] = 'i', ['ï'] = 'i', + ['ó'] = 'o', ['ò'] = 'o', ['õ'] = 'o', ['ô'] = 'o', ['ö'] = 'o', + ['ú'] = 'u', ['ù'] = 'u', ['û'] = 'u', ['ü'] = 'u', + ['ç'] = 'c', + ['ñ'] = 'n', + ['ý'] = 'y', ['ÿ'] = 'y' + }; + public static string Normalize(string value) + { + Span buffer = stackalloc char[value.Length]; + for (int i = 0; i < value.Length; i++) { - var unicodedCategory = Char.GetUnicodeCategory(c); - if (unicodedCategory != UnicodeCategory.NonSpacingMark) - sb.Append(c); + var c = char.ToLowerInvariant(value[i]); + buffer[i] = AccentMap.TryGetValue(c, out var mapped) ? mapped : c; } - return sb.ToString().Normalize(NormalizationForm.FormC); + return new string(buffer); } - private static bool IsAcronym(string stringToCompare, int compareStringIndex) { if (IsAcronymChar(stringToCompare, compareStringIndex) || @@ -301,12 +312,12 @@ private static int CalculateClosestSpaceIndex(List spaceIndices, int firstM } private static bool AllPreviousCharsMatched(int startIndexToVerify, int currentQuerySubstringCharacterIndex, - string fullStringToCompareWithoutCase, string currentQuerySubstring) + string fullStringToCompare, string currentQuerySubstring) { var allMatch = true; for (int indexToCheck = 0; indexToCheck < currentQuerySubstringCharacterIndex; indexToCheck++) { - if (fullStringToCompareWithoutCase[startIndexToVerify + indexToCheck] != + if (fullStringToCompare[startIndexToVerify + indexToCheck] != currentQuerySubstring[indexToCheck]) { allMatch = false; diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 7524d6c1a79..966e6558b91 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -359,6 +359,20 @@ public bool ShouldUsePinyin } } + private bool _sensitiveAccents = false; + public bool SensitiveAccents + { + get => _sensitiveAccents; + set + { + if (_sensitiveAccents != value) + { + _sensitiveAccents = value; + OnPropertyChanged(); + } + } + } + private bool _useDoublePinyin = false; public bool UseDoublePinyin { diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 1b2b01ef892..f1b83858cdd 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -123,6 +123,8 @@ Select Hide Flow Launcher on startup Flow Launcher search window is hidden in the tray after starting up. + Enable accent sensitivity when searching for programs. + When this option is enabled, you will be able to find programs that contain accented characters more easily. Hide tray icon When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window. Query Search Precision diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index 590de12c5e8..2c6eae3ecc5 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -121,6 +121,8 @@ Selecionar Esconder Flow Launcher na inicialização Flow Launcher search window is hidden in the tray after starting up. + Ativar a distinção de acentuação na consulta de programas. + Ao ativar ou desativar esta opção você precisa reniciar o Flow para ser aplicado corretamente a configuração, você poderá encontrar programas que possuem acentuação com mais facilidade. Ocultar ícone da bandeja Quando o ícone não está na bandeja, o menu de Configurações pode ser aberto ao clicar na janela de busca com o botão direito do mouse. Precisão de Busca da Consulta diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs index aa78849bad9..82d6fa94407 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs @@ -196,6 +196,19 @@ public int SearchDelayTimeValue } } + public bool SensitiveAccents + { + get => Settings.SensitiveAccents; + set + { + if (Settings.SensitiveAccents != value) + { + Settings.SensitiveAccents = value; + OnPropertyChanged(); + } + } + } + public int MaxHistoryResultsToShowValue { get => Settings.MaxHistoryResultsToShowForHomePage; diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index b4c94cb354b..a8f79b72858 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -91,7 +91,14 @@ OffContent="{DynamicResource disable}" OnContent="{DynamicResource enable}" /> - + + + Date: Fri, 27 Mar 2026 22:00:15 -0300 Subject: [PATCH 05/32] feat: add restart button when toggling Sensitive Accents Ensures the system restarts automatically when the Sensitive Accents option is enabled or disabled Improves user experience by making the restart action explicit --- Flow.Launcher/Languages/en.xaml | 5 ++++- Flow.Launcher/Languages/pt-br.xaml | 7 +++++-- .../ViewModels/SettingsPaneGeneralViewModel.cs | 15 ++++++++++++--- .../SettingPages/Views/SettingsPaneGeneral.xaml | 14 +++++++++++++- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index f1b83858cdd..d77cda21127 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -124,7 +124,10 @@ Hide Flow Launcher on startup Flow Launcher search window is hidden in the tray after starting up. Enable accent sensitivity when searching for programs. - When this option is enabled, you will be able to find programs that contain accented characters more easily. + When this option is changed, a restart is required. When enabled, you will be able to find programs that contain accented characters more easily. + Restart Required + Changing accent sensitivity requires a restart of Flow Launcher to take effect. + Restart Now Hide tray icon When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window. Query Search Precision diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index 2c6eae3ecc5..0d873dbbe77 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -114,7 +114,7 @@ Caminho do Node.js Selecione o executável do Node.js Por favor, selecione pythonw.exe - Sempre Começar Digitando em Modo Inglês + Sempre Começar Digitando em Modo Inglês Temporariamente altere seu método de entrada para o Modo Inglês ao ativar o Flow. Atualizar Automaticamente Automatically check and update the app when available @@ -122,7 +122,10 @@ Esconder Flow Launcher na inicialização Flow Launcher search window is hidden in the tray after starting up. Ativar a distinção de acentuação na consulta de programas. - Ao ativar ou desativar esta opção você precisa reniciar o Flow para ser aplicado corretamente a configuração, você poderá encontrar programas que possuem acentuação com mais facilidade. + Quando esta opção for alterada, será necessária uma reinicialização. Quando ativada, você poderá encontrar programas que contêm caracteres acentuados com mais facilidade. + Reinicialização Necessária + Alterar a sensibilidade de acentos requer a reinicialização do Flow Launcher para surtir efeito. + Reiniciar Agora Ocultar ícone da bandeja Quando o ícone não está na bandeja, o menu de Configurações pode ser aberto ao clicar na janela de busca com o botão direito do mouse. Precisão de Busca da Consulta diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs index 82d6fa94407..95f36fe2163 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs @@ -22,13 +22,16 @@ public partial class SettingsPaneGeneralViewModel : BaseModel private readonly Updater _updater; private readonly Portable _portable; private readonly Internationalization _translater; - - public SettingsPaneGeneralViewModel(Settings settings, Updater updater, Portable portable, Internationalization translater) + private readonly IPublicAPI _publicAPIInstance; + private readonly bool _initialSensitiveAccents; + public SettingsPaneGeneralViewModel(Settings settings, Updater updater, Portable portable, Internationalization translater, IPublicAPI publicApiInstance) { Settings = settings; _updater = updater; _portable = portable; _translater = translater; + _publicAPIInstance = publicApiInstance; + _initialSensitiveAccents = settings.SensitiveAccents; UpdateEnumDropdownLocalizations(); } @@ -173,6 +176,7 @@ public bool EnableDialogJump public class DialogJumpWindowPositionData : DropdownDataGeneric { } public class DialogJumpResultBehaviourData : DropdownDataGeneric { } public class DialogJumpFileResultBehaviourData : DropdownDataGeneric { } + public bool SensitiveAccentsRestartRequired => Settings.SensitiveAccents != _initialSensitiveAccents; public List DialogJumpWindowPositions { get; } = DropdownDataGeneric.GetValues("DialogJumpWindowPosition"); @@ -196,15 +200,17 @@ public int SearchDelayTimeValue } } + public bool SensitiveAccents { get => Settings.SensitiveAccents; set { - if (Settings.SensitiveAccents != value) + if(Settings.SensitiveAccents != value) { Settings.SensitiveAccents = value; OnPropertyChanged(); + OnPropertyChanged(nameof(SensitiveAccentsRestartRequired)); } } } @@ -362,6 +368,9 @@ private static string GetFileFromDialog(string title, string filter = "") }; } + [RelayCommand] + private void RestartApp() + => _publicAPIInstance.RestartApp(); private void UpdateApp() { _ = _updater.UpdateAppAsync(false); diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index a8f79b72858..461eabed875 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -95,10 +95,22 @@ Description="{DynamicResource sensitiveAccentToolTip}" Header="{DynamicResource sensitiveAccent}"> + + +