diff options
author | Deiz <silverwraithii@gmail.com> | 2015-03-26 03:06:18 -0400 |
---|---|---|
committer | Deiz <silverwraithii@gmail.com> | 2015-03-29 16:22:31 -0400 |
commit | b4f6dae10e82aa95e5e8ae84a07520d3fec0057e (patch) | |
tree | e442a97b150c497eac88a83ae03a0167995ee123 /i3lock.c | |
parent | a9ecf1e0c9063594ff9c4a782b4181788e4374a8 (diff) |
List generic pressed modifiers on failure
Diffstat (limited to 'i3lock.c')
-rw-r--r-- | i3lock.c | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -59,8 +59,7 @@ static bool beep = false; bool debug_mode = false; static bool dpms = false; bool unlock_indicator = true; -bool capslock_active = false; -bool numlock_active = false; +char *modifier_string = NULL; static bool dont_fork = false; struct ev_loop *main_loop; 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; redraw_screen(); + /* Clear modifier string. */ + if (modifier_string != NULL) { + free(modifier_string); + modifier_string = NULL; + } + /* Now free this 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 * STATE_PAM_WRONG state */ - capslock_active = xkb_state_mod_name_is_active(xkb_state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_EFFECTIVE); - numlock_active = xkb_state_mod_name_is_active(xkb_state, XKB_MOD_NAME_NUM, XKB_STATE_MODS_EFFECTIVE); + xkb_mod_index_t idx, num_mods; + 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; failed_attempts += 1; |