X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fresizerelative.c;h=e32aff32d55e417888ae26985fcc7226f144a4bc;hb=46ca54fd81096b466e51eace79d0761b2c4923f7;hp=5742e1fcff0a963e589aa370de47e6d11377c135;hpb=26cc41f6c6187dabd5c7ee4365c8fa44751009e5;p=chaz%2Fopenbox diff --git a/openbox/actions/resizerelative.c b/openbox/actions/resizerelative.c index 5742e1fc..e32aff32 100644 --- a/openbox/actions/resizerelative.c +++ b/openbox/actions/resizerelative.c @@ -2,22 +2,35 @@ #include "openbox/client.h" #include "openbox/screen.h" #include "openbox/frame.h" -#include /* for atoi */ +#include "openbox/config.h" typedef struct { gint left; + gint left_denom; gint right; + gint right_denom; gint top; + gint top_denom; gint bottom; + gint bottom_denom; } Options; static gpointer setup_func(xmlNodePtr node); +static void free_func(gpointer options); static gboolean run_func(ObActionsData *data, gpointer options); void action_resizerelative_startup(void) { - actions_register("ResizeRelative", setup_func, g_free, run_func, - NULL, NULL); + actions_register("ResizeRelative", setup_func, free_func, run_func); +} + +static void xml_node_relative(xmlNodePtr n, gint *num, gint *denom) +{ + gchar *s; + + s = obt_xml_node_string(n); + config_parse_relative_number(s, num, denom); + g_free(s); } static gpointer setup_func(xmlNodePtr node) @@ -25,22 +38,27 @@ static gpointer setup_func(xmlNodePtr node) xmlNodePtr n; Options *o; - o = g_new0(Options, 1); + o = g_slice_new0(Options); - if ((n = obt_parse_find_node(node, "left"))) - o->left = obt_parse_node_int(n); - if ((n = obt_parse_find_node(node, "right"))) - o->right = obt_parse_node_int(n); - if ((n = obt_parse_find_node(node, "top")) || - (n = obt_parse_find_node(node, "up"))) - o->top = obt_parse_node_int(n); - if ((n = obt_parse_find_node(node, "bottom")) || - (n = obt_parse_find_node(node, "down"))) - o->bottom = obt_parse_node_int(n); + if ((n = obt_xml_find_node(node, "left"))) + xml_node_relative(n, &o->left, &o->left_denom); + if ((n = obt_xml_find_node(node, "right"))) + xml_node_relative(n, &o->right, &o->right_denom); + if ((n = obt_xml_find_node(node, "top")) || + (n = obt_xml_find_node(node, "up"))) + xml_node_relative(n, &o->top, &o->top_denom); + if ((n = obt_xml_find_node(node, "bottom")) || + (n = obt_xml_find_node(node, "down"))) + xml_node_relative(n, &o->bottom, &o->bottom_denom); return o; } +static void free_func(gpointer o) +{ + g_slice_free(Options, o); +} + /* Always return FALSE because its not interactive */ static gboolean run_func(ObActionsData *data, gpointer options) { @@ -49,17 +67,27 @@ static gboolean run_func(ObActionsData *data, gpointer options) if (data->client) { ObClient *c = data->client; gint x, y, ow, xoff, nw, oh, yoff, nh, lw, lh; + gint left = o->left, right = o->right, top = o->top, bottom = o->bottom; + + if (o->left_denom) + left = (left * c->area.width / c->size_inc.width) / o->left_denom; + if (o->right_denom) + right = (right * c->area.width / c->size_inc.width) / o->right_denom; + if (o->top_denom) + top = (top * c->area.height / c->size_inc.height) / o->top_denom; + if (o->bottom_denom) + bottom = (bottom * c->area.height / c->size_inc.height) / o->bottom_denom; 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; + xoff = -left * c->size_inc.width; + nw = ow + right * c->size_inc.width + + 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; + yoff = -top * c->size_inc.height; + nh = oh + bottom * c->size_inc.height + + top * c->size_inc.height; client_try_configure(c, &x, &y, &nw, &nh, &lw, &lh, TRUE); xoff = xoff == 0 ? 0 :