Browse Source

Display error message when locking failed (#99)

To give a feedback for when the pointer couldn't be grabbed,
displaying an error message before exiting.
master
eplanet 8 years ago
committed by Michael Stapelberg
parent
commit
d2130092cf
  1. 5
      unlock_indicator.c
  2. 9
      unlock_indicator.h
  3. 12
      xcb.c

5
unlock_indicator.c

@ -160,6 +160,7 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
cairo_set_source_rgba(ctx, 0, 114.0 / 255, 255.0 / 255, 0.75); cairo_set_source_rgba(ctx, 0, 114.0 / 255, 255.0 / 255, 0.75);
break; break;
case STATE_PAM_WRONG: case STATE_PAM_WRONG:
case STATE_I3LOCK_LOCK_FAILED:
cairo_set_source_rgba(ctx, 250.0 / 255, 0, 0, 0.75); cairo_set_source_rgba(ctx, 250.0 / 255, 0, 0, 0.75);
break; break;
default: default:
@ -174,6 +175,7 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
cairo_set_source_rgb(ctx, 51.0 / 255, 0, 250.0 / 255); cairo_set_source_rgb(ctx, 51.0 / 255, 0, 250.0 / 255);
break; break;
case STATE_PAM_WRONG: case STATE_PAM_WRONG:
case STATE_I3LOCK_LOCK_FAILED:
cairo_set_source_rgb(ctx, 125.0 / 255, 51.0 / 255, 0); cairo_set_source_rgb(ctx, 125.0 / 255, 51.0 / 255, 0);
break; break;
case STATE_PAM_IDLE: case STATE_PAM_IDLE:
@ -213,6 +215,9 @@ xcb_pixmap_t draw_image(uint32_t *resolution) {
case STATE_PAM_WRONG: case STATE_PAM_WRONG:
text = "wrong!"; text = "wrong!";
break; break;
case STATE_I3LOCK_LOCK_FAILED:
text = "lock failed!";
break;
default: default:
if (show_failed_attempts && failed_attempts > 0) { if (show_failed_attempts && failed_attempts > 0) {
if (failed_attempts > 999) { if (failed_attempts > 999) {

9
unlock_indicator.h

@ -11,10 +11,11 @@ typedef enum {
} unlock_state_t; } unlock_state_t;
typedef enum { typedef enum {
STATE_PAM_IDLE = 0, /* no PAM interaction at the moment */ STATE_PAM_IDLE = 0, /* no PAM interaction at the moment */
STATE_PAM_VERIFY = 1, /* currently verifying the password via PAM */ STATE_PAM_VERIFY = 1, /* currently verifying the password via PAM */
STATE_PAM_LOCK = 2, /* currently locking the screen */ STATE_PAM_LOCK = 2, /* currently locking the screen */
STATE_PAM_WRONG = 3 /* the password was wrong */ STATE_PAM_WRONG = 3, /* the password was wrong */
STATE_I3LOCK_LOCK_FAILED = 4 /* i3lock failed to load */
} pam_state_t; } pam_state_t;
xcb_pixmap_t draw_image(uint32_t* resolution); xcb_pixmap_t draw_image(uint32_t* resolution);

12
xcb.c

@ -23,6 +23,8 @@
#include "cursors.h" #include "cursors.h"
#include "unlock_indicator.h" #include "unlock_indicator.h"
extern pam_state_t pam_state;
xcb_connection_t *conn; xcb_connection_t *conn;
xcb_screen_t *screen; xcb_screen_t *screen;
@ -160,7 +162,7 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c
} }
/* /*
* Repeatedly tries to grab pointer and keyboard (up to 1000 times). * Repeatedly tries to grab pointer and keyboard (up to 10000 times).
* *
*/ */
void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb_cursor_t cursor) { void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb_cursor_t cursor) {
@ -233,8 +235,14 @@ void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb
} }
} }
if (tries <= 0) /* After trying for 10000 times, i3lock will display an error message
* for 2 sec prior to terminate. */
if (tries <= 0) {
pam_state = STATE_I3LOCK_LOCK_FAILED;
redraw_screen();
sleep(1);
errx(EXIT_FAILURE, "Cannot grab pointer/keyboard"); errx(EXIT_FAILURE, "Cannot grab pointer/keyboard");
}
} }
xcb_cursor_t create_cursor(xcb_connection_t *conn, xcb_screen_t *screen, xcb_window_t win, int choice) { xcb_cursor_t create_cursor(xcb_connection_t *conn, xcb_screen_t *screen, xcb_window_t win, int choice) {

Loading…
Cancel
Save