+ if (!data->client)
+ return FALSE;
+ if (data->client->shaded) {
+ gboolean doing_verical_resize =
+ o->dir == OB_DIRECTION_NORTH ||
+ o->dir == OB_DIRECTION_SOUTH ||
+ o->fill;
+ if (doing_verical_resize)
+ return FALSE;
+ }
+
+ if (o->fill) {
+ if (o->shrink) {
+ /* We don't have any implementation of shrinking for the FillToGrow
+ action. */
+ return FALSE;
+ }
+
+ 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);