diff --git a/smx-config/App.config b/smx-config/App.config
index 89464e6..fba0990 100644
--- a/smx-config/App.config
+++ b/smx-config/App.config
@@ -1,8 +1,18 @@
+
+
+
+
+
+
+ False
+
+
+
diff --git a/smx-config/App.xaml.cs b/smx-config/App.xaml.cs
index 6c3ad6d..fdf1bd2 100644
--- a/smx-config/App.xaml.cs
+++ b/smx-config/App.xaml.cs
@@ -24,6 +24,18 @@ namespace smx_config
{
base.OnStartup(e);
+ // If we're being launched on startup, but the LaunchOnStartup setting is false,
+ // then the user turned off auto-launching but we're still being launched for some
+ // reason (eg. a renamed launch shortcut that we couldn't find to remove). As
+ // a safety so we don't launch when the user doesn't want us to, just exit in this
+ // case.
+ if(Helpers.LaunchedOnStartup() && !LaunchOnStartup.Enable)
+ {
+ Shutdown();
+ return;
+ }
+
+ LaunchOnStartup.Enable = true;
if(!SMX.SMX.DLLExists())
{
MessageBox.Show("SMXConfig encountered an unexpected error.\n\nSMX.dll couldn't be found:\n\n" + Helpers.GetLastWin32ErrorString(), "SMXConfig");
diff --git a/smx-config/Helpers.cs b/smx-config/Helpers.cs
index 3e4060a..1a54393 100644
--- a/smx-config/Helpers.cs
+++ b/smx-config/Helpers.cs
@@ -75,17 +75,29 @@ namespace smx_config
static class Helpers
{
- // Return true if we're in debug mode.
- public static bool GetDebug()
+ // Return true if arg is in the commandline.
+ public static bool HasCommandlineArgument(string arg)
{
- foreach(string arg in Environment.GetCommandLineArgs())
+ foreach(string s in Environment.GetCommandLineArgs())
{
- if(arg == "-d")
+ if(s == arg)
return true;
}
return false;
}
+ // Return true if we're in debug mode.
+ public static bool GetDebug()
+ {
+ return HasCommandlineArgument("-d");
+ }
+
+ // Return true if we were launched on startup.
+ public static bool LaunchedOnStartup()
+ {
+ return HasCommandlineArgument("-s");
+ }
+
// Return the last Win32 error as a string.
public static string GetLastWin32ErrorString()
{
@@ -332,6 +344,19 @@ namespace smx_config
string error;
SMX.SMX.LightsAnimation_Load(gif, pad, type, out error);
}
+
+ // Create a .lnk.
+ public static void CreateShortcut(string outputFile, string targetPath, string arguments)
+ {
+ Type shellType = Type.GetTypeFromProgID("WScript.Shell");
+ dynamic shell = Activator.CreateInstance(shellType);
+ dynamic shortcut = shell.CreateShortcut(outputFile);
+
+ shortcut.TargetPath = targetPath;
+ shortcut.Arguments = arguments;
+ shortcut.WindowStyle = 0;
+ shortcut.Save();
+ }
}
// This class just makes it easier to assemble binary command packets.
@@ -368,6 +393,46 @@ namespace smx_config
private LinkedList parts = new LinkedList();
};
+ // Manage launching on startup.
+ static class LaunchOnStartup
+ {
+ public static string GetLaunchShortcutFilename()
+ {
+ string startupFolder = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
+ return startupFolder + "/StepManiaX.lnk";
+ }
+
+ // Enable or disable launching on startup.
+ public static bool Enable
+ {
+ get {
+ return Properties.Settings.Default.LaunchOnStartup;
+ }
+
+ set {
+ // Remember whether we want to be launched on startup. This is used as a sanity
+ // check in case we're not able to remove our launch shortcut.
+ Properties.Settings.Default.LaunchOnStartup = value;
+ Properties.Settings.Default.Save();
+
+ string shortcutFilename = GetLaunchShortcutFilename();
+ if(value)
+ {
+ string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
+ Helpers.CreateShortcut(shortcutFilename, filename, "-s");
+ } else {
+
+ try {
+ System.IO.File.Delete(shortcutFilename);
+ } catch {
+ // If there's an error deleting the shortcut (most likely it doesn't exist),
+ // don't do anything.
+ }
+ }
+ }
+ }
+ };
+
// When enabled, periodically set all lights to the current auto-lighting color. This
// is enabled while manipulating the step color slider.
class ShowAutoLightsColor
diff --git a/smx-config/Properties/Settings.Designer.cs b/smx-config/Properties/Settings.Designer.cs
index de27821..6a30787 100644
--- a/smx-config/Properties/Settings.Designer.cs
+++ b/smx-config/Properties/Settings.Designer.cs
@@ -22,5 +22,17 @@ namespace smx_config.Properties {
return defaultInstance;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool LaunchOnStartup {
+ get {
+ return ((bool)(this["LaunchOnStartup"]));
+ }
+ set {
+ this["LaunchOnStartup"] = value;
+ }
+ }
}
}
diff --git a/smx-config/Properties/Settings.settings b/smx-config/Properties/Settings.settings
index 8e615f2..2d633bc 100644
--- a/smx-config/Properties/Settings.settings
+++ b/smx-config/Properties/Settings.settings
@@ -1,5 +1,9 @@
-
+
-
+
+
+ False
+
+
\ No newline at end of file