+ }
+
+ if (raise)
+ action_raise(data);
+ else
+ action_lower(data);
+}
+
+void action_raise(union ActionData *data)
+{
+ client_action_start(data);
+ stacking_raise(CLIENT_AS_WINDOW(data->client.any.c));
+ client_action_end(data);
+}
+
+void action_unshaderaise(union ActionData *data)
+{
+ if (data->client.any.c->shaded)
+ action_unshade(data);
+ else
+ action_raise(data);
+}
+
+void action_shadelower(union ActionData *data)
+{
+ if (data->client.any.c->shaded)
+ action_lower(data);
+ else
+ action_shade(data);
+}
+
+void action_lower(union ActionData *data)
+{
+ client_action_start(data);
+ stacking_lower(CLIENT_AS_WINDOW(data->client.any.c));
+ client_action_end(data);
+}
+
+void action_close(union ActionData *data)
+{
+ client_close(data->client.any.c);
+}
+
+void action_kill(union ActionData *data)
+{
+ client_kill(data->client.any.c);
+}
+
+void action_shade(union ActionData *data)
+{
+ client_action_start(data);
+ client_shade(data->client.any.c, TRUE);
+ client_action_end(data);
+}
+
+void action_unshade(union ActionData *data)
+{
+ client_action_start(data);
+ client_shade(data->client.any.c, FALSE);
+ client_action_end(data);
+}
+
+void action_toggle_shade(union ActionData *data)
+{
+ client_action_start(data);
+ client_shade(data->client.any.c, !data->client.any.c->shaded);
+ client_action_end(data);
+}
+
+void action_toggle_omnipresent(union ActionData *data)
+{
+ client_set_desktop(data->client.any.c,
+ data->client.any.c->desktop == DESKTOP_ALL ?
+ screen_desktop : DESKTOP_ALL, FALSE);
+}
+
+void action_move_relative_horz(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ client_action_start(data);
+ client_move(c, c->area.x + data->relative.deltax, c->area.y);
+ client_action_end(data);
+}
+
+void action_move_relative_vert(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ client_action_start(data);
+ client_move(c, c->area.x, c->area.y + data->relative.deltax);
+ client_action_end(data);
+}
+
+void action_move_to_center(union ActionData *data)
+{
+ ObClient *c = data->client.any.c;
+ Rect *area;
+ area = screen_area_monitor(c->desktop, 0);
+ client_action_start(data);
+ client_move(c, area->width / 2 - c->area.width / 2,
+ area->height / 2 - c->area.height / 2);
+ client_action_end(data);
+}
+
+void action_resize_relative_horz(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ client_action_start(data);
+ client_resize(c,
+ c->area.width + data->relative.deltax * c->size_inc.width,
+ c->area.height);
+ client_action_end(data);
+}
+
+void action_resize_relative_vert(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ if (!c->shaded) {
+ client_action_start(data);
+ client_resize(c, c->area.width, c->area.height +
+ data->relative.deltax * c->size_inc.height);
+ client_action_end(data);
+ }
+}
+
+void action_move_relative(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ client_action_start(data);
+ client_move(c, c->area.x + data->relative.deltax, c->area.y +
+ data->relative.deltay);
+ client_action_end(data);
+}
+
+void action_resize_relative(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ gint x, y, ow, w, oh, h, lw, lh;
+
+ client_action_start(data);
+
+ x = c->area.x;
+ y = c->area.y;
+ ow = c->area.width;
+ w = ow + data->relative.deltax * c->size_inc.width
+ + data->relative.deltaxl * c->size_inc.width;
+ oh = c->area.height;
+ h = oh + data->relative.deltay * c->size_inc.height
+ + data->relative.deltayu * c->size_inc.height;
+
+ client_try_configure(c, &x, &y, &w, &h, &lw, &lh, TRUE);
+ client_move_resize(c, x + (ow - w), y + (oh - h), w, h);
+ client_action_end(data);
+}
+
+void action_maximize_full(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, TRUE, 0);
+ client_action_end(data);
+}
+
+void action_unmaximize_full(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, FALSE, 0);
+ client_action_end(data);
+}
+
+void action_toggle_maximize_full(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c,
+ !(data->client.any.c->max_horz ||
+ data->client.any.c->max_vert),
+ 0);
+ client_action_end(data);
+}
+
+void action_maximize_horz(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, TRUE, 1);
+ client_action_end(data);
+}
+
+void action_unmaximize_horz(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, FALSE, 1);
+ client_action_end(data);
+}
+
+void action_toggle_maximize_horz(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c,
+ !data->client.any.c->max_horz, 1);
+ client_action_end(data);
+}
+
+void action_maximize_vert(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, TRUE, 2);
+ client_action_end(data);
+}
+
+void action_unmaximize_vert(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c, FALSE, 2);
+ client_action_end(data);
+}
+
+void action_toggle_maximize_vert(union ActionData *data)
+{
+ client_action_start(data);
+ client_maximize(data->client.any.c,
+ !data->client.any.c->max_vert, 2);
+ client_action_end(data);
+}
+
+void action_toggle_fullscreen(union ActionData *data)
+{
+ client_action_start(data);
+ client_fullscreen(data->client.any.c, !(data->client.any.c->fullscreen));
+ client_action_end(data);
+}
+
+void action_send_to_desktop(union ActionData *data)
+{
+ ObClient *c = data->sendto.any.c;
+
+ if (!client_normal(c)) return;
+
+ if (data->sendto.desk < screen_num_desktops ||
+ data->sendto.desk == DESKTOP_ALL) {
+ client_set_desktop(c, data->sendto.desk, data->sendto.follow);
+ if (data->sendto.follow)
+ screen_set_desktop(data->sendto.desk, TRUE);
+ }
+}
+
+void action_desktop(union ActionData *data)
+{
+ if (!data->inter.any.interactive ||
+ (!data->inter.cancel && !data->inter.final))
+ {
+ if (data->desktop.desk < screen_num_desktops ||
+ data->desktop.desk == DESKTOP_ALL)
+ {
+ screen_set_desktop(data->desktop.desk, TRUE);
+ if (data->inter.any.interactive)
+ screen_desktop_popup(data->desktop.desk, TRUE);