X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fkeyboard.c;h=2c60ac3d4f632e14c195eb0c1ce0380483b94263;hb=aa81b46ff3f8b17d323605bbf9830bbf1fccc2bb;hp=b834046b9cdc4282a51f19093346c53d1d6852c0;hpb=9fcb2aa1d25ec9889b45d145939fb17160b1106a;p=chaz%2Fopenbox diff --git a/openbox/keyboard.c b/openbox/keyboard.c index b834046b..2c60ac3d 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -78,11 +78,11 @@ static gboolean chain_timeout(gpointer data) static void set_curpos(KeyBindingTree *newpos) { - if (curpos != newpos) { - grab_keys(FALSE); - curpos = newpos; - grab_keys(TRUE); - } + if (curpos == newpos) return; + + grab_keys(FALSE); + curpos = newpos; + grab_keys(TRUE); if (curpos != NULL) { gchar *text = NULL; @@ -311,6 +311,14 @@ void keyboard_event(ObClient *client, const XEvent *e) 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);