diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 0798857ed..4afedb9e4 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -25,23 +25,29 @@ namespace Flow.Launcher.Plugin.Program.Programs public string Name { get; set; } public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); } // For path comparison public string IcoPath { get; set; } + /// /// Path of the file. It's the path of .lnk and .url for .lnk and .url files. /// public string FullPath { get; set; } + /// /// Path of the executable for .lnk, or the URL for .url. Arguments are included if any. /// public string LnkResolvedPath { get; set; } + /// /// Path of the actual executable file. Args are included. /// public string ExecutablePath => LnkResolvedPath ?? FullPath; + public string ParentDirectory { get; set; } + /// /// Name of the executable for .lnk files /// public string ExecutableName { get; set; } + public string Description { get; set; } public bool Valid { get; set; } public bool Enabled { get; set; } @@ -199,8 +205,8 @@ namespace Flow.Launcher.Plugin.Program.Programs { var info = new ProcessStartInfo { - FileName = FullPath, - WorkingDirectory = ParentDirectory, + FileName = FullPath, + WorkingDirectory = ParentDirectory, UseShellExecute = true }; @@ -363,6 +369,7 @@ namespace Flow.Launcher.Plugin.Program.Programs { return program; } + foreach (var protocol in protocols) { if (url.StartsWith(protocol)) @@ -418,10 +425,10 @@ namespace Flow.Launcher.Plugin.Program.Programs if (!Directory.Exists(directory)) return Enumerable.Empty(); - return Directory.EnumerateFiles(directory, "*", new EnumerationOptions - { - IgnoreInaccessible = true, RecurseSubdirectories = recursive - }).Where(x => suffixes.Contains(Extension(x))); + return Directory.EnumerateFiles( + directory, "*", + new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = recursive }) + .Where(x => suffixes.Contains(Extension(x))); } private static string Extension(string path) @@ -450,14 +457,11 @@ namespace Flow.Launcher.Plugin.Program.Programs private static IEnumerable StartMenuPrograms(string[] suffixes, string[] protocols) { - var directory1 = Environment.GetFolderPath(Environment.SpecialFolder.Programs); - var directory2 = Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms); - var paths1 = EnumerateProgramsInDir(directory1, suffixes); - var paths2 = EnumerateProgramsInDir(directory2, suffixes); + var allPrograms = GetStartMenuPaths() + .SelectMany(p => EnumerateProgramsInDir(p, suffixes)) + .Distinct(); - var toFilter = paths1.Concat(paths2); - - var programs = ExceptDisabledSource(toFilter.Distinct()) + var programs = ExceptDisabledSource(allPrograms) .Select(x => GetProgramFromPath(x, protocols)); return programs; } @@ -471,7 +475,7 @@ namespace Flow.Launcher.Plugin.Program.Programs } var paths = pathEnv.Split(";", StringSplitOptions.RemoveEmptyEntries).DistinctBy(p => p.ToLowerInvariant()); - + var toFilter = paths.Where(x => commonParents.All(parent => !FilesFolders.PathContains(parent, x))) .AsParallel() .SelectMany(p => EnumerateProgramsInDir(p, suffixes, recursive: false)); @@ -695,12 +699,10 @@ namespace Flow.Launcher.Plugin.Program.Programs private static IEnumerable GetStartMenuPaths() { - var directory1 = Environment.GetFolderPath(Environment.SpecialFolder.Programs); - var directory2 = Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms); - return new[] - { - directory1, directory2 - }; + var userStartMenu = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu); + var commonStartMenu = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu); + + return new[] { userStartMenu, commonStartMenu }; } public static void WatchProgramUpdate(Settings settings)