make growtoedge shrink if it cyan grow any more
This commit is contained in:
parent
758ef2cafa
commit
fba55d8d9f
1 changed files with 76 additions and 26 deletions
|
@ -57,39 +57,89 @@ static void free_func(gpointer options)
|
||||||
g_free(o);
|
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 */
|
/* Always return FALSE because its not interactive */
|
||||||
static gboolean run_func(ObActionsData *data, gpointer options)
|
static gboolean run_func(ObActionsData *data, gpointer options)
|
||||||
{
|
{
|
||||||
Options *o = options;
|
Options *o = options;
|
||||||
|
gint x, y, w, h;
|
||||||
|
ObDirection opp;
|
||||||
|
gint half;
|
||||||
|
|
||||||
if (data->client) {
|
if (!data->client ||
|
||||||
gint x, y, w, h, realw, realh, lw, lh;
|
|
||||||
|
|
||||||
/* don't allow vertical resize if shaded */
|
/* don't allow vertical resize if shaded */
|
||||||
if (o->dir != OB_DIRECTION_NORTH || o->dir != OB_DIRECTION_SOUTH ||
|
((o->dir == OB_DIRECTION_NORTH || o->dir == OB_DIRECTION_SOUTH) &&
|
||||||
!data->client->shaded)
|
data->client->shaded))
|
||||||
{
|
{
|
||||||
client_find_resize_directional(data->client, o->dir, TRUE,
|
return FALSE;
|
||||||
&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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue