X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions%2Fmoverelative.c;h=b67b5cf1094d3c4fcf03c53726388014bb598a16;hb=1d1fe5e6cc7afd8db05be7d4938ca87ba621dc94;hp=189b4dd0d7c4bc59497ac7584fa8b2a106d6fe64;hpb=d179d6428ae585a3b8a13479bfe4586e41de2ff9;p=chaz%2Fopenbox diff --git a/openbox/actions/moverelative.c b/openbox/actions/moverelative.c index 189b4dd0..b67b5cf1 100644 --- a/openbox/actions/moverelative.c +++ b/openbox/actions/moverelative.c @@ -2,11 +2,13 @@ #include "openbox/client.h" #include "openbox/screen.h" #include "openbox/frame.h" -#include /* for atoi */ +#include "openbox/config.h" typedef struct { gint x; + gint x_denom; gint y; + gint y_denom; } Options; static gpointer setup_func(xmlNodePtr node); @@ -22,13 +24,20 @@ static gpointer setup_func(xmlNodePtr node) { xmlNodePtr n; Options *o; + gchar *s; o = g_slice_new0(Options); - if ((n = obt_xml_find_node(node, "x"))) - o->x = obt_xml_node_int(n); - if ((n = obt_xml_find_node(node, "y"))) - o->y = obt_xml_node_int(n); + if ((n = obt_xml_find_node(node, "x"))) { + s = obt_xml_node_string(n); + config_parse_relative_number(s, &o->x, &o->x_denom); + g_free(s); + } + if ((n = obt_xml_find_node(node, "y"))) { + s = obt_xml_node_string(n); + config_parse_relative_number(s, &o->y, &o->y_denom); + g_free(s); + } return o; } @@ -48,8 +57,19 @@ static gboolean run_func(ObActionsData *data, gpointer options) gint x, y, lw, lh, w, h; c = data->client; - x = c->area.x + o->x; - y = c->area.y + o->y; + x = o->x; + y = o->y; + if (o->x_denom || o->y_denom) { + const Rect *carea; + + carea = screen_area(c->desktop, client_monitor(c), NULL); + if (o->x_denom) + x = (x * carea->width) / o->x_denom; + if (o->y_denom) + y = (y * carea->height) / o->y_denom; + } + x = c->area.x + x; + y = c->area.y + y; w = c->area.width; h = c->area.height; client_try_configure(c, &x, &y, &w, &h, &lw, &lh, TRUE);