+ focus_directional_cycle(data->interdiraction.direction,
+ data->interdiraction.dock_windows,
+ data->interdiraction.desktop_windows,
+ data->any.interactive,
+ data->interdiraction.dialog,
+ data->interdiraction.inter.final,
+ data->interdiraction.inter.cancel);
+}
+
+void action_movetoedge(union ActionData *data)
+{
+ gint x, y;
+ ObClient *c = data->diraction.any.c;
+
+ x = c->frame->area.x;
+ y = c->frame->area.y;
+
+ switch(data->diraction.direction) {
+ case OB_DIRECTION_NORTH:
+ y = client_directional_edge_search(c, OB_DIRECTION_NORTH,
+ data->diraction.hang)
+ - (data->diraction.hang ? c->frame->area.height : 0);
+ break;
+ case OB_DIRECTION_WEST:
+ x = client_directional_edge_search(c, OB_DIRECTION_WEST,
+ data->diraction.hang)
+ - (data->diraction.hang ? c->frame->area.width : 0);
+ break;
+ case OB_DIRECTION_SOUTH:
+ y = client_directional_edge_search(c, OB_DIRECTION_SOUTH,
+ data->diraction.hang)
+ - (data->diraction.hang ? 0 : c->frame->area.height);
+ break;
+ case OB_DIRECTION_EAST:
+ x = client_directional_edge_search(c, OB_DIRECTION_EAST,
+ data->diraction.hang)
+ - (data->diraction.hang ? 0 : c->frame->area.width);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ frame_frame_gravity(c->frame, &x, &y, c->area.width, c->area.height);
+ client_action_start(data);
+ client_move(c, x, y);
+ client_action_end(data, FALSE);
+}
+
+void action_growtoedge(union ActionData *data)
+{
+ gint x, y, width, height, dest;
+ ObClient *c = data->diraction.any.c;
+ Rect *a;
+
+ a = screen_area(c->desktop, SCREEN_AREA_ALL_MONITORS, &c->frame->area);
+ x = c->frame->area.x;
+ y = c->frame->area.y;
+ /* get the unshaded frame's dimensions..if it is shaded */
+ width = c->area.width + c->frame->size.left + c->frame->size.right;
+ height = c->area.height + c->frame->size.top + c->frame->size.bottom;
+
+ switch(data->diraction.direction) {
+ case OB_DIRECTION_NORTH:
+ if (c->shaded) break; /* don't allow vertical resize if shaded */
+
+ dest = client_directional_edge_search(c, OB_DIRECTION_NORTH, FALSE);
+ if (a->y == y)
+ height = height / 2;
+ else {
+ height = c->frame->area.y + height - dest;
+ y = dest;
+ }
+ break;
+ case OB_DIRECTION_WEST:
+ dest = client_directional_edge_search(c, OB_DIRECTION_WEST, FALSE);
+ if (a->x == x)
+ width = width / 2;
+ else {
+ width = c->frame->area.x + width - dest;
+ x = dest;
+ }
+ break;
+ case OB_DIRECTION_SOUTH:
+ if (c->shaded) break; /* don't allow vertical resize if shaded */
+
+ dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH, FALSE);
+ if (a->y + a->height == y + c->frame->area.height) {
+ height = c->frame->area.height / 2;
+ y = a->y + a->height - height;
+ } else
+ height = dest - c->frame->area.y;
+ y += (height - c->frame->area.height) % c->size_inc.height;
+ height -= (height - c->frame->area.height) % c->size_inc.height;
+ break;
+ case OB_DIRECTION_EAST:
+ dest = client_directional_edge_search(c, OB_DIRECTION_EAST, FALSE);
+ if (a->x + a->width == x + c->frame->area.width) {
+ width = c->frame->area.width / 2;
+ x = a->x + a->width - width;
+ } else
+ width = dest - c->frame->area.x;
+ x += (width - c->frame->area.width) % c->size_inc.width;
+ width -= (width - c->frame->area.width) % c->size_inc.width;
+ break;
+ default:
+ g_assert_not_reached();