|
@ -59,8 +59,7 @@ static bool beep = false; |
|
|
bool debug_mode = false; |
|
|
bool debug_mode = false; |
|
|
static bool dpms = false; |
|
|
static bool dpms = false; |
|
|
bool unlock_indicator = true; |
|
|
bool unlock_indicator = true; |
|
|
bool capslock_active = false; |
|
|
char *modifier_string = NULL; |
|
|
bool numlock_active = false; |
|
|
|
|
|
static bool dont_fork = false; |
|
|
static bool dont_fork = false; |
|
|
struct ev_loop *main_loop; |
|
|
struct ev_loop *main_loop; |
|
|
static struct ev_timer *clear_pam_wrong_timeout; |
|
|
static struct ev_timer *clear_pam_wrong_timeout; |
|
@ -219,6 +218,12 @@ static void clear_pam_wrong(EV_P_ ev_timer *w, int revents) { |
|
|
unlock_state = STATE_STARTED; |
|
|
unlock_state = STATE_STARTED; |
|
|
redraw_screen(); |
|
|
redraw_screen(); |
|
|
|
|
|
|
|
|
|
|
|
/* Clear modifier string. */ |
|
|
|
|
|
if (modifier_string != NULL) { |
|
|
|
|
|
free(modifier_string); |
|
|
|
|
|
modifier_string = NULL; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/* Now free this timeout. */ |
|
|
/* Now free this timeout. */ |
|
|
STOP_TIMER(clear_pam_wrong_timeout); |
|
|
STOP_TIMER(clear_pam_wrong_timeout); |
|
|
} |
|
|
} |
|
@ -281,8 +286,38 @@ static void input_done(void) { |
|
|
|
|
|
|
|
|
/* Get state of Caps and Num lock modifiers, to be displayed in
|
|
|
/* Get state of Caps and Num lock modifiers, to be displayed in
|
|
|
* STATE_PAM_WRONG state */ |
|
|
* STATE_PAM_WRONG state */ |
|
|
capslock_active = xkb_state_mod_name_is_active(xkb_state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_EFFECTIVE); |
|
|
xkb_mod_index_t idx, num_mods; |
|
|
numlock_active = xkb_state_mod_name_is_active(xkb_state, XKB_MOD_NAME_NUM, XKB_STATE_MODS_EFFECTIVE); |
|
|
const char *mod_name; |
|
|
|
|
|
|
|
|
|
|
|
num_mods = xkb_keymap_num_mods(xkb_keymap); |
|
|
|
|
|
|
|
|
|
|
|
for (idx = 0; idx < num_mods; idx++) { |
|
|
|
|
|
if (!xkb_state_mod_index_is_active(xkb_state, idx, XKB_STATE_MODS_EFFECTIVE)) |
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
mod_name = xkb_keymap_mod_get_name(xkb_keymap, idx); |
|
|
|
|
|
if (mod_name == NULL) |
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
/* Replace certain xkb names with nicer, human-readable ones. */ |
|
|
|
|
|
if (strcmp(mod_name, XKB_MOD_NAME_CAPS) == 0) |
|
|
|
|
|
mod_name = "Caps Lock"; |
|
|
|
|
|
else if (strcmp(mod_name, XKB_MOD_NAME_ALT) == 0) |
|
|
|
|
|
mod_name = "Alt"; |
|
|
|
|
|
else if (strcmp(mod_name, XKB_MOD_NAME_NUM) == 0) |
|
|
|
|
|
mod_name = "Num Lock"; |
|
|
|
|
|
else if (strcmp(mod_name, XKB_MOD_NAME_LOGO) == 0) |
|
|
|
|
|
mod_name = "Win"; |
|
|
|
|
|
|
|
|
|
|
|
char *tmp; |
|
|
|
|
|
if (modifier_string == NULL) { |
|
|
|
|
|
if (asprintf(&tmp, "%s", mod_name) != -1) |
|
|
|
|
|
modifier_string = tmp; |
|
|
|
|
|
} else if (asprintf(&tmp, "%s, %s", modifier_string, mod_name) != -1) { |
|
|
|
|
|
free(modifier_string); |
|
|
|
|
|
modifier_string = tmp; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
pam_state = STATE_PAM_WRONG; |
|
|
pam_state = STATE_PAM_WRONG; |
|
|
failed_attempts += 1; |
|
|
failed_attempts += 1; |
|
|