add focused check to if action
[mikachu/openbox.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     gboolean focused;
20     gboolean unfocused;
21     GSList *thenacts;
22     GSList *elseacts;
23 } Options;
24
25 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
26 static void     free_func(gpointer options);
27 static gboolean run_func(ObActionsData *data, gpointer options);
28
29 void action_if_startup()
30 {
31     actions_register("If",
32                      setup_func,
33                      free_func,
34                      run_func,
35                      NULL, NULL);
36 }
37
38 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
39 {
40     xmlNodePtr n;
41     Options *o;
42
43     o = g_new0(Options, 1);
44
45     if ((n = parse_find_node("shaded", node))) {
46         if (parse_bool(doc, n))
47             o->shaded_on = TRUE;
48         else
49             o->shaded_off = TRUE;
50     }
51     if ((n = parse_find_node("maximized", node))) {
52         if (parse_bool(doc, n))
53             o->maxfull_on = TRUE;
54         else
55             o->maxfull_off = TRUE;
56     }
57     if ((n = parse_find_node("maximizedhorizontal", node))) {
58         if (parse_bool(doc, n))
59             o->maxhorz_on = TRUE;
60         else
61             o->maxhorz_off = TRUE;
62     }
63     if ((n = parse_find_node("maximizedvertical", node))) {
64         if (parse_bool(doc, n))
65             o->maxvert_on = TRUE;
66         else
67             o->maxvert_off = TRUE;
68     }
69     if ((n = parse_find_node("iconified", node))) {
70         if (parse_bool(doc, n))
71             o->iconic_on = TRUE;
72         else
73             o->iconic_off = TRUE;
74     }
75     if ((n = parse_find_node("focused", node))) {
76         if (parse_bool(doc, n))
77             o->focused = TRUE;
78         else
79             o->unfocused = TRUE;
80     }
81
82     if ((n = parse_find_node("then", node))) {
83         xmlNodePtr m;
84
85         m = parse_find_node("action", n->xmlChildrenNode);
86         while (m) {
87             ObActionsAct *action = actions_parse(i, doc, m);
88             if (action) o->thenacts = g_slist_prepend(o->thenacts, action);
89             m = parse_find_node("action", m->next);
90         }
91     }
92     if ((n = parse_find_node("else", node))) {
93         xmlNodePtr m;
94
95         m = parse_find_node("action", n->xmlChildrenNode);
96         while (m) {
97             ObActionsAct *action = actions_parse(i, doc, m);
98             if (action) o->elseacts = g_slist_prepend(o->elseacts, action);
99             m = parse_find_node("action", m->next);
100         }
101     }
102
103     return o;
104 }
105
106 static void free_func(gpointer options)
107 {
108     Options *o = options;
109
110     g_free(o);
111 }
112
113 /* Always return FALSE because its not interactive */
114 static gboolean run_func(ObActionsData *data, gpointer options)
115 {
116     Options *o = options;
117     GSList *acts;
118     ObClient *c = data->client;
119
120     if ((!o->shaded_on || (c && c->shaded)) &&
121         (!o->shaded_off || (c && !c->shaded)) &&
122         (!o->iconic_on || (c && c->iconic)) &&
123         (!o->iconic_off || (c && !c->iconic)) &&
124         (!o->maxhorz_on || (c && c->max_horz)) &&
125         (!o->maxhorz_off || (c && !c->max_horz)) &&
126         (!o->maxvert_on || (c && c->max_vert)) &&
127         (!o->maxvert_off || (c && !c->max_vert)) &&
128         (!o->maxfull_on || (c && c->max_vert && c->max_horz)) &&
129         (!o->maxfull_off || (c && !(c->max_vert && c->max_horz))) &&
130         (!o->focused || (c && !(c == focus_client))) &&
131         (!o->unfocused || (c && !(c != focus_client))))
132     {
133         acts = o->thenacts;
134     }
135     else
136         acts = o->elseacts;
137
138     actions_run_acts(acts, data->uact, data->state,
139                      data->x, data->y, data->button,
140                      data->context, data->client);
141
142     return FALSE;
143 }