]> Dogcows Code - chaz/openbox/blob - plugins/mouse/mouserc_parse.l
properly restrict bindings for motion events
[chaz/openbox] / plugins / mouse / mouserc_parse.l
1 %{
2 #include "mouse.h"
3 #include <glib.h>
4 #ifdef HAVE_STDIO_H
5 # include <stdio.h>
6 #endif
7
8 static int lineno;
9 static char *path;
10 static gboolean error;
11
12 static char *context;
13 static char *event;
14 static char *button;
15 static char *action;
16
17 static void endofline();
18 static int mparsewrap();
19 static void gotfield();
20 static void addbinding();
21 %}
22
23 field [A-Za-z0-9][-A-Za-z0-9]*
24 white [ \t]*
25
26 %%
27
28 ^{white}#.*\n lineno++;
29 {field} gotfield();
30 \n endofline();
31 [ \t]
32 . error = TRUE;
33
34 %%
35
36 static void gotfield()
37 {
38 if (context == NULL)
39 context = g_strdup(mparsetext);
40 else if (event == NULL)
41 event = g_strdup(mparsetext);
42 else if (button == NULL)
43 button = g_strdup(mparsetext);
44 else if (action == NULL)
45 action = g_strdup(mparsetext);
46 else
47 error = TRUE;
48 }
49
50 static void endofline()
51 {
52 if (!error && context && event && button && action)
53 addbinding();
54 else if (error || context || event || button || action)
55 g_warning("Parser error in '%s' on line %d", path, lineno);
56
57 error = FALSE;
58 g_free(context); g_free(event); g_free(button); g_free(action);
59 context = event = button = action = NULL;
60
61 ++lineno;
62 }
63
64 static void addbinding()
65 {
66 Action *a = NULL;
67 MouseAction mact;
68
69 if (!g_ascii_strcasecmp(event, "press"))
70 mact = MouseAction_Press;
71 else if (!g_ascii_strcasecmp(event, "release"))
72 mact = MouseAction_Release;
73 else if (!g_ascii_strcasecmp(event, "click"))
74 mact = MouseAction_Click;
75 else if (!g_ascii_strcasecmp(event, "doubleclick"))
76 mact = MouseAction_DClick;
77 else if (!g_ascii_strcasecmp(event, "drag"))
78 mact = MouseAction_Motion;
79 else {
80 g_warning("Invalid event '%s' in '%s' on line %d", event, path,
81 lineno);
82 return;
83 }
84
85 if (mact == MouseAction_Motion) {
86 if (!g_ascii_strcasecmp(action, "move") &&
87 mact == MouseAction_Motion) {
88 a = action_new(action_move);
89 } else if (!g_ascii_strcasecmp(action, "resize") &&
90 mact == MouseAction_Motion) {
91 a = action_new(action_resize);
92 }
93 } else {
94 if (!g_ascii_strcasecmp(action, "focus")) {
95 a = action_new(action_focus);
96 } else if (!g_ascii_strcasecmp(action, "unfocus")) {
97 a = action_new(action_unfocus);
98 } else if (!g_ascii_strcasecmp(action, "iconify")) {
99 a = action_new(action_iconify);
100 } else if (!g_ascii_strcasecmp(action, "raise")) {
101 a = action_new(action_raise);
102 } else if (!g_ascii_strcasecmp(action, "lower")) {
103 a = action_new(action_lower);
104 } else if (!g_ascii_strcasecmp(action, "focusraise")) {
105 a = action_new(action_focusraise);
106 } else if (!g_ascii_strcasecmp(action, "close")) {
107 a = action_new(action_close);
108 } else if (!g_ascii_strcasecmp(action, "kill")) {
109 a = action_new(action_kill);
110 } else if (!g_ascii_strcasecmp(action, "shade")) {
111 a = action_new(action_shade);
112 } else if (!g_ascii_strcasecmp(action, "unshade")) {
113 a = action_new(action_unshade);
114 } else if (!g_ascii_strcasecmp(action, "toggleshade")) {
115 a = action_new(action_toggle_shade);
116 } else if (!g_ascii_strcasecmp(action, "toggleomnipresent")) {
117 a = action_new(action_toggle_omnipresent);
118 } else if (!g_ascii_strcasecmp(action, "maximizefull")) {
119 a = action_new(action_maximize_full);
120 } else if (!g_ascii_strcasecmp(action, "unmaximizefull")) {
121 a = action_new(action_unmaximize_full);
122 } else if (!g_ascii_strcasecmp(action, "togglemaximizefull")) {
123 a = action_new(action_toggle_maximize_full);
124 } else if (!g_ascii_strcasecmp(action, "maximizehorz")) {
125 a = action_new(action_maximize_horz);
126 } else if (!g_ascii_strcasecmp(action, "unmaximizehorz")) {
127 a = action_new(action_unmaximize_horz);
128 } else if (!g_ascii_strcasecmp(action, "togglemaximizehorz")) {
129 a = action_new(action_toggle_maximize_horz);
130 } else if (!g_ascii_strcasecmp(action, "maximizevert")) {
131 a = action_new(action_maximize_vert);
132 } else if (!g_ascii_strcasecmp(action, "unmaximizevert")) {
133 a = action_new(action_unmaximize_vert);
134 } else if (!g_ascii_strcasecmp(action, "togglemaximizevert")) {
135 a = action_new(action_toggle_maximize_vert);
136 } else if (!g_ascii_strcasecmp(action, "sendtonextdesktop")) {
137 a = action_new(action_send_to_next_desktop);
138 a->data.sendtonextprev.wrap = FALSE;
139 a->data.sendtonextprev.follow = TRUE;
140 } else if (!g_ascii_strcasecmp(action, "sendtonextdesktopwrap")) {
141 a = action_new(action_send_to_next_desktop);
142 a->data.sendtonextprev.wrap = TRUE;
143 a->data.sendtonextprev.follow = TRUE;
144 } else if (!g_ascii_strcasecmp(action, "sendtopreviousdesktop")) {
145 a = action_new(action_send_to_previous_desktop);
146 a->data.sendtonextprev.wrap = FALSE;
147 a->data.sendtonextprev.follow = TRUE;
148 } else if (!g_ascii_strcasecmp(action, "sendtopreviousdesktopwrap")) {
149 a = action_new(action_send_to_previous_desktop);
150 a->data.sendtonextprev.wrap = TRUE;
151 a->data.sendtonextprev.follow = TRUE;
152 } else if (!g_ascii_strcasecmp(action, "nextdesktop")) {
153 a = action_new(action_next_desktop);
154 a->data.nextprevdesktop.wrap = FALSE;
155 } else if (!g_ascii_strcasecmp(action, "nextdesktopwrap")) {
156 a = action_new(action_next_desktop);
157 a->data.nextprevdesktop.wrap = TRUE;
158 } else if (!g_ascii_strcasecmp(action, "previousdesktop")) {
159 a = action_new(action_previous_desktop);
160 a->data.nextprevdesktop.wrap = FALSE;
161 } else if (!g_ascii_strcasecmp(action, "previousdesktopwrap")) {
162 a = action_new(action_previous_desktop);
163 a->data.nextprevdesktop.wrap = TRUE;
164 } else if (!g_ascii_strcasecmp(action, "nextdesktopcolumn")) {
165 a = action_new(action_next_desktop_column);
166 a->data.nextprevdesktop.wrap = FALSE;
167 } else if (!g_ascii_strcasecmp(action, "nextdesktopcolumnwrap")) {
168 a = action_new(action_next_desktop_column);
169 a->data.nextprevdesktop.wrap = TRUE;
170 } else if (!g_ascii_strcasecmp(action, "previousdesktopcolumn")) {
171 a = action_new(action_previous_desktop_column);
172 a->data.nextprevdesktop.wrap = FALSE;
173 } else if (!g_ascii_strcasecmp(action, "previousdesktopcolumnwrap")) {
174 a = action_new(action_previous_desktop_column);
175 a->data.nextprevdesktop.wrap = TRUE;
176 } else if (!g_ascii_strcasecmp(action, "nextdesktoprow")) {
177 a = action_new(action_next_desktop_row);
178 a->data.nextprevdesktop.wrap = FALSE;
179 } else if (!g_ascii_strcasecmp(action, "nextdesktoprowwrap")) {
180 a = action_new(action_next_desktop_row);
181 a->data.nextprevdesktop.wrap = TRUE;
182 } else if (!g_ascii_strcasecmp(action, "previousdesktoprow")) {
183 a = action_new(action_previous_desktop_row);
184 a->data.nextprevdesktop.wrap = FALSE;
185 } else if (!g_ascii_strcasecmp(action, "previousdesktoprowwrap")) {
186 a = action_new(action_previous_desktop_row);
187 a->data.nextprevdesktop.wrap = TRUE;
188 }
189 }
190 if (a == NULL) {
191 g_warning("Invalid action '%s' in '%s' on line %d", action, path,
192 lineno);
193 return;
194 }
195
196 if (!mbind(button, context, mact, a)) {
197 action_free(a);
198 g_warning("Unable to add binding '%s %s %s %s'",
199 context, event, button, action);
200 }
201 }
202
203
204 static int mparsewrap()
205 {
206 g_free(context); g_free(event); g_free(button); g_free(action);
207 return 1;
208 }
209
210 void mouserc_parse()
211 {
212 path = g_build_filename(g_get_home_dir(), ".openbox", "mouserc", NULL);
213 if ((mparsein = fopen(path, "r")) == NULL) {
214 g_free(path);
215 path = g_build_filename(RCDIR, "mouserc", NULL);
216 if ((mparsein = fopen(path, "r")) == NULL) {
217 g_warning("No mouserc file found!");
218 g_free(path);
219 return;
220 }
221 }
222
223 lineno = 1;
224 error = FALSE;
225 context = event = button = action = NULL;
226
227 mparselex();
228
229 g_free(path);
230 }
This page took 0.055405 seconds and 5 git commands to generate.