summaryrefslogtreecommitdiffstats
path: root/swayidle
diff options
context:
space:
mode:
Diffstat (limited to 'swayidle')
-rw-r--r--swayidle/main.c77
-rw-r--r--swayidle/swayidle.1.scd2
2 files changed, 56 insertions, 23 deletions
diff --git a/swayidle/main.c b/swayidle/main.c
index 2b185949..dd7d9de3 100644
--- a/swayidle/main.c
+++ b/swayidle/main.c
@@ -43,6 +43,12 @@ struct swayidle_timeout_cmd {
43 char *resume_cmd; 43 char *resume_cmd;
44}; 44};
45 45
46void sway_terminate(int exit_code) {
47 wl_display_disconnect(state.display);
48 wl_event_loop_destroy(state.event_loop);
49 exit(exit_code);
50}
51
46static void cmd_exec(char *param) { 52static void cmd_exec(char *param) {
47 wlr_log(WLR_DEBUG, "Cmd exec %s", param); 53 wlr_log(WLR_DEBUG, "Cmd exec %s", param);
48 pid_t pid = fork(); 54 pid_t pid = fork();
@@ -81,16 +87,16 @@ static int release_lock(void *data) {
81} 87}
82 88
83static void acquire_sleep_lock(void) { 89static void acquire_sleep_lock(void) {
84 sd_bus_message *msg; 90 sd_bus_message *msg = NULL;
85 sd_bus_error error; 91 sd_bus_error error = SD_BUS_ERROR_NULL;
86 int ret = sd_bus_call_method(bus, "org.freedesktop.login1", 92 int ret = sd_bus_call_method(bus, "org.freedesktop.login1",
87 "/org/freedesktop/login1", 93 "/org/freedesktop/login1",
88 "org.freedesktop.login1.Manager", "Inhibit", 94 "org.freedesktop.login1.Manager", "Inhibit",
89 &error, &msg, "ssss", "sleep", "swayidle", 95 &error, &msg, "ssss", "sleep", "swayidle",
90 "Setup Up Lock Screen", "delay"); 96 "Setup Up Lock Screen", "delay");
91 if (ret < 0) { 97 if (ret < 0) {
92 wlr_log(WLR_ERROR, "Failed to send Inhibit signal: %s", 98 wlr_log(WLR_ERROR, "Failed to send Inhibit signal: %s", error.message);
93 strerror(-ret)); 99 sd_bus_error_free(&error);
94 return; 100 return;
95 } 101 }
96 102
@@ -98,10 +104,11 @@ static void acquire_sleep_lock(void) {
98 if (ret < 0) { 104 if (ret < 0) {
99 wlr_log(WLR_ERROR, "Failed to parse D-Bus response for Inhibit: %s", 105 wlr_log(WLR_ERROR, "Failed to parse D-Bus response for Inhibit: %s",
100 strerror(-ret)); 106 strerror(-ret));
101 return; 107 } else {
108 wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd);
102 } 109 }
103 110 sd_bus_error_free(&error);
104 wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd); 111 sd_bus_message_unref(msg);
105} 112}
106 113
107static int prepare_for_sleep(sd_bus_message *msg, void *userdata, 114static int prepare_for_sleep(sd_bus_message *msg, void *userdata,
@@ -137,10 +144,28 @@ static int prepare_for_sleep(sd_bus_message *msg, void *userdata,
137 144
138static int dbus_event(int fd, uint32_t mask, void *data) { 145static int dbus_event(int fd, uint32_t mask, void *data) {
139 sd_bus *bus = data; 146 sd_bus *bus = data;
140 while (sd_bus_process(bus, NULL) > 0) { 147
141 // Do nothing. 148 if ((mask & WL_EVENT_HANGUP) || (mask & WL_EVENT_ERROR)) {
149 sway_terminate(0);
150 }
151
152 int count = 0;
153 if (mask & WL_EVENT_READABLE) {
154 count = sd_bus_process(bus, NULL);
142 } 155 }
143 return 1; 156 if (mask & WL_EVENT_WRITABLE) {
157 sd_bus_flush(bus);
158 }
159 if (mask == 0) {
160 sd_bus_flush(bus);
161 }
162
163 if (count < 0) {
164 wlr_log_errno(WLR_ERROR, "sd_bus_process failed, exiting");
165 sway_terminate(0);
166 }
167
168 return count;
144} 169}
145 170
146static void setup_sleep_listener(void) { 171static void setup_sleep_listener(void) {
@@ -166,8 +191,9 @@ static void setup_sleep_listener(void) {
166 } 191 }
167 acquire_sleep_lock(); 192 acquire_sleep_lock();
168 193
169 wl_event_loop_add_fd(state.event_loop, sd_bus_get_fd(bus), 194 struct wl_event_source *source = wl_event_loop_add_fd(state.event_loop,
170 WL_EVENT_READABLE, dbus_event, bus); 195 sd_bus_get_fd(bus), WL_EVENT_READABLE, dbus_event, bus);
196 wl_event_source_check(source);
171} 197}
172#endif 198#endif
173 199
@@ -339,12 +365,6 @@ static int parse_args(int argc, char *argv[]) {
339 return 0; 365 return 0;
340} 366}
341 367
342void sway_terminate(int exit_code) {
343 wl_display_disconnect(state.display);
344 wl_event_loop_destroy(state.event_loop);
345 exit(exit_code);
346}
347
348static void register_zero_idle_timeout(void *item) { 368static void register_zero_idle_timeout(void *item) {
349 struct swayidle_timeout_cmd *cmd = item; 369 struct swayidle_timeout_cmd *cmd = item;
350 register_timeout(cmd, 0); 370 register_timeout(cmd, 0);
@@ -365,15 +385,28 @@ static int handle_signal(int sig, void *data) {
365} 385}
366 386
367static int display_event(int fd, uint32_t mask, void *data) { 387static int display_event(int fd, uint32_t mask, void *data) {
368 if (mask & WL_EVENT_HANGUP) { 388 if ((mask & WL_EVENT_HANGUP) || (mask & WL_EVENT_ERROR)) {
369 sway_terminate(0); 389 sway_terminate(0);
370 } 390 }
371 if (wl_display_dispatch(state.display) < 0) { 391
392 int count = 0;
393 if (mask & WL_EVENT_READABLE) {
394 count = wl_display_dispatch(state.display);
395 }
396 if (mask & WL_EVENT_WRITABLE) {
397 wl_display_flush(state.display);
398 }
399 if (mask == 0) {
400 count = wl_display_dispatch_pending(state.display);
401 wl_display_flush(state.display);
402 }
403
404 if (count < 0) {
372 wlr_log_errno(WLR_ERROR, "wl_display_dispatch failed, exiting"); 405 wlr_log_errno(WLR_ERROR, "wl_display_dispatch failed, exiting");
373 sway_terminate(0); 406 sway_terminate(0);
374 } 407 }
375 wl_display_flush(state.display); 408
376 return 0; 409 return count;
377} 410}
378 411
379static void register_idle_timeout(void *item) { 412static void register_idle_timeout(void *item) {
diff --git a/swayidle/swayidle.1.scd b/swayidle/swayidle.1.scd
index 3083163f..0e3b5c3c 100644
--- a/swayidle/swayidle.1.scd
+++ b/swayidle/swayidle.1.scd
@@ -49,7 +49,7 @@ swayidle \
49``` 49```
50 50
51This will lock your screen after 300 seconds of inactivity, then turn off your 51This will lock your screen after 300 seconds of inactivity, then turn off your
52displays after another 600 seconds, and turn your screens back on when resumed. 52displays after another 300 seconds, and turn your screens back on when resumed.
53It will also lock your screen before your computer goes to sleep. 53It will also lock your screen before your computer goes to sleep.
54 54
55# AUTHORS 55# AUTHORS