]> Dogcows Code - chaz/openbox/blob - openbox/actions/if.c
add the "if" action
[chaz/openbox] / openbox / actions / if.c
1 #include "openbox/actions.h"
2 #include "openbox/misc.h"
3 #include "openbox/client.h"
4 #include "openbox/frame.h"
5 #include "openbox/screen.h"
6 #include <glib.h>
7
8 typedef struct {
9 gboolean shaded_on;
10 gboolean shaded_off;
11 gboolean maxvert_on;
12 gboolean maxvert_off;
13 gboolean maxhorz_on;
14 gboolean maxhorz_off;
15 gboolean maxfull_on;
16 gboolean maxfull_off;
17 gboolean iconic_on;
18 gboolean iconic_off;
19 GSList *thenacts;
20 GSList *elseacts;
21 } Options;
22
23 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
24 static void free_func(gpointer options);
25 static gboolean run_func(ObActionsData *data, gpointer options);
26
27 void action_if_startup()
28 {
29 actions_register("If",
30 setup_func,
31 free_func,
32 run_func,
33 NULL, NULL);
34 }
35
36 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
37 {
38 xmlNodePtr n;
39 Options *o;
40
41 o = g_new0(Options, 1);
42
43 if ((n = parse_find_node("shaded", node))) {
44 if (parse_bool(doc, n))
45 o->shaded_on = TRUE;
46 else
47 o->shaded_off = TRUE;
48 }
49 if ((n = parse_find_node("maximized", node))) {
50 if (parse_bool(doc, n))
51 o->maxfull_on = TRUE;
52 else
53 o->maxfull_off = TRUE;
54 }
55 if ((n = parse_find_node("maximizedhorizontal", node))) {
56 if (parse_bool(doc, n))
57 o->maxhorz_on = TRUE;
58 else
59 o->maxhorz_off = TRUE;
60 }
61 if ((n = parse_find_node("maximizedvertical", node))) {
62 if (parse_bool(doc, n))
63 o->maxvert_on = TRUE;
64 else
65 o->maxvert_off = TRUE;
66 }
67 if ((n = parse_find_node("iconified", node))) {
68 if (parse_bool(doc, n))
69 o->iconic_on = TRUE;
70 else
71 o->iconic_off = TRUE;
72 }
73
74 if ((n = parse_find_node("then", node))) {
75 xmlNodePtr m;
76
77 m = parse_find_node("action", n->xmlChildrenNode);
78 while (m) {
79 ObActionsAct *action = actions_parse(i, doc, m);
80 if (action) o->thenacts = g_slist_prepend(o->thenacts, action);
81 m = parse_find_node("action", m->next);
82 }
83 }
84 if ((n = parse_find_node("else", node))) {
85 xmlNodePtr m;
86
87 m = parse_find_node("action", n->xmlChildrenNode);
88 while (m) {
89 ObActionsAct *action = actions_parse(i, doc, m);
90 if (action) o->elseacts = g_slist_prepend(o->elseacts, action);
91 m = parse_find_node("action", m->next);
92 }
93 }
94
95 return o;
96 }
97
98 static void free_func(gpointer options)
99 {
100 Options *o = options;
101
102 g_free(o);
103 }
104
105 /* Always return FALSE because its not interactive */
106 static gboolean run_func(ObActionsData *data, gpointer options)
107 {
108 Options *o = options;
109 GSList *acts;
110 ObClient *c = data->client;
111
112 if ((!o->shaded_on || (c && c->shaded)) &&
113 (!o->shaded_off || (c && !c->shaded)) &&
114 (!o->iconic_on || (c && c->iconic)) &&
115 (!o->iconic_off || (c && !c->iconic)) &&
116 (!o->maxhorz_on || (c && c->max_horz)) &&
117 (!o->maxhorz_off || (c && !c->max_horz)) &&
118 (!o->maxvert_on || (c && c->max_vert)) &&
119 (!o->maxvert_off || (c && !c->max_vert)) &&
120 (!o->maxfull_on || (c && c->max_vert && c->max_horz)) &&
121 (!o->maxfull_off || (c && !(c->max_vert && c->max_horz))))
122 {
123 acts = o->thenacts;
124 }
125 else
126 acts = o->elseacts;
127
128 actions_run_acts(acts, data->uact, data->state,
129 data->x, data->y, data->button,
130 data->context, data->client);
131
132 return FALSE;
133 }
This page took 0.039878 seconds and 5 git commands to generate.