diff options
Diffstat (limited to 'openbox/actions')
| -rw-r--r-- | openbox/actions/growtoedge.c | 122 |
1 files changed, 70 insertions, 52 deletions
diff --git a/openbox/actions/growtoedge.c b/openbox/actions/growtoedge.c index 3a213806..fa1b2c7e 100644 --- a/openbox/actions/growtoedge.c +++ b/openbox/actions/growtoedge.c @@ -123,6 +123,58 @@ static gboolean do_grow(ObActionsData *data, gint x, gint y, gint w, gint h) return FALSE; } +static gboolean do_grow_all_edges(ObActionsData* data, + ObClientDirectionalResizeType resize_type) +{ + gint x, y, w, h; + gint temp_x, temp_y, temp_w, temp_h; + + client_find_resize_directional(data->client, + OB_DIRECTION_NORTH, + resize_type, + &temp_x, &temp_y, &temp_w, &temp_h); + y = temp_y; + h = temp_h; + + client_find_resize_directional(data->client, + OB_DIRECTION_SOUTH, + resize_type, + &temp_x, &temp_y, &temp_w, &temp_h); + h += temp_h - data->client->area.height; + + + client_find_resize_directional(data->client, + OB_DIRECTION_WEST, + resize_type, + &temp_x, &temp_y, &temp_w, &temp_h); + x = temp_x; + w = temp_w; + + client_find_resize_directional(data->client, + OB_DIRECTION_EAST, + resize_type, + &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. */ + int lw, lh; + client_try_configure(data->client, &x, &y, &w, &h, &lw, &lh, TRUE); + + if (x == data->client->area.x && + y == data->client->area.y && + w == data->client->area.width && + h == data->client->area.height) + { + return FALSE; + } + + actions_client_move(data, TRUE); + client_move_resize(data->client, x, y, w, h); + actions_client_move(data, FALSE); + return TRUE; +} + static void free_func(gpointer o) { g_slice_free(Options, o); @@ -132,20 +184,16 @@ static void free_func(gpointer o) static gboolean run_func(ObActionsData *data, gpointer options) { Options *o = options; - gint x, y, w, h; - - gint half; 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) + + gboolean doing_verical_resize = + o->dir == OB_DIRECTION_NORTH || + o->dir == OB_DIRECTION_SOUTH || + o->fill; + if (data->client->shaded && doing_verical_resize) return FALSE; - } if (o->fill) { if (o->shrink) { @@ -154,53 +202,18 @@ static gboolean run_func(ObActionsData *data, gpointer options) return FALSE; } - 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; + if (do_grow_all_edges(data, CLIENT_RESIZE_GROW_IF_NOT_ON_EDGE)) + return FALSE; - 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); - } + /* If all the edges are blocked, then allow them to jump past their + current block points. */ + do_grow_all_edges(data, CLIENT_RESIZE_GROW); return FALSE; } if (!o->shrink) { + gint x, y, w, h; + /* Try grow. */ client_find_resize_directional(data->client, o->dir, @@ -217,10 +230,15 @@ static gboolean run_func(ObActionsData *data, gpointer options) (o->dir == OB_DIRECTION_SOUTH ? OB_DIRECTION_NORTH : (o->dir == OB_DIRECTION_EAST ? OB_DIRECTION_WEST : OB_DIRECTION_EAST))); + + gint x, y, w, h; + gint half; + client_find_resize_directional(data->client, opposite, CLIENT_RESIZE_SHRINK, &x, &y, &w, &h); + switch (opposite) { case OB_DIRECTION_NORTH: half = data->client->area.y + data->client->area.height / 2; |
