- gint head, size;
- gint e_start, e_size;
- gboolean near;
-
- gint north_edge;
- head = RECT_TOP(data->client->frame->area)+1;
- size = data->client->frame->area.height;
- e_start = RECT_LEFT(data->client->frame->area);
- e_size = data->client->frame->area.width;
-
- client_find_edge_directional(data->client, OB_DIRECTION_NORTH,
- head, size, e_start, e_size,
- &north_edge, &near);
-
- gint south_edge;
- head = RECT_BOTTOM(data->client->frame->area)-1;
- size = data->client->frame->area.height;
- e_start = RECT_LEFT(data->client->frame->area);
- e_size = data->client->frame->area.width;
-
- client_find_edge_directional(data->client, OB_DIRECTION_SOUTH,
- head, size, e_start, e_size,
- &south_edge, &near);
-
- gint east_edge;
- head = RECT_RIGHT(data->client->frame->area)-1;
- size = data->client->frame->area.width;
- e_start = RECT_TOP(data->client->frame->area);
- e_size = data->client->frame->area.height;
-
- client_find_edge_directional(data->client, OB_DIRECTION_EAST,
- head, size, e_start, e_size,
- &east_edge, &near);
-
- gint west_edge;
- head = RECT_LEFT(data->client->frame->area)+1;
- size = data->client->frame->area.width;
- e_start = RECT_TOP(data->client->frame->area);
- e_size = data->client->frame->area.height;
-
- client_find_edge_directional(data->client, OB_DIRECTION_WEST,
- head, size, e_start, e_size,
- &west_edge, &near);
-
- /* Calculate the client pos and size, based on frame pos and size.
- */
-
- gint w_client_delta =
- data->client->frame->area.width - data->client->area.width;
- gint h_client_delta =
- data->client->frame->area.height - data->client->area.height;
-
- gint x_client_delta =
- data->client->area.x - data->client->frame->area.x;
- gint y_client_delta =
- data->client->area.y - data->client->frame->area.y;
-
- x = west_edge + x_client_delta + 1;
- y = north_edge + y_client_delta + 1;
-
- w = east_edge - west_edge - w_client_delta - 1;
- h = south_edge - north_edge - h_client_delta - 1;
-
- /* grow passing client pos and size */
-
- do_grow(data, x, y, w, h);
+ ObClientDirectionalResizeType grow = CLIENT_RESIZE_GROW_IF_NOT_ON_EDGE;
+
+ gint temp_x;
+ gint temp_y;
+ gint temp_w;
+ gint temp_h;
+
+ client_find_resize_directional(data->client,
+ OB_DIRECTION_NORTH,
+ grow,
+ &temp_x, &temp_y, &temp_w, &temp_h);
+ y = temp_y;
+ h = temp_h;
+
+ client_find_resize_directional(data->client,
+ OB_DIRECTION_SOUTH,
+ grow,
+ &temp_x, &temp_y, &temp_w, &temp_h);
+ h += temp_h - data->client->area.height;
+
+
+ client_find_resize_directional(data->client,
+ OB_DIRECTION_WEST,
+ grow,
+ &temp_x, &temp_y, &temp_w, &temp_h);
+ x = temp_x;
+ w = temp_w;
+
+ client_find_resize_directional(data->client,
+ OB_DIRECTION_EAST,
+ grow,
+ &temp_x, &temp_y, &temp_w, &temp_h);
+ w += temp_w - data->client->area.width;
+
+ /* When filling, we allow the window to move to an arbitrary x/y
+ position, since we'll be growing the other edge as well. */
+ 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, w, h);
+ actions_client_move(data, FALSE);
+ }