Skip to content

Commit 7723f12

Browse files
committed
feat(application/mac): emit power events from NSWorkspace observers
Mirrors the windows:APMSuspend / APMResumeAutomatic / APMResumeSuspend events that Wails v3 already raises from WM_POWERBROADCAST on Windows. NSWorkspace power notifications post to its own notification center (not the default NSNotificationCenter that NSApplicationDelegate uses) so the events are declared with the `!` suffix in events.txt to skip the delegate-selector auto-generation, and observers are wired by hand in application_darwin.go's init() alongside the existing theme-change observer on NSDistributedNotificationCenter. New events: - mac:ApplicationWillSleep (NSWorkspaceWillSleepNotification) - mac:ApplicationDidWake (NSWorkspaceDidWakeNotification) - mac:ApplicationScreensDidSleep (NSWorkspaceScreensDidSleepNotification) - mac:ApplicationScreensDidWake (NSWorkspaceScreensDidWakeNotification) Verification: compile + vet + existing unit tests pass on macOS, linux, windows. Runtime firing of the observers is not exercised by automated tests (same gap as the rest of the AppDelegate selectors) — to be confirmed via xbar2's #807 follow-up wiring and a manual sleep test. Motivation: xbar2 needs DidWake to force a plugin refresh sweep after sleep, addressing upstream xbar issue #807 (the most-upvoted open bug).
1 parent 2ef15be commit 7723f12

9 files changed

Lines changed: 571 additions & 510 deletions

File tree

v3/internal/generator/collect/known_events.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,15 @@ var knownEvents = map[string]struct{}{
5757
"mac:ApplicationDidResignActive": {},
5858
"mac:ApplicationDidUnhide": {},
5959
"mac:ApplicationDidUpdate": {},
60+
"mac:ApplicationDidWake": {},
61+
"mac:ApplicationScreensDidSleep": {},
62+
"mac:ApplicationScreensDidWake": {},
6063
"mac:ApplicationShouldHandleReopen": {},
6164
"mac:ApplicationWillBecomeActive": {},
6265
"mac:ApplicationWillFinishLaunching": {},
6366
"mac:ApplicationWillHide": {},
6467
"mac:ApplicationWillResignActive": {},
68+
"mac:ApplicationWillSleep": {},
6569
"mac:ApplicationWillTerminate": {},
6670
"mac:ApplicationWillUnhide": {},
6771
"mac:ApplicationWillUpdate": {},

v3/internal/runtime/desktop/@wailsio/runtime/src/event_types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,15 @@ export const Types = Object.freeze({
7373
ApplicationDidResignActive: "mac:ApplicationDidResignActive",
7474
ApplicationDidUnhide: "mac:ApplicationDidUnhide",
7575
ApplicationDidUpdate: "mac:ApplicationDidUpdate",
76+
ApplicationDidWake: "mac:ApplicationDidWake",
77+
ApplicationScreensDidSleep: "mac:ApplicationScreensDidSleep",
78+
ApplicationScreensDidWake: "mac:ApplicationScreensDidWake",
7679
ApplicationShouldHandleReopen: "mac:ApplicationShouldHandleReopen",
7780
ApplicationWillBecomeActive: "mac:ApplicationWillBecomeActive",
7881
ApplicationWillFinishLaunching: "mac:ApplicationWillFinishLaunching",
7982
ApplicationWillHide: "mac:ApplicationWillHide",
8083
ApplicationWillResignActive: "mac:ApplicationWillResignActive",
84+
ApplicationWillSleep: "mac:ApplicationWillSleep",
8185
ApplicationWillTerminate: "mac:ApplicationWillTerminate",
8286
ApplicationWillUnhide: "mac:ApplicationWillUnhide",
8387
ApplicationWillUpdate: "mac:ApplicationWillUpdate",

v3/pkg/application/application_darwin.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ static void init(void) {
5757
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter];
5858
[center addObserver:appDelegate selector:@selector(themeChanged:) name:@"AppleInterfaceThemeChangedNotification" object:nil];
5959
60+
// Workspace power notifications are posted on a separate notification
61+
// center from the default one — apps must observe NSWorkspace's centre
62+
// to receive sleep/wake events. Mirrors WM_POWERBROADCAST on Windows.
63+
NSNotificationCenter *workspaceCenter = [[NSWorkspace sharedWorkspace] notificationCenter];
64+
[workspaceCenter addObserver:appDelegate selector:@selector(workspaceWillSleep:) name:NSWorkspaceWillSleepNotification object:nil];
65+
[workspaceCenter addObserver:appDelegate selector:@selector(workspaceDidWake:) name:NSWorkspaceDidWakeNotification object:nil];
66+
[workspaceCenter addObserver:appDelegate selector:@selector(workspaceScreensDidSleep:) name:NSWorkspaceScreensDidSleepNotification object:nil];
67+
[workspaceCenter addObserver:appDelegate selector:@selector(workspaceScreensDidWake:) name:NSWorkspaceScreensDidWakeNotification object:nil];
68+
6069
// Register the custom URL scheme handler
6170
StartCustomProtocolHandler();
6271
}

v3/pkg/application/application_darwin_delegate.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,26 @@ - (void)themeChanged:(NSNotification *)notification {
3737
processApplicationEvent(EventApplicationDidChangeTheme, NULL);
3838
}
3939
}
40+
- (void)workspaceWillSleep:(NSNotification *)notification {
41+
if( hasListeners(EventApplicationWillSleep) ) {
42+
processApplicationEvent(EventApplicationWillSleep, NULL);
43+
}
44+
}
45+
- (void)workspaceDidWake:(NSNotification *)notification {
46+
if( hasListeners(EventApplicationDidWake) ) {
47+
processApplicationEvent(EventApplicationDidWake, NULL);
48+
}
49+
}
50+
- (void)workspaceScreensDidSleep:(NSNotification *)notification {
51+
if( hasListeners(EventApplicationScreensDidSleep) ) {
52+
processApplicationEvent(EventApplicationScreensDidSleep, NULL);
53+
}
54+
}
55+
- (void)workspaceScreensDidWake:(NSNotification *)notification {
56+
if( hasListeners(EventApplicationScreensDidWake) ) {
57+
processApplicationEvent(EventApplicationScreensDidWake, NULL);
58+
}
59+
}
4060
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
4161
if( ! shouldQuitApplication() ) {
4262
return NSTerminateCancel;

v3/pkg/events/events.go

Lines changed: 380 additions & 368 deletions
Large diffs are not rendered by default.

v3/pkg/events/events.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,15 @@ mac:ApplicationDidHide
4949
mac:ApplicationDidResignActive
5050
mac:ApplicationDidUnhide
5151
mac:ApplicationDidUpdate
52+
mac:ApplicationDidWake!
53+
mac:ApplicationScreensDidSleep!
54+
mac:ApplicationScreensDidWake!
5255
mac:ApplicationShouldHandleReopen!
5356
mac:ApplicationWillBecomeActive
5457
mac:ApplicationWillFinishLaunching
5558
mac:ApplicationWillHide
5659
mac:ApplicationWillResignActive
60+
mac:ApplicationWillSleep!
5761
mac:ApplicationWillTerminate
5862
mac:ApplicationWillUnhide
5963
mac:ApplicationWillUpdate

v3/pkg/events/events_darwin.h

Lines changed: 123 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -20,126 +20,130 @@ extern void processWindowEvent(unsigned int, unsigned int);
2020
#define EventApplicationDidResignActive 1072
2121
#define EventApplicationDidUnhide 1073
2222
#define EventApplicationDidUpdate 1074
23-
#define EventApplicationShouldHandleReopen 1075
24-
#define EventApplicationWillBecomeActive 1076
25-
#define EventApplicationWillFinishLaunching 1077
26-
#define EventApplicationWillHide 1078
27-
#define EventApplicationWillResignActive 1079
28-
#define EventApplicationWillTerminate 1080
29-
#define EventApplicationWillUnhide 1081
30-
#define EventApplicationWillUpdate 1082
31-
#define EventMenuDidAddItem 1083
32-
#define EventMenuDidBeginTracking 1084
33-
#define EventMenuDidClose 1085
34-
#define EventMenuDidDisplayItem 1086
35-
#define EventMenuDidEndTracking 1087
36-
#define EventMenuDidHighlightItem 1088
37-
#define EventMenuDidOpen 1089
38-
#define EventMenuDidPopUp 1090
39-
#define EventMenuDidRemoveItem 1091
40-
#define EventMenuDidSendAction 1092
41-
#define EventMenuDidSendActionToItem 1093
42-
#define EventMenuDidUpdate 1094
43-
#define EventMenuWillAddItem 1095
44-
#define EventMenuWillBeginTracking 1096
45-
#define EventMenuWillDisplayItem 1097
46-
#define EventMenuWillEndTracking 1098
47-
#define EventMenuWillHighlightItem 1099
48-
#define EventMenuWillOpen 1100
49-
#define EventMenuWillPopUp 1101
50-
#define EventMenuWillRemoveItem 1102
51-
#define EventMenuWillSendAction 1103
52-
#define EventMenuWillSendActionToItem 1104
53-
#define EventMenuWillUpdate 1105
54-
#define EventWebViewDidCommitNavigation 1106
55-
#define EventWebViewDidFinishNavigation 1107
56-
#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1108
57-
#define EventWebViewDidStartProvisionalNavigation 1109
58-
#define EventWindowDidBecomeKey 1110
59-
#define EventWindowDidBecomeMain 1111
60-
#define EventWindowDidBeginSheet 1112
61-
#define EventWindowDidChangeAlpha 1113
62-
#define EventWindowDidChangeBackingLocation 1114
63-
#define EventWindowDidChangeBackingProperties 1115
64-
#define EventWindowDidChangeCollectionBehavior 1116
65-
#define EventWindowDidChangeEffectiveAppearance 1117
66-
#define EventWindowDidChangeOcclusionState 1118
67-
#define EventWindowDidChangeOrderingMode 1119
68-
#define EventWindowDidChangeScreen 1120
69-
#define EventWindowDidChangeScreenParameters 1121
70-
#define EventWindowDidChangeScreenProfile 1122
71-
#define EventWindowDidChangeScreenSpace 1123
72-
#define EventWindowDidChangeScreenSpaceProperties 1124
73-
#define EventWindowDidChangeSharingType 1125
74-
#define EventWindowDidChangeSpace 1126
75-
#define EventWindowDidChangeSpaceOrderingMode 1127
76-
#define EventWindowDidChangeTitle 1128
77-
#define EventWindowDidChangeToolbar 1129
78-
#define EventWindowDidDeminiaturize 1130
79-
#define EventWindowDidEndSheet 1131
80-
#define EventWindowDidEnterFullScreen 1132
81-
#define EventWindowDidEnterVersionBrowser 1133
82-
#define EventWindowDidExitFullScreen 1134
83-
#define EventWindowDidExitVersionBrowser 1135
84-
#define EventWindowDidExpose 1136
85-
#define EventWindowDidFocus 1137
86-
#define EventWindowDidMiniaturize 1138
87-
#define EventWindowDidMove 1139
88-
#define EventWindowDidOrderOffScreen 1140
89-
#define EventWindowDidOrderOnScreen 1141
90-
#define EventWindowDidResignKey 1142
91-
#define EventWindowDidResignMain 1143
92-
#define EventWindowDidResize 1144
93-
#define EventWindowDidUpdate 1145
94-
#define EventWindowDidUpdateAlpha 1146
95-
#define EventWindowDidUpdateCollectionBehavior 1147
96-
#define EventWindowDidUpdateCollectionProperties 1148
97-
#define EventWindowDidUpdateShadow 1149
98-
#define EventWindowDidUpdateTitle 1150
99-
#define EventWindowDidUpdateToolbar 1151
100-
#define EventWindowDidZoom 1152
101-
#define EventWindowFileDraggingEntered 1153
102-
#define EventWindowFileDraggingExited 1154
103-
#define EventWindowFileDraggingPerformed 1155
104-
#define EventWindowHide 1156
105-
#define EventWindowMaximise 1157
106-
#define EventWindowUnMaximise 1158
107-
#define EventWindowMinimise 1159
108-
#define EventWindowUnMinimise 1160
109-
#define EventWindowShouldClose 1161
110-
#define EventWindowShow 1162
111-
#define EventWindowWillBecomeKey 1163
112-
#define EventWindowWillBecomeMain 1164
113-
#define EventWindowWillBeginSheet 1165
114-
#define EventWindowWillChangeOrderingMode 1166
115-
#define EventWindowWillClose 1167
116-
#define EventWindowWillDeminiaturize 1168
117-
#define EventWindowWillEnterFullScreen 1169
118-
#define EventWindowWillEnterVersionBrowser 1170
119-
#define EventWindowWillExitFullScreen 1171
120-
#define EventWindowWillExitVersionBrowser 1172
121-
#define EventWindowWillFocus 1173
122-
#define EventWindowWillMiniaturize 1174
123-
#define EventWindowWillMove 1175
124-
#define EventWindowWillOrderOffScreen 1176
125-
#define EventWindowWillOrderOnScreen 1177
126-
#define EventWindowWillResignMain 1178
127-
#define EventWindowWillResize 1179
128-
#define EventWindowWillUnfocus 1180
129-
#define EventWindowWillUpdate 1181
130-
#define EventWindowWillUpdateAlpha 1182
131-
#define EventWindowWillUpdateCollectionBehavior 1183
132-
#define EventWindowWillUpdateCollectionProperties 1184
133-
#define EventWindowWillUpdateShadow 1185
134-
#define EventWindowWillUpdateTitle 1186
135-
#define EventWindowWillUpdateToolbar 1187
136-
#define EventWindowWillUpdateVisibility 1188
137-
#define EventWindowWillUseStandardFrame 1189
138-
#define EventWindowZoomIn 1190
139-
#define EventWindowZoomOut 1191
140-
#define EventWindowZoomReset 1192
23+
#define EventApplicationDidWake 1075
24+
#define EventApplicationScreensDidSleep 1076
25+
#define EventApplicationScreensDidWake 1077
26+
#define EventApplicationShouldHandleReopen 1078
27+
#define EventApplicationWillBecomeActive 1079
28+
#define EventApplicationWillFinishLaunching 1080
29+
#define EventApplicationWillHide 1081
30+
#define EventApplicationWillResignActive 1082
31+
#define EventApplicationWillSleep 1083
32+
#define EventApplicationWillTerminate 1084
33+
#define EventApplicationWillUnhide 1085
34+
#define EventApplicationWillUpdate 1086
35+
#define EventMenuDidAddItem 1087
36+
#define EventMenuDidBeginTracking 1088
37+
#define EventMenuDidClose 1089
38+
#define EventMenuDidDisplayItem 1090
39+
#define EventMenuDidEndTracking 1091
40+
#define EventMenuDidHighlightItem 1092
41+
#define EventMenuDidOpen 1093
42+
#define EventMenuDidPopUp 1094
43+
#define EventMenuDidRemoveItem 1095
44+
#define EventMenuDidSendAction 1096
45+
#define EventMenuDidSendActionToItem 1097
46+
#define EventMenuDidUpdate 1098
47+
#define EventMenuWillAddItem 1099
48+
#define EventMenuWillBeginTracking 1100
49+
#define EventMenuWillDisplayItem 1101
50+
#define EventMenuWillEndTracking 1102
51+
#define EventMenuWillHighlightItem 1103
52+
#define EventMenuWillOpen 1104
53+
#define EventMenuWillPopUp 1105
54+
#define EventMenuWillRemoveItem 1106
55+
#define EventMenuWillSendAction 1107
56+
#define EventMenuWillSendActionToItem 1108
57+
#define EventMenuWillUpdate 1109
58+
#define EventWebViewDidCommitNavigation 1110
59+
#define EventWebViewDidFinishNavigation 1111
60+
#define EventWebViewDidReceiveServerRedirectForProvisionalNavigation 1112
61+
#define EventWebViewDidStartProvisionalNavigation 1113
62+
#define EventWindowDidBecomeKey 1114
63+
#define EventWindowDidBecomeMain 1115
64+
#define EventWindowDidBeginSheet 1116
65+
#define EventWindowDidChangeAlpha 1117
66+
#define EventWindowDidChangeBackingLocation 1118
67+
#define EventWindowDidChangeBackingProperties 1119
68+
#define EventWindowDidChangeCollectionBehavior 1120
69+
#define EventWindowDidChangeEffectiveAppearance 1121
70+
#define EventWindowDidChangeOcclusionState 1122
71+
#define EventWindowDidChangeOrderingMode 1123
72+
#define EventWindowDidChangeScreen 1124
73+
#define EventWindowDidChangeScreenParameters 1125
74+
#define EventWindowDidChangeScreenProfile 1126
75+
#define EventWindowDidChangeScreenSpace 1127
76+
#define EventWindowDidChangeScreenSpaceProperties 1128
77+
#define EventWindowDidChangeSharingType 1129
78+
#define EventWindowDidChangeSpace 1130
79+
#define EventWindowDidChangeSpaceOrderingMode 1131
80+
#define EventWindowDidChangeTitle 1132
81+
#define EventWindowDidChangeToolbar 1133
82+
#define EventWindowDidDeminiaturize 1134
83+
#define EventWindowDidEndSheet 1135
84+
#define EventWindowDidEnterFullScreen 1136
85+
#define EventWindowDidEnterVersionBrowser 1137
86+
#define EventWindowDidExitFullScreen 1138
87+
#define EventWindowDidExitVersionBrowser 1139
88+
#define EventWindowDidExpose 1140
89+
#define EventWindowDidFocus 1141
90+
#define EventWindowDidMiniaturize 1142
91+
#define EventWindowDidMove 1143
92+
#define EventWindowDidOrderOffScreen 1144
93+
#define EventWindowDidOrderOnScreen 1145
94+
#define EventWindowDidResignKey 1146
95+
#define EventWindowDidResignMain 1147
96+
#define EventWindowDidResize 1148
97+
#define EventWindowDidUpdate 1149
98+
#define EventWindowDidUpdateAlpha 1150
99+
#define EventWindowDidUpdateCollectionBehavior 1151
100+
#define EventWindowDidUpdateCollectionProperties 1152
101+
#define EventWindowDidUpdateShadow 1153
102+
#define EventWindowDidUpdateTitle 1154
103+
#define EventWindowDidUpdateToolbar 1155
104+
#define EventWindowDidZoom 1156
105+
#define EventWindowFileDraggingEntered 1157
106+
#define EventWindowFileDraggingExited 1158
107+
#define EventWindowFileDraggingPerformed 1159
108+
#define EventWindowHide 1160
109+
#define EventWindowMaximise 1161
110+
#define EventWindowUnMaximise 1162
111+
#define EventWindowMinimise 1163
112+
#define EventWindowUnMinimise 1164
113+
#define EventWindowShouldClose 1165
114+
#define EventWindowShow 1166
115+
#define EventWindowWillBecomeKey 1167
116+
#define EventWindowWillBecomeMain 1168
117+
#define EventWindowWillBeginSheet 1169
118+
#define EventWindowWillChangeOrderingMode 1170
119+
#define EventWindowWillClose 1171
120+
#define EventWindowWillDeminiaturize 1172
121+
#define EventWindowWillEnterFullScreen 1173
122+
#define EventWindowWillEnterVersionBrowser 1174
123+
#define EventWindowWillExitFullScreen 1175
124+
#define EventWindowWillExitVersionBrowser 1176
125+
#define EventWindowWillFocus 1177
126+
#define EventWindowWillMiniaturize 1178
127+
#define EventWindowWillMove 1179
128+
#define EventWindowWillOrderOffScreen 1180
129+
#define EventWindowWillOrderOnScreen 1181
130+
#define EventWindowWillResignMain 1182
131+
#define EventWindowWillResize 1183
132+
#define EventWindowWillUnfocus 1184
133+
#define EventWindowWillUpdate 1185
134+
#define EventWindowWillUpdateAlpha 1186
135+
#define EventWindowWillUpdateCollectionBehavior 1187
136+
#define EventWindowWillUpdateCollectionProperties 1188
137+
#define EventWindowWillUpdateShadow 1189
138+
#define EventWindowWillUpdateTitle 1190
139+
#define EventWindowWillUpdateToolbar 1191
140+
#define EventWindowWillUpdateVisibility 1192
141+
#define EventWindowWillUseStandardFrame 1193
142+
#define EventWindowZoomIn 1194
143+
#define EventWindowZoomOut 1195
144+
#define EventWindowZoomReset 1196
141145

142-
#define MAX_EVENTS 1193
146+
#define MAX_EVENTS 1197
143147

144148

145149
#endif

v3/pkg/events/events_ios.h

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,30 @@
66
extern void processApplicationEvent(unsigned int, void* data);
77
extern void processWindowEvent(unsigned int, unsigned int);
88

9-
#define EventApplicationDidBecomeActive 1237
10-
#define EventApplicationDidEnterBackground 1238
11-
#define EventApplicationDidFinishLaunching 1239
12-
#define EventApplicationDidReceiveMemoryWarning 1240
13-
#define EventApplicationWillEnterForeground 1241
14-
#define EventApplicationWillResignActive 1242
15-
#define EventApplicationWillTerminate 1243
16-
#define EventWindowDidLoad 1244
17-
#define EventWindowWillAppear 1245
18-
#define EventWindowDidAppear 1246
19-
#define EventWindowWillDisappear 1247
20-
#define EventWindowDidDisappear 1248
21-
#define EventWindowSafeAreaInsetsChanged 1249
22-
#define EventWindowOrientationChanged 1250
23-
#define EventWindowTouchBegan 1251
24-
#define EventWindowTouchMoved 1252
25-
#define EventWindowTouchEnded 1253
26-
#define EventWindowTouchCancelled 1254
27-
#define EventWebViewDidStartNavigation 1255
28-
#define EventWebViewDidFinishNavigation 1256
29-
#define EventWebViewDidFailNavigation 1257
30-
#define EventWebViewDecidePolicyForNavigationAction 1258
9+
#define EventApplicationDidBecomeActive 1241
10+
#define EventApplicationDidEnterBackground 1242
11+
#define EventApplicationDidFinishLaunching 1243
12+
#define EventApplicationDidReceiveMemoryWarning 1244
13+
#define EventApplicationWillEnterForeground 1245
14+
#define EventApplicationWillResignActive 1246
15+
#define EventApplicationWillTerminate 1247
16+
#define EventWindowDidLoad 1248
17+
#define EventWindowWillAppear 1249
18+
#define EventWindowDidAppear 1250
19+
#define EventWindowWillDisappear 1251
20+
#define EventWindowDidDisappear 1252
21+
#define EventWindowSafeAreaInsetsChanged 1253
22+
#define EventWindowOrientationChanged 1254
23+
#define EventWindowTouchBegan 1255
24+
#define EventWindowTouchMoved 1256
25+
#define EventWindowTouchEnded 1257
26+
#define EventWindowTouchCancelled 1258
27+
#define EventWebViewDidStartNavigation 1259
28+
#define EventWebViewDidFinishNavigation 1260
29+
#define EventWebViewDidFailNavigation 1261
30+
#define EventWebViewDecidePolicyForNavigationAction 1262
3131

32-
#define MAX_EVENTS 1259
32+
#define MAX_EVENTS 1263
3333

3434

3535
#endif

0 commit comments

Comments
 (0)