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;
}