]> git.sur5r.net Git - i3/i3lock/commitdiff
Measure wall-clock time instead of CPU time for “locking” indicator. (#153)
authorMichael Stapelberg <stapelberg@users.noreply.github.com>
Sat, 21 Oct 2017 22:32:57 +0000 (00:32 +0200)
committerGitHub <noreply@github.com>
Sat, 21 Oct 2017 22:32:57 +0000 (00:32 +0200)
related to https://github.com/i3/i3lock/issues/35

xcb.c

diff --git a/xcb.c b/xcb.c
index d8423109df41075e206f548dbcf6f0cefc9a4d2a..c38440414766b4f8b6b9d19166329ffae2bc0dc5 100644 (file)
--- a/xcb.c
+++ b/xcb.c
@@ -19,6 +19,7 @@
 #include <assert.h>
 #include <err.h>
 #include <time.h>
+#include <sys/time.h>
 
 #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;
         }