Skip to content

Commit 8dcb100

Browse files
Feature: Added "run" settings to properties window for shortcut files (#16672)
1 parent e9199bd commit 8dcb100

File tree

15 files changed

+112
-22
lines changed

15 files changed

+112
-22
lines changed

src/Files.App/Data/Items/ListedItem.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.IO;
1111
using System.Text;
1212
using Windows.Storage;
13+
using Windows.Win32.UI.WindowsAndMessaging;
1314

1415
#pragma warning disable CS0618 // Type or member is obsolete
1516

@@ -526,6 +527,7 @@ public override string Name
526527
public string Arguments { get; set; }
527528
public string WorkingDirectory { get; set; }
528529
public bool RunAsAdmin { get; set; }
530+
public SHOW_WINDOW_CMD ShowWindowCommand { get; set; }
529531
public bool IsUrl { get; set; }
530532
public bool IsSymLink { get; set; }
531533
public override bool IsExecutable => FileExtensionHelpers.IsExecutableFile(TargetPath, true);
@@ -678,7 +680,7 @@ public string? GitLastCommitFullSha
678680
set => SetProperty(ref _GitLastCommitFullSha, value);
679681
}
680682
}
681-
public sealed class GitShortcutItem : GitItem,IShortcutItem
683+
public sealed class GitShortcutItem : GitItem, IShortcutItem
682684
{
683685
private volatile int statusPropertiesInitialized = 0;
684686
public bool StatusPropertiesInitialized
@@ -762,6 +764,7 @@ public override string Name
762764
public string Arguments { get; set; }
763765
public string WorkingDirectory { get; set; }
764766
public bool RunAsAdmin { get; set; }
767+
public SHOW_WINDOW_CMD ShowWindowCommand { get; set; }
765768
public bool IsUrl { get; set; }
766769
public bool IsSymLink { get; set; }
767770
public override bool IsExecutable => FileExtensionHelpers.IsExecutableFile(TargetPath, true);
@@ -800,11 +803,9 @@ public interface IShortcutItem
800803
public string Arguments { get; set; }
801804
public string WorkingDirectory { get; set; }
802805
public bool RunAsAdmin { get; set; }
806+
public SHOW_WINDOW_CMD ShowWindowCommand { get; set; }
803807
public bool IsUrl { get; set; }
804808
public bool IsSymLink { get; set; }
805-
806809
public bool IsExecutable { get; }
807-
808-
809810
}
810811
}

src/Files.App/Data/Items/ShellLinkItem.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Files Community
22
// Licensed under the MIT License.
33

4+
using Windows.Win32.UI.WindowsAndMessaging;
5+
46
namespace Files.App.Data.Items
57
{
68
public sealed class ShellLinkItem : ShellFileItem
@@ -15,6 +17,8 @@ public sealed class ShellLinkItem : ShellFileItem
1517

1618
public bool InvalidTarget { get; set; }
1719

20+
public SHOW_WINDOW_CMD ShowWindowCommand { get; set; }
21+
1822
public ShellLinkItem()
1923
{
2024
}

src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Files.Shared.Helpers;
66
using System.Windows.Input;
77
using TagLib;
8+
using Windows.Win32.UI.WindowsAndMessaging;
89

910
namespace Files.App.Data.Models
1011
{
@@ -526,7 +527,6 @@ public bool IsItemSelected
526527

527528
public SelectedItemsPropertiesViewModel()
528529
{
529-
530530
}
531531

532532
private bool isSelectedItemImage = false;
@@ -782,6 +782,56 @@ public bool RunAsAdminEnabled
782782
set => SetProperty(ref runAsAdminEnabled, value);
783783
}
784784

785+
private static readonly IReadOnlyDictionary<SHOW_WINDOW_CMD, string> showWindowCommandTypes = new Dictionary<SHOW_WINDOW_CMD, string>
786+
{
787+
{ SHOW_WINDOW_CMD.SW_NORMAL, Strings.NormalWindow.GetLocalizedResource() },
788+
{ SHOW_WINDOW_CMD.SW_SHOWMINNOACTIVE, Strings.Minimized.GetLocalizedResource() },
789+
{ SHOW_WINDOW_CMD.SW_MAXIMIZE, Strings.Maximized.GetLocalizedResource() }
790+
}.AsReadOnly();
791+
792+
/// <summary>
793+
/// The available show window command types.
794+
/// </summary>
795+
public IReadOnlyDictionary<SHOW_WINDOW_CMD, string> ShowWindowCommandTypes { get => showWindowCommandTypes; }
796+
797+
/// <summary>
798+
/// The localized string of the currently selected ShowWindowCommand.
799+
/// This value can be used for display in the UI.
800+
/// </summary>
801+
public string SelectedShowWindowCommand
802+
{
803+
get => ShowWindowCommandTypes.GetValueOrDefault(ShowWindowCommandEditedValue)!;
804+
set => ShowWindowCommandEditedValue = ShowWindowCommandTypes.First(e => e.Value == value).Key;
805+
}
806+
807+
private SHOW_WINDOW_CMD showWindowCommand;
808+
/// <summary>
809+
/// The current <see cref="SHOW_WINDOW_CMD"/> property of the item.
810+
/// </summary>
811+
public SHOW_WINDOW_CMD ShowWindowCommand
812+
{
813+
get => showWindowCommand;
814+
set
815+
{
816+
if (SetProperty(ref showWindowCommand, value))
817+
ShowWindowCommandEditedValue = value;
818+
}
819+
}
820+
821+
private SHOW_WINDOW_CMD showWindowCommandEditedValue;
822+
/// <summary>
823+
/// The edited <see cref="SHOW_WINDOW_CMD"/> property of the item.
824+
/// </summary>
825+
public SHOW_WINDOW_CMD ShowWindowCommandEditedValue
826+
{
827+
get => showWindowCommandEditedValue;
828+
set
829+
{
830+
if (SetProperty(ref showWindowCommandEditedValue, value))
831+
OnPropertyChanged(nameof(SelectedShowWindowCommand));
832+
}
833+
}
834+
785835
private bool isPropertiesLoaded;
786836
public bool IsPropertiesLoaded
787837
{

src/Files.App/Helpers/UI/UIFilesystemHelpers.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Text;
99
using Windows.ApplicationModel.DataTransfer;
1010
using Windows.Storage;
11+
using Windows.Win32.UI.WindowsAndMessaging;
1112

1213
namespace Files.App.Helpers
1314
{
@@ -245,17 +246,13 @@ public static async Task<bool> HandleShortcutCannotBeCreated(string shortcutName
245246
/// <summary>
246247
/// Updates ListedItem properties for a shortcut
247248
/// </summary>
248-
/// <param name="item"></param>
249-
/// <param name="targetPath"></param>
250-
/// <param name="arguments"></param>
251-
/// <param name="workingDir"></param>
252-
/// <param name="runAsAdmin"></param>
253-
public static void UpdateShortcutItemProperties(IShortcutItem item, string targetPath, string arguments, string workingDir, bool runAsAdmin)
249+
public static void UpdateShortcutItemProperties(IShortcutItem item, string targetPath, string arguments, string workingDir, bool runAsAdmin, SHOW_WINDOW_CMD showWindowCommand)
254250
{
255251
item.TargetPath = Environment.ExpandEnvironmentVariables(targetPath);
256252
item.Arguments = arguments;
257253
item.WorkingDirectory = workingDir;
258254
item.RunAsAdmin = runAsAdmin;
255+
item.ShowWindowCommand = showWindowCommand;
259256
}
260257

261258
public async static Task<StorageCredential> RequestPassword(IPasswordProtectedItem sender)

src/Files.App/Strings/en-US/Resources.resw

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,18 @@
18381838
<data name="CompatibilityRegisterThisProgramForRestart" xml:space="preserve">
18391839
<value>Register this program for restart</value>
18401840
</data>
1841+
<data name="StartWindow" xml:space="preserve">
1842+
<value>Start window</value>
1843+
</data>
1844+
<data name="NormalWindow" xml:space="preserve">
1845+
<value>Normal window</value>
1846+
</data>
1847+
<data name="Minimized" xml:space="preserve">
1848+
<value>Minimized</value>
1849+
</data>
1850+
<data name="Maximized" xml:space="preserve">
1851+
<value>Maximized</value>
1852+
</data>
18411853
<data name="RunAsAdministrator" xml:space="preserve">
18421854
<value>Run as administrator</value>
18431855
</data>

src/Files.App/Utils/Shell/ShellFolderExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public static ShellLinkItem GetShellLinkItem(ShellLink linkItem)
127127
{
128128
IsFolder = !string.IsNullOrEmpty(linkItem.TargetPath) && linkItem.Target.IsFolder,
129129
RunAsAdmin = linkItem.RunAsAdministrator,
130+
ShowWindowCommand = (Windows.Win32.UI.WindowsAndMessaging.SHOW_WINDOW_CMD)linkItem.ShowState,
130131
Arguments = linkItem.Arguments,
131132
WorkingDirectory = Environment.ExpandEnvironmentVariables(linkItem.WorkingDirectory),
132133
TargetPath = Environment.ExpandEnvironmentVariables(linkItem.TargetPath)

src/Files.App/Utils/Storage/Enumerators/UniversalStorageEnumerator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ public static async Task<ListedItem> AddFolderAsync(
193193
TargetPath = linkFolder.TargetPath,
194194
Arguments = linkFolder.Arguments,
195195
WorkingDirectory = linkFolder.WorkingDirectory,
196-
RunAsAdmin = linkFolder.RunAsAdmin
196+
RunAsAdmin = linkFolder.RunAsAdmin,
197+
ShowWindowCommand = linkFolder.ShowWindowCommand
197198
};
198199
}
199200
else if (folder is BinStorageFolder binFolder)
@@ -293,6 +294,7 @@ public static async Task<ListedItem> AddFileAsync(
293294
Arguments = linkFile.Arguments,
294295
WorkingDirectory = linkFile.WorkingDirectory,
295296
RunAsAdmin = linkFile.RunAsAdmin,
297+
ShowWindowCommand = linkFile.ShowWindowCommand,
296298
IsUrl = isUrl,
297299
};
298300
}

src/Files.App/Utils/Storage/Enumerators/Win32StorageEnumerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,6 @@ CancellationToken cancellationToken
319319
IsSymLink = true
320320
};
321321
}
322-
323322
}
324323
else if (FileExtensionHelpers.IsShortcutOrUrlFile(findData.cFileName))
325324
{
@@ -351,6 +350,7 @@ CancellationToken cancellationToken
351350
Arguments = shInfo.Arguments,
352351
WorkingDirectory = shInfo.WorkingDirectory,
353352
RunAsAdmin = shInfo.RunAsAdmin,
353+
ShowWindowCommand = shInfo.ShowWindowCommand,
354354
IsUrl = isUrl,
355355
};
356356
}
@@ -376,6 +376,7 @@ CancellationToken cancellationToken
376376
Arguments = shInfo.Arguments,
377377
WorkingDirectory = shInfo.WorkingDirectory,
378378
RunAsAdmin = shInfo.RunAsAdmin,
379+
ShowWindowCommand = shInfo.ShowWindowCommand,
379380
IsUrl = isUrl,
380381
};
381382
}

src/Files.App/Utils/Storage/Operations/FileOperationsHelpers.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Vanara.PInvoke;
1313
using Vanara.Windows.Shell;
1414
using Windows.ApplicationModel.DataTransfer;
15+
using Windows.Win32.UI.WindowsAndMessaging;
1516

1617
namespace Files.App.Utils.Storage
1718
{
@@ -733,7 +734,7 @@ public static void TryCancelOperation(string operationId)
733734
}
734735
}
735736

736-
public static Task<bool> CreateOrUpdateLinkAsync(string linkSavePath, string targetPath, string arguments = "", string workingDirectory = "", bool runAsAdmin = false)
737+
public static Task<bool> CreateOrUpdateLinkAsync(string linkSavePath, string targetPath, string arguments = "", string workingDirectory = "", bool runAsAdmin = false, SHOW_WINDOW_CMD showWindowCommand = SHOW_WINDOW_CMD.SW_NORMAL)
737738
{
738739
try
739740
{
@@ -746,6 +747,10 @@ public static Task<bool> CreateOrUpdateLinkAsync(string linkSavePath, string tar
746747
newLink.RunAsAdministrator = runAsAdmin;
747748

748749
newLink.SaveAs(linkSavePath); // Overwrite if exists
750+
751+
// ShowState has to be set after SaveAs has been called, otherwise an UnauthorizedAccessException gets thrown in some cases
752+
newLink.ShowState = (ShowWindowCommand)showWindowCommand;
753+
749754
return Task.FromResult(true);
750755
}
751756
else if (FileExtensionHelpers.IsWebLinkFile(linkSavePath))

src/Files.App/Utils/Storage/StorageItems/ShellStorageFile.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
// Licensed under the MIT License.
33

44
using System.Runtime.InteropServices.WindowsRuntime;
5+
using Vanara.PInvoke;
56
using Windows.Foundation;
67
using Windows.Storage;
78
using Windows.Storage.FileProperties;
89
using Windows.Storage.Streams;
10+
using Windows.Win32.UI.WindowsAndMessaging;
911
using IO = System.IO;
1012

1113
namespace Files.App.Utils.Storage
@@ -16,13 +18,15 @@ public sealed class ShortcutStorageFile : ShellStorageFile, IShortcutStorageItem
1618
public string Arguments { get; }
1719
public string WorkingDirectory { get; }
1820
public bool RunAsAdmin { get; }
21+
public SHOW_WINDOW_CMD ShowWindowCommand { get; set; }
1922

2023
public ShortcutStorageFile(ShellLinkItem item) : base(item)
2124
{
2225
TargetPath = item.TargetPath;
2326
Arguments = item.Arguments;
2427
WorkingDirectory = item.WorkingDirectory;
2528
RunAsAdmin = item.RunAsAdmin;
29+
ShowWindowCommand = item.ShowWindowCommand;
2630
}
2731
}
2832

0 commit comments

Comments
 (0)