diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-06-23 15:43:35 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-06-23 15:43:35 +0000 |
| commit | cf640af0eade492a6a0a9765a1d2d35d81ea1235 (patch) | |
| tree | 36cf63466db651ae701e46067d70962656e2df66 /openbox/actions | |
| parent | 52b63adfe1120b2e6bc12df4b9f867e9e7c6ab31 (diff) | |
add the "if" action
Diffstat (limited to 'openbox/actions')
| -rw-r--r-- | openbox/actions/all.c | 1 | ||||
| -rw-r--r-- | openbox/actions/all.h | 1 | ||||
| -rw-r--r-- | openbox/actions/if.c | 133 |
3 files changed, 135 insertions, 0 deletions
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 <glib.h> + +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; +} |
