From 434ba827057f5aa7ad6c9342aa8bb52877fc8619 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 17 Nov 2019 18:06:25 +1100 Subject: [PATCH 01/20] Fix build fail from task reindex run --- Plugins/Wox.Plugin.Program/Main.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index 009dd84fbd..e165a10826 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -111,9 +111,9 @@ namespace Wox.Plugin.Program public static void IndexPrograms() { - var t1 = Task.Run(IndexWin32Programs); + var t1 = Task.Run(()=>IndexWin32Programs()); - var t2 = Task.Run(IndexUWPPrograms); + var t2 = Task.Run(()=>IndexUWPPrograms()); Task.WaitAll(t1, t2); From 05f66f9bead5e5c4eb7cad070d2eb06efcc742a7 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Thu, 28 Nov 2019 12:44:01 +0100 Subject: [PATCH 02/20] Improve code formatting --- Wox.Infrastructure/StringMatcher.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index 5b82b18918..8d66e19c21 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text; using Wox.Infrastructure.Logger; @@ -95,14 +95,20 @@ namespace Wox.Infrastructure private static int CalScore(string query, string stringToCompare, int firstIndex, int matchLen) { - //a match found near the beginning of a string is scored more than a match found near the end - //a match is scored more if the characters in the patterns are closer to each other, while the score is lower if they are more spread out + // A match found near the beginning of a string is scored more than a match found near the end + // A match is scored more if the characters in the patterns are closer to each other, + // while the score is lower if they are more spread out var score = 100 * (query.Length + 1) / ((1 + firstIndex) + (matchLen + 1)); - //a match with less characters assigning more weights + + // A match with less characters assigning more weights if (stringToCompare.Length - query.Length < 5) + { score += 20; + } else if (stringToCompare.Length - query.Length < 10) + { score += 10; + } return score; } From 3d55ad783eda0b9b2624b833d87f259bf401c9a6 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 14:55:22 +0100 Subject: [PATCH 03/20] Only pass needed setting to Alphabet As Alphabet class is static, its methods could be used without ever calling Alphabet.initialize(_settings) beforehand which would end in an exception. Therefor only _shouldUsePinyin settings needed will be transferred with a given default value. --- Wox.Infrastructure/Alphabet.cs | 74 +++++++++++++++++++--------------- Wox/App.xaml.cs | 4 +- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/Wox.Infrastructure/Alphabet.cs b/Wox.Infrastructure/Alphabet.cs index d7fae882cb..a2f64241a4 100644 --- a/Wox.Infrastructure/Alphabet.cs +++ b/Wox.Infrastructure/Alphabet.cs @@ -15,17 +15,26 @@ namespace Wox.Infrastructure private static readonly HanyuPinyinOutputFormat Format = new HanyuPinyinOutputFormat(); private static ConcurrentDictionary PinyinCache; private static BinaryStorage> _pinyinStorage; - private static Settings _settings; - - public static void Initialize(Settings settings) + private static bool _shouldUsePinyin = true; + + public static void Initialize(bool shouldUsePinyin = true) + { + _shouldUsePinyin = shouldUsePinyin; + if (_shouldUsePinyin) + { + InitializePinyinHelpers(); + } + } + + private static void InitializePinyinHelpers() { - _settings = settings; Format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); Stopwatch.Normal("|Wox.Infrastructure.Alphabet.Initialize|Preload pinyin cache", () => { _pinyinStorage = new BinaryStorage>("Pinyin"); PinyinCache = _pinyinStorage.TryLoad(new ConcurrentDictionary()); + // force pinyin library static constructor initialize PinyinHelper.toHanyuPinyinStringArray('T', Format); }); @@ -34,6 +43,10 @@ namespace Wox.Infrastructure public static void Save() { + if (!_shouldUsePinyin) + { + return; + } _pinyinStorage.Save(PinyinCache); } @@ -46,7 +59,7 @@ namespace Wox.Infrastructure /// public static string[] Pinyin(string word) { - if (!_settings.ShouldUsePinyin) + if (!_shouldUsePinyin) { return EmptyStringArray; } @@ -68,39 +81,36 @@ namespace Wox.Infrastructure /// public static string[][] PinyinComination(string characters) { - if (_settings.ShouldUsePinyin && !string.IsNullOrEmpty(characters)) + if (!_shouldUsePinyin || string.IsNullOrEmpty(characters)) { - if (!PinyinCache.ContainsKey(characters)) - { + return Empty2DStringArray; + } - var allPinyins = new List(); - foreach (var c in characters) + if (!PinyinCache.ContainsKey(characters)) + { + var allPinyins = new List(); + foreach (var c in characters) + { + var pinyins = PinyinHelper.toHanyuPinyinStringArray(c, Format); + if (pinyins != null) { - var pinyins = PinyinHelper.toHanyuPinyinStringArray(c, Format); - if (pinyins != null) - { - var r = pinyins.Distinct().ToArray(); - allPinyins.Add(r); - } - else - { - var r = new[] { c.ToString() }; - allPinyins.Add(r); - } + var r = pinyins.Distinct().ToArray(); + allPinyins.Add(r); } + else + { + var r = new[] { c.ToString() }; + allPinyins.Add(r); + } + } - var combination = allPinyins.Aggregate(Combination).Select(c => c.Split(';')).ToArray(); - PinyinCache[characters] = combination; - return combination; - } - else - { - return PinyinCache[characters]; - } + var combination = allPinyins.Aggregate(Combination).Select(c => c.Split(';')).ToArray(); + PinyinCache[characters] = combination; + return combination; } else { - return Empty2DStringArray; + return PinyinCache[characters]; } } @@ -112,7 +122,7 @@ namespace Wox.Infrastructure public static bool ContainsChinese(string word) { - if (!_settings.ShouldUsePinyin) + if (!_shouldUsePinyin) { return false; } @@ -130,7 +140,7 @@ namespace Wox.Infrastructure private static string[] Combination(string[] array1, string[] array2) { - if (!_settings.ShouldUsePinyin) + if (!_shouldUsePinyin) { return EmptyStringArray; } diff --git a/Wox/App.xaml.cs b/Wox/App.xaml.cs index 0ec1614bf9..acfb88d266 100644 --- a/Wox/App.xaml.cs +++ b/Wox/App.xaml.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Threading.Tasks; using System.Timers; @@ -53,7 +53,7 @@ namespace Wox _settingsVM = new SettingWindowViewModel(); _settings = _settingsVM.Settings; - Alphabet.Initialize(_settings); + Alphabet.Initialize(_settings.ShouldUsePinyin); StringMatcher.UserSettingSearchPrecision = _settings.QuerySearchPrecision; From 6ebca7fa7cf0462d9ff9734f216d7ef460fef16d Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 14:58:52 +0100 Subject: [PATCH 04/20] Apply search precision filter on assignment The search precision must be used, so it makes sense to apply the filter directly on score assignment. Score will be "0" if precision filter was not met. --- Wox.Infrastructure/StringMatcher.cs | 49 +++++++++++++++++++---------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index 8d66e19c21..d24bdf2c35 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -120,19 +120,6 @@ namespace Wox.Infrastructure None = 0 } - public static bool IsSearchPrecisionScoreMet(this MatchResult matchResult) - { - var precisionScore = (SearchPrecisionScore)Enum.Parse(typeof(SearchPrecisionScore), - UserSettingSearchPrecision ?? SearchPrecisionScore.Regular.ToString()); - return matchResult.Score >= (int)precisionScore; - } - - public static int ScoreAfterSearchPrecisionFilter(this MatchResult matchResult) - { - return matchResult.IsSearchPrecisionScoreMet() ? matchResult.Score : 0; - - } - public static int ScoreForPinyin(string source, string target) { if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(target)) @@ -164,12 +151,42 @@ namespace Wox.Infrastructure public class MatchResult { public bool Success { get; set; } - public int Score { get; set; } + + private int _score; + public int Score + { + get + { + return _score; + } + set + { + _score = ApplySearchPrecisionFilter(value); + } + } /// - /// highlight string + /// Matched data to highlight. /// - public string Value { get; set; } + public List MatchData { get; set; } + + public bool IsSearchPrecisionScoreMet() + { + return IsSearchPrecisionScoreMet(Score); + } + + private bool IsSearchPrecisionScoreMet(int score) + { + var precisionScore = (SearchPrecisionScore)Enum.Parse( + typeof(SearchPrecisionScore), + UserSettingSearchPrecision ?? SearchPrecisionScore.Regular.ToString()); + return score >= (int)precisionScore; + } + + private int ApplySearchPrecisionFilter(int score) + { + return IsSearchPrecisionScoreMet(score) ? score : 0; + } } public class MatchOption From 627e99859d76ee624062e96e3e76ddb308288910 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 15:02:59 +0100 Subject: [PATCH 05/20] Directly calculate pinyin if needed The MatchResult will always get the maximum score from either ScoreForPinyin() or CalculateSearchScore(). ScoreForPinyin() is completely dependant on the "ShouldUsePinyin" global setting. --- Wox.Infrastructure/StringMatcher.cs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index d24bdf2c35..dd5a118fb4 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -1,10 +1,12 @@ -using System; +using System; +using System.Collections.Generic; using System.Linq; using System.Text; using Wox.Infrastructure.Logger; using Wox.Infrastructure.UserSettings; +using static Wox.Infrastructure.StringMatcher; -namespace Wox.Infrastructure +namespace Wox.Infrastructure { public static class StringMatcher { @@ -54,6 +56,9 @@ namespace Wox.Infrastructure var firstMatchIndex = -1; var lastMatchIndex = 0; char ch; + + var indexList = new List(); + for (var idx = 0; idx < len; idx++) { ch = stringToCompare[idx]; @@ -63,6 +68,7 @@ namespace Wox.Infrastructure firstMatchIndex = idx; lastMatchIndex = idx + 1; + indexList.Add(idx); sb.Append(opt.Prefix + ch + opt.Suffix); patternIdx += 1; } @@ -82,18 +88,25 @@ namespace Wox.Infrastructure // return rendered string if we have a match for every char if (patternIdx == pattern.Length) { - return new MatchResult + var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex, lastMatchIndex - firstMatchIndex); + var pinyinScore = ScoreForPinyin(stringToCompare, query); + + var result = new MatchResult { Success = true, - Value = sb.ToString(), - Score = CalScore(query, stringToCompare, firstMatchIndex, lastMatchIndex - firstMatchIndex) + MatchData = indexList, + Score = Math.Max(score, pinyinScore) }; + + return result.Score > 0 ? + result : + new MatchResult { Success = false }; } return new MatchResult { Success = false }; } - private static int CalScore(string query, string stringToCompare, int firstIndex, int matchLen) + private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, int matchLen) { // A match found near the beginning of a string is scored more than a match found near the end // A match is scored more if the characters in the patterns are closer to each other, @@ -164,7 +177,7 @@ namespace Wox.Infrastructure _score = ApplySearchPrecisionFilter(value); } } - + /// /// Matched data to highlight. /// From 2aeceb7ea8e305fed8567240a45c738b944e4ce1 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 15:04:02 +0100 Subject: [PATCH 06/20] Fix tests for new search precision handling --- Wox.Test/FuzzyMatcherTest.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Wox.Test/FuzzyMatcherTest.cs b/Wox.Test/FuzzyMatcherTest.cs index ce1746a3a3..aa8778a54c 100644 --- a/Wox.Test/FuzzyMatcherTest.cs +++ b/Wox.Test/FuzzyMatcherTest.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Linq; using NUnit.Framework; using Wox.Infrastructure; +using Wox.Infrastructure.UserSettings; using Wox.Plugin; namespace Wox.Test @@ -48,6 +49,8 @@ namespace Wox.Test "aac" }; + Alphabet.Initialize(false); + StringMatcher.UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.Low.ToString(); var results = new List(); foreach (var str in sources) @@ -130,6 +133,9 @@ namespace Wox.Test var results = new List(); + Alphabet.Initialize(false); + StringMatcher.UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.None.ToString(); + foreach (var str in searchStrings) { results.Add(new Result @@ -168,8 +174,11 @@ namespace Wox.Test [TestCase("ccs", "Candy Crush Saga from King", (int)StringMatcher.SearchPrecisionScore.Low, true)] [TestCase("cand", "Candy Crush Saga from King", (int)StringMatcher.SearchPrecisionScore.Regular, true)] [TestCase("cand", "Help cure hope raise on mind entity Chrome", (int)StringMatcher.SearchPrecisionScore.Regular, false)] - public void WhenGivenDesiredPrecisionThenShouldReturnAllResultsGreaterOrEqual(string queryString, string compareString, - int expectedPrecisionScore, bool expectedPrecisionResult) + public void WhenGivenDesiredPrecisionThenShouldReturnAllResultsGreaterOrEqual( + string queryString, + string compareString, + int expectedPrecisionScore, + bool expectedPrecisionResult) { var expectedPrecisionString = (StringMatcher.SearchPrecisionScore)expectedPrecisionScore; StringMatcher.UserSettingSearchPrecision = expectedPrecisionString.ToString(); From 8997c27819e514027a5410f18c32353ebc5c90a8 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 15:08:21 +0100 Subject: [PATCH 07/20] Add highlight converter component --- Wox/Converters/HighlightTextConverter.cs | 53 ++++++++++++++++++++++++ Wox/ResultListBox.xaml | 22 +++++++++- Wox/ViewModel/RelayCommand.cs | 1 - Wox/ViewModel/ResultsViewModel.cs | 31 ++++++++++++++ Wox/Wox.csproj | 1 + 5 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 Wox/Converters/HighlightTextConverter.cs diff --git a/Wox/Converters/HighlightTextConverter.cs b/Wox/Converters/HighlightTextConverter.cs new file mode 100644 index 0000000000..b7d6d06838 --- /dev/null +++ b/Wox/Converters/HighlightTextConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; +using System.Windows.Documents; + +namespace Wox.Converters +{ + public class HighlightTextConverter : IMultiValueConverter + { + public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo) + { + var text = value[0] as string; + var highlightData = value[1] as List; + + var textBlock = new Span(); + + if (highlightData == null || !highlightData.Any()) + { + // No highlight data, just return the text + return new Run(text); + } + + for (var i = 0; i < text.Length; i++) + { + var currentCharacter = text.Substring(i, 1); + if (this.ShouldHighlight(highlightData, i)) + { + textBlock.Inlines.Add(new Bold(new Run(currentCharacter))); + } + else + { + textBlock.Inlines.Add(new Run(currentCharacter)); + } + } + return textBlock; + } + + public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) + { + return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue }; + } + + private bool ShouldHighlight(List highlightData, int index) + { + return highlightData.Contains(index); + } + } +} diff --git a/Wox/ResultListBox.xaml b/Wox/ResultListBox.xaml index cad02d5198..dc3100e0e7 100644 --- a/Wox/ResultListBox.xaml +++ b/Wox/ResultListBox.xaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:vm="clr-namespace:Wox.ViewModel" + xmlns:converter="clr-namespace:Wox.Converters" mc:Ignorable="d" d:DesignWidth="100" d:DesignHeight="100" d:DataContext="{d:DesignInstance vm:ResultsViewModel}" MaxHeight="{Binding MaxHeight}" @@ -30,6 +31,9 @@ + + + @@ -44,9 +48,23 @@ + Text="{Binding Result.Title}"> + + + + + + + + Grid.Row="1" x:Name="SubTitle" Text="{Binding Result.SubTitle}"> + + + + + + + diff --git a/Wox/ViewModel/RelayCommand.cs b/Wox/ViewModel/RelayCommand.cs index 3a52f30007..b1dbc551c1 100644 --- a/Wox/ViewModel/RelayCommand.cs +++ b/Wox/ViewModel/RelayCommand.cs @@ -5,7 +5,6 @@ namespace Wox.ViewModel { public class RelayCommand : ICommand { - private Action _action; public RelayCommand(Action action) diff --git a/Wox/ViewModel/ResultsViewModel.cs b/Wox/ViewModel/ResultsViewModel.cs index 674923228e..1496647d22 100644 --- a/Wox/ViewModel/ResultsViewModel.cs +++ b/Wox/ViewModel/ResultsViewModel.cs @@ -3,7 +3,9 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; +using System.Windows.Controls; using System.Windows.Data; +using System.Windows.Documents; using Wox.Infrastructure.UserSettings; using Wox.Plugin; @@ -193,8 +195,37 @@ namespace Wox.ViewModel return results; } + #endregion + #region FormattedText Dependency Property + public static readonly DependencyProperty FormattedTextProperty = DependencyProperty.RegisterAttached( + "FormattedText", + typeof(Inline), + typeof(ResultsViewModel), + new PropertyMetadata(null, FormattedTextPropertyChanged)); + public static void SetFormattedText(DependencyObject textBlock, IList value) + { + textBlock.SetValue(FormattedTextProperty, value); + } + + public static Inline GetFormattedText(DependencyObject textBlock) + { + return (Inline)textBlock.GetValue(FormattedTextProperty); + } + + private static void FormattedTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var textBlock = d as TextBlock; + if (textBlock == null) return; + + var inline = (Inline)e.NewValue; + + textBlock.Inlines.Clear(); + if (inline == null) return; + + textBlock.Inlines.Add(inline); + } #endregion public class ResultCollection : ObservableCollection diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index ef77148291..4a4dc62bfc 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -158,6 +158,7 @@ Properties\SolutionAssemblyInfo.cs + From a004ef65aff61d0bd9088babd3a71bac7ae6e837 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 15:10:21 +0100 Subject: [PATCH 08/20] Set title & subtitle highlight data --- Wox.Plugin/Result.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Wox.Plugin/Result.cs b/Wox.Plugin/Result.cs index 2f74591703..aff56554af 100644 --- a/Wox.Plugin/Result.cs +++ b/Wox.Plugin/Result.cs @@ -42,6 +42,16 @@ namespace Wox.Plugin public int Score { get; set; } + /// + /// A list of indexes for the characters to be highlighted in Title + /// + public IList TitleHighlightData { get; set; } + + /// + /// A list of indexes for the characters to be highlighted in SubTitle + /// + public IList SubTitleHighlightData { get; set; } + /// /// Only resulsts that originQuery match with curren query will be displayed in the panel /// @@ -69,7 +79,9 @@ namespace Wox.Plugin var equality = string.Equals(r?.Title, Title) && string.Equals(r?.SubTitle, SubTitle) && - string.Equals(r?.IcoPath, IcoPath); + string.Equals(r?.IcoPath, IcoPath) && + TitleHighlightData == r.TitleHighlightData && + SubTitleHighlightData == r.SubTitleHighlightData; return equality; } From 601d6f37af61ad14ac9493904440a3a84a99e755 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 15:25:19 +0100 Subject: [PATCH 09/20] Highlight how results matched --- Plugins/Wox.Plugin.ControlPanel/Main.cs | 36 ++++++++------------ Plugins/Wox.Plugin.Everything/Main.cs | 2 ++ Plugins/Wox.Plugin.Folder/Main.cs | 6 ++++ Plugins/Wox.Plugin.PluginManagement/Main.cs | 5 +++ Plugins/Wox.Plugin.Program/Programs/UWP.cs | 12 +++---- Plugins/Wox.Plugin.Program/Programs/Win32.cs | 13 +++---- Plugins/Wox.Plugin.Sys/Main.cs | 15 ++++++-- 7 files changed, 52 insertions(+), 37 deletions(-) diff --git a/Plugins/Wox.Plugin.ControlPanel/Main.cs b/Plugins/Wox.Plugin.ControlPanel/Main.cs index 0e0a8898d6..77b57fe865 100644 --- a/Plugins/Wox.Plugin.ControlPanel/Main.cs +++ b/Plugins/Wox.Plugin.ControlPanel/Main.cs @@ -27,7 +27,6 @@ namespace Wox.Plugin.ControlPanel Directory.CreateDirectory(iconFolder); } - foreach (ControlPanelItem item in controlPanelItems) { if (!File.Exists(iconFolder + item.GUID + fileType) && item.Icon != null) @@ -43,7 +42,10 @@ namespace Wox.Plugin.ControlPanel foreach (var item in controlPanelItems) { - item.Score = Score(item, query.Search); + var titleMatch = StringMatcher.FuzzySearch(query.Search, item.LocalizedString); + var subTitleMatch = StringMatcher.FuzzySearch(query.Search, item.InfoTip); + + item.Score = Math.Max(titleMatch.Score, subTitleMatch.Score); if (item.Score > 0) { var result = new Result @@ -66,6 +68,16 @@ namespace Wox.Plugin.ControlPanel return true; } }; + + if (item.Score == titleMatch.Score) + { + result.TitleHighlightData = titleMatch.MatchData; + } + else + { + result.SubTitleHighlightData = subTitleMatch.MatchData; + } + results.Add(result); } } @@ -74,26 +86,6 @@ namespace Wox.Plugin.ControlPanel return panelItems; } - private int Score(ControlPanelItem item, string query) - { - var scores = new List {0}; - if (!string.IsNullOrEmpty(item.LocalizedString)) - { - var score1 = StringMatcher.FuzzySearch(query, item.LocalizedString).ScoreAfterSearchPrecisionFilter(); - var score2 = StringMatcher.ScoreForPinyin(item.LocalizedString, query); - scores.Add(score1); - scores.Add(score2); - } - if (!string.IsNullOrEmpty(item.InfoTip)) - { - var score1 = StringMatcher.FuzzySearch(query, item.InfoTip).ScoreAfterSearchPrecisionFilter(); - var score2 = StringMatcher.ScoreForPinyin(item.InfoTip, query); - scores.Add(score1); - scores.Add(score2); - } - return scores.Max(); - } - public string GetTranslatedPluginTitle() { return context.API.GetTranslation("wox_plugin_controlpanel_plugin_name"); diff --git a/Plugins/Wox.Plugin.Everything/Main.cs b/Plugins/Wox.Plugin.Everything/Main.cs index 7969a079fe..4188f89dda 100644 --- a/Plugins/Wox.Plugin.Everything/Main.cs +++ b/Plugins/Wox.Plugin.Everything/Main.cs @@ -55,6 +55,7 @@ namespace Wox.Plugin.Everything r.Title = Path.GetFileName(path); r.SubTitle = path; r.IcoPath = path; + r.TitleHighlightData = StringMatcher.FuzzySearch(keyword, Path.GetFileName(path)).MatchData; r.Action = c => { bool hide; @@ -78,6 +79,7 @@ namespace Wox.Plugin.Everything return hide; }; r.ContextData = s; + r.SubTitleHighlightData = StringMatcher.FuzzySearch(keyword, path).MatchData; results.Add(r); } } diff --git a/Plugins/Wox.Plugin.Folder/Main.cs b/Plugins/Wox.Plugin.Folder/Main.cs index e8f33a951b..f3aef7d1d5 100644 --- a/Plugins/Wox.Plugin.Folder/Main.cs +++ b/Plugins/Wox.Plugin.Folder/Main.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; +using Wox.Infrastructure; using Wox.Infrastructure.Storage; namespace Wox.Plugin.Folder @@ -53,6 +54,7 @@ namespace Wox.Plugin.Folder Title = item.Nickname, IcoPath = item.Path, SubTitle = "Ctrl + Enter to open the directory", + TitleHighlightData = StringMatcher.FuzzySearch(item.Nickname, search).MatchData, Action = c => { if (c.SpecialKeyState.CtrlPressed) @@ -148,6 +150,8 @@ namespace Wox.Plugin.Folder } }); + string searchNickname = new FolderLink { Path = query.Search }.Nickname; + //Add children directories DirectoryInfo[] dirs = new DirectoryInfo(search).GetDirectories(); foreach (DirectoryInfo dir in dirs) @@ -162,6 +166,7 @@ namespace Wox.Plugin.Folder Title = dir.Name, IcoPath = dir.FullName, SubTitle = "Ctrl + Enter to open the directory", + TitleHighlightData = StringMatcher.FuzzySearch(dir.Name, searchNickname).MatchData, Action = c => { if (c.SpecialKeyState.CtrlPressed) @@ -197,6 +202,7 @@ namespace Wox.Plugin.Folder { Title = Path.GetFileName(filePath), IcoPath = filePath, + TitleHighlightData = StringMatcher.FuzzySearch(file.Name, searchNickname).MatchData, Action = c => { try diff --git a/Plugins/Wox.Plugin.PluginManagement/Main.cs b/Plugins/Wox.Plugin.PluginManagement/Main.cs index 785ca3b1f3..1ee0fd7ae8 100644 --- a/Plugins/Wox.Plugin.PluginManagement/Main.cs +++ b/Plugins/Wox.Plugin.PluginManagement/Main.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows; using Newtonsoft.Json; +using Wox.Infrastructure; using Wox.Infrastructure.Http; using Wox.Infrastructure.Logger; @@ -142,6 +143,8 @@ namespace Wox.Plugin.PluginManagement Title = r.name, SubTitle = r.description, IcoPath = "Images\\plugin.png", + TitleHighlightData = StringMatcher.FuzzySearch(query.SecondSearch, r.name).MatchData, + SubTitleHighlightData = StringMatcher.FuzzySearch(query.SecondSearch, r.description).MatchData, Action = c => { MessageBoxResult result = MessageBox.Show("Are you sure you wish to install the \'" + r.name + "\' plugin", @@ -191,6 +194,8 @@ namespace Wox.Plugin.PluginManagement Title = plugin.Name, SubTitle = plugin.Description, IcoPath = plugin.IcoPath, + TitleHighlightData = StringMatcher.FuzzySearch(query.SecondSearch, plugin.Name).MatchData, + SubTitleHighlightData = StringMatcher.FuzzySearch(query.SecondSearch, plugin.Description).MatchData, Action = e => { UnInstallPlugin(plugin); diff --git a/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/Plugins/Wox.Plugin.Program/Programs/UWP.cs index 77d33e2e2f..3cd75fbae2 100644 --- a/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -35,7 +35,6 @@ namespace Wox.Plugin.Program.Programs public UWP(Package package) { - Location = package.InstalledLocation.Path; Name = package.Id.Name; FullName = package.Id.FullName; @@ -266,11 +265,9 @@ namespace Wox.Plugin.Program.Programs private int Score(string query) { - var score1 = StringMatcher.FuzzySearch(query, DisplayName).ScoreAfterSearchPrecisionFilter(); - var score2 = StringMatcher.ScoreForPinyin(DisplayName, query); - var score3 = StringMatcher.FuzzySearch(query, Description).ScoreAfterSearchPrecisionFilter(); - var score4 = StringMatcher.ScoreForPinyin(Description, query); - var score = new[] { score1, score2, score3, score4 }.Max(); + var displayNameMatch = StringMatcher.FuzzySearch(query, DisplayName); + var descriptionMatch = StringMatcher.FuzzySearch(query, Description); + var score = new[] { displayNameMatch.Score, descriptionMatch.Score }.Max(); return score; } @@ -293,14 +290,17 @@ namespace Wox.Plugin.Program.Programs Description.Substring(0, DisplayName.Length) == DisplayName) { result.Title = Description; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, Description).MatchData; } else if (!string.IsNullOrEmpty(Description)) { result.Title = $"{DisplayName}: {Description}"; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, DisplayName).MatchData; } else { result.Title = DisplayName; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, DisplayName).MatchData; } return result; } diff --git a/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/Plugins/Wox.Plugin.Program/Programs/Win32.cs index dc11a56654..b6a5cf01c9 100644 --- a/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -33,12 +33,10 @@ namespace Wox.Plugin.Program.Programs private int Score(string query) { - var score1 = StringMatcher.FuzzySearch(query, Name).ScoreAfterSearchPrecisionFilter(); - var score2 = StringMatcher.ScoreForPinyin(Name, query); - var score3 = StringMatcher.FuzzySearch(query, Description).ScoreAfterSearchPrecisionFilter(); - var score4 = StringMatcher.ScoreForPinyin(Description, query); - var score5 = StringMatcher.FuzzySearch(query, ExecutableName).ScoreAfterSearchPrecisionFilter(); - var score = new[] { score1, score2, score3, score4, score5 }.Max(); + var nameMatch = StringMatcher.FuzzySearch(query, Name); + var descriptionMatch = StringMatcher.FuzzySearch(query, Description); + var executableNameMatch = StringMatcher.FuzzySearch(query, ExecutableName); + var score = new[] { nameMatch.Score, descriptionMatch.Score, executableNameMatch.Score }.Max(); return score; } @@ -67,14 +65,17 @@ namespace Wox.Plugin.Program.Programs Description.Substring(0, Name.Length) == Name) { result.Title = Description; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, Description).MatchData; } else if (!string.IsNullOrEmpty(Description)) { result.Title = $"{Name}: {Description}"; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, Description).MatchData; } else { result.Title = Name; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, Name).MatchData; } return result; diff --git a/Plugins/Wox.Plugin.Sys/Main.cs b/Plugins/Wox.Plugin.Sys/Main.cs index 32e888514d..e888dbb378 100644 --- a/Plugins/Wox.Plugin.Sys/Main.cs +++ b/Plugins/Wox.Plugin.Sys/Main.cs @@ -56,12 +56,21 @@ namespace Wox.Plugin.Sys var results = new List(); foreach (var c in commands) { - var titleScore = StringMatcher.FuzzySearch(query.Search, c.Title).ScoreAfterSearchPrecisionFilter(); - var subTitleScore = StringMatcher.FuzzySearch(query.Search, c.SubTitle).ScoreAfterSearchPrecisionFilter(); - var score = Math.Max(titleScore, subTitleScore); + var titleMatch = StringMatcher.FuzzySearch(query.Search, c.Title); + var subTitleMatch = StringMatcher.FuzzySearch(query.Search, c.SubTitle); + + var score = Math.Max(titleMatch.Score, subTitleMatch.Score); if (score > 0) { c.Score = score; + if (score == titleMatch.Score) + { + c.TitleHighlightData = titleMatch.MatchData; + } + else + { + c.SubTitleHighlightData = subTitleMatch.MatchData; + } results.Add(c); } } From f4a2f67db389260f7744f1ed992638ba412063f8 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 3 Dec 2019 19:22:03 +0100 Subject: [PATCH 10/20] Fix wrong comparison parameter Wrong string was used for FuzzySearch comparison which resulted wrong highlighted letters in the results. --- Plugins/Wox.Plugin.Program/Programs/Win32.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/Plugins/Wox.Plugin.Program/Programs/Win32.cs index b6a5cf01c9..b9a6e401c3 100644 --- a/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -69,8 +69,9 @@ namespace Wox.Plugin.Program.Programs } else if (!string.IsNullOrEmpty(Description)) { - result.Title = $"{Name}: {Description}"; - result.TitleHighlightData = StringMatcher.FuzzySearch(query, Description).MatchData; + var title = $"{Name}: {Description}"; + result.Title = title; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, title).MatchData; } else { From 78f243651e82155b5cb80b70e5aaa1dfc3899b8f Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Mon, 9 Dec 2019 20:47:24 +0100 Subject: [PATCH 11/20] Pass Settings instance to Alphabet again --- Wox.Infrastructure/Alphabet.cs | 21 +++++++++------------ Wox/App.xaml.cs | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Wox.Infrastructure/Alphabet.cs b/Wox.Infrastructure/Alphabet.cs index a2f64241a4..ee6b84b418 100644 --- a/Wox.Infrastructure/Alphabet.cs +++ b/Wox.Infrastructure/Alphabet.cs @@ -15,15 +15,12 @@ namespace Wox.Infrastructure private static readonly HanyuPinyinOutputFormat Format = new HanyuPinyinOutputFormat(); private static ConcurrentDictionary PinyinCache; private static BinaryStorage> _pinyinStorage; - private static bool _shouldUsePinyin = true; + private static Settings _settings; - public static void Initialize(bool shouldUsePinyin = true) + public static void Initialize(Settings settings) { - _shouldUsePinyin = shouldUsePinyin; - if (_shouldUsePinyin) - { - InitializePinyinHelpers(); - } + _settings = settings; + InitializePinyinHelpers(); } private static void InitializePinyinHelpers() @@ -43,7 +40,7 @@ namespace Wox.Infrastructure public static void Save() { - if (!_shouldUsePinyin) + if (!_settings.ShouldUsePinyin) { return; } @@ -59,7 +56,7 @@ namespace Wox.Infrastructure /// public static string[] Pinyin(string word) { - if (!_shouldUsePinyin) + if (!_settings.ShouldUsePinyin) { return EmptyStringArray; } @@ -81,7 +78,7 @@ namespace Wox.Infrastructure /// public static string[][] PinyinComination(string characters) { - if (!_shouldUsePinyin || string.IsNullOrEmpty(characters)) + if (!_settings.ShouldUsePinyin || string.IsNullOrEmpty(characters)) { return Empty2DStringArray; } @@ -122,7 +119,7 @@ namespace Wox.Infrastructure public static bool ContainsChinese(string word) { - if (!_shouldUsePinyin) + if (!_settings.ShouldUsePinyin) { return false; } @@ -140,7 +137,7 @@ namespace Wox.Infrastructure private static string[] Combination(string[] array1, string[] array2) { - if (!_shouldUsePinyin) + if (!_settings.ShouldUsePinyin) { return EmptyStringArray; } diff --git a/Wox/App.xaml.cs b/Wox/App.xaml.cs index acfb88d266..8cdc4a8b85 100644 --- a/Wox/App.xaml.cs +++ b/Wox/App.xaml.cs @@ -53,7 +53,7 @@ namespace Wox _settingsVM = new SettingWindowViewModel(); _settings = _settingsVM.Settings; - Alphabet.Initialize(_settings.ShouldUsePinyin); + Alphabet.Initialize(_settings); StringMatcher.UserSettingSearchPrecision = _settings.QuerySearchPrecision; From 49c5c5bbdeb355541c587f9f60f5f432a491bc1d Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Mon, 9 Dec 2019 20:57:59 +0100 Subject: [PATCH 12/20] Pass "ShouldUsePinyin" to StringMatcher Flag is used in method "ShouldUsePinyin()" to avoid calling Alphabet service. Otherwise, tests applying to StringMatcher.FuzzySearch() would fail because the pinyin helper library fails to initialize. --- Wox.Infrastructure/StringMatcher.cs | 8 +++++++- Wox.Infrastructure/UserSettings/Settings.cs | 12 +++++++++++- Wox/App.xaml.cs | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index dd5a118fb4..baca1020f2 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -13,6 +13,7 @@ namespace Wox.Infrastructure public static MatchOption DefaultMatchOption = new MatchOption(); public static string UserSettingSearchPrecision { get; set; } + public static bool ShouldUsePinyin { get; set; } [Obsolete("This method is obsolete and should not be used. Please use the static function StringMatcher.FuzzySearch")] public static int Score(string source, string target) @@ -135,6 +136,11 @@ namespace Wox.Infrastructure public static int ScoreForPinyin(string source, string target) { + if (!ShouldUsePinyin) + { + return 0; + } + if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(target)) { if (Alphabet.ContainsChinese(source)) diff --git a/Wox.Infrastructure/UserSettings/Settings.cs b/Wox.Infrastructure/UserSettings/Settings.cs index 7371ea5d05..de5a2e6624 100644 --- a/Wox.Infrastructure/UserSettings/Settings.cs +++ b/Wox.Infrastructure/UserSettings/Settings.cs @@ -24,7 +24,17 @@ namespace Wox.Infrastructure.UserSettings /// /// when false Alphabet static service will always return empty results /// - public bool ShouldUsePinyin { get; set; } = true; + private bool _shouldUsePinyin = true; + public bool ShouldUsePinyin + { + get { return _shouldUsePinyin; } + set + { + _shouldUsePinyin = value; + StringMatcher.ShouldUsePinyin = value; + } + } + private string _querySearchPrecision { get; set; } = StringMatcher.SearchPrecisionScore.Regular.ToString(); public string QuerySearchPrecision diff --git a/Wox/App.xaml.cs b/Wox/App.xaml.cs index 8cdc4a8b85..9436df4758 100644 --- a/Wox/App.xaml.cs +++ b/Wox/App.xaml.cs @@ -56,6 +56,7 @@ namespace Wox Alphabet.Initialize(_settings); StringMatcher.UserSettingSearchPrecision = _settings.QuerySearchPrecision; + StringMatcher.ShouldUsePinyin = _settings.ShouldUsePinyin; PluginManager.LoadPlugins(_settings.PluginSettings); _mainVM = new MainViewModel(_settings); From e60797cd0f55d5566c54bb755dd3c998633f7b33 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Mon, 9 Dec 2019 21:06:31 +0100 Subject: [PATCH 13/20] Introduce RawScore property New property RawScore is used to save the calculated score without any search precision filtering added. --- Wox.Infrastructure/StringMatcher.cs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index baca1020f2..f350e0e404 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -96,7 +96,7 @@ namespace Wox.Infrastructure { Success = true, MatchData = indexList, - Score = Math.Max(score, pinyinScore) + RawScore = Math.Max(score, pinyinScore) }; return result.Score > 0 ? @@ -171,16 +171,22 @@ namespace Wox.Infrastructure { public bool Success { get; set; } - private int _score; - public int Score + /// + /// The final score of the match result with all search precision filters applied. + /// + public int Score { get; private set; } + + /// + /// The raw calculated search score without any search precision filtering applied. + /// + private int _rawScore; + public int RawScore { - get - { - return _score; - } + get { return _rawScore; } set { - _score = ApplySearchPrecisionFilter(value); + _rawScore = value; + Score = ApplySearchPrecisionFilter(_rawScore); } } From ce89ff3c85bbe3f0bc05650fb392ee48cc7c1222 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Mon, 9 Dec 2019 21:08:17 +0100 Subject: [PATCH 14/20] FIx test methods Use RawScore or Score depending on the test case. Also removed unnecessary test settings introduced earlier. --- Wox.Test/FuzzyMatcherTest.cs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/Wox.Test/FuzzyMatcherTest.cs b/Wox.Test/FuzzyMatcherTest.cs index aa8778a54c..21563f91f9 100644 --- a/Wox.Test/FuzzyMatcherTest.cs +++ b/Wox.Test/FuzzyMatcherTest.cs @@ -12,7 +12,7 @@ namespace Wox.Test [TestFixture] public class FuzzyMatcherTest { - public List GetSearchStrings() + public List GetSearchStrings() => new List { "Chrome", @@ -49,16 +49,13 @@ namespace Wox.Test "aac" }; - Alphabet.Initialize(false); - StringMatcher.UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.Low.ToString(); - var results = new List(); foreach (var str in sources) { results.Add(new Result { Title = str, - Score = StringMatcher.FuzzySearch("inst", str).Score + Score = StringMatcher.FuzzySearch("inst", str).RawScore }); } @@ -75,7 +72,7 @@ namespace Wox.Test { var compareString = "Can have rum only in my glass"; - var scoreResult = StringMatcher.FuzzySearch(searchString, compareString).Score; + var scoreResult = StringMatcher.FuzzySearch(searchString, compareString).RawScore; Assert.True(scoreResult == 0); } @@ -132,16 +129,12 @@ namespace Wox.Test .ToList(); var results = new List(); - - Alphabet.Initialize(false); - StringMatcher.UserSettingSearchPrecision = StringMatcher.SearchPrecisionScore.None.ToString(); - foreach (var str in searchStrings) { results.Add(new Result { Title = str, - Score = StringMatcher.FuzzySearch(searchTerm, str).Score + Score = StringMatcher.FuzzySearch(searchTerm, str).RawScore }); } From 7d5c827dec085d29e4631b4a8be96c363d60e4cf Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Mon, 9 Dec 2019 21:08:38 +0100 Subject: [PATCH 15/20] Remove whitespace --- Wox.Infrastructure/Alphabet.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Wox.Infrastructure/Alphabet.cs b/Wox.Infrastructure/Alphabet.cs index ee6b84b418..63e178ba1e 100644 --- a/Wox.Infrastructure/Alphabet.cs +++ b/Wox.Infrastructure/Alphabet.cs @@ -149,7 +149,5 @@ namespace Wox.Infrastructure ).ToArray(); return combination; } - - } } From 695be896569c9c2634155e4e1361c39040ddfbf6 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 10 Dec 2019 22:01:12 +1100 Subject: [PATCH 16/20] Add ability to run as a different user for win32 programs --- Plugins/Wox.Plugin.Program/Images/user.png | Bin 0 -> 65650 bytes Plugins/Wox.Plugin.Program/Languages/en.xaml | 1 + Plugins/Wox.Plugin.Program/Main.cs | 4 +- Plugins/Wox.Plugin.Program/Programs/UWP.cs | 2 +- Plugins/Wox.Plugin.Program/Programs/Win32.cs | 21 ++++++- .../Wox.Plugin.Program.csproj | 3 + Wox.Plugin/SharedCommands/ShellCommand.cs | 53 +++++++++++++++++- 7 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 Plugins/Wox.Plugin.Program/Images/user.png diff --git a/Plugins/Wox.Plugin.Program/Images/user.png b/Plugins/Wox.Plugin.Program/Images/user.png new file mode 100644 index 0000000000000000000000000000000000000000..2d45c1ee919304a973641b387934dbd517979271 GIT binary patch literal 65650 zcmV*nKuEudP)KoEefB#uyts#u%fQWvShg+Wqc(&#Brg ze^l+-YrpDLoqKNg?e4Q|^{uMkUTgnq*WPQdy=&J#goP|*R{5P100{Wb>wy2|3E)4y z1vh`_6rhkZBgguMoQv@ggV8b+Eu$DOV=`W$e6T|Ka1}(WD9U9$K6gF1+y$aFkXi$1 z6+~-b9)a}=z(W8dFmiwu00jVC%?_NSy`II+#xaI1Sb(!TKarc0vtz zJ`a_h2lzA>jYd()+z44*}#L%E7Gah&3T1hHbkXb+{1)p_i~MjcO2SFc$y{C^ZJD z^I*LW%1+Z@=>*F0aX>vygQdUYvV4?TKZ(KUB=qF`WU#cZM_NOT^>c69*P7Ep7P4@> z3#sHco~gXkHA5VHE`y#R=kbLhseBcLJt)ilAUed83ojy-A7ot|gf91h)CgJ+!8)%D zF&I!yyotJ!MVuf5AkQN@Seu?lf4WTugF12H8X#*!+elhfPFd@9sO&gp`ID@R$7#6Z zGtm4vvg~OvjlXfhT`cPHE?EJMejefaLNl=INpW)+DYsxCm89$kc!DNsca3C z@c{sbpeJ7o&9_0R!(2}G16YABR?P69!HU>8r0R+}VXiz^=pY$j0#SVofIv2YWd;e4 zC)_1iV7~LM@-x;v+cR?UbK?4#Y-$al;-vDk0M1f2cp6$i3Z=dPmH#ckk0W1ticy@@ z+3@@Z@%TiZ18=>i?Wru}3YUfBy-H=@uRN>Nq!<$AYplzI#C$uzUk@&CgVwjRE_VaG zQcV@Gs+?4}?~#sHlql|2WgJ`c*i0HXiMM4u;>J;}N_sRx7cGw07~{Nye3daMh%Ol0AB zuOeCc&11Os>@Xj4zJ~FIBhdOTl#`c&a68IkFTg9z

PbOc!t+-8s$(Xa?|2G$~zC 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≠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 literal 0 HcmV?d00001 diff --git a/Plugins/Wox.Plugin.Program/Languages/en.xaml b/Plugins/Wox.Plugin.Program/Languages/en.xaml index bb218887c4..b7202d590f 100644 --- a/Plugins/Wox.Plugin.Program/Languages/en.xaml +++ b/Plugins/Wox.Plugin.Program/Languages/en.xaml @@ -31,6 +31,7 @@ Successfully updated file suffixes File suffixes can't be empty + Run As Different User Run As Administrator Open containing folder Disable this program from displaying diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index a37e9f2028..a135d1e805 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -191,12 +191,12 @@ namespace Wox.Plugin.Program ); } - public static bool StartProcess(ProcessStartInfo info) + public static bool StartProcess(Func runProcess, ProcessStartInfo info) { bool hide; try { - Process.Start(info); + runProcess(info); hide = true; } catch (Exception) diff --git a/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/Plugins/Wox.Plugin.Program/Programs/UWP.cs index 2c608807b4..e73371cd14 100644 --- a/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -320,7 +320,7 @@ namespace Wox.Plugin.Program.Programs Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), Action = _ => { - var hide = Main.StartProcess(new ProcessStartInfo(Package.Location)); + var hide = Main.StartProcess(Process.Start, new ProcessStartInfo(Package.Location)); return hide; }, IcoPath = "Images/folder.png" diff --git a/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/Plugins/Wox.Plugin.Program/Programs/Win32.cs index 36e08a3c46..ee34328d9a 100644 --- a/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -6,10 +6,12 @@ using System.Linq; using System.Runtime.InteropServices; using System.Security; using System.Text; +using System.Threading.Tasks; using Microsoft.Win32; using Shell; using Wox.Infrastructure; using Wox.Plugin.Program.Logger; +using Wox.Plugin.SharedCommands; namespace Wox.Plugin.Program.Programs { @@ -64,7 +66,7 @@ namespace Wox.Plugin.Program.Programs FileName = FullPath, WorkingDirectory = ParentDirectory }; - var hide = Main.StartProcess(info); + var hide = Main.StartProcess(Process.Start, info); return hide; } }; @@ -91,6 +93,19 @@ namespace Wox.Plugin.Program.Programs { var contextMenus = new List { + new Result + { + Title = api.GetTranslation("wox_plugin_program_run_as_different_user"), + Action = _ => + { + var info = FullPath.SetProcessStartInfo(ParentDirectory); + + Task.Run(() => Main.StartProcess(ShellCommand.RunAsDifferentUser, info)); + + return true; + }, + IcoPath = "Images/user.png" + }, new Result { Title = api.GetTranslation("wox_plugin_program_run_as_administrator"), @@ -102,7 +117,7 @@ namespace Wox.Plugin.Program.Programs WorkingDirectory = ParentDirectory, Verb = "runas" }; - var hide = Main.StartProcess(info); + var hide = Main.StartProcess(Process.Start, info); return hide; }, IcoPath = "Images/cmd.png" @@ -112,7 +127,7 @@ namespace Wox.Plugin.Program.Programs Title = api.GetTranslation("wox_plugin_program_open_containing_folder"), Action = _ => { - var hide = Main.StartProcess(new ProcessStartInfo(ParentDirectory)); + var hide = Main.StartProcess(Process.Start, new ProcessStartInfo(ParentDirectory)); return hide; }, IcoPath = "Images/folder.png" diff --git a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj index 850f972ca4..91dada0670 100644 --- a/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj +++ b/Plugins/Wox.Plugin.Program/Wox.Plugin.Program.csproj @@ -112,6 +112,9 @@ PreserveNewest + + Always + MSBuild:Compile Designer diff --git a/Wox.Plugin/SharedCommands/ShellCommand.cs b/Wox.Plugin/SharedCommands/ShellCommand.cs index d7071e7353..9da535150c 100644 --- a/Wox.Plugin/SharedCommands/ShellCommand.cs +++ b/Wox.Plugin/SharedCommands/ShellCommand.cs @@ -2,14 +2,65 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Runtime.InteropServices; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace Wox.Plugin.SharedCommands { public static class ShellCommand { - public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory="", string arguments = "", string verb = "") + public delegate bool EnumThreadDelegate(IntPtr hwnd, IntPtr lParam); + [DllImport("user32.dll")] static extern bool EnumThreadWindows(uint threadId, EnumThreadDelegate lpfn, IntPtr lParam); + [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount); + [DllImport("user32.dll")] static extern int GetWindowTextLength(IntPtr hwnd); + + private static bool containsSecurityWindow; + + public static Process RunAsDifferentUser(ProcessStartInfo processStartInfo) + { + processStartInfo.Verb = "RunAsUser"; + var process = Process.Start(processStartInfo); + + containsSecurityWindow = false; + while (!containsSecurityWindow) // wait for windows to bring up the "Windows Security" dialog + { + CheckSecurityWindow(); + Thread.Sleep(25); + } + while (containsSecurityWindow) // while this process contains a "Windows Security" dialog, stay open + { + containsSecurityWindow = false; + CheckSecurityWindow(); + Thread.Sleep(50); + } + + return process; + } + + private static void CheckSecurityWindow() + { + ProcessThreadCollection ptc = Process.GetCurrentProcess().Threads; + for (int i = 0; i < ptc.Count; i++) + EnumThreadWindows((uint)ptc[i].Id, CheckSecurityThread, IntPtr.Zero); + } + + private static bool CheckSecurityThread(IntPtr hwnd, IntPtr lParam) + { + if (GetWindowTitle(hwnd) == "Windows Security") + containsSecurityWindow = true; + return true; + } + + private static string GetWindowTitle(IntPtr hwnd) + { + StringBuilder sb = new StringBuilder(GetWindowTextLength(hwnd) + 1); + GetWindowText(hwnd, sb, sb.Capacity); + return sb.ToString(); + } + + public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "") { var info = new ProcessStartInfo { From 971e1cdbecb8278604c131eabaa4c704f08d17d5 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 11 Dec 2019 19:08:52 +0100 Subject: [PATCH 17/20] Fix highlighting for UWP results --- Plugins/Wox.Plugin.Program/Programs/UWP.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/Plugins/Wox.Plugin.Program/Programs/UWP.cs index b86cad51cf..9d893e7659 100644 --- a/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -300,8 +300,9 @@ namespace Wox.Plugin.Program.Programs } else if (!string.IsNullOrEmpty(Description)) { - result.Title = $"{DisplayName}: {Description}"; - result.TitleHighlightData = StringMatcher.FuzzySearch(query, DisplayName).MatchData; + var title = $"{DisplayName}: {Description}"; + result.Title = title; + result.TitleHighlightData = StringMatcher.FuzzySearch(query, title).MatchData; } else { From 0f9da7f5194486f1eb84562a13df804dfff3c1fa Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 11 Dec 2019 19:10:11 +0100 Subject: [PATCH 18/20] Always return filled result again --- Plugins/Wox.Plugin.Program/Main.cs | 4 ++-- Wox.Infrastructure/StringMatcher.cs | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index a37e9f2028..106ac9cfa7 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -78,8 +78,8 @@ namespace Wox.Plugin.Program } var results1 = win32.AsParallel() - .Where(p => p.Enabled) - .Select(p => p.Result(query.Search, _context.API)); + .Where(p => p.Enabled) + .Select(p => p.Result(query.Search, _context.API)); var results2 = uwps.AsParallel() .Where(p => p.Enabled) diff --git a/Wox.Infrastructure/StringMatcher.cs b/Wox.Infrastructure/StringMatcher.cs index f350e0e404..58ffa336fc 100644 --- a/Wox.Infrastructure/StringMatcher.cs +++ b/Wox.Infrastructure/StringMatcher.cs @@ -99,9 +99,7 @@ namespace Wox.Infrastructure RawScore = Math.Max(score, pinyinScore) }; - return result.Score > 0 ? - result : - new MatchResult { Success = false }; + return result; } return new MatchResult { Success = false }; From da798e7a5a08efd89162ad6efa750ec28124b812 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Thu, 12 Dec 2019 20:55:41 +1100 Subject: [PATCH 19/20] add run as different user option to context menu --- Plugins/Wox.Plugin.Shell/Images/user.png | Bin 0 -> 65650 bytes Plugins/Wox.Plugin.Shell/Languages/en.xaml | 1 + Plugins/Wox.Plugin.Shell/Main.cs | 72 ++++++++++++------ .../Wox.Plugin.Shell/Wox.Plugin.Shell.csproj | 3 + 4 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 Plugins/Wox.Plugin.Shell/Images/user.png diff --git a/Plugins/Wox.Plugin.Shell/Images/user.png b/Plugins/Wox.Plugin.Shell/Images/user.png new file mode 100644 index 0000000000000000000000000000000000000000..2d45c1ee919304a973641b387934dbd517979271 GIT binary patch literal 65650 zcmV*nKuEudP)KoEefB#uyts#u%fQWvShg+Wqc(&#Brg ze^l+-YrpDLoqKNg?e4Q|^{uMkUTgnq*WPQdy=&J#goP|*R{5P100{Wb>wy2|3E)4y z1vh`_6rhkZBgguMoQv@ggV8b+Eu$DOV=`W$e6T|Ka1}(WD9U9$K6gF1+y$aFkXi$1 z6+~-b9)a}=z(W8dFmiwu00jVC%?_NSy`II+#xaI1Sb(!TKarc0vtz zJ`a_h2lzA>jYd()+z44*}#L%E7Gah&3T1hHbkXb+{1)p_i~MjcO2SFc$y{C^ZJD z^I*LW%1+Z@=>*F0aX>vygQdUYvV4?TKZ(KUB=qF`WU#cZM_NOT^>c69*P7Ep7P4@> z3#sHco~gXkHA5VHE`y#R=kbLhseBcLJt)ilAUed83ojy-A7ot|gf91h)CgJ+!8)%D zF&I!yyotJ!MVuf5AkQN@Seu?lf4WTugF12H8X#*!+elhfPFd@9sO&gp`ID@R$7#6Z zGtm4vvg~OvjlXfhT`cPHE?EJMejefaLNl=INpW)+DYsxCm89$kc!DNsca3C z@c{sbpeJ7o&9_0R!(2}G16YABR?P69!HU>8r0R+}VXiz^=pY$j0#SVofIv2YWd;e4 zC)_1iV7~LM@-x;v+cR?UbK?4#Y-$al;-vDk0M1f2cp6$i3Z=dPmH#ckk0W1ticy@@ z+3@@Z@%TiZ18=>i?Wru}3YUfBy-H=@uRN>Nq!<$AYplzI#C$uzUk@&CgVwjRE_VaG zQcV@Gs+?4}?~#sHlql|2WgJ`c*i0HXiMM4u;>J;}N_sRx7cGw07~{Nye3daMh%Ol0AB zuOeCc&11Os>@Xj4zJ~FIBhdOTl#`c&a68IkFTg9z

PbOc!t+-8s$(Xa?|2G$~zC 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≠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 literal 0 HcmV?d00001 diff --git a/Plugins/Wox.Plugin.Shell/Languages/en.xaml b/Plugins/Wox.Plugin.Shell/Languages/en.xaml index 6f56e83f58..0d0a41b3f1 100644 --- a/Plugins/Wox.Plugin.Shell/Languages/en.xaml +++ b/Plugins/Wox.Plugin.Shell/Languages/en.xaml @@ -5,6 +5,7 @@ Replace Win+R Do not close Command Prompt after command execution Always run as administrator + Run as different user Shell Allows to execute system commands from Wox. Commands should start with > this command has been executed {0} times diff --git a/Plugins/Wox.Plugin.Shell/Main.cs b/Plugins/Wox.Plugin.Shell/Main.cs index 323cfb5cd3..1a5174c4e4 100644 --- a/Plugins/Wox.Plugin.Shell/Main.cs +++ b/Plugins/Wox.Plugin.Shell/Main.cs @@ -1,8 +1,10 @@ -using System; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; +using System.Threading.Tasks; using System.Windows; using WindowsInput; using WindowsInput.Native; @@ -84,7 +86,7 @@ namespace Wox.Plugin.Shell IcoPath = Image, Action = c => { - Execute(m); + Execute(Process.Start, PrepareProcessStartInfo(m)); return true; } })); @@ -117,7 +119,7 @@ namespace Wox.Plugin.Shell IcoPath = Image, Action = c => { - Execute(m.Key); + Execute(Process.Start, PrepareProcessStartInfo(m.Key)); return true; } }; @@ -136,7 +138,7 @@ namespace Wox.Plugin.Shell IcoPath = Image, Action = c => { - Execute(cmd); + Execute(Process.Start, PrepareProcessStartInfo(cmd)); return true; } }; @@ -154,14 +156,14 @@ namespace Wox.Plugin.Shell IcoPath = Image, Action = c => { - Execute(m.Key); + Execute(Process.Start, PrepareProcessStartInfo(m.Key)); return true; } }).Take(5); return history.ToList(); } - private void Execute(string command, bool runAsAdministrator = false) + private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false) { command = command.Trim(); command = Environment.ExpandEnvironmentVariables(command); @@ -212,19 +214,33 @@ namespace Wox.Plugin.Shell } else { - return; + throw new NotImplementedException(); } info.UseShellExecute = true; + _settings.AddCmdHistory(command); + + return info; + } + + private void Execute(Func startProcess,ProcessStartInfo info) + { try { - Process.Start(info); - _settings.AddCmdHistory(command); + startProcess(info); } catch (FileNotFoundException e) { - MessageBox.Show($"Command not found: {e.Message}"); + var name = "Plugin: Shell"; + var message = $"Command not found: {e.Message}"; + _context.API.ShowMsg(name, message); + } + catch(Win32Exception e) + { + var name = "Plugin: Shell"; + var message = $"Error running the command: {e.Message}"; + _context.API.ShowMsg(name, message); } } @@ -306,19 +322,31 @@ namespace Wox.Plugin.Shell public List LoadContextMenus(Result selectedResult) { - return new List + var resultlist = new List { - new Result - { - Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_administrator"), - Action = c => - { - Execute(selectedResult.Title, true); - return true; - }, - IcoPath = Image - } - }; + new Result + { + Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_different_user"), + Action = c => + { + Task.Run(() =>Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title))); + return true; + }, + IcoPath = "Images/user.png" + }, + new Result + { + Title = _context.API.GetTranslation("wox_plugin_cmd_run_as_administrator"), + Action = c => + { + Execute(Process.Start, PrepareProcessStartInfo(selectedResult.Title, true)); + return true; + }, + IcoPath = Image + } + }; + + return resultlist; } } } diff --git a/Plugins/Wox.Plugin.Shell/Wox.Plugin.Shell.csproj b/Plugins/Wox.Plugin.Shell/Wox.Plugin.Shell.csproj index 2291f78bb8..270a55c3b4 100644 --- a/Plugins/Wox.Plugin.Shell/Wox.Plugin.Shell.csproj +++ b/Plugins/Wox.Plugin.Shell/Wox.Plugin.Shell.csproj @@ -70,6 +70,9 @@ + + Always + MSBuild:Compile Designer From 5139bc326a60377267deee243f83959ba18ddf1e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 13 Dec 2019 07:36:12 +1100 Subject: [PATCH 20/20] Fix bug from merge in Folder plugin --- Plugins/Wox.Plugin.Folder/Main.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Plugins/Wox.Plugin.Folder/Main.cs b/Plugins/Wox.Plugin.Folder/Main.cs index 7775398ff5..d7b5a15697 100644 --- a/Plugins/Wox.Plugin.Folder/Main.cs +++ b/Plugins/Wox.Plugin.Folder/Main.cs @@ -165,8 +165,7 @@ namespace Wox.Plugin.Folder searchOption = SearchOption.AllDirectories; incompleteName = incompleteName.Substring(1); } - - string searchNickname = new FolderLink { Path = query.Search }.Nickname; + try { // search folder and add results