From d3636246de11a02bb0d79808436c1edfe80d406b Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 22 Oct 2017 00:32:57 +0200 Subject: [PATCH] =?UTF-8?q?Measure=20wall-clock=20time=20instead=20of=20CP?= =?UTF-8?q?U=20time=20for=20=E2=80=9Clocking=E2=80=9D=20indicator.=20(#153?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit related to https://github.com/i3/i3lock/issues/35 --- xcb.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/xcb.c b/xcb.c index d842310..c384404 100644 --- a/xcb.c +++ b/xcb.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "cursors.h" #include "unlock_indicator.h" @@ -172,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( @@ -199,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; } @@ -226,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; }