diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Apps.UnitTests/Settings.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Apps.UnitTests/Settings.cs index b48abaf32a..a022f79016 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Apps.UnitTests/Settings.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Apps.UnitTests/Settings.cs @@ -13,6 +13,8 @@ public class Settings : ISettingsInterface private readonly bool enableDesktopSource; private readonly bool enableRegistrySource; private readonly bool enablePathEnvironmentVariableSource; + private readonly bool includeNonAppsOnDesktop; + private readonly bool includeNonAppsInStartMenu; private readonly List programSuffixes; private readonly List runCommandSuffixes; @@ -21,6 +23,8 @@ public class Settings : ISettingsInterface bool enableDesktopSource = true, bool enableRegistrySource = true, bool enablePathEnvironmentVariableSource = true, + bool includeNonAppsOnDesktop = false, + bool includeNonAppsInStartMenu = true, List programSuffixes = null, List runCommandSuffixes = null) { @@ -28,6 +32,8 @@ public class Settings : ISettingsInterface this.enableDesktopSource = enableDesktopSource; this.enableRegistrySource = enableRegistrySource; this.enablePathEnvironmentVariableSource = enablePathEnvironmentVariableSource; + this.includeNonAppsOnDesktop = includeNonAppsOnDesktop; + this.includeNonAppsInStartMenu = includeNonAppsInStartMenu; this.programSuffixes = programSuffixes ?? new List { "bat", "appref-ms", "exe", "lnk", "url" }; this.runCommandSuffixes = runCommandSuffixes ?? new List { "bat", "appref-ms", "exe", "lnk", "url", "cpl", "msc" }; } @@ -40,6 +46,10 @@ public class Settings : ISettingsInterface public bool EnablePathEnvironmentVariableSource => enablePathEnvironmentVariableSource; + public bool IncludeNonAppsOnDesktop => includeNonAppsOnDesktop; + + public bool IncludeNonAppsInStartMenu => includeNonAppsInStartMenu; + public List ProgramSuffixes => programSuffixes; public List RunCommandSuffixes => runCommandSuffixes; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/AllAppsSettings.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/AllAppsSettings.cs index 924285e1ef..fb90a7fe9a 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/AllAppsSettings.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/AllAppsSettings.cs @@ -62,6 +62,10 @@ public class AllAppsSettings : JsonSettingsManager, ISettingsInterface public bool EnablePathEnvironmentVariableSource => _enablePathEnvironmentVariableSource.Value; + public bool IncludeNonAppsOnDesktop => _includeNonAppsOnDesktop.Value; + + public bool IncludeNonAppsInStartMenu => _includeNonAppsInStartMenu.Value; + private readonly ChoiceSetSetting _searchResultLimitSource = new( Namespaced(nameof(SearchResultLimit)), Resources.limit_fallback_results_source, @@ -121,6 +125,18 @@ public class AllAppsSettings : JsonSettingsManager, ISettingsInterface string.Empty, false); // this one is very VERY noisy + private readonly ToggleSetting _includeNonAppsOnDesktop = new( + Namespaced(nameof(IncludeNonAppsOnDesktop)), + Resources.include_non_apps_on_desktop, + string.Empty, + false); + + private readonly ToggleSetting _includeNonAppsInStartMenu = new( + Namespaced(nameof(IncludeNonAppsInStartMenu)), + Resources.include_non_apps_in_start_menu, + string.Empty, + true); + public double MinScoreThreshold { get; set; } = 0.75; internal const char SuffixSeparator = ';'; @@ -139,7 +155,9 @@ public class AllAppsSettings : JsonSettingsManager, ISettingsInterface FilePath = SettingsJsonPath(); Settings.Add(_enableStartMenuSource); + Settings.Add(_includeNonAppsInStartMenu); Settings.Add(_enableDesktopSource); + Settings.Add(_includeNonAppsOnDesktop); Settings.Add(_enableRegistrySource); Settings.Add(_enablePathEnvironmentVariableSource); Settings.Add(_searchResultLimitSource); diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Helpers/ISettingsInterface.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Helpers/ISettingsInterface.cs index b6328f3c10..cda92acf5c 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Helpers/ISettingsInterface.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Helpers/ISettingsInterface.cs @@ -19,4 +19,8 @@ public interface ISettingsInterface public List ProgramSuffixes { get; } public List RunCommandSuffixes { get; } + + public bool IncludeNonAppsOnDesktop { get; } + + public bool IncludeNonAppsInStartMenu { get; } } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Programs/Win32Program.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Programs/Win32Program.cs index 1de01b408e..ffd00ce7c8 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Programs/Win32Program.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Programs/Win32Program.cs @@ -409,9 +409,37 @@ public class Win32Program : IProgram program.Description = info.FileDescription; } } + + if (program.AppType is ApplicationType.GenericFile or ApplicationType.Folder) + { + var includeNonAppsOnDesktop = AllAppsSettings.Instance.IncludeNonAppsOnDesktop; + var includeNonAppsInStartMenu = AllAppsSettings.Instance.IncludeNonAppsInStartMenu; + + var lnk = program.LnkFilePath; + if (!string.IsNullOrEmpty(lnk)) + { + var isDesktop = StartsWithFolder(lnk, Environment.SpecialFolder.Desktop) || + StartsWithFolder(lnk, Environment.SpecialFolder.CommonDesktopDirectory); + + var isStartMenu = StartsWithFolder(lnk, Environment.SpecialFolder.StartMenu) || + StartsWithFolder(lnk, Environment.SpecialFolder.CommonStartMenu); + + if ((isDesktop && !includeNonAppsOnDesktop) || (isStartMenu && !includeNonAppsInStartMenu)) + { + program.Enabled = false; + } + } + } } return program; + + static bool StartsWithFolder(string path, Environment.SpecialFolder folder) + { + var folderPath = Environment.GetFolderPath(folder, Environment.SpecialFolderOption.DoNotVerify); + return !string.IsNullOrEmpty(folderPath) + && path.StartsWith(folderPath, StringComparison.OrdinalIgnoreCase); + } } catch (System.IO.FileLoadException e) { diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.Designer.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.Designer.cs index 8b16bdc2f5..f8015e6632 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.Designer.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.Designer.cs @@ -106,7 +106,7 @@ namespace Microsoft.CmdPal.Ext.Apps.Properties { } /// - /// Looks up a localized string similar to Include apps registered in the Registry. + /// Looks up a localized string similar to Include apps registered in the Windows Registry. /// internal static string enable_registry_source { get { @@ -115,7 +115,7 @@ namespace Microsoft.CmdPal.Ext.Apps.Properties { } /// - /// Looks up a localized string similar to Include apps found in the Start Menu. + /// Looks up a localized string similar to Include apps found in the Start menu. /// internal static string enable_start_menu_source { get { @@ -141,6 +141,24 @@ namespace Microsoft.CmdPal.Ext.Apps.Properties { } } + /// + /// Looks up a localized string similar to Also include non-app shortcuts from the Start menu. + /// + internal static string include_non_apps_in_start_menu { + get { + return ResourceManager.GetString("include_non_apps_in_start_menu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Also include non-app shortcuts from the desktop. + /// + internal static string include_non_apps_on_desktop { + get { + return ResourceManager.GetString("include_non_apps_on_desktop", resourceCulture); + } + } + /// /// Looks up a localized string similar to Installed apps. /// diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.resx b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.resx index e7fdbb0013..b2b260a93f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.resx +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Apps/Properties/Resources.resx @@ -1,17 +1,17 @@  - @@ -170,13 +170,13 @@ Run as different user - Include apps found in the Start Menu + Include apps found in the Start menu Include apps found on the desktop - Include apps registered in the Registry + Include apps registered in the Windows Registry Include apps anywhere on the %PATH% @@ -238,4 +238,10 @@ Default ({0}) default option; {0} = number of items + + Also include non-app shortcuts from the desktop + + + Also include non-app shortcuts from the Start menu + \ No newline at end of file