Skip to content

Commit 2d5a5dd

Browse files
committed
feat(application/linux): emit sleep/wake events via logind D-Bus
Adds Linux equivalents to the mac:ApplicationDidWake / WillSleep events introduced in the previous commit, completing power-event coverage across macOS, Windows, and Linux. Implementation subscribes to org.freedesktop.login1.Manager's PrepareForSleep signal on the system bus. The signal fires twice with a boolean arg — true just before suspend (→ linux:SystemWillSleep), false on resume (→ linux:SystemDidWake). The pattern mirrors monitorThemeChanges() in the same file (goroutine + AddMatchSignal + range over Signal channel), differing only in bus (system vs session) and dispatch logic. Graceful degradation: distros without logind/elogind reachable on the system bus (Alpine, Void, some Devuan setups) log a warning and the goroutine exits — the rest of the application keeps running. This matches the existing theme-monitor behaviour for missing session bus. New events: - linux:SystemWillSleep (PrepareForSleep arg=true) - linux:SystemDidWake (PrepareForSleep arg=false) Verification: darwin build + vet + tests pass. Linux cross-compile requires a GTK toolchain not available in this environment, so runtime behaviour will be confirmed when the branch is built on Linux + a manual systemctl suspend test. The function structure is a near-copy of the existing monitorThemeChanges() so the parse-time risk is low. godbus API calls (ConnectSystemBus, WithMatchInterface, WithMatchMember, WithMatchObjectPath) verified against v5.2.2 (the version in go.mod).
1 parent 7723f12 commit 2d5a5dd

9 files changed

Lines changed: 669 additions & 595 deletions

File tree

v3/internal/generator/collect/known_events.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ var knownEvents = map[string]struct{}{
3333
"common:WindowZoomOut": {},
3434
"common:WindowZoomReset": {},
3535
"linux:ApplicationStartup": {},
36+
"linux:SystemDidWake": {},
3637
"linux:SystemThemeChanged": {},
38+
"linux:SystemWillSleep": {},
3739
"linux:WindowDeleteEvent": {},
3840
"linux:WindowDidMove": {},
3941
"linux:WindowDidResize": {},

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,9 @@ export const Types = Object.freeze({
198198
}),
199199
Linux: Object.freeze({
200200
ApplicationStartup: "linux:ApplicationStartup",
201+
SystemDidWake: "linux:SystemDidWake",
201202
SystemThemeChanged: "linux:SystemThemeChanged",
203+
SystemWillSleep: "linux:SystemWillSleep",
202204
WindowDeleteEvent: "linux:WindowDeleteEvent",
203205
WindowDidMove: "linux:WindowDidMove",
204206
WindowDidResize: "linux:WindowDidResize",

v3/pkg/application/application_linux.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ func (a *linuxApp) run() error {
180180
})
181181
a.setupCommonEvents()
182182
a.monitorThemeChanges()
183+
a.monitorPowerEvents()
183184
return appRun(a.application)
184185
}
185186

@@ -275,6 +276,63 @@ func (a *linuxApp) monitorThemeChanges() {
275276
}()
276277
}
277278

279+
// monitorPowerEvents subscribes to systemd-logind's PrepareForSleep signal on
280+
// the system bus and translates it into Linux.SystemWillSleep (arg=true, just
281+
// before suspend) and Linux.SystemDidWake (arg=false, immediately on resume).
282+
// Mirrors NSWorkspace willSleep/didWake on macOS and WM_POWERBROADCAST on
283+
// Windows.
284+
//
285+
// On systems without systemd or logind/elogind reachable on the system bus
286+
// (Alpine, Void, some Devuan setups), we log a warning and exit cleanly so
287+
// the rest of the app keeps working.
288+
func (a *linuxApp) monitorPowerEvents() {
289+
go func() {
290+
defer handlePanic()
291+
conn, err := dbus.ConnectSystemBus()
292+
if err != nil {
293+
a.parent.warning(
294+
"[WARNING] Failed to connect to system bus; sleep/wake events will not fire: %v",
295+
err,
296+
)
297+
return
298+
}
299+
defer conn.Close()
300+
301+
if err = conn.AddMatchSignal(
302+
dbus.WithMatchInterface("org.freedesktop.login1.Manager"),
303+
dbus.WithMatchMember("PrepareForSleep"),
304+
dbus.WithMatchObjectPath("/org/freedesktop/login1"),
305+
); err != nil {
306+
a.parent.warning(
307+
"[WARNING] Failed to subscribe to logind PrepareForSleep; sleep/wake events will not fire: %v",
308+
err,
309+
)
310+
return
311+
}
312+
313+
c := make(chan *dbus.Signal, 4)
314+
conn.Signal(c)
315+
316+
for v := range c {
317+
if v.Name != "org.freedesktop.login1.Manager.PrepareForSleep" {
318+
continue
319+
}
320+
if len(v.Body) < 1 {
321+
continue
322+
}
323+
willSleep, ok := v.Body[0].(bool)
324+
if !ok {
325+
continue
326+
}
327+
if willSleep {
328+
applicationEvents <- newApplicationEvent(events.Linux.SystemWillSleep)
329+
} else {
330+
applicationEvents <- newApplicationEvent(events.Linux.SystemDidWake)
331+
}
332+
}
333+
}()
334+
}
335+
278336
func newPlatformApp(parent *App) *linuxApp {
279337
name := sanitizeAppName(parent.options.Name)
280338
app := &linuxApp{

v3/pkg/events/events.go

Lines changed: 430 additions & 424 deletions
Large diffs are not rendered by default.

v3/pkg/events/events.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ common:WindowZoomIn
2525
common:WindowZoomOut
2626
common:WindowZoomReset
2727
linux:ApplicationStartup
28+
linux:SystemDidWake!
2829
linux:SystemThemeChanged
30+
linux:SystemWillSleep!
2931
linux:WindowDeleteEvent
3032
linux:WindowDidMove
3133
linux:WindowDidResize

v3/pkg/events/events_darwin.h

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

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

146-
#define MAX_EVENTS 1197
146+
#define MAX_EVENTS 1199
147147

148148

149149
#endif

0 commit comments

Comments
 (0)