Skip to content

Commit 18d425b

Browse files
committed
Merge branch 'master' into switch-to-new-socket-lib
2 parents 0393b0b + 5e82ae4 commit 18d425b

File tree

10 files changed

+184
-44
lines changed

10 files changed

+184
-44
lines changed

ElectronNET.API/App.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ public void Relaunch()
581581
/// <param name="relaunchOptions">Options for the relaunch.</param>
582582
public void Relaunch(RelaunchOptions relaunchOptions)
583583
{
584-
BridgeConnector.EmitSync("appRelaunch", relaunchOptions);
584+
BridgeConnector.EmitSync("appRelaunch", JObject.FromObject(relaunchOptions, _jsonSerializer));
585585
}
586586

587587
/// <summary>
@@ -601,7 +601,7 @@ public void Focus()
601601
/// </summary>
602602
public void Focus(FocusOptions focusOptions)
603603
{
604-
BridgeConnector.Emit("appFocus", focusOptions);
604+
BridgeConnector.Emit("appFocus", JObject.FromObject(focusOptions, _jsonSerializer));
605605
}
606606

607607
/// <summary>
@@ -891,7 +891,7 @@ public async Task<bool> IsDefaultProtocolClientAsync(string protocol, string pat
891891
/// <param name="userTasks">Array of <see cref="UserTask"/> objects.</param>
892892
/// <param name="cancellationToken">The cancellation token.</param>
893893
/// <returns>Whether the call succeeded.</returns>
894-
public Task<bool> SetUserTasksAsync(UserTask[] userTasks, CancellationToken cancellationToken = default) => BridgeConnector.OnResult<bool>("appSetUserTasks", "appSetUserTasksCompleted", cancellationToken, userTasks);
894+
public Task<bool> SetUserTasksAsync(UserTask[] userTasks, CancellationToken cancellationToken = default) => BridgeConnector.OnResult<bool>("appSetUserTasks", "appSetUserTasksCompleted", cancellationToken, JArray.FromObject(userTasks, _jsonSerializer));
895895

896896
/// <summary>
897897
/// Jump List settings for the application.
@@ -918,7 +918,7 @@ public async Task<bool> IsDefaultProtocolClientAsync(string protocol, string pat
918918
/// <param name="categories">Array of <see cref="JumpListCategory"/> objects.</param>
919919
public void SetJumpList(JumpListCategory[] categories)
920920
{
921-
BridgeConnector.Emit("appSetJumpList", categories);
921+
BridgeConnector.Emit("appSetJumpList", JArray.FromObject(categories, _jsonSerializer));
922922
}
923923

924924
/// <summary>
@@ -1054,7 +1054,7 @@ public void SetAppUserModelId(string id)
10541054
/// <param name="options"></param>
10551055
/// <param name="cancellationToken">The cancellation token.</param>
10561056
/// <returns>Result of import. Value of 0 indicates success.</returns>
1057-
public Task<int> ImportCertificateAsync(ImportCertificateOptions options, CancellationToken cancellationToken = default) => BridgeConnector.OnResult<int>("appImportCertificate", "appImportCertificateCompleted", cancellationToken, options);
1057+
public Task<int> ImportCertificateAsync(ImportCertificateOptions options, CancellationToken cancellationToken = default) => BridgeConnector.OnResult<int>("appImportCertificate", "appImportCertificateCompleted", cancellationToken, JObject.FromObject(options, _jsonSerializer));
10581058

10591059
/// <summary>
10601060
/// Memory and cpu usage statistics of all the processes associated with the app.
@@ -1120,7 +1120,7 @@ public async Task<LoginItemSettings> GetLoginItemSettingsAsync(CancellationToken
11201120
/// <param name="cancellationToken">The cancellation token.</param>
11211121
public Task<LoginItemSettings> GetLoginItemSettingsAsync(LoginItemSettingsOptions options, CancellationToken cancellationToken = default) =>
11221122
options is null ? BridgeConnector.OnResult<LoginItemSettings>("appGetLoginItemSettings", "appGetLoginItemSettingsCompleted", cancellationToken)
1123-
: BridgeConnector.OnResult<LoginItemSettings>("appGetLoginItemSettings", "appGetLoginItemSettingsCompleted", cancellationToken, options);
1123+
: BridgeConnector.OnResult<LoginItemSettings>("appGetLoginItemSettings", "appGetLoginItemSettingsCompleted", cancellationToken, JObject.FromObject(options, _jsonSerializer));
11241124

11251125
/// <summary>
11261126
/// Set the app's login item settings.
@@ -1130,7 +1130,7 @@ public Task<LoginItemSettings> GetLoginItemSettingsAsync(LoginItemSettingsOption
11301130
/// <param name="loginSettings"></param>
11311131
public void SetLoginItemSettings(LoginSettings loginSettings)
11321132
{
1133-
BridgeConnector.Emit("appSetLoginItemSettings", loginSettings);
1133+
BridgeConnector.Emit("appSetLoginItemSettings", JObject.FromObject(loginSettings, _jsonSerializer));
11341134
}
11351135

11361136
/// <summary>
@@ -1179,7 +1179,7 @@ public void ShowAboutPanel()
11791179
/// <param name="options">About panel options.</param>
11801180
public void SetAboutPanelOptions(AboutPanelOptions options)
11811181
{
1182-
BridgeConnector.Emit("appSetAboutPanelOptions", options);
1182+
BridgeConnector.Emit("appSetAboutPanelOptions", JObject.FromObject(options, _jsonSerializer));
11831183
}
11841184

11851185
/// <summary>
@@ -1243,5 +1243,10 @@ internal void PreventQuit()
12431243
/// <param name="eventName">The event name</param>
12441244
/// <param name="fn">The handler</param>
12451245
public void Once(string eventName, Action<object> fn) => Events.Instance.Once(ModuleName, eventName, fn);
1246+
1247+
private readonly JsonSerializer _jsonSerializer = new JsonSerializer()
1248+
{
1249+
ContractResolver = new CamelCasePropertyNamesContractResolver()
1250+
};
12461251
}
12471252
}

ElectronNET.API/BrowserWindow.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,7 +1682,7 @@ public void Reload()
16821682
public void SetMenu(MenuItem[] menuItems)
16831683
{
16841684
menuItems.AddMenuItemsId();
1685-
BridgeConnector.Emit("browserWindowSetMenu", Id, menuItems);
1685+
BridgeConnector.Emit("browserWindowSetMenu", Id, JArray.FromObject(menuItems, _jsonSerializer));
16861686
_items.AddRange(menuItems);
16871687

16881688
BridgeConnector.Off("windowMenuItemClicked");
@@ -1788,7 +1788,7 @@ public Task<bool> SetThumbarButtonsAsync(ThumbarButton[] thumbarButtons)
17881788
});
17891789

17901790
thumbarButtons.AddThumbarButtonsId();
1791-
BridgeConnector.Emit("browserWindowSetThumbarButtons", Id, thumbarButtons);
1791+
BridgeConnector.Emit("browserWindowSetThumbarButtons", Id, JArray.FromObject(thumbarButtons, _jsonSerializer));
17921792
_thumbarButtons.Clear();
17931793
_thumbarButtons.AddRange(thumbarButtons);
17941794

@@ -2003,5 +2003,11 @@ public void SetBrowserView(BrowserView browserView)
20032003
{
20042004
BridgeConnector.Emit("browserWindow-setBrowserView", Id, browserView.Id);
20052005
}
2006+
2007+
private static readonly JsonSerializer _jsonSerializer = new JsonSerializer()
2008+
{
2009+
ContractResolver = new CamelCasePropertyNamesContractResolver(),
2010+
NullValueHandling = NullValueHandling.Ignore
2011+
};
20062012
}
20072013
}

ElectronNET.API/Dock.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,14 @@ public Task<bool> IsVisibleAsync(CancellationToken cancellationToken = default)
138138
public void SetMenu(MenuItem[] menuItems)
139139
{
140140
menuItems.AddMenuItemsId();
141-
BridgeConnector.Emit("dock-setMenu", menuItems);
141+
BridgeConnector.Emit("dock-setMenu", JArray.FromObject(menuItems, _jsonSerializer));
142142
_items.AddRange(menuItems);
143143

144144
BridgeConnector.Off("dockMenuItemClicked");
145145
BridgeConnector.On<string>("dockMenuItemClicked", (id) => {
146146
MenuItem menuItem = _items.GetMenuItem(id);
147147
menuItem?.Click();
148148
});
149-
150149
}
151150

152151
/// <summary>
@@ -163,5 +162,11 @@ public void SetIcon(string image)
163162
{
164163
BridgeConnector.Emit("dock-setIcon", image);
165164
}
165+
166+
private static readonly JsonSerializer _jsonSerializer = new JsonSerializer()
167+
{
168+
ContractResolver = new CamelCasePropertyNamesContractResolver(),
169+
NullValueHandling = NullValueHandling.Ignore
170+
};
166171
}
167172
}

ElectronNET.API/IpcMain.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,27 @@ public void Send(BrowserView browserView, string channel, params object[] data)
207207
}
208208
}
209209

210+
/// <summary>
211+
/// Log a message to the console output pipe. This is used when running with "detachedProcess" : true on the electron.manifest.json,
212+
/// as in that case we can't open pipes to read the console output from the child process anymore
213+
/// </summary>
214+
/// <param name="text">Message to log</param>
215+
public static void ConsoleLog(string text)
216+
{
217+
BridgeConnector.Emit("console-stdout", text);
218+
}
219+
220+
/// <summary>
221+
/// Log a message to the console error pipe. This is used when running with "detachedProcess" : true on the electron.manifest.json,
222+
/// as in that case we can't open pipes to read the console output from the child process anymore
223+
/// </summary>
224+
/// <param name="text">Message to log</param>
225+
226+
public static void ConsoleError(string text)
227+
{
228+
BridgeConnector.Emit("console-stderr", text);
229+
}
230+
210231
private JsonSerializer _jsonSerializer = new JsonSerializer()
211232
{
212233
ContractResolver = new CamelCasePropertyNamesContractResolver(),

ElectronNET.API/Menu.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void SetApplicationMenu(MenuItem[] menuItems)
5858
menuItems.AddMenuItemsId();
5959
menuItems.AddSubmenuTypes();
6060

61-
BridgeConnector.Emit("menu-setApplicationMenu", menuItems);
61+
BridgeConnector.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer));
6262
_menuItems.AddRange(menuItems);
6363

6464
BridgeConnector.Off("menuItemClicked");
@@ -87,7 +87,7 @@ public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems)
8787
menuItems.AddMenuItemsId();
8888
menuItems.AddSubmenuTypes();
8989

90-
BridgeConnector.Emit("menu-setContextMenu", browserWindow.Id, menuItems);
90+
BridgeConnector.Emit("menu-setContextMenu", browserWindow.Id, JArray.FromObject(menuItems, _jsonSerializer));
9191

9292
if (!_contextMenuItems.ContainsKey(browserWindow.Id))
9393
{
@@ -112,5 +112,11 @@ public void ContextMenuPopup(BrowserWindow browserWindow)
112112
{
113113
BridgeConnector.Emit("menu-contextMenuPopup", browserWindow.Id);
114114
}
115+
116+
private JsonSerializer _jsonSerializer = new JsonSerializer()
117+
{
118+
ContractResolver = new CamelCasePropertyNamesContractResolver(),
119+
NullValueHandling = NullValueHandling.Ignore
120+
};
115121
}
116122
}

ElectronNET.API/Tray.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ public void Show(string image, MenuItem menuItem)
242242
public void Show(string image, MenuItem[] menuItems)
243243
{
244244
menuItems.AddMenuItemsId();
245-
BridgeConnector.Emit("create-tray", image, menuItems);
245+
BridgeConnector.Emit("create-tray", image, JArray.FromObject(menuItems, _jsonSerializer));
246246
_items.Clear();
247247
_items.AddRange(menuItems);
248248

@@ -324,33 +324,39 @@ public void DisplayBalloon(DisplayBalloonOptions options)
324324
public Task<bool> IsDestroyedAsync() => BridgeConnector.OnResult<bool>("tray-isDestroyed", "tray-isDestroyedCompleted");
325325

326326
private const string ModuleName = "tray";
327+
327328
/// <summary>
328329
/// Subscribe to an unmapped event on the <see cref="Tray"/> module.
329330
/// </summary>
330331
/// <param name="eventName">The event name</param>
331332
/// <param name="fn">The handler</param>
332-
public void On(string eventName, Action fn)
333-
=> Events.Instance.On(ModuleName, eventName, fn);
333+
public void On(string eventName, Action fn) => Events.Instance.On(ModuleName, eventName, fn);
334+
334335
/// <summary>
335336
/// Subscribe to an unmapped event on the <see cref="Tray"/> module.
336337
/// </summary>
337338
/// <param name="eventName">The event name</param>
338339
/// <param name="fn">The handler</param>
339-
public void On(string eventName, Action<object> fn)
340-
=> Events.Instance.On(ModuleName, eventName, fn);
340+
public void On(string eventName, Action<object> fn) => Events.Instance.On(ModuleName, eventName, fn);
341+
341342
/// <summary>
342343
/// Subscribe to an unmapped event on the <see cref="Tray"/> module once.
343344
/// </summary>
344345
/// <param name="eventName">The event name</param>
345346
/// <param name="fn">The handler</param>
346-
public void Once(string eventName, Action fn)
347-
=> Events.Instance.Once(ModuleName, eventName, fn);
347+
public void Once(string eventName, Action fn) => Events.Instance.Once(ModuleName, eventName, fn);
348+
348349
/// <summary>
349350
/// Subscribe to an unmapped event on the <see cref="Tray"/> module once.
350351
/// </summary>
351352
/// <param name="eventName">The event name</param>
352353
/// <param name="fn">The handler</param>
353-
public void Once(string eventName, Action<object> fn)
354-
=> Events.Instance.Once(ModuleName, eventName, fn);
354+
public void Once(string eventName, Action<object> fn) => Events.Instance.Once(ModuleName, eventName, fn);
355+
356+
private JsonSerializer _jsonSerializer = new JsonSerializer()
357+
{
358+
ContractResolver = new CamelCasePropertyNamesContractResolver(),
359+
NullValueHandling = NullValueHandling.Ignore
360+
};
355361
}
356362
}

ElectronNET.API/WindowManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public Task<BrowserWindow> CreateWindowAsync(BrowserWindowOptions options, strin
150150
ContractResolver = new CamelCasePropertyNamesContractResolver(),
151151
NullValueHandling = NullValueHandling.Ignore
152152
};
153+
153154
BridgeConnector.Emit("createBrowserWindow", JObject.FromObject(options, ownjsonSerializer), loadUrl);
154155
}
155156

ElectronNET.CLI/ProcessHelper.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,39 @@
11
using System;
2+
using System.Collections.Concurrent;
23
using System.Diagnostics;
34
using System.Runtime.InteropServices;
45

56
namespace ElectronNET.CLI
67
{
78
public class ProcessHelper
89
{
10+
private static ConcurrentDictionary<Process, bool> _activeProcess = new();
11+
12+
public static void KillActive()
13+
{
14+
foreach(var kv in _activeProcess)
15+
{
16+
if (!kv.Key.HasExited)
17+
{
18+
try
19+
{
20+
kv.Key.CloseMainWindow();
21+
}
22+
catch
23+
{
24+
25+
}
26+
try
27+
{
28+
kv.Key.Kill(true);
29+
}
30+
catch
31+
{
32+
33+
}
34+
}
35+
}
36+
}
937
public static int CmdExecute(string command, string workingDirectoryPath, bool output = true, bool waitForExit = true)
1038
{
1139
using (Process cmd = new Process())
@@ -43,7 +71,11 @@ public static int CmdExecute(string command, string workingDirectoryPath, bool o
4371

4472
if (waitForExit)
4573
{
74+
_activeProcess[cmd] = true;
75+
4676
cmd.WaitForExit();
77+
78+
_activeProcess.TryRemove(cmd, out _);
4779
}
4880

4981
return cmd.ExitCode;

ElectronNET.CLI/Program.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ static async Task Main(string[] args)
1919
Environment.Exit(-1);
2020
}
2121

22+
Console.CancelKeyPress += (s,e) =>
23+
{
24+
ProcessHelper.KillActive();
25+
Environment.Exit(-1);
26+
};
27+
2228
ICommand command = null;
2329

2430
switch (args[0])

0 commit comments

Comments
 (0)