all repos — openbox @ 83bd9e1d5aeecbd05287e4ab220c277fab7142be

openbox fork - make it a bit more like ryudo

change now the keyboard is ungrabbed before executing actions. instead, ungrab it just before calling exec. other actions don't need it ungrabbed, and this way the release doesn't get sent through to programs for our keybindings. except for exec i suppose.
Dana Jansens danakj@orodu.net
commit

83bd9e1d5aeecbd05287e4ab220c277fab7142be

parent

9fcb2aa1d25ec9889b45d145939fb17160b1106a

1 files changed, 19 insertions(+), 28 deletions(-)

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

@@ -1095,40 +1095,12 @@ gboolean cancel, gboolean done)

{ GSList *it; ObAction *a; - gboolean inter = FALSE; if (!acts) return; if (x < 0 && y < 0) screen_pointer_pos(&x, &y); - - if (grab_on_keyboard()) - inter = TRUE; - else - for (it = acts; it; it = g_slist_next(it)) { - a = it->data; - if (a->data.any.interactive) { - inter = TRUE; - break; - } - } - - if (!inter && button == 0) { - /* Ungrab the keyboard before running the action, if it was - not from a mouse event. - - We have to do this because a key press causes a passive - grab on the keyboard, and so if the action we are running - wants to grab the keyboard, it will fail if the button is still - held down (which is likely). - - Use the X function not out own, because we're not considering - a grab to be in place at all so our function won't try ungrab - anything. - */ - XUngrabKeyboard(ob_display, time); - } for (it = acts; it; it = g_slist_next(it)) { a = it->data;

@@ -1216,6 +1188,25 @@ {

GError *e = NULL; gchar *cmd, **argv = 0; if (data->execute.path) { + /* Ungrab the keyboard before running the action. + + If there is an interactive action going on, then cancel it to + release the keyboard. If not, then call XUngrabKeyboard(). + + We call XUngrabKeyboard because a key press causes a passive + grab on the keyboard, and so if program we are executing wants to + grab the keyboard, it will fail if the button is still held down + (which is likely). + + Use the X function not out own, because we're not considering + a grab to be in place at all so our function won't try ungrab + anything. + */ + if (keyboard_interactively_grabbed()) + keyboard_interactive_cancel(); + else + XUngrabKeyboard(ob_display, data->any.time); + cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL); if (cmd) { if (!g_shell_parse_argv (cmd, NULL, &argv, &e)) {