diff options
author | emersion <contact@emersion.fr> | 2018-11-24 23:26:57 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-11-24 23:26:57 +0100 |
commit | 9b88ee01439a95b922ac3be96a93f16094b06566 (patch) | |
tree | 85cc4f46cf1107f30b7444efb46bf97093a21988 /swayidle | |
parent | swayidle: listen when display becomes writable (diff) | |
download | sway-9b88ee01439a95b922ac3be96a93f16094b06566.tar.gz sway-9b88ee01439a95b922ac3be96a93f16094b06566.tar.zst sway-9b88ee01439a95b922ac3be96a93f16094b06566.zip |
swayidle: fix dbus_event not to block
Diffstat (limited to 'swayidle')
-rw-r--r-- | swayidle/main.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/swayidle/main.c b/swayidle/main.c index ab4b4596..89ccf671 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 | ||
46 | void 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 | |||
46 | static void cmd_exec(char *param) { | 52 | static 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(); |
@@ -138,10 +144,28 @@ static int prepare_for_sleep(sd_bus_message *msg, void *userdata, | |||
138 | 144 | ||
139 | static int dbus_event(int fd, uint32_t mask, void *data) { | 145 | static int dbus_event(int fd, uint32_t mask, void *data) { |
140 | sd_bus *bus = data; | 146 | sd_bus *bus = data; |
141 | while (sd_bus_process(bus, NULL) > 0) { | 147 | |
142 | // 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); | ||
155 | } | ||
156 | if (mask & WL_EVENT_WRITABLE) { | ||
157 | sd_bus_flush(bus); | ||
143 | } | 158 | } |
144 | return 1; | 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; | ||
145 | } | 169 | } |
146 | 170 | ||
147 | static void setup_sleep_listener(void) { | 171 | static void setup_sleep_listener(void) { |
@@ -167,8 +191,10 @@ static void setup_sleep_listener(void) { | |||
167 | } | 191 | } |
168 | acquire_sleep_lock(); | 192 | acquire_sleep_lock(); |
169 | 193 | ||
170 | 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, |
171 | WL_EVENT_READABLE, dbus_event, bus); | 195 | sd_bus_get_fd(bus), WL_EVENT_READABLE | WL_EVENT_WRITABLE, |
196 | dbus_event, bus); | ||
197 | wl_event_source_check(source); | ||
172 | } | 198 | } |
173 | #endif | 199 | #endif |
174 | 200 | ||
@@ -340,12 +366,6 @@ static int parse_args(int argc, char *argv[]) { | |||
340 | return 0; | 366 | return 0; |
341 | } | 367 | } |
342 | 368 | ||
343 | void sway_terminate(int exit_code) { | ||
344 | wl_display_disconnect(state.display); | ||
345 | wl_event_loop_destroy(state.event_loop); | ||
346 | exit(exit_code); | ||
347 | } | ||
348 | |||
349 | static void register_zero_idle_timeout(void *item) { | 369 | static void register_zero_idle_timeout(void *item) { |
350 | struct swayidle_timeout_cmd *cmd = item; | 370 | struct swayidle_timeout_cmd *cmd = item; |
351 | register_timeout(cmd, 0); | 371 | register_timeout(cmd, 0); |