make growtoedge shrink if it cyan grow any more

This commit is contained in:
Dana Jansens 2007-08-04 14:04:22 -04:00
parent 758ef2cafa
commit fba55d8d9f

View file

@ -57,39 +57,89 @@ static void free_func(gpointer options)
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;
gint x, y, w, h;
ObDirection opp;
gint half;
if (data->client) {
gint x, y, w, h, realw, realh, lw, lh;
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;
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);
}
}
((o->dir == OB_DIRECTION_NORTH || o->dir == OB_DIRECTION_SOUTH) &&
data->client->shaded))
{
return 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;
}