From: Dana Jansens Date: Fri, 11 Jan 2008 18:05:11 +0000 (-0500) Subject: XKB modifiers are strange things, and i don't know how to read them properly in modke... X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=162a97e158e0dfa774754aee5198786907f9453b;hp=5a468756c07a43e0ee7fa4e406847c86db09834a;p=chaz%2Fopenbox XKB modifiers are strange things, and i don't know how to read them properly in modkeys.c and convert it all to the x core stuff. so we use this to get the state of the modifiers, otherwise we end up missing them sometimes (like on PPC) --- diff --git a/openbox/event.c b/openbox/event.c index 41bcd350..0c97bd93 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -247,6 +247,10 @@ static void event_set_curtime(XEvent *e) static void event_hack_mods(XEvent *e) { +#ifdef XKB + XkbStateRec xkb_state; +#endif + switch (e->type) { case ButtonPress: case ButtonRelease: @@ -256,10 +260,22 @@ static void event_hack_mods(XEvent *e) e->xkey.state = modkeys_only_modifier_masks(e->xkey.state); break; case KeyRelease: - e->xkey.state = modkeys_only_modifier_masks(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 &= ~modkeys_keycode_to_mask(e->xkey.keycode); +#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(ob_display, XkbUseCoreKbd, &xkb_state) == Success) { + e->xkey.state = xkb_state.compat_state; + break; + } + else +#endif + { + e->xkey.state = modkeys_only_modifier_masks(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 &= ~modkeys_keycode_to_mask(e->xkey.keycode); + } break; case MotionNotify: e->xmotion.state = modkeys_only_modifier_masks(e->xmotion.state);