Skip to content

Commit fdb026c

Browse files
fix app quit event bugs
1 parent 96722e7 commit fdb026c

File tree

10 files changed

+162
-76
lines changed

10 files changed

+162
-76
lines changed

ElectronNET.API/App.cs

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Newtonsoft.Json.Linq;
44
using Newtonsoft.Json.Serialization;
55
using System;
6+
using System.Runtime.InteropServices;
7+
using System.Threading;
68
using System.Threading.Tasks;
79

810
namespace ElectronNET.API
@@ -30,7 +32,10 @@ public event Action WindowAllClosed
3032
{
3133
BridgeConnector.Socket.On("app-window-all-closed" + GetHashCode(), () =>
3234
{
33-
_windowAllClosed();
35+
if (!Electron.WindowManager.IsQuitOnWindowAllClosed)
36+
{
37+
_windowAllClosed();
38+
}
3439
});
3540

3641
BridgeConnector.Socket.Emit("register-app-window-all-closed-event", GetHashCode());
@@ -54,15 +59,38 @@ public event Action WindowAllClosed
5459
/// Note: If application quit was initiated by autoUpdater.quitAndInstall() then before-quit is emitted after
5560
/// emitting close event on all windows and closing them.
5661
/// </summary>
57-
public event Action BeforeQuit
62+
public event Func<Task> BeforeQuit
5863
{
5964
add
6065
{
6166
if (_beforeQuit == null)
6267
{
63-
BridgeConnector.Socket.On("app-before-quit" + GetHashCode(), () =>
68+
BridgeConnector.Socket.On("app-before-quit" + GetHashCode(), async () =>
6469
{
65-
_beforeQuit();
70+
await _beforeQuit();
71+
72+
if(_willQuit == null && _quitting == null)
73+
{
74+
Exit();
75+
}
76+
else if (_willQuit != null)
77+
{
78+
await _willQuit();
79+
80+
if(_quitting == null)
81+
{
82+
Exit();
83+
} else
84+
{
85+
await _quitting();
86+
Exit();
87+
}
88+
}
89+
else if(_quitting != null)
90+
{
91+
await _quitting();
92+
Exit();
93+
}
6694
});
6795

6896
BridgeConnector.Socket.Emit("register-app-before-quit-event", GetHashCode());
@@ -78,23 +106,33 @@ public event Action BeforeQuit
78106
}
79107
}
80108

81-
private event Action _beforeQuit;
109+
private event Func<Task> _beforeQuit;
82110

83111
/// <summary>
84112
/// Emitted when all windows have been closed and the application will quit.
85113
///
86114
/// See the description of the window-all-closed event for the differences between the will-quit and
87115
/// window-all-closed events.
88116
/// </summary>
89-
public event Action WillQuit
117+
public event Func<Task> WillQuit
90118
{
91119
add
92120
{
93121
if (_willQuit == null)
94122
{
95-
BridgeConnector.Socket.On("app-will-quit" + GetHashCode(), () =>
123+
BridgeConnector.Socket.On("app-will-quit" + GetHashCode(), async () =>
96124
{
97-
_willQuit();
125+
await _willQuit();
126+
127+
if(_quitting == null)
128+
{
129+
Exit();
130+
}
131+
else
132+
{
133+
await _quitting();
134+
Exit();
135+
}
98136
});
99137

100138
BridgeConnector.Socket.Emit("register-app-will-quit-event", GetHashCode());
@@ -110,23 +148,27 @@ public event Action WillQuit
110148
}
111149
}
112150

113-
private event Action _willQuit;
151+
private event Func<Task> _willQuit;
114152

115153
/// <summary>
116154
/// Emitted when the application is quitting.
117155
/// </summary>
118-
public event Action Quitting
156+
public event Func<Task> Quitting
119157
{
120158
add
121159
{
122160
if (_quitting == null)
123161
{
124-
BridgeConnector.Socket.On("app-quit" + GetHashCode(), () =>
162+
BridgeConnector.Socket.On("app-will-quit" + GetHashCode() + "quitting", async () =>
125163
{
126-
_quitting();
164+
if(_willQuit == null)
165+
{
166+
await _quitting();
167+
Exit();
168+
}
127169
});
128170

129-
BridgeConnector.Socket.Emit("register-app-quit-event", GetHashCode());
171+
BridgeConnector.Socket.Emit("register-app-will-quit-event", GetHashCode() + "quitting");
130172
}
131173
_quitting += value;
132174
}
@@ -135,11 +177,11 @@ public event Action Quitting
135177
_quitting -= value;
136178

137179
if (_quitting == null)
138-
BridgeConnector.Socket.Off("app-quit" + GetHashCode());
180+
BridgeConnector.Socket.Off("app-will-quit" + GetHashCode() + "quitting");
139181
}
140182
}
141183

142-
private event Action _quitting;
184+
private event Func<Task> _quitting;
143185

144186
/// <summary>
145187
/// Emitted when a BrowserWindow gets blurred.

ElectronNET.API/Dialog.cs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,21 @@ internal static Dialog Instance
4747
public Task<string[]> ShowOpenDialogAsync(BrowserWindow browserWindow, OpenDialogOptions options)
4848
{
4949
var taskCompletionSource = new TaskCompletionSource<string[]>();
50+
string guid = Guid.NewGuid().ToString();
5051

51-
BridgeConnector.Socket.On("showOpenDialogComplete", (filePaths) =>
52+
BridgeConnector.Socket.On("showOpenDialogComplete" + guid, (filePaths) =>
5253
{
53-
BridgeConnector.Socket.Off("showOpenDialogComplete");
54+
BridgeConnector.Socket.Off("showOpenDialogComplete" + guid);
5455

5556
var result = ((JArray)filePaths).ToObject<string[]>();
5657
taskCompletionSource.SetResult(result);
5758
});
5859

59-
BridgeConnector.Socket.Emit("showOpenDialog",
60-
JObject.FromObject(browserWindow, _jsonSerializer),
61-
JObject.FromObject(options, _jsonSerializer));
60+
61+
BridgeConnector.Socket.Emit("showOpenDialog",
62+
JObject.FromObject(browserWindow, _jsonSerializer),
63+
JObject.FromObject(options, _jsonSerializer),
64+
guid);
6265

6366
return taskCompletionSource.Task;
6467
}
@@ -72,17 +75,19 @@ public Task<string[]> ShowOpenDialogAsync(BrowserWindow browserWindow, OpenDialo
7275
public Task<string> ShowSaveDialogAsync(BrowserWindow browserWindow, SaveDialogOptions options)
7376
{
7477
var taskCompletionSource = new TaskCompletionSource<string>();
78+
string guid = Guid.NewGuid().ToString();
7579

76-
BridgeConnector.Socket.On("showSaveDialogComplete", (filename) =>
80+
BridgeConnector.Socket.On("showSaveDialogComplete" + guid, (filename) =>
7781
{
78-
BridgeConnector.Socket.Off("showSaveDialogComplete");
82+
BridgeConnector.Socket.Off("showSaveDialogComplete" + guid);
7983

8084
taskCompletionSource.SetResult(filename.ToString());
8185
});
8286

8387
BridgeConnector.Socket.Emit("showSaveDialog",
8488
JObject.FromObject(browserWindow, _jsonSerializer),
85-
JObject.FromObject(options, _jsonSerializer));
89+
JObject.FromObject(options, _jsonSerializer),
90+
guid);
8691

8792
return taskCompletionSource.Task;
8893
}
@@ -139,10 +144,11 @@ public async Task<MessageBoxResult> ShowMessageBoxAsync(BrowserWindow browserWin
139144
public Task<MessageBoxResult> ShowMessageBoxAsync(BrowserWindow browserWindow, MessageBoxOptions messageBoxOptions)
140145
{
141146
var taskCompletionSource = new TaskCompletionSource<MessageBoxResult>();
147+
var guid = Guid.NewGuid().ToString();
142148

143-
BridgeConnector.Socket.On("showMessageBoxComplete", (args) =>
149+
BridgeConnector.Socket.On("showMessageBoxComplete" + guid, (args) =>
144150
{
145-
BridgeConnector.Socket.Off("showMessageBoxComplete");
151+
BridgeConnector.Socket.Off("showMessageBoxComplete" + guid);
146152

147153
var result = ((JArray)args);
148154

@@ -156,12 +162,13 @@ public Task<MessageBoxResult> ShowMessageBoxAsync(BrowserWindow browserWindow, M
156162

157163
if (browserWindow == null)
158164
{
159-
BridgeConnector.Socket.Emit("showMessageBox", JObject.FromObject(messageBoxOptions, _jsonSerializer));
165+
BridgeConnector.Socket.Emit("showMessageBox", JObject.FromObject(messageBoxOptions, _jsonSerializer), guid);
160166
} else
161167
{
162168
BridgeConnector.Socket.Emit("showMessageBox",
163169
JObject.FromObject(browserWindow, _jsonSerializer),
164-
JObject.FromObject(messageBoxOptions, _jsonSerializer));
170+
JObject.FromObject(messageBoxOptions, _jsonSerializer),
171+
guid);
165172
}
166173

167174
return taskCompletionSource.Task;
@@ -205,16 +212,18 @@ public Task ShowCertificateTrustDialogAsync(CertificateTrustDialogOptions option
205212
public Task ShowCertificateTrustDialogAsync(BrowserWindow browserWindow, CertificateTrustDialogOptions options)
206213
{
207214
var taskCompletionSource = new TaskCompletionSource<object>();
215+
string guid = Guid.NewGuid().ToString();
208216

209-
BridgeConnector.Socket.On("showCertificateTrustDialogComplete", () =>
217+
BridgeConnector.Socket.On("showCertificateTrustDialogComplete" + guid, () =>
210218
{
211-
BridgeConnector.Socket.Off("showCertificateTrustDialogComplete");
219+
BridgeConnector.Socket.Off("showCertificateTrustDialogComplete" + guid);
212220
taskCompletionSource.SetResult(null);
213221
});
214222

215223
BridgeConnector.Socket.Emit("showCertificateTrustDialog",
216224
JObject.FromObject(browserWindow, _jsonSerializer),
217-
JObject.FromObject(options, _jsonSerializer));
225+
JObject.FromObject(options, _jsonSerializer),
226+
guid);
218227

219228
return taskCompletionSource.Task;
220229
}

ElectronNET.API/WindowManager.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ internal static WindowManager Instance
3838
}
3939
}
4040

41+
/// <summary>
42+
/// Quit when all windows are closed. (Default is true)
43+
/// </summary>
44+
/// <value>
45+
/// <c>true</c> if [quit window all closed]; otherwise, <c>false</c>.
46+
/// </value>
47+
public bool IsQuitOnWindowAllClosed
48+
{
49+
get { return _isQuitOnWindowAllClosed; }
50+
set
51+
{
52+
BridgeConnector.Socket.Emit("quit-app-window-all-closed-event", value);
53+
_isQuitOnWindowAllClosed = value;
54+
}
55+
}
56+
private bool _isQuitOnWindowAllClosed = true;
57+
4158
/// <summary>
4259
/// Gets the browser windows.
4360
/// </summary>

ElectronNET.Host/api/app.js

Lines changed: 17 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)