From 9239d4298c63c46bf7ae1de6ad8b6e7904fb64dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Jan 2019 21:35:38 +0100 Subject: [PATCH] main: drop xcb dependency Handle program termination by a) using a signal handler to detect e.g. ctrl-c, and b) listening on the abort_fd to detect when the bar aborts (e.g. due to XCB disconnect, i.e. when the X server dies). --- main.c | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/main.c b/main.c index f765eb7..fd1c00c 100644 --- a/main.c +++ b/main.c @@ -121,15 +121,6 @@ main(int argc, const char *const *argv) return 1; } - /* Connect to XCB, to be able to detect a disconnect (allowing us - * to exit) */ - xcb_connection_t *xcb = xcb_connect(NULL, NULL); - if (xcb_connection_has_error(xcb) > 0) { - LOG_ERR("failed to connect to X"); - xcb_disconnect(xcb); - return 1; - } - xcb_init(); bar->abort_fd = abort_fd; @@ -140,27 +131,19 @@ main(int argc, const char *const *argv) /* Now unblock. We should be only thread receiving SIGINT */ pthread_sigmask(SIG_UNBLOCK, &signal_mask, NULL); - /* Wait for SIGINT, or XCB disconnect */ while (!aborted) { - struct pollfd fds[] = { - {.fd = xcb_get_file_descriptor(xcb), .events = POLLPRI} - }; + struct pollfd fds[] = {{.fd = abort_fd, .events = POLLIN}}; + int r = poll(fds, 1, -1); - poll(fds, 1, -1); - - if (aborted) - break; - - LOG_INFO("XCB poll data"); - - if (fds[0].revents & POLLHUP) { - LOG_INFO("disconnected from XCB, exiting"); - break; - } + /* + * Either the bar aborted (triggering the abort_fd), or user + * killed us (triggering the signal handler which sets + * 'aborted') + */ + assert(aborted || r == 1); + break; } - xcb_disconnect(xcb); - if (aborted) LOG_INFO("aborted: %s (%d)", strsignal(aborted), aborted);