X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Factions%2Fgrowtoedge.c;h=501c64dee9ac74a1f669b3f7ce48b7e9023a3a06;hb=83d6c14f0c3771478c46be2af997b7b2d4329564;hp=5d4647f779fa504e18ccdcc98a079aca16cf3388;hpb=055cef6c5ddae81fe8976ad83cfa4d60248c0f49;p=chaz%2Fopenbox diff --git a/openbox/actions/growtoedge.c b/openbox/actions/growtoedge.c index 5d4647f7..501c64de 100644 --- a/openbox/actions/growtoedge.c +++ b/openbox/actions/growtoedge.c @@ -63,73 +63,32 @@ static gboolean run_func(ObActionsData *data, gpointer options) Options *o = options; 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; + gint x, y, w, h, realw, realh, lw, lh; + + /* don't allow vertical resize if shaded */ + if (o->dir != OB_DIRECTION_NORTH || o->dir != OB_DIRECTION_SOUTH || + !data->client->shaded) + { + client_find_resize_directional(data->client, o->dir, TRUE, + &x, &y, &w, &h); + realw = w; + realh = h; + client_try_configure(data->client, &x, &y, &realw, &realh, + &lw, &lh, TRUE); + /* if it's going to be resized smaller than it intended, don't + move the window over */ + if (x != data->client->area.x) x += w - realw; + if (y != data->client->area.y) y += h - realh; + + if (x != data->client->area.x || y != data->client->area.y || + w != data->client->area.width || + h != data->client->area.height) + { + actions_client_move(data, TRUE); + client_move_resize(data->client, x, y, realw, realh); + actions_client_move(data, FALSE); } - 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(); } - - width -= c->frame->size.left + c->frame->size.right; - height -= c->frame->size.top + c->frame->size.bottom; - frame_frame_gravity(c->frame, &x, &y); - - actions_client_move(data, FALSE); - client_move_resize(c, x, y, width, height); - actions_client_move(data, TRUE); - - g_free(a); } return FALSE;