From: Dana Jansens Date: Sat, 23 Jun 2007 15:43:35 +0000 (+0000) Subject: add the "if" action X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=cf640af0eade492a6a0a9765a1d2d35d81ea1235;p=chaz%2Fopenbox add the "if" action --- diff --git a/Makefile.am b/Makefile.am index 3181ef8d..798422b3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -173,6 +173,7 @@ openbox_openbox_SOURCES = \ openbox/actions/fullscreen.c \ openbox/actions/growtoedge.c \ openbox/actions/iconify.c \ + openbox/actions/if.c \ openbox/actions/kill.c \ openbox/actions/layer.c \ openbox/actions/lower.c \ diff --git a/openbox/action.c b/openbox/action.c index 04a2f9d2..3786feb3 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -17,78 +17,6 @@ See the COPYING file for a copy of the GNU General Public License. */ -#include "debug.h" -#include "client.h" -#include "focus.h" -#include "focus_cycle.h" -#include "moveresize.h" -#include "menu.h" -#include "prop.h" -#include "stacking.h" -#include "screen.h" -#include "action.h" -#include "openbox.h" -#include "grab.h" -#include "keyboard.h" -#include "event.h" -#include "dock.h" -#include "config.h" -#include "mainloop.h" -#include "startupnotify.h" -#include "gettext.h" - -#include - - - - -void setup_action_growtoedge_north(ObAction **a, ObUserAction uact) -{ - (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.diraction.direction = OB_DIRECTION_NORTH; -} - -void setup_action_growtoedge_south(ObAction **a, ObUserAction uact) -{ - (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.diraction.direction = OB_DIRECTION_SOUTH; -} - -void setup_action_growtoedge_east(ObAction **a, ObUserAction uact) -{ - (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.diraction.direction = OB_DIRECTION_EAST; -} - -void setup_action_growtoedge_west(ObAction **a, ObUserAction uact) -{ - (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.diraction.direction = OB_DIRECTION_WEST; -} - -void setup_action_top_layer(ObAction **a, ObUserAction uact) -{ - (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.layer.layer = 1; -} - -void setup_action_normal_layer(ObAction **a, ObUserAction uact) -{ - (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.layer.layer = 0; -} - -void setup_action_bottom_layer(ObAction **a, ObUserAction uact) -{ - (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS; - (*a)->data.layer.layer = -1; -} - -void setup_client_action(ObAction **a, ObUserAction uact) -{ - (*a)->data.any.client_action = OB_CLIENT_ACTION_ALWAYS; -} - ActionString actionstrings[] = { { @@ -101,26 +29,6 @@ ActionString actionstrings[] = action_unshaderaise, setup_client_action }, - { - "growtoedgenorth", - action_growtoedge, - setup_action_growtoedge_north - }, - { - "growtoedgesouth", - action_growtoedge, - setup_action_growtoedge_south - }, - { - "growtoedgewest", - action_growtoedge, - setup_action_growtoedge_west - }, - { - "growtoedgeeast", - action_growtoedge, - setup_action_growtoedge_east - }, { NULL, NULL, @@ -143,7 +51,3 @@ void action_shadelower(union ActionData *data) else action_shade(data); } - -void action_growtoedge(union ActionData *data) -{ -} diff --git a/openbox/actions/all.c b/openbox/actions/all.c index b9b0a795..51996de8 100644 --- a/openbox/actions/all.c +++ b/openbox/actions/all.c @@ -40,4 +40,5 @@ void action_all_startup() action_layer_startup(); action_movetofromedge_startup(); action_growtoedge_startup(); + action_if_startup(); } diff --git a/openbox/actions/all.h b/openbox/actions/all.h index 156633f6..fd71e4b1 100644 --- a/openbox/actions/all.h +++ b/openbox/actions/all.h @@ -41,5 +41,6 @@ void action_dockautohide_startup(); void action_layer_startup(); void action_movetofromedge_startup(); void action_growtoedge_startup(); +void action_if_startup(); #endif diff --git a/openbox/actions/if.c b/openbox/actions/if.c new file mode 100644 index 00000000..08f543b7 --- /dev/null +++ b/openbox/actions/if.c @@ -0,0 +1,133 @@ +#include "openbox/actions.h" +#include "openbox/misc.h" +#include "openbox/client.h" +#include "openbox/frame.h" +#include "openbox/screen.h" +#include + +typedef struct { + gboolean shaded_on; + gboolean shaded_off; + gboolean maxvert_on; + gboolean maxvert_off; + gboolean maxhorz_on; + gboolean maxhorz_off; + gboolean maxfull_on; + gboolean maxfull_off; + gboolean iconic_on; + gboolean iconic_off; + GSList *thenacts; + GSList *elseacts; +} 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_if_startup() +{ + actions_register("If", + 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("shaded", node))) { + if (parse_bool(doc, n)) + o->shaded_on = TRUE; + else + o->shaded_off = TRUE; + } + if ((n = parse_find_node("maximized", node))) { + if (parse_bool(doc, n)) + o->maxfull_on = TRUE; + else + o->maxfull_off = TRUE; + } + if ((n = parse_find_node("maximizedhorizontal", node))) { + if (parse_bool(doc, n)) + o->maxhorz_on = TRUE; + else + o->maxhorz_off = TRUE; + } + if ((n = parse_find_node("maximizedvertical", node))) { + if (parse_bool(doc, n)) + o->maxvert_on = TRUE; + else + o->maxvert_off = TRUE; + } + if ((n = parse_find_node("iconified", node))) { + if (parse_bool(doc, n)) + o->iconic_on = TRUE; + else + o->iconic_off = TRUE; + } + + if ((n = parse_find_node("then", node))) { + xmlNodePtr m; + + m = parse_find_node("action", n->xmlChildrenNode); + while (m) { + ObActionsAct *action = actions_parse(i, doc, m); + if (action) o->thenacts = g_slist_prepend(o->thenacts, action); + m = parse_find_node("action", m->next); + } + } + if ((n = parse_find_node("else", node))) { + xmlNodePtr m; + + m = parse_find_node("action", n->xmlChildrenNode); + while (m) { + ObActionsAct *action = actions_parse(i, doc, m); + if (action) o->elseacts = g_slist_prepend(o->elseacts, action); + m = parse_find_node("action", m->next); + } + } + + 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; + GSList *acts; + ObClient *c = data->client; + + if ((!o->shaded_on || (c && c->shaded)) && + (!o->shaded_off || (c && !c->shaded)) && + (!o->iconic_on || (c && c->iconic)) && + (!o->iconic_off || (c && !c->iconic)) && + (!o->maxhorz_on || (c && c->max_horz)) && + (!o->maxhorz_off || (c && !c->max_horz)) && + (!o->maxvert_on || (c && c->max_vert)) && + (!o->maxvert_off || (c && !c->max_vert)) && + (!o->maxfull_on || (c && c->max_vert && c->max_horz)) && + (!o->maxfull_off || (c && !(c->max_vert && c->max_horz)))) + { + acts = o->thenacts; + } + else + acts = o->elseacts; + + actions_run_acts(acts, data->uact, data->state, + data->x, data->y, data->button, + data->context, data->client); + + return FALSE; +}