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;
-
-#if 0
- dest = client_directional_edge_search(c, o->dir);
-
- switch(o->dir) {
- case OB_DIRECTION_NORTH:
- if (c->shaded) break; /* don't allow vertical resize if shaded */
-
- if (a->y == y)
- height = height / 2;
- else {
- height = c->frame->area.y + height - dest;
- y = dest;
- }
- break;
- case OB_DIRECTION_WEST:
- if (a->x == x)
- width = width / 2;
- else {
- width = c->frame->area.x + width - dest;
- x = dest;
+ gint x, y, w, h;
+
+ /* 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);
+ 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, FALSE);
+ client_move_resize(data->client, x, y, w, h);
+ actions_client_move(data, TRUE);
}
- break;
- case OB_DIRECTION_SOUTH:
- if (c->shaded) break; /* don't allow vertical resize if shaded */
-
- 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:
- 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);
-
-#endif
- g_free(a);
}
return FALSE;
frame_frame_gravity(self->frame, x, y);
}
+void client_find_resize_directional(ObClient *self, ObDirection side,
+ gboolean grow,
+ gint *x, gint *y, gint *w, gint *h)
+{
+ gint head, size;
+ gint e, e_start, e_size, delta;
+ gboolean near;
+ ObDirection dir;
+
+ switch (side) {
+ case OB_DIRECTION_EAST:
+ head = RECT_RIGHT(self->frame->area) + (self->size_inc.width - 1);
+ size = self->frame->area.width;
+ e_start = RECT_TOP(self->frame->area);
+ e_size = self->frame->area.height;
+ dir = grow ? OB_DIRECTION_EAST : OB_DIRECTION_WEST;
+ break;
+ case OB_DIRECTION_WEST:
+ head = RECT_LEFT(self->frame->area) - (self->size_inc.width - 1);
+ size = self->frame->area.width;
+ e_start = RECT_TOP(self->frame->area);
+ e_size = self->frame->area.height;
+ dir = grow ? OB_DIRECTION_WEST : OB_DIRECTION_EAST;
+ break;
+ case OB_DIRECTION_NORTH:
+ head = RECT_TOP(self->frame->area) - (self->size_inc.height - 1);
+ size = self->frame->area.height;
+ e_start = RECT_LEFT(self->frame->area);
+ e_size = self->frame->area.width;
+ dir = grow ? OB_DIRECTION_NORTH : OB_DIRECTION_SOUTH;
+ break;
+ case OB_DIRECTION_SOUTH:
+ head = RECT_BOTTOM(self->frame->area) + (self->size_inc.height - 1);
+ size = self->frame->area.height;
+ e_start = RECT_LEFT(self->frame->area);
+ e_size = self->frame->area.width;
+ dir = grow ? OB_DIRECTION_SOUTH : OB_DIRECTION_NORTH;
+ break;
+ default:
+ g_assert_not_reached();
+ }
+
+ client_find_edge_directional(self, dir, head, size,
+ e_start, e_size, &e, &near);
+ *x = self->frame->area.x;
+ *y = self->frame->area.y;
+ *w = self->frame->area.width;
+ *h = self->frame->area.height;
+ switch (side) {
+ case OB_DIRECTION_EAST:
+ if (near) --e;
+ delta = e - RECT_RIGHT(self->frame->area);
+ *w += delta;
+ break;
+ case OB_DIRECTION_WEST:
+ if (near) ++e;
+ delta = RECT_LEFT(self->frame->area) - e;
+ *x -= delta;
+ *w += delta;
+ break;
+ case OB_DIRECTION_NORTH:
+ if (near) ++e;
+ delta = RECT_TOP(self->frame->area) - e;
+ *y -= delta;
+ *h += delta;
+ break;
+ case OB_DIRECTION_SOUTH:
+ if (near) --e;
+ delta = e - RECT_BOTTOM(self->frame->area);
+ *h += delta;
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ frame_frame_gravity(self->frame, x, y);
+ *w -= self->frame->size.left + self->frame->size.right;
+ *h -= self->frame->size.top + self->frame->size.bottom;
+}
+
ObClient* client_under_pointer()
{
gint x, y;
gint *dest, gboolean *near_edge);
void client_find_move_directional(ObClient *self, ObDirection dir,
gint *x, gint *y);
+void client_find_resize_directional(ObClient *self, ObDirection side,
+ gboolean grow,
+ gint *x, gint *y, gint *w, gint *h);
/*! Fullscreen's or unfullscreen's the client window
@param fs true if the window should be made fullscreen; false if it should