all repos — openbox @ fba55d8d9f49f0714054bf84a604e70ac15ead3c

openbox fork - make it a bit more like ryudo

make growtoedge shrink if it cyan grow any more
Dana Jansens danakj@orodu.net
commit

fba55d8d9f49f0714054bf84a604e70ac15ead3c

parent

758ef2cafa559e7941d82364956e8afb33d1ad2f

1 files changed, 74 insertions(+), 24 deletions(-)

jump to
M openbox/actions/growtoedge.copenbox/actions/growtoedge.c

@@ -57,39 +57,89 @@

g_free(o); } +static gboolean do_grow(ObActionsData *data, gint x, gint y, gint w, gint h) +{ + gint realw, realh, lw, lh; + + 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 || + realw != data->client->area.width || + realh != data->client->area.height) + { + actions_client_move(data, TRUE); + client_move_resize(data->client, x, y, realw, realh); + actions_client_move(data, FALSE); + return TRUE; + } + return FALSE; +} + /* Always return FALSE because its not interactive */ static gboolean run_func(ObActionsData *data, gpointer options) { Options *o = options; - - if (data->client) { - gint x, y, w, h, realw, realh, lw, lh; + gint x, y, w, h; + ObDirection opp; + gint half; + if (!data->client || /* 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; + ((o->dir == OB_DIRECTION_NORTH || o->dir == OB_DIRECTION_SOUTH) && + data->client->shaded)) + { + return FALSE; + } - 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); - } + /* try grow */ + client_find_resize_directional(data->client, o->dir, TRUE, + &x, &y, &w, &h); + if (do_grow(data, x, y, w, h)) + return FALSE; + + /* 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; + } + break; + case OB_DIRECTION_SOUTH: + half = data->client->area.height / 2; + if (h < half) + h = half; + break; + case OB_DIRECTION_WEST: + half = data->client->area.x + data->client->area.width / 2; + if (x > half) { + w += x - half; + x = half; } + break; + case OB_DIRECTION_EAST: + half = data->client->area.width / 2; + if (w < half) + w = half; + break; + default: g_assert_not_reached(); } + if (do_grow(data, x, y, w, h)) + return FALSE; return FALSE; }