#include "config.h"
#include "keytree.h"
#include "keyboard.h"
-#include "translate.h"
#include "moveresize.h"
#include "popup.h"
#include "gettext.h"
p = curpos->first_child;
while (p) {
if (p->key == e->xkey.keycode &&
- p->state == e->xkey.state)
+ /* tricksy.
+ if you have Super_L and Super_R bound to different modXmasks,
+ this makes either mod mask count as Super
+
+ e.g. Super_L is mod1 and Super_R is mod2, so..
+ p->state = 00011
+ key state is just Super_L so 00001
+ 00011 | 00001 == 00011 == p->state
+ */
+ (p->state | e->xkey.state) == p->state)
{
/* if we hit a key binding, then close any open menus and run it */
if (menu_frame_visible)
else {
keyboard_reset_chains(0);
+ /* If we don't have the keyboard grabbed, then ungrab it with
+ XUngrabKeyboard, so that there is not a passive grab left
+ on from the KeyPress. If the grab is left on, and focus
+ moves during that time, it will be NotifyWhileGrabbed, and
+ applications like to ignore those! */
+ if (!keyboard_interactively_grabbed())
+ XUngrabKeyboard(ob_display, e->xkey.time);
+
action_run_key(p->actions, client, e->xkey.state,
e->xkey.x_root, e->xkey.y_root,
e->xkey.time);