typedef struct {
guint state;
ObClient *client;
- ObAction *action;
+ GSList *actions;
ObFrameContext context;
} ObInteractiveState;
g_assert(action->data.any.interactive);
- if (moveresize_in_progress)
- moveresize_end(FALSE);
-
if (!interactive_states) {
if (!grab_keyboard(TRUE))
return;
s->state = state;
s->client = client;
- s->action = action;
+ s->actions = g_slist_append(NULL, action);
interactive_states = g_slist_append(interactive_states, s);
}
void keyboard_interactive_end(ObInteractiveState *s,
guint state, gboolean cancel)
{
- action_run_interactive(s->action, s->client, state, cancel, TRUE);
+ action_run_interactive(s->actions, s->client, state, cancel, TRUE);
+ g_slist_free(s->actions);
g_free(s);
interactive_states = g_slist_remove(interactive_states, s);
}
}
-void keyboard_interactive_end_client(gpointer data)
+void keyboard_interactive_end_client(ObClient *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);
+ if (s->client == client)
+ s->client = NULL;
}
}
curpos = p;
grab_keys(TRUE);
} else {
- GSList *it;
-
- for (it = p->actions; it; it = it->next)
- action_run_key(it->data, client, e->xkey.state,
- e->xkey.x_root, e->xkey.y_root);
keyboard_reset_chains();
+
+ action_run_key(p->actions, client, e->xkey.state,
+ e->xkey.x_root, e->xkey.y_root);
}
break;
}
grab_keys(TRUE);
if (!reconfig)
- client_add_destructor(keyboard_interactive_end_client);
+ client_add_destructor(keyboard_interactive_end_client, NULL);
}
void keyboard_shutdown(gboolean reconfig)