08f543b776ae2c1ed4fa4602d42122b6b9f56da4
[dana/openbox-history.git] / 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 }