mirror of https://github.com/i3/i3lock.git
Measure wall-clock time instead of CPU time for “locking” indicator. (#153)
related to https://github.com/i3/i3lock/issues/35pull/155/head
parent
d52cc44605
commit
d3636246de
30
xcb.c
30
xcb.c
|
@ -19,6 +19,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include "cursors.h"
|
#include "cursors.h"
|
||||||
#include "unlock_indicator.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_cookie_t kcookie;
|
||||||
xcb_grab_keyboard_reply_t *kreply;
|
xcb_grab_keyboard_reply_t *kreply;
|
||||||
|
|
||||||
|
const suseconds_t screen_redraw_timeout = 100000; /* 100ms */
|
||||||
int tries = 10000;
|
int tries = 10000;
|
||||||
|
|
||||||
/* Using few variables to trigger a redraw_screen() if too many tries */
|
/* Using few variables to trigger a redraw_screen() if too many tries */
|
||||||
bool redrawn = false;
|
bool redrawn = false;
|
||||||
time_t start = clock();
|
struct timeval start;
|
||||||
|
if (gettimeofday(&start, NULL) == -1) {
|
||||||
|
err(EXIT_FAILURE, "gettimeofday");
|
||||||
|
}
|
||||||
|
|
||||||
while (tries-- > 0) {
|
while (tries-- > 0) {
|
||||||
pcookie = xcb_grab_pointer(
|
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 */
|
/* Make this quite a bit slower */
|
||||||
usleep(50);
|
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 &&
|
if (!redrawn &&
|
||||||
(tries % 100) == 0 &&
|
(tries % 100) == 0 &&
|
||||||
(clock() - start) > 250000) {
|
elapsed.tv_usec >= screen_redraw_timeout) {
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
redrawn = true;
|
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 */
|
/* Make this quite a bit slower */
|
||||||
usleep(50);
|
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 &&
|
if (!redrawn &&
|
||||||
(tries % 100) == 0 &&
|
(tries % 100) == 0 &&
|
||||||
(clock() - start) > 250000) {
|
elapsed.tv_usec >= screen_redraw_timeout) {
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
redrawn = true;
|
redrawn = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue