all repos — openbox @ c168faee634d3c3f9494b2a4da89b80d10f311ce

openbox fork - make it a bit more like ryudo

i learnt what xkb does with the state.

use the state from keyrelease events directly, rather than query the state (which is not as accurate!)

the xkb state (as opposed to the normally sent compat state) contains extra info like the keyboard group, the pointer buttons, etc.  so we can just strip that stuff out. (See section 2.2.2 of the XKB proto document)
Dana Jansens danakj@orodu.net
commit

c168faee634d3c3f9494b2a4da89b80d10f311ce

parent

e9070fe7da03effb198c0bbae8293f22fdf36085

1 files changed, 7 insertions(+), 17 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -260,10 +260,6 @@ }

static void event_hack_mods(XEvent *e) { -#ifdef XKB - XkbStateRec xkb_state; -#endif - switch (e->type) { case ButtonPress: case ButtonRelease:

@@ -274,20 +270,14 @@ e->xkey.state = obt_keyboard_only_modmasks(e->xkey.state);

break; case KeyRelease: #ifdef XKB - /* If XKB is present, then the modifiers are all strange from its - magic. Our X core protocol stuff won't work, so we use this to - find what the modifier state is instead. */ - if (XkbGetState(obt_display, XkbUseCoreKbd, &xkb_state) == Success) - e->xkey.state = - obt_keyboard_only_modmasks(xkb_state.compat_state); - else + /* keep only the keyboard modifiers. xkb includes other things here. + (see XKBProto.pdf document: section 2.2.2) */ + e->xkey.state &= 0xf; #endif - { - e->xkey.state = obt_keyboard_only_modmasks(e->xkey.state); - /* remove from the state the mask of the modifier key being - released, if it is a modifier key being released that is */ - e->xkey.state &= ~obt_keyboard_keycode_to_modmask(e->xkey.keycode); - } + e->xkey.state = obt_keyboard_only_modmasks(e->xkey.state); + /* remove from the state the mask of the modifier key being + released, if it is a modifier key being released that is */ + e->xkey.state &= ~obt_keyboard_keycode_to_modmask(e->xkey.keycode); break; case MotionNotify: e->xmotion.state = obt_keyboard_only_modmasks(e->xmotion.state);