From f51c391e84ae03ab096cefc1b7bfd45a5a3dc5a1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Thu, 5 Sep 2019 08:05:17 +1000 Subject: [PATCH 01/31] Enable user selected program loading only Update logic, add program source only loading --- Plugins/Wox.Plugin.Program/Main.cs | 90 ++++++++++++++------ Plugins/Wox.Plugin.Program/Programs/UWP.cs | 14 +++ Plugins/Wox.Plugin.Program/Programs/Win32.cs | 30 +++++-- Plugins/Wox.Plugin.Program/Settings.cs | 4 + 4 files changed, 105 insertions(+), 33 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index 7cdb3507b0..880e881c92 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; @@ -31,7 +31,7 @@ namespace Wox.Plugin.Program _settingsStorage = new PluginJsonStorage(); _settings = _settingsStorage.Load(); - Stopwatch.Normal("|Wox.Plugin.Program.Main|Preload programs cost", () => + var preloadcost = Stopwatch.Normal("|Wox.Plugin.Program.Main|Preload programs cost", () => { _win32Storage = new BinaryStorage("Win32"); _win32s = _win32Storage.TryLoad(new Win32[] { }); @@ -40,10 +40,48 @@ namespace Wox.Plugin.Program }); Log.Info($"|Wox.Plugin.Program.Main|Number of preload win32 programs <{_win32s.Length}>"); Log.Info($"|Wox.Plugin.Program.Main|Number of preload uwps <{_uwps.Length}>"); - Task.Run(() => + + //########DELETE + long win32indexcost = 0; + long uwpindexcost = 0; + + var a = Task.Run(() => { - Stopwatch.Normal("|Wox.Plugin.Program.Main|Program index cost", IndexPrograms); + if (!_win32s.Any()) + win32indexcost = Stopwatch.Normal("|Wox.Plugin.Program.Main|Win32Program index cost", IndexWin32Programs); }); + + var b = Task.Run(() => + { + if (!_uwps.Any()) + uwpindexcost = Stopwatch.Normal("|Wox.Plugin.Program.Main|Win32Program index cost", IndexUWPPrograms); + }); + + Task.WaitAll(a, b); + + //########DELETE + /* + * With roaming folder already + Preload programs cost <24ms> + Program index cost <3163ms> + + no roaming yet (clean) + Preload programs cost <79ms> + Program index cost <2900ms> + * + * + */ + + long totalindexcost = win32indexcost + uwpindexcost; + + if (preloadcost > 70 || totalindexcost > 4000) + { +#if DEBUG +#else + throw e +#endif + } + //########DELETE } public void Save() @@ -69,36 +107,36 @@ namespace Wox.Plugin.Program _context = context; } - public static void IndexPrograms() + public static void IndexWin32Programs() { - Win32[] w = { }; - UWP.Application[] u = { }; - var t1 = Task.Run(() => + lock (IndexLock) { - w = Win32.All(_settings); - }); - var t2 = Task.Run(() => - { - var windows10 = new Version(10, 0); - var support = Environment.OSVersion.Version.Major >= windows10.Major; - if (support) - { - u = UWP.All(); - } - else - { - u = new UWP.Application[] { }; - } - }); - Task.WaitAll(t1, t2); + _win32s = Win32.All(_settings); + } + } + + public static void IndexUWPPrograms() + { + var windows10 = new Version(10, 0); + var support = Environment.OSVersion.Version.Major >= windows10.Major; lock (IndexLock) { - _win32s = w; - _uwps = u; + var allUWPs = support ? UWP.All() : new UWP.Application[] { }; + + _uwps = UWP.RetainApplications(allUWPs, _settings.ProgramSources, _settings.EnableProgramSourceOnly); } } + public static void IndexPrograms() + { + var t1 = Task.Run(() => { IndexWin32Programs(); }); + + var t2 = Task.Run(() => { IndexUWPPrograms(); }); + + Task.WaitAll(t1, t2); + } + public Control CreateSettingPanel() { return new ProgramSetting(_context, _settings); diff --git a/Plugins/Wox.Plugin.Program/Programs/UWP.cs b/Plugins/Wox.Plugin.Program/Programs/UWP.cs index bad8fece95..2fce5165d6 100644 --- a/Plugins/Wox.Plugin.Program/Programs/UWP.cs +++ b/Plugins/Wox.Plugin.Program/Programs/UWP.cs @@ -202,6 +202,20 @@ namespace Wox.Plugin.Program.Programs } } + public static Application[] RetainApplications(Application[] applications, List applicationsToRetainPaths, bool enableProgramSourceOnly) + { + if(enableProgramSourceOnly) + return applications + .Where(t1 => applicationsToRetainPaths + .Any(x => x.LocationFile == t1.Package.Location + && x.EnableIndexing)) + .Select(t1 => t1).ToArray(); + + // Do not return if the application is disabled for indexing + return applications.Where(t1 => !applicationsToRetainPaths.Any(x => x.LocationFile == t1.Package.Location && !x.EnableIndexing)) + .Select(t1 => t1).ToArray(); + } + public override string ToString() { return FamilyName; diff --git a/Plugins/Wox.Plugin.Program/Programs/Win32.cs b/Plugins/Wox.Plugin.Program/Programs/Win32.cs index 6ac53fa922..4e2c5b2c7a 100644 --- a/Plugins/Wox.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Wox.Plugin.Program/Programs/Win32.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; @@ -262,9 +262,19 @@ namespace Wox.Plugin.Program.Programs private static ParallelQuery UnregisteredPrograms(List sources, string[] suffixes) { - var paths = sources.Where(s => Directory.Exists(s.Location)) - .SelectMany(s => ProgramPaths(s.Location, suffixes)) - .ToArray(); + var list = new List(); + sources.Where(s => Directory.Exists(s.Location) && s.EnableIndexing) + .SelectMany(s => ProgramPaths(s.Location, suffixes)) + .ToList() + .ForEach(x => list.Add(x)); + + sources.Where(x=> File.Exists(x.LocationFile) && x.EnableIndexing) + .Select(y => y.LocationFile) + .ToList() + .ForEach(z => list.Add(z)); + + var paths = list.ToArray(); + var programs1 = paths.AsParallel().Where(p => Extension(p) == ExeExtension).Select(ExeProgram); var programs2 = paths.AsParallel().Where(p => Extension(p) == ShortcutExtension).Select(ExeProgram); var programs3 = from p in paths.AsParallel() @@ -384,18 +394,24 @@ namespace Wox.Plugin.Program.Programs public static Win32[] All(Settings settings) { ParallelQuery programs = new List().AsParallel(); + + var unregistered = UnregisteredPrograms(settings.ProgramSources, settings.ProgramSuffixes); + programs = programs.Concat(unregistered); + + if (settings.EnableProgramSourceOnly) + return programs.ToArray(); + if (settings.EnableRegistrySource) { var appPaths = AppPathsPrograms(settings.ProgramSuffixes); programs = programs.Concat(appPaths); } + if (settings.EnableStartMenuSource) { var startMenu = StartMenuPrograms(settings.ProgramSuffixes); programs = programs.Concat(startMenu); - } - var unregistered = UnregisteredPrograms(settings.ProgramSources, settings.ProgramSuffixes); - programs = programs.Concat(unregistered); + } //.Select(ScoreFilter); return programs.ToArray(); } diff --git a/Plugins/Wox.Plugin.Program/Settings.cs b/Plugins/Wox.Plugin.Program/Settings.cs index 9c981a4e00..12db7108dc 100644 --- a/Plugins/Wox.Plugin.Program/Settings.cs +++ b/Plugins/Wox.Plugin.Program/Settings.cs @@ -12,11 +12,15 @@ namespace Wox.Plugin.Program public bool EnableRegistrySource { get; set; } = true; + public bool EnableProgramSourceOnly { get; set; } = false; + internal const char SuffixSeperator = ';'; public class ProgramSource { public string Location { get; set; } + public string LocationFile { get; set; } + public bool EnableIndexing { get; set; } = true; } } } From 9d3f0d45d5d1f0ece5a337f0fa3d221bbfa02561 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 6 Sep 2019 08:06:51 +1000 Subject: [PATCH 02/31] Add display of all loaded applications --- Plugins/Wox.Plugin.Program/AddProgramSource.xaml.cs | 2 +- Plugins/Wox.Plugin.Program/Main.cs | 13 +++++++++++++ Plugins/Wox.Plugin.Program/ProgramSetting.xaml | 8 ++++++++ Plugins/Wox.Plugin.Program/ProgramSetting.xaml.cs | 9 +++++++++ Plugins/Wox.Plugin.Program/Programs/UWP.cs | 6 +++--- Plugins/Wox.Plugin.Program/Programs/Win32.cs | 8 ++++---- Plugins/Wox.Plugin.Program/Settings.cs | 7 +++++-- 7 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Plugins/Wox.Plugin.Program/AddProgramSource.xaml.cs b/Plugins/Wox.Plugin.Program/AddProgramSource.xaml.cs index 063e1166a6..a8b090b86e 100644 --- a/Plugins/Wox.Plugin.Program/AddProgramSource.xaml.cs +++ b/Plugins/Wox.Plugin.Program/AddProgramSource.xaml.cs @@ -54,7 +54,7 @@ namespace Wox.Plugin.Program { Location = Directory.Text, }; - _settings.ProgramSources.Add(source); + _settings.ProgramSources.Insert(0, source); } else { diff --git a/Plugins/Wox.Plugin.Program/Main.cs b/Plugins/Wox.Plugin.Program/Main.cs index 880e881c92..bdeb46576a 100644 --- a/Plugins/Wox.Plugin.Program/Main.cs +++ b/Plugins/Wox.Plugin.Program/Main.cs @@ -137,6 +137,19 @@ namespace Wox.Plugin.Program Task.WaitAll(t1, t2); } + public static void AddLoadedApplicationsToSettings() + { + _win32s + .Where(t1 => !_settings.ProgramSources.Any(x => x.Name == t1.Name)) + .ToList() + .ForEach(t1 => _settings.ProgramSources.Add(new Settings.ProgramSource (){Name = t1.Name, Location = t1.ParentDirectory })); + + _uwps + .Where(t1 => !_settings.ProgramSources.Any(x => x.Name == t1.DisplayName)) + .ToList() + .ForEach(t1 => _settings.ProgramSources.Add(new Settings.ProgramSource() { Name = t1.DisplayName, Location = t1.Package.Location })); + } + public Control CreateSettingPanel() { return new ProgramSetting(_context, _settings); diff --git a/Plugins/Wox.Plugin.Program/ProgramSetting.xaml b/Plugins/Wox.Plugin.Program/ProgramSetting.xaml index 2636e349f4..f1aa7ae609 100644 --- a/Plugins/Wox.Plugin.Program/ProgramSetting.xaml +++ b/Plugins/Wox.Plugin.Program/ProgramSetting.xaml @@ -25,6 +25,13 @@ Drop="programSourceView_Drop" > + + + + + + + @@ -44,6 +51,7 @@