- if (e->type == Event_X_KeyRelease) {
- if (grabbed_key) {
- if (!(grabbed_key->state & e->data.x.e->xkey.state)) {
- grabbed_key->action->data.cycle.final = TRUE;
- grabbed_key->action->func(&grabbed_key->action->data);
+ if (grabbed_key) {
+ gboolean done = FALSE;
+
+ if ((e->type == Event_X_KeyRelease &&
+ !(grabbed_key->state & e->data.x.e->xkey.state)))
+ done = TRUE;
+ else if (e->type == Event_X_KeyPress) {
+ if (e->data.x.e->xkey.keycode == button_return)
+ done = TRUE;
+ else if (e->data.x.e->xkey.keycode == button_escape) {
+ GSList *it;
+ for (it = grabbed_key->actions; it; it = it->next) {
+ Action *act = it->data;
+ act->data.cycle.cancel = TRUE;
+ }
+ done = TRUE;
+ }
+ }
+ if (done) {
+ GSList *it;
+ for (it = grabbed_key->actions; it; it = it->next) {
+ Action *act = it->data;
+ act->data.cycle.final = TRUE;
+ act->func(&act->data);