From: Dana Jansens Date: Sat, 23 Jun 2007 15:11:56 +0000 (+0000) Subject: add the growtoedge action X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=055cef6c5ddae81fe8976ad83cfa4d60248c0f49;p=chaz%2Fopenbox add the growtoedge action --- diff --git a/Makefile.am b/Makefile.am index a03e3a3d..3181ef8d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -171,6 +171,7 @@ openbox_openbox_SOURCES = \ openbox/actions/exit.c \ openbox/actions/focus.c \ openbox/actions/fullscreen.c \ + openbox/actions/growtoedge.c \ openbox/actions/iconify.c \ openbox/actions/kill.c \ openbox/actions/layer.c \ diff --git a/openbox/action.c b/openbox/action.c index d0953cc1..04a2f9d2 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -146,68 +146,4 @@ void action_shadelower(union ActionData *data) void action_growtoedge(union ActionData *data) { - gint x, y, width, height, dest; - ObClient *c = data->diraction.any.c; - Rect *a; - - a = screen_area(c->desktop, SCREEN_AREA_ALL_MONITORS, &c->frame->area); - x = c->frame->area.x; - y = c->frame->area.y; - /* get the unshaded frame's dimensions..if it is shaded */ - width = c->area.width + c->frame->size.left + c->frame->size.right; - height = c->area.height + c->frame->size.top + c->frame->size.bottom; - - switch(data->diraction.direction) { - case OB_DIRECTION_NORTH: - if (c->shaded) break; /* don't allow vertical resize if shaded */ - - dest = client_directional_edge_search(c, OB_DIRECTION_NORTH, FALSE); - if (a->y == y) - height = height / 2; - else { - height = c->frame->area.y + height - dest; - y = dest; - } - break; - case OB_DIRECTION_WEST: - dest = client_directional_edge_search(c, OB_DIRECTION_WEST, FALSE); - if (a->x == x) - width = width / 2; - else { - width = c->frame->area.x + width - dest; - x = dest; - } - break; - case OB_DIRECTION_SOUTH: - if (c->shaded) break; /* don't allow vertical resize if shaded */ - - dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH, FALSE); - if (a->y + a->height == y + c->frame->area.height) { - height = c->frame->area.height / 2; - y = a->y + a->height - height; - } else - height = dest - c->frame->area.y; - y += (height - c->frame->area.height) % c->size_inc.height; - height -= (height - c->frame->area.height) % c->size_inc.height; - break; - case OB_DIRECTION_EAST: - dest = client_directional_edge_search(c, OB_DIRECTION_EAST, FALSE); - if (a->x + a->width == x + c->frame->area.width) { - width = c->frame->area.width / 2; - x = a->x + a->width - width; - } else - width = dest - c->frame->area.x; - x += (width - c->frame->area.width) % c->size_inc.width; - width -= (width - c->frame->area.width) % c->size_inc.width; - break; - default: - g_assert_not_reached(); - } - width -= c->frame->size.left + c->frame->size.right; - height -= c->frame->size.top + c->frame->size.bottom; - frame_frame_gravity(c->frame, &x, &y, width, height); - client_action_start(data); - client_move_resize(c, x, y, width, height); - client_action_end(data, FALSE); - g_free(a); } diff --git a/openbox/actions/all.c b/openbox/actions/all.c index d22a25fb..b9b0a795 100644 --- a/openbox/actions/all.c +++ b/openbox/actions/all.c @@ -39,4 +39,5 @@ void action_all_startup() action_dockautohide_startup(); action_layer_startup(); action_movetofromedge_startup(); + action_growtoedge_startup(); } diff --git a/openbox/actions/all.h b/openbox/actions/all.h index 9b318c0f..156633f6 100644 --- a/openbox/actions/all.h +++ b/openbox/actions/all.h @@ -40,5 +40,6 @@ void action_addremovedesktop_startup(); void action_dockautohide_startup(); void action_layer_startup(); void action_movetofromedge_startup(); +void action_growtoedge_startup(); #endif diff --git a/openbox/actions/growtoedge.c b/openbox/actions/growtoedge.c new file mode 100644 index 00000000..5d4647f7 --- /dev/null +++ b/openbox/actions/growtoedge.c @@ -0,0 +1,136 @@ +#include "openbox/actions.h" +#include "openbox/misc.h" +#include "openbox/client.h" +#include "openbox/frame.h" +#include "openbox/screen.h" +#include + +typedef struct { + ObDirection dir; +} 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_growtoedge_startup() +{ + actions_register("GrowToEdge", + 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); + o->dir = OB_DIRECTION_NORTH; + + if ((n = parse_find_node("direction", node))) { + gchar *s = parse_string(doc, n); + if (!g_ascii_strcasecmp(s, "north") || + !g_ascii_strcasecmp(s, "up")) + o->dir = OB_DIRECTION_NORTH; + else if (!g_ascii_strcasecmp(s, "south") || + !g_ascii_strcasecmp(s, "down")) + o->dir = OB_DIRECTION_SOUTH; + else if (!g_ascii_strcasecmp(s, "west") || + !g_ascii_strcasecmp(s, "left")) + o->dir = OB_DIRECTION_WEST; + else if (!g_ascii_strcasecmp(s, "east") || + !g_ascii_strcasecmp(s, "right")) + o->dir = OB_DIRECTION_EAST; + g_free(s); + } + + 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) { + gint x, y, width, height, dest; + ObClient *c = data->client; + Rect *a; + + a = screen_area(c->desktop, SCREEN_AREA_ALL_MONITORS, &c->frame->area); + x = c->frame->area.x; + y = c->frame->area.y; + /* get the unshaded frame's dimensions..if it is shaded */ + width = c->area.width + c->frame->size.left + c->frame->size.right; + height = c->area.height + c->frame->size.top + c->frame->size.bottom; + + switch(o->dir) { + case OB_DIRECTION_NORTH: + if (c->shaded) break; /* don't allow vertical resize if shaded */ + + dest = client_directional_edge_search(c, o->dir, FALSE); + if (a->y == y) + height = height / 2; + else { + height = c->frame->area.y + height - dest; + y = dest; + } + break; + case OB_DIRECTION_WEST: + dest = client_directional_edge_search(c, o->dir, FALSE); + if (a->x == x) + width = width / 2; + else { + width = c->frame->area.x + width - dest; + x = dest; + } + break; + case OB_DIRECTION_SOUTH: + if (c->shaded) break; /* don't allow vertical resize if shaded */ + + dest = client_directional_edge_search(c, o->dir, FALSE); + if (a->y + a->height == y + c->frame->area.height) { + height = c->frame->area.height / 2; + y = a->y + a->height - height; + } else + height = dest - c->frame->area.y; + y += (height - c->frame->area.height) % c->size_inc.height; + height -= (height - c->frame->area.height) % c->size_inc.height; + break; + case OB_DIRECTION_EAST: + dest = client_directional_edge_search(c, o->dir, FALSE); + if (a->x + a->width == x + c->frame->area.width) { + width = c->frame->area.width / 2; + x = a->x + a->width - width; + } else + width = dest - c->frame->area.x; + x += (width - c->frame->area.width) % c->size_inc.width; + width -= (width - c->frame->area.width) % c->size_inc.width; + break; + default: + g_assert_not_reached(); + } + + width -= c->frame->size.left + c->frame->size.right; + height -= c->frame->size.top + c->frame->size.bottom; + frame_frame_gravity(c->frame, &x, &y); + + actions_client_move(data, FALSE); + client_move_resize(c, x, y, width, height); + actions_client_move(data, TRUE); + + g_free(a); + } + + return FALSE; +}