static void event_hack_mods(XEvent *e)
{
+#ifdef XKB
+ XkbStateRec xkb_state;
+#endif
+
switch (e->type) {
case ButtonPress:
case ButtonRelease:
break;
case KeyRelease:
#ifdef XKB
- /* keep only the keyboard modifiers. xkb includes other things here.
- (see XKBProto.pdf document: section 2.2.2) */
- e->xkey.state &= 0xf;
+ /* 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 =
+ modkeys_only_modifier_masks(xkb_state.compat_state);
+ 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);
+ {
+ 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);
(e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
/* XXX make use of data.l[2] !? */
if (e->xclient.data.l[0] == 1 || e->xclient.data.l[0] == 2) {
- event_curtime = e->xclient.data.l[1];
+ /* we can not trust the timestamp from applications.
+ e.g. chromium passes a very old timestamp. openbox thinks
+ the window will get focus and calls XSetInputFocus with the
+ (old) timestamp, which doesn't end up moving focus at all.
+ but the window is raised, not hilited, etc, as if it was
+ really going to get focus.
+
+ so do not use this timestamp in event_curtime, as this would
+ be used in XSetInputFocus.
+ */
+ /*event_curtime = e->xclient.data.l[1];*/
if (e->xclient.data.l[1] == 0)
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_ACTIVE_WINDOW message for window %s is"
" missing a timestamp\n", client->title);
+
+ event_curtime = event_get_server_time();
} else
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_ACTIVE_WINDOW message for window %s is "