X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fresizerelative.c;h=a4739104631f22a510469cb99b1dbe8e273b394e;hb=2391410e3fd7767e266c0efe84fd34244ea29dc6;hp=5742e1fcff0a963e589aa370de47e6d11377c135;hpb=4145468a1984e1055a947ad957075ae51f70ca9c;p=chaz%2Fopenbox diff --git a/openbox/actions/resizerelative.c b/openbox/actions/resizerelative.c index 5742e1fc..a4739104 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,37 @@ 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 / o->left_denom; + if (o->right_denom) + right = right * c->area.width / o->right_denom; + if (o->top_denom) + top = top * c->area.height / o->top_denom; + if (o->bottom_denom) + bottom = bottom * c->area.height / o->bottom_denom; + + if (left && ABS(left) < c->size_inc.width) + left = left < 0 ? -c->size_inc.width : c->size_inc.width; + if (right && ABS(right) < c->size_inc.width) + right = right < 0 ? -c->size_inc.width : c->size_inc.width; + if (top && ABS(top) < c->size_inc.height) + top = top < 0 ? -c->size_inc.height : c->size_inc.height; + if (bottom && ABS(bottom) < c->size_inc.height) + bottom = bottom < 0 ? -c->size_inc.height : c->size_inc.height; + // When resizing, if the resize has a non-zero value then make sure it + // is at least as big as the size increment so the window does actually + // resize. 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; + nw = ow + right + left; 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; + nh = oh + bottom + top; client_try_configure(c, &x, &y, &nw, &nh, &lw, &lh, TRUE); xoff = xoff == 0 ? 0 :