Skip to content

Commit

Permalink
revert shift lock handling (broke uppercase letters)
Browse files Browse the repository at this point in the history
With some layouts, this broke uppercase letters in your passwords.

I think that explicit shiftlock handling is unnecessary. X11 seems to do
it on its own. Here is what leads me to that conclusion:

  $ setxkbmap de
  $ xmodmap -e 'keycode 66 = Shift_Lock'
  $ xev

Now enter a character, say "a", then press CapsLk (which is now
Shift_Lock), then press "a" again. The event state is 0x1, thereby
undistinguishable from normal shift.
  • Loading branch information
stapelberg committed May 30, 2012
1 parent 9b29ae7 commit dd02dff
Showing 1 changed file with 7 additions and 16 deletions.
23 changes: 7 additions & 16 deletions i3lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ static bool modeswitch_active = false;
static bool iso_level3_shift_active = false;
static bool iso_level5_shift_active = false;
static int numlockmask;
static int shiftlockmask;
static int capslockmask;
static bool beep = false;
bool debug_mode = false;
Expand Down Expand Up @@ -289,18 +288,12 @@ static void handle_key_press(xcb_key_press_event_t *event) {
* their uppercase variant) is active at the moment. */
bool capslock = (event->state & capslockmask);

/* Whether Shift Lock (shift state is reversed) is active at the moment. */
bool shiftlock = (event->state & shiftlockmask);

/* Whether Caps Lock or Shift Lock is active at the moment. */
bool lock = (capslock || shiftlock);

DEBUG("shift = %d, lock = %d, capslock = %d, shiftlock = %d\n",
shift, lock, capslock, shiftlock);
DEBUG("shift = %d, capslock = %d\n",
shift, capslock);

if ((event->state & numlockmask) && xcb_is_keypad_key(sym1)) {
/* this key was a keypad key */
if (shift || shiftlock)
if (shift)
sym = sym0;
else sym = sym1;
} else {
Expand All @@ -313,16 +306,15 @@ static void handle_key_press(xcb_key_press_event_t *event) {
* for alphabetic keys, unlike Shift Lock. */
if (lower == upper) {
capslock = false;
lock = (capslock || shiftlock);
DEBUG("lower == upper, now shift = %d, lock = %d, capslock = %d, shiftlock = %d\n",
shift, lock, capslock, shiftlock);
DEBUG("lower == upper, now shift = %d, capslock = %d\n",
shift, capslock);
}

/* In two different cases we need to use the uppercase keysym:
* 1) The user holds shift, no lock is active.
* 2) Any of the two locks is active.
*/
if ((shift && !lock) || (!shift && lock))
if ((shift && !capslock) || (!shift && capslock))
sym = sym1;
else sym = sym0;
}
Expand Down Expand Up @@ -716,10 +708,9 @@ int main(int argc, char *argv[]) {

symbols = xcb_key_symbols_alloc(conn);
numlockmask = get_mod_mask(conn, symbols, XK_Num_Lock);
shiftlockmask = get_mod_mask(conn, symbols, XK_Shift_Lock);
capslockmask = get_mod_mask(conn, symbols, XK_Caps_Lock);

DEBUG("shift lock mask = %d\n", shiftlockmask);
DEBUG("numlock mask = %d\n", numlockmask);
DEBUG("caps lock mask = %d\n", capslockmask);

if (dpms)
Expand Down

0 comments on commit dd02dff

Please sign in to comment.