/* holds the password you enter (in UTF-8) */
static char password[512];
static bool modeswitch_active = false;
+static bool iso_level3_shift_active = false;
static int modeswitchmask;
static int numlockmask;
static bool beep = false;
if (sym == XK_Mode_switch) {
//printf("Mode switch disabled\n");
modeswitch_active = false;
+ } else if (sym == XK_ISO_Level3_Shift) {
+ iso_level3_shift_active = false;
}
}
//printf("keypress %d, state raw = %d\n", event->detail, event->state);
xcb_keysym_t sym0, sym1, sym;
- if (modeswitch_active) {
- sym0 = xcb_key_press_lookup_keysym(symbols, event, 4);
- sym1 = xcb_key_press_lookup_keysym(symbols, event, 5);
- } else {
- sym0 = xcb_key_press_lookup_keysym(symbols, event, 0);
- sym1 = xcb_key_press_lookup_keysym(symbols, event, 1);
- }
+ /* For each keycode, there is a list of symbols. The list could look like this:
+ * $ xmodmap -pke | grep 'keycode 38'
+ * keycode 38 = a A adiaeresis Adiaeresis o O
+ * In non-X11 terminology, the symbols for the keycode 38 (the key labeled
+ * with "a" on my keyboard) are "a A ä Ä o O".
+ * Another form to display the same information is using xkbcomp:
+ * $ xkbcomp $DISPLAY /tmp/xkb.dump
+ * Then open /tmp/xkb.dump and search for '\<a\>' (in VIM regexp-language):
+ *
+ * symbols[Group1]= [ a, A, o, O ],
+ * symbols[Group2]= [ adiaeresis, Adiaeresis ]
+ *
+ * So there are two *groups*, one containing 'a A' and one containing 'ä
+ * Ä'. You can use Mode_switch to switch between these groups. You can use
+ * ISO_Level3_Shift to reach the 'o O' part of the first group (it’s the
+ * same group, just an even higher shift level).
+ *
+ * So, using the "logical" XKB information, the following lookup will be
+ * performed:
+ *
+ * Neither Mode_switch nor ISO_Level3_Shift active: group 1, column 0 and 1
+ * Mode_switch active: group 2, column 0 and 1
+ * ISO_Level3_Shift active: group 1, column 2 and 3
+ *
+ * Using the column index which xcb_key_press_lookup_keysym uses (and
+ * xmodmap prints out), the following lookup will be performed:
+ *
+ * Neither Mode_switch nor ISO_Level3_Shift active: column 0 and 1
+ * Mode_switch active: column 2 and 3
+ * ISO_Level3_Shift active: column 4 and 5
+ */
+ int base_column = 0;
+ if (modeswitch_active)
+ base_column = 2;
+ if (iso_level3_shift_active)
+ base_column = 4;
+ sym0 = xcb_key_press_lookup_keysym(symbols, event, base_column);
+ sym1 = xcb_key_press_lookup_keysym(symbols, event, base_column + 1);
switch (sym0) {
case XK_Mode_switch:
//printf("Mode switch enabled\n");
modeswitch_active = true;
return;
-
+ case XK_ISO_Level3_Shift:
+ DEBUG("ISO_Level3_Shift enabled\n");
+ iso_level3_shift_active = true;
+ return;
case XK_Return:
case XK_KP_Enter:
input_done();