gracefully handle grabs failing when doing interactive actions
Dana Jansens danakj@orodu.net
3 files changed,
10 insertions(+),
7 deletions(-)
M
openbox/action.c
→
openbox/action.c
@@ -946,7 +946,8 @@ if (a->data.any.interactive) {
a->data.inter.cancel = cancel; a->data.inter.final = done; if (!(cancel || done)) - keyboard_interactive_grab(state, a->data.any.c, a); + if (!keyboard_interactive_grab(state, a->data.any.c, a)) + continue; /* interactive actions are not queued */ a->func(&a->data);
M
openbox/keyboard.c
→
openbox/keyboard.c
@@ -155,8 +155,8 @@
return TRUE; } -void keyboard_interactive_grab(guint state, ObClient *client, - ObAction *action) +gboolean keyboard_interactive_grab(guint state, ObClient *client, + ObAction *action) { ObInteractiveState *s;@@ -164,10 +164,10 @@ g_assert(action->data.any.interactive);
if (!interactive_states) { if (!grab_keyboard(TRUE)) - return; + return FALSE; if (!grab_pointer(TRUE, OB_CURSOR_NONE)) { grab_keyboard(FALSE); - return; + return FALSE; } }@@ -178,6 +178,8 @@ s->client = client;
s->actions = g_slist_append(NULL, action); interactive_states = g_slist_append(interactive_states, s); + + return TRUE; } void keyboard_interactive_end(ObInteractiveState *s,
M
openbox/keyboard.h
→
openbox/keyboard.h
@@ -39,8 +39,8 @@
void keyboard_event(struct _ObClient *client, const XEvent *e); void keyboard_reset_chains(); -void keyboard_interactive_grab(guint state, struct _ObClient *client, - struct _ObAction *action); +gboolean keyboard_interactive_grab(guint state, struct _ObClient *client, + struct _ObAction *action); gboolean keyboard_process_interactive_grab(const XEvent *e, struct _ObClient **client);