diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-06-22 19:24:45 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-06-22 19:24:45 +0000 |
| commit | 8ab1e9537e5aebfe48d826cbf266cf8d582d9d65 (patch) | |
| tree | faf8857d5a7cd35822802a676bfd83266368541c /openbox/actions/resizerelative.c | |
| parent | 4044b942e74b59599e82bb4834a730c32e49820d (diff) | |
add resizerelative action
Diffstat (limited to 'openbox/actions/resizerelative.c')
| -rw-r--r-- | openbox/actions/resizerelative.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/openbox/actions/resizerelative.c b/openbox/actions/resizerelative.c new file mode 100644 index 00000000..1aefb515 --- /dev/null +++ b/openbox/actions/resizerelative.c @@ -0,0 +1,85 @@ +#include "openbox/actions.h" +#include "openbox/client.h" +#include "openbox/screen.h" +#include "openbox/frame.h" +#include <stdlib.h> /* for atoi */ + +typedef struct { + gint left; + gint right; + gint top; + gint bottom; +} Options; + +static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); +static void free_func(gpointer options); +static gboolean run_func(ObActionsData *data, gpointer options); + +void action_resizerelative_startup() +{ + actions_register("ResizeRelative", + setup_func, + free_func, + run_func, + NULL, NULL); +} + +static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node) +{ + xmlNodePtr n; + Options *o; + + o = g_new0(Options, 1); + + if ((n = parse_find_node("left", node))) + o->left = parse_int(doc, n); + if ((n = parse_find_node("right", node))) + o->right = parse_int(doc, n); + if ((n = parse_find_node("top", node))) + o->top = parse_int(doc, n); + if ((n = parse_find_node("bottom", node))) + o->bottom = parse_int(doc, n); + + return o; +} + +static void free_func(gpointer options) +{ + Options *o = options; + + g_free(o); +} + +/* Always return FALSE because its not interactive */ +static gboolean run_func(ObActionsData *data, gpointer options) +{ + Options *o = options; + + if (data->client) { + ObClient *c = data->client; + gint x, y, ow, xoff, nw, oh, yoff, nh, lw, lh; + + x = c->area.x; + y = c->area.y; + ow = c->area.width; + xoff = -o->left * c->size_inc.width; + nw = ow + o->right * c->size_inc.width + + o->left * c->size_inc.width; + oh = c->area.height; + yoff = -o->top * c->size_inc.height; + nh = oh + o->bottom * c->size_inc.height + + o->top * c->size_inc.height; + + client_try_configure(c, &x, &y, &nw, &nh, &lw, &lh, TRUE); + xoff = xoff == 0 ? 0 : + (xoff < 0 ? MAX(xoff, ow-nw) : MIN(xoff, ow-nw)); + yoff = yoff == 0 ? 0 : + (yoff < 0 ? MAX(yoff, oh-nh) : MIN(yoff, oh-nh)); + + actions_client_move(data, FALSE); + client_move_resize(c, x + xoff, y + yoff, nw, nh); + actions_client_move(data, TRUE); + } + + return FALSE; +} |
