X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fkeyboard.c;h=8598cbf95fe620de26ff2877e212274503de13d9;hb=c1b2fc5324522f74a14a5cfa210c95e1509a6e7f;hp=65d2f2e072f22a1891965a907b599ff2cb4445be;hpb=78282959f970d28131e6aa8d66adce359aa145dc;p=chaz%2Fopenbox diff --git a/openbox/keyboard.c b/openbox/keyboard.c index 65d2f2e0..8598cbf9 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -12,6 +12,7 @@ #include "keytree.h" #include "keyboard.h" #include "translate.h" +#include "moveresize.h" #include @@ -129,12 +130,15 @@ gboolean keyboard_bind(GList *keylist, ObAction *action) } void keyboard_interactive_grab(guint state, ObClient *client, - ObFrameContext context, ObAction *action) + ObAction *action) { ObInteractiveState *s; g_assert(action->data.any.interactive); + if (moveresize_in_progress) + moveresize_end(FALSE); + if (!interactive_states) { if (!grab_keyboard(TRUE)) return; @@ -149,14 +153,42 @@ void keyboard_interactive_grab(guint state, ObClient *client, s->state = state; s->client = client; s->action = action; - s->context = context; interactive_states = g_slist_append(interactive_states, s); } -gboolean keyboard_process_interactive_grab(const XEvent *e, - ObClient **client, - ObFrameContext *context) +void keyboard_interactive_end(ObInteractiveState *s, + guint state, gboolean cancel) +{ + action_run_interactive(s->action, s->client, state, cancel, TRUE); + + g_free(s); + + interactive_states = g_slist_remove(interactive_states, s); + + if (!interactive_states) { + grab_keyboard(FALSE); + grab_pointer(FALSE, OB_CURSOR_NONE); + keyboard_reset_chains(); + } +} + +void keyboard_interactive_end_client(gpointer data) +{ + GSList *it, *next; + ObClient *c = data; + + for (it = interactive_states; it; it = next) { + ObInteractiveState *s = it->data; + + next = g_slist_next(it); + + if (s->client == c) + keyboard_interactive_end(s, 0, FALSE); + } +} + +gboolean keyboard_process_interactive_grab(const XEvent *e, ObClient **client) { GSList *it, *next; gboolean handled = FALSE; @@ -168,9 +200,6 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, next = g_slist_next(it); - *client = s->client; - *context = s->context; - if ((e->type == KeyRelease && !(s->state & e->xkey.state))) done = TRUE; @@ -181,20 +210,11 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, cancel = done = TRUE; } if (done) { - action_run_interactive(s->action, s->client, - e->xkey.state, cancel, TRUE); - - g_free(s); - - interactive_states = g_slist_delete_link(interactive_states, it); - if (!interactive_states) { - grab_keyboard(FALSE); - grab_pointer(FALSE, OB_CURSOR_NONE); - keyboard_reset_chains(); - } + keyboard_interactive_end(s, e->xkey.state, cancel); handled = TRUE; - } + } else + *client = s->client; } return handled; @@ -247,12 +267,18 @@ void keyboard_event(ObClient *client, const XEvent *e) void keyboard_startup(gboolean reconfig) { grab_keys(TRUE); + + if (!reconfig) + client_add_destructor(keyboard_interactive_end_client); } void keyboard_shutdown(gboolean reconfig) { GSList *it; + if (!reconfig) + client_remove_destructor(keyboard_interactive_end_client); + tree_destroy(keyboard_firstnode); keyboard_firstnode = NULL;