diff --git a/helpers.h b/helpers.h index 6535624..cd19c8a 100644 --- a/helpers.h +++ b/helpers.h @@ -1,13 +1,34 @@ #ifndef HELPERS_SENTRY #define HELPERS_SENTRY -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - #define KB(n) (((unsigned long long)(n)) << 10) #define MB(n) (((unsigned long long)(n)) << 20) #define GB(n) (((unsigned long long)(n)) << 30) #define TB(n) (((unsigned long long)(n)) << 40) +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + #define SWAP(T, a, b) do { T t__ = a; a = b; b = t__; } while(0) +#define PI 3.1415926535897f +#define EPSILON 4.94065645841247e-324 + +#define MAX_U64 (unsigned long long)0xffffffffffffffffull +#define MAX_U32 (unsigned int)0xffffffff +#define MAX_U16 (unsigned short)0xffff +#define MAX_U8 (unsigned char)0xff + +#define MAX_S64 (long long)0x7fffffffffffffffll +#define MAX_S32 (int)0x7fffffff +#define MAX_S16 (short)0x7fff +#define MAX_S8 (signed char)0x7f + +#define MIN_S64 (long long)0x8000000000000000ll +#define MIN_S32 (int)0x80000000 +#define MIN_S16 (short)0x8000 +#define MIN_S8 (signed char)0x80 + #endif diff --git a/slock.c b/slock.c index b15eb55..3b443dd 100644 --- a/slock.c +++ b/slock.c @@ -745,7 +745,7 @@ run_loop(struct arena *arena, struct timeval tv; KeySym ksym; XEvent ev; - unsigned long long rendering_timeout_millis; + unsigned long long rendering_timeout_millis, failure_timeout_millis; struct dpms_state dpms_state; struct fonts fonts; int kbl_brightness; @@ -775,6 +775,7 @@ run_loop(struct arena *arena, needs_rendering = 1; rendering_timeout_millis = millis(); + failure_timeout_millis = 0; while(running) { fd_set fds; @@ -851,44 +852,47 @@ run_loop(struct arena *arena, #endif } - switch (ksym) { - case XK_Return: - passwd[len] = '\0'; - errno = 0; - if (!(inputhash = crypt(passwd, hash))) - fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); - else - running = !!strcmp(inputhash, hash); - if (running) { - XBell(dpy, 100); - failure = 1; - } else { - locked = 0; - } - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - break; - case XK_Escape: - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - failure = 0; - break; - case XK_BackSpace: - if (len) - passwd[--len] = '\0'; - break; - default: - if (num && !iscntrl((unsigned char)buf[0]) && - (len + num < sizeof(passwd))) { - memcpy(passwd + len, buf, num); - len += num; - } else if (buf[0] == '\025') { /* ctrl-u clears input */ + if(millis() - failure_timeout_millis >= 2000) { + switch (ksym) { + case XK_Return: + passwd[len] = '\0'; + errno = 0; + if (!(inputhash = crypt(passwd, hash))) + fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); + else + running = !!strcmp(inputhash, hash); + if (running) { + XBell(dpy, 100); + failure = 1; + failure_timeout_millis = millis(); + } else { + locked = 0; + } explicit_bzero(&passwd, sizeof(passwd)); len = 0; - } else { - continue; /* Don't trigger fail screen when pressing control characters */ + break; + case XK_Escape: + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + failure = 0; + break; + case XK_BackSpace: + if (len) + passwd[--len] = '\0'; + break; + default: + if (num && !iscntrl((unsigned char)buf[0]) && + (len + num < sizeof(passwd))) { + memcpy(passwd + len, buf, num); + len += num; + } else if (buf[0] == '\025') { /* ctrl-u clears input */ + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + } else { + continue; /* Don't trigger fail screen when pressing control characters */ + } + break; } - break; } } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { rre = (XRRScreenChangeNotifyEvent*)&ev;