Skip to content

Commit 2f0d9b2

Browse files
committed
Support changing theme via CLI and refactor arg parsing
1 parent f533006 commit 2f0d9b2

File tree

4 files changed

+120
-51
lines changed

4 files changed

+120
-51
lines changed

src/AppContext.cs

Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
44

55
using System;
6-
using System.Linq;
76
using System.Reflection;
87
using System.Windows.Forms;
98

@@ -23,8 +22,8 @@ public AppContext(string[] args) : base(new HiddenForm())
2322
Localization.Initialize();
2423
LoggingHandler.RotateDebugLog();
2524

26-
ThemeManager.importPaths = args.Where(System.IO.File.Exists).ToList();
27-
HandleMultiInstance(args);
25+
CheckSingleInstance(args);
26+
ipcManager.ProcessArgs(args);
2827

2928
InitializeTrayIcon();
3029
LocationManager.Initialize();
@@ -36,13 +35,13 @@ public AppContext(string[] args) : base(new HiddenForm())
3635
UpdateChecker.Initialize();
3736
}
3837

39-
private void HandleMultiInstance(string[] args)
38+
private void CheckSingleInstance(string[] args)
4039
{
4140
ipcManager = new IpcManager();
4241

4342
if (ipcManager.isFirstInstance)
4443
{
45-
ipcManager.ListenForArgs(OnArgumentsReceived);
44+
ipcManager.ListenForArgs(this);
4645
}
4746
else
4847
{
@@ -92,48 +91,6 @@ public static void ToggleTrayIcon()
9291
notifyIcon.Visible = !isHidden;
9392
}
9493

95-
private void OnArgumentsReceived(string[] args)
96-
{
97-
if (JsonConfig.settings.hideTrayIcon)
98-
{
99-
MainForm.BeginInvoke(ToggleTrayIcon);
100-
}
101-
102-
foreach (string arg in args)
103-
{
104-
if (arg.StartsWith('/'))
105-
{
106-
switch (arg.ToLower())
107-
{
108-
case "/refresh":
109-
scheduler.RunAndUpdateLocation(true);
110-
break;
111-
case "/theme:auto":
112-
MainForm.BeginInvoke(SolarScheduler.SetAppearanceMode, AppearanceMode.Automatic);
113-
break;
114-
case "/theme:light":
115-
MainForm.BeginInvoke(SolarScheduler.SetAppearanceMode, AppearanceMode.Light);
116-
break;
117-
case "/theme:dark":
118-
MainForm.BeginInvoke(SolarScheduler.SetAppearanceMode, AppearanceMode.Dark);
119-
break;
120-
default:
121-
Console.WriteLine("Unrecognized command line option: " + arg);
122-
break;
123-
}
124-
}
125-
else
126-
{
127-
ThemeManager.importPaths.Add(arg);
128-
}
129-
}
130-
131-
if (ThemeManager.importPaths.Count > 0 && !ThemeManager.importMode)
132-
{
133-
MainForm.BeginInvoke(ThemeManager.SelectTheme);
134-
}
135-
}
136-
13794
private void OnNotifyIconMouseUp(object sender, MouseEventArgs e)
13895
{
13996
// Show context menu when taskbar icon is left clicked

src/IpcManager.cs

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.IO.Pipes;
88
using System.Threading;
99
using System.Threading.Tasks;
10+
using System.Windows.Forms;
1011

1112
namespace WinDynamicDesktop
1213
{
@@ -30,7 +31,7 @@ public void Dispose()
3031
namedPipeServer?.Dispose();
3132
}
3233

33-
public void ListenForArgs(Action<string[]> listener)
34+
public void ListenForArgs(ApplicationContext app)
3435
{
3536
Task.Factory.StartNew(() =>
3637
{
@@ -44,7 +45,8 @@ public void ListenForArgs(Action<string[]> listener)
4445
namedPipeServer.WaitForConnection();
4546
}
4647

47-
listener(reader.ReadToEnd().Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries));
48+
ProcessArgs(app, reader.ReadToEnd().Split(Environment.NewLine,
49+
StringSplitOptions.RemoveEmptyEntries));
4850
namedPipeServer.Disconnect();
4951
}
5052
}, TaskCreationOptions.LongRunning);
@@ -59,5 +61,115 @@ public void SendArgsToFirstInstance(string[] args)
5961
writer.Write(string.Join(Environment.NewLine, args));
6062
writer.Flush();
6163
}
64+
65+
public void ProcessArgs(string[] initialArgs)
66+
{
67+
foreach (string arg in initialArgs)
68+
{
69+
if (arg.ToLower().StartsWith("/theme") && arg.IndexOf('=') != -1)
70+
{
71+
ProcessThemeArg(arg.ToLower());
72+
}
73+
else if (arg.StartsWith('/'))
74+
{
75+
switch (arg.ToLower())
76+
{
77+
case "/refresh":
78+
break;
79+
case "/theme:auto":
80+
case "/theme:light":
81+
case "/theme:dark":
82+
AppearanceMode mode = (AppearanceMode)Enum.Parse(typeof(AppearanceMode),
83+
arg.Substring(7), true);
84+
JsonConfig.settings.appearanceMode = (int)mode;
85+
break;
86+
default:
87+
Console.WriteLine("Unrecognized command line option: " + arg);
88+
break;
89+
}
90+
}
91+
else if (File.Exists(arg))
92+
{
93+
ThemeManager.importPaths.Add(arg);
94+
}
95+
}
96+
}
97+
98+
private void ProcessArgs(ApplicationContext app, string[] args)
99+
{
100+
if (JsonConfig.settings.hideTrayIcon)
101+
{
102+
app.MainForm.BeginInvoke(AppContext.ToggleTrayIcon);
103+
}
104+
105+
foreach (string arg in args)
106+
{
107+
if (arg.ToLower().StartsWith("/theme") && arg.IndexOf('=') != -1)
108+
{
109+
string themeId = ProcessThemeArg(arg.ToLower());
110+
if (themeId != null)
111+
{
112+
ThemeShuffler.AddThemeToHistory(themeId);
113+
AppContext.scheduler.Run(true);
114+
}
115+
}
116+
else if (arg.StartsWith('/'))
117+
{
118+
switch (arg.ToLower())
119+
{
120+
case "/refresh":
121+
AppContext.scheduler.RunAndUpdateLocation(true);
122+
break;
123+
case "/theme:auto":
124+
case "/theme:light":
125+
case "/theme:dark":
126+
AppearanceMode mode = (AppearanceMode)Enum.Parse(typeof(AppearanceMode),
127+
arg.Substring(7), true);
128+
app.MainForm.BeginInvoke(SolarScheduler.SetAppearanceMode, mode);
129+
break;
130+
default:
131+
Console.WriteLine("Unrecognized command line option: " + arg);
132+
break;
133+
}
134+
}
135+
else if (File.Exists(arg))
136+
{
137+
ThemeManager.importPaths.Add(arg);
138+
}
139+
}
140+
141+
if (ThemeManager.importPaths.Count > 0 && !ThemeManager.importMode)
142+
{
143+
app.MainForm.BeginInvoke(ThemeManager.SelectTheme);
144+
}
145+
}
146+
147+
private string ProcessThemeArg(string arg)
148+
{
149+
string themeId = arg.Substring(arg.IndexOf('=') + 1);
150+
if (ThemeManager.themeSettings.Find((theme) => theme.themeId == themeId) == null)
151+
{
152+
Console.WriteLine("Failed to set theme - unknown theme ID: " + themeId);
153+
return null;
154+
}
155+
156+
if (arg.StartsWith("/theme="))
157+
{
158+
JsonConfig.settings.activeThemes[0] = themeId;
159+
}
160+
else if (arg.StartsWith("/theme:L="))
161+
{
162+
JsonConfig.settings.lockScreenTheme = themeId;
163+
JsonConfig.settings.lockScreenDisplayIndex = -1;
164+
}
165+
else
166+
{
167+
int displayNumber = int.Parse(arg[7].ToString());
168+
JsonConfig.settings.activeThemes[displayNumber] = themeId;
169+
JsonConfig.settings.activeThemes[0] = null;
170+
}
171+
172+
return themeId;
173+
}
62174
}
63175
}

src/SolarScheduler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace WinDynamicDesktop
1010
{
11-
public enum AppearanceMode { Automatic, Light, Dark }
11+
public enum AppearanceMode { Automatic, Auto = Automatic, Light, Dark }
1212

1313
public enum DaySegment { Sunrise, Day, Sunset, Night, AlwaysDay, AlwaysNight }
1414

src/ThemeManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ThemeManager
1919

2020
public static bool downloadMode = false;
2121
public static bool importMode = false;
22-
public static List<string> importPaths;
22+
public static List<string> importPaths = new List<string>();
2323
public static List<ThemeConfig> importedThemes = new List<ThemeConfig>();
2424

2525
public static string[] defaultThemes;

0 commit comments

Comments
 (0)