- if (data->client) {
- gint x, y, width, height, dest;
- ObClient *c = data->client;
- 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(o->dir) {
- case OB_DIRECTION_NORTH:
- if (c->shaded) break; /* don't allow vertical resize if shaded */
-
- dest = client_directional_edge_search(c, o->dir, 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, o->dir, 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, o->dir, 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, o->dir, 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();
+ /* we couldn't grow, so try shrink! */
+ opp = (o->dir == OB_DIRECTION_NORTH ? OB_DIRECTION_SOUTH :
+ (o->dir == OB_DIRECTION_SOUTH ? OB_DIRECTION_NORTH :
+ (o->dir == OB_DIRECTION_EAST ? OB_DIRECTION_WEST :
+ OB_DIRECTION_EAST)));
+ client_find_resize_directional(data->client, opp, FALSE,
+ &x, &y, &w, &h);
+ switch (opp) {
+ case OB_DIRECTION_NORTH:
+ half = data->client->area.y + data->client->area.height / 2;
+ if (y > half) {
+ h += y - half;
+ y = half;