X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=xcb.c;h=c38440414766b4f8b6b9d19166329ffae2bc0dc5;hb=d3636246de11a02bb0d79808436c1edfe80d406b;hp=078ddb96fc7bd9eee542d170eae3689d7d6baf8d;hpb=0bed914e8eccb5d62cb12de4b26541b7441c94dc;p=i3%2Fi3lock diff --git a/xcb.c b/xcb.c index 078ddb9..c384404 100644 --- a/xcb.c +++ b/xcb.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -20,6 +19,7 @@ #include #include #include +#include #include "cursors.h" #include "unlock_indicator.h" @@ -107,29 +107,6 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c uint32_t mask = 0; uint32_t values[3]; xcb_window_t win = xcb_generate_id(conn); - xcb_window_t parent_win = scr->root; - - /* Check whether the composite extension is available */ - const xcb_query_extension_reply_t *extension_query = NULL; - xcb_generic_error_t *error = NULL; - xcb_composite_get_overlay_window_cookie_t cookie; - xcb_composite_get_overlay_window_reply_t *composite_reply = NULL; - - extension_query = xcb_get_extension_data(conn, &xcb_composite_id); - if (extension_query && extension_query->present) { - /* When composition is used, we need to use the composite overlay - * window instead of the normal root window to be able to cover - * composited windows */ - cookie = xcb_composite_get_overlay_window(conn, scr->root); - composite_reply = xcb_composite_get_overlay_window_reply(conn, cookie, &error); - - if (!error && composite_reply) { - parent_win = composite_reply->overlay_win; - } - - free(composite_reply); - free(error); - } if (pixmap == XCB_NONE) { mask |= XCB_CW_BACK_PIXEL; @@ -151,8 +128,8 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c xcb_create_window(conn, XCB_COPY_FROM_PARENT, - win, /* the window id */ - parent_win, + win, /* the window id */ + scr->root, /* parent == root */ 0, 0, scr->width_in_pixels, scr->height_in_pixels, /* dimensions */ @@ -196,11 +173,15 @@ void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb xcb_grab_keyboard_cookie_t kcookie; xcb_grab_keyboard_reply_t *kreply; + const suseconds_t screen_redraw_timeout = 100000; /* 100ms */ int tries = 10000; /* Using few variables to trigger a redraw_screen() if too many tries */ bool redrawn = false; - time_t start = clock(); + struct timeval start; + if (gettimeofday(&start, NULL) == -1) { + err(EXIT_FAILURE, "gettimeofday"); + } while (tries-- > 0) { pcookie = xcb_grab_pointer( @@ -223,10 +204,17 @@ void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb /* Make this quite a bit slower */ usleep(50); - /* Measure elapsed time and trigger a screen redraw if elapsed > 250000 */ + struct timeval now; + if (gettimeofday(&now, NULL) == -1) { + err(EXIT_FAILURE, "gettimeofday"); + } + + struct timeval elapsed; + timersub(&now, &start, &elapsed); + if (!redrawn && (tries % 100) == 0 && - (clock() - start) > 250000) { + elapsed.tv_usec >= screen_redraw_timeout) { redraw_screen(); redrawn = true; } @@ -250,10 +238,18 @@ void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb /* Make this quite a bit slower */ usleep(50); - /* Measure elapsed time and trigger a screen redraw if elapsed > 250000 */ + struct timeval now; + if (gettimeofday(&now, NULL) == -1) { + err(EXIT_FAILURE, "gettimeofday"); + } + + struct timeval elapsed; + timersub(&now, &start, &elapsed); + + /* Trigger a screen redraw if 100ms elapsed */ if (!redrawn && (tries % 100) == 0 && - (clock() - start) > 250000) { + elapsed.tv_usec >= screen_redraw_timeout) { redraw_screen(); redrawn = true; }