From: Dana Jansens Date: Tue, 10 Jul 2007 20:47:10 +0000 (+0000) Subject: grow to edge works again, using the new edge detection code X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=ad8a7e2e025cd6eba8f7b8b29f85cb9e81b808b5;p=chaz%2Fopenbox grow to edge works again, using the new edge detection code --- diff --git a/openbox/actions/growtoedge.c b/openbox/actions/growtoedge.c index a5b24e37..b6979c93 100644 --- a/openbox/actions/growtoedge.c +++ b/openbox/actions/growtoedge.c @@ -63,73 +63,23 @@ static gboolean run_func(ObActionsData *data, gpointer options) 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; diff --git a/openbox/client.c b/openbox/client.c index 4383bc7d..064d6851 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -4089,6 +4089,85 @@ void client_find_move_directional(ObClient *self, ObDirection dir, 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; diff --git a/openbox/client.h b/openbox/client.h index cae9d905..9f208596 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -463,6 +463,9 @@ void client_find_edge_directional(ObClient *self, ObDirection dir, 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