diff --git a/i3lock.c b/i3lock.c index a276f6c..e7c170b 100644 --- a/i3lock.c +++ b/i3lock.c @@ -657,6 +657,22 @@ static void xcb_prepare_cb(EV_P_ ev_prepare *w, int revents) { xcb_flush(conn); } +/* + * Try closing logind sleep lock fd passed over from xss-lock, in case we're + * being run from there. + * + */ +static void maybe_close_sleep_lock_fd(void) { + const char *sleep_lock_fd = getenv("XSS_SLEEP_LOCK_FD"); + char *endptr; + if (sleep_lock_fd && *sleep_lock_fd != 0) { + long int fd = strtol(sleep_lock_fd, &endptr, 10); + if (*endptr == 0) { + close(fd); + } + } +} + /* * Instead of polling the X connection socket we leave this to * xcb_poll_for_event() which knows better than we can ever know. @@ -691,6 +707,7 @@ static void xcb_check_cb(EV_P_ ev_check *w, int revents) { break; case XCB_MAP_NOTIFY: + maybe_close_sleep_lock_fd(); if (!dont_fork) { /* After the first MapNotify, we never fork again. We don’t * expect to get another MapNotify, but better be sure… */ @@ -1131,6 +1148,7 @@ int main(int argc, char *argv[]) { if (pid == 0) { /* Child */ close(xcb_get_file_descriptor(conn)); + maybe_close_sleep_lock_fd(); raise_loop(win); exit(EXIT_SUCCESS); } diff --git a/xcb.c b/xcb.c index f1a9a76..3e8cd07 100644 --- a/xcb.c +++ b/xcb.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -150,6 +151,9 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c values[0] = XCB_STACK_MODE_ABOVE; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_STACK_MODE, values); + /* Ensure that the window is created and set up before returning */ + xcb_aux_sync(conn); + return win; }