-static void keyboard_interactive_end(guint state, gboolean cancel, Time time,
- gboolean ungrab)
-{
- GSList *alist;
-
- g_assert(istate.active);
-
- /* ungrab first so they won't be NotifyWhileGrabbed */
- if (ungrab)
- grab_keyboard(FALSE);
-
- alist = g_slist_append(NULL, istate.action);
- action_run_interactive(alist, istate.client, state, time, cancel, TRUE);
- g_slist_free(alist);
-
- istate.active = FALSE;
-}
-
-static void keyboard_interactive_end_client(ObClient *client, gpointer data)
-{
- if (istate.active && istate.client == client)
- istate.client = NULL;
-}
-
-gboolean keyboard_interactive_grab(guint state, ObClient *client,
- ObAction *action)
-{
- g_assert(action->data.any.interactive);
-
- if (!istate.active) {
- if (!grab_keyboard(TRUE))
- return FALSE;
- } else if (action->func != istate.action->func) {
- keyboard_interactive_end(state, TRUE, action->data.any.time, FALSE);
- }
-
- istate.active = TRUE;
- istate.state = state;
- istate.client = client;
- istate.action = action;
-
- return TRUE;
-}
-