]> Dogcows Code - chaz/openbox/blob - openbox/actions/if.c
add focused check to 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 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 }
This page took 0.045573 seconds and 5 git commands to generate.