]> git.lizzy.rs Git - bspwm.git/blob - messages.c
New message: 'list_rules'
[bspwm.git] / messages.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include "settings.h"
5 #include "messages.h"
6 #include "common.h"
7 #include "types.h"
8 #include "bspwm.h"
9 #include "ewmh.h"
10 #include "helpers.h"
11 #include "window.h"
12 #include "tree.h"
13 #include "rules.h"
14
15 void process_message(char *msg, char *rsp)
16 {
17     char *cmd = strtok(msg, TOK_SEP);
18
19     if (cmd == NULL)
20         return;
21
22     if (strcmp(cmd, "get") == 0) {
23         char *name = strtok(NULL, TOK_SEP);
24         get_setting(name, rsp);
25         return;
26     } else if (strcmp(cmd, "set") == 0) {
27         char *name = strtok(NULL, TOK_SEP);
28         char *value = strtok(NULL, TOK_SEP);
29         set_setting(name, value, rsp);
30         return;
31     } else if (strcmp(cmd, "list") == 0) {
32         char *name = strtok(NULL, TOK_SEP);
33         if (name != NULL) {
34             desktop_location_t loc;
35             if (locate_desktop(name, &loc))
36                 dump_tree(loc.desktop, loc.desktop->root, rsp, 0);
37         } else {
38             dump_tree(mon->desk, mon->desk->root, rsp, 0);
39         }
40         return;
41     } else if (strcmp(cmd, "list_monitors") == 0) {
42         char *arg = strtok(NULL, TOK_SEP);
43         list_option_t opt;
44         if (parse_list_option(arg, &opt))
45             list_monitors(opt, rsp);
46         return;
47     } else if (strcmp(cmd, "list_desktops") == 0) {
48         char *arg = strtok(NULL, TOK_SEP);
49         list_option_t opt;
50         if (parse_list_option(arg, &opt))
51             list_desktops(mon, opt, 0, rsp);
52         return;
53     } else if (strcmp(cmd, "list_windows") == 0) {
54         list_windows(rsp);
55         return;
56     } else if (strcmp(cmd, "list_rules") == 0) {
57         list_rules(rsp);
58         return;
59     } else if (strcmp(cmd, "close") == 0) {
60         window_close(mon->desk->focus);
61         return;
62     } else if (strcmp(cmd, "kill") == 0) {
63         window_kill(mon->desk, mon->desk->focus);
64     } else if (strcmp(cmd, "rotate") == 0) {
65         char *deg = strtok(NULL, TOK_SEP);
66         if (deg != NULL) {
67             rotate_t r;
68             if (parse_rotate(deg, &r)) {
69                 rotate_tree(mon->desk->root, r);
70             }
71         }
72     } else if (strcmp(cmd, "layout") == 0) {
73         char *lyt = strtok(NULL, TOK_SEP);
74         if (lyt != NULL) {
75             layout_t y;
76             if (parse_layout(lyt, &y)) {
77                 char *name = strtok(NULL, TOK_SEP);
78                 if (name == NULL) {
79                     mon->desk->layout = y;
80                 } else {
81                     desktop_location_t loc;
82                     do {
83                         if (locate_desktop(name, &loc))
84                             loc.desktop->layout = y;
85                     } while ((name = strtok(NULL, TOK_SEP)) != NULL);
86                 }
87             }
88         }
89         put_status();
90     } else if (strcmp(cmd, "cycle_layout") == 0) {
91         if (mon->desk->layout == LAYOUT_MONOCLE)
92             mon->desk->layout = LAYOUT_TILED;
93         else
94             mon->desk->layout = LAYOUT_MONOCLE;
95         put_status();
96     } else if (strcmp(cmd, "shift") == 0) {
97         char *dir = strtok(NULL, TOK_SEP);
98         if (dir != NULL) {
99             direction_t d;
100             if (parse_direction(dir, &d)) {
101                 swap_nodes(mon->desk->focus, find_neighbor(mon->desk->focus, d));
102             }
103         }
104     } else if (strcmp(cmd, "toggle_fullscreen") == 0) {
105         if (mon->desk->focus != NULL)
106             toggle_fullscreen(mon, mon->desk->focus->client);
107     } else if (strcmp(cmd, "toggle_floating") == 0) {
108         split_mode = MODE_AUTOMATIC;
109         toggle_floating(mon->desk->focus);
110     } else if (strcmp(cmd, "toggle_locked") == 0) {
111         if (mon->desk->focus != NULL)
112             toggle_locked(mon->desk->focus->client);
113     } else if (strcmp(cmd, "toggle_visibility") == 0) {
114         toggle_visibility();
115     } else if (strcmp(cmd, "pad") == 0) {
116         char *name = strtok(NULL, TOK_SEP);
117         if (name != NULL) {
118             monitor_t *m = find_monitor(name);
119             if (m != NULL) {
120                 char args[BUFSIZ] = {0}, *s;
121                 while ((s = strtok(NULL, TOK_SEP)) != NULL) {
122                     strncat(args, s, REMLEN(args));
123                     strncat(args, TOK_SEP, REMLEN(args));
124                 }
125                 if (strlen(args) > 0) {
126                     sscanf(args, "%i %i %i %i", &m->top_padding, &m->right_padding, &m->bottom_padding, &m->left_padding);
127                     arrange(m, m->desk);
128                 } else {
129                     snprintf(rsp, BUFSIZ, "%i %i %i %i\n", m->top_padding, m->right_padding, m->bottom_padding, m->left_padding);
130                 }
131             }
132         }
133         return;
134     } else if (strcmp(cmd, "ratio") == 0) {
135         char *value = strtok(NULL, TOK_SEP);
136         if (value != NULL && mon->desk->focus != NULL)
137             sscanf(value, "%lf", &mon->desk->focus->split_ratio);
138     } else if (strcmp(cmd, "cancel") == 0) {
139         split_mode = MODE_AUTOMATIC;
140         window_draw_border(mon->desk->focus, true, true);
141         return;
142     } else if (strcmp(cmd, "presel") == 0) {
143         if (mon->desk->focus == NULL || !is_tiled(mon->desk->focus->client) || mon->desk->layout != LAYOUT_TILED)
144             return;
145         char *dir = strtok(NULL, TOK_SEP);
146         if (dir != NULL) {
147             direction_t d;
148             if (parse_direction(dir, &d)) {
149                 split_mode = MODE_MANUAL;
150                 split_dir = d;
151                 char *rat = strtok(NULL, TOK_SEP);
152                 if (rat != NULL)
153                     sscanf(rat, "%lf", &mon->desk->focus->split_ratio);
154                 window_draw_border(mon->desk->focus, true, true);
155             }
156         }
157         return;
158     } else if (strcmp(cmd, "push") == 0 || strcmp(cmd, "pull") == 0) {
159         char *dir = strtok(NULL, TOK_SEP);
160         if (dir != NULL) {
161             fence_move_t m;
162             direction_t d;
163             if (parse_fence_move(cmd, &m) && parse_direction(dir, &d)) {
164                 move_fence(mon->desk->focus, d, m);
165             }
166         }
167     } else if (strcmp(cmd, "send_to_monitor") == 0) {
168         char *name = strtok(NULL, TOK_SEP);
169         if (name != NULL) {
170             monitor_t *m = find_monitor(name);
171             if (m != NULL && m != mon) {
172                 transfer_node(mon, mon->desk, m, m->desk, mon->desk->focus);
173                 arrange(m, m->desk);
174                 char *arg = strtok(NULL, TOK_SEP);
175                 send_option_t opt;
176                 if (parse_send_option(arg, &opt) && opt == SEND_OPTION_FOLLOW)
177                     select_monitor(m);
178             }
179         }
180     } else if (strcmp(cmd, "send_to") == 0) {
181         char *name = strtok(NULL, TOK_SEP);
182         if (name != NULL) {
183             desktop_location_t loc;
184             if (locate_desktop(name, &loc)) {
185                 transfer_node(mon, mon->desk, loc.monitor, loc.desktop, mon->desk->focus);
186                 if (mon != loc.monitor && loc.monitor->desk == loc.desktop)
187                     arrange(loc.monitor, loc.desktop);
188                 char *arg = strtok(NULL, TOK_SEP);
189                 send_option_t opt;
190                 if (parse_send_option(arg, &opt) && opt == SEND_OPTION_FOLLOW) {
191                     select_monitor(loc.monitor);
192                     select_desktop(loc.desktop);
193                 }
194             }
195         }
196     } else if (strcmp(cmd, "rename_monitor") == 0) {
197         char *cur_name = strtok(NULL, TOK_SEP);
198         if (cur_name != NULL) {
199             monitor_t *m = find_monitor(cur_name);
200             if (m != NULL) {
201                 char *new_name = strtok(NULL, TOK_SEP);
202                 if (new_name != NULL) {
203                     strncpy(m->name, new_name, sizeof(m->name));
204                     put_status();
205                 }
206             }
207         }
208     } else if (strcmp(cmd, "rename") == 0) {
209         char *cur_name = strtok(NULL, TOK_SEP);
210         if (cur_name != NULL) {
211             desktop_location_t loc;
212             if (locate_desktop(cur_name, &loc)) {
213                 char *new_name = strtok(NULL, TOK_SEP);
214                 if (new_name != NULL) {
215                     strncpy(loc.desktop->name, new_name, sizeof(loc.desktop->name));
216                     ewmh_update_desktop_names();
217                     put_status();
218                 }
219             }
220         }
221     } else if (strcmp(cmd, "use_monitor") == 0) {
222         char *name = strtok(NULL, TOK_SEP);
223         if (name != NULL) {
224             monitor_t *m = find_monitor(name);
225             if (m != NULL)
226                 select_monitor(m);
227         }
228     } else if (strcmp(cmd, "use") == 0) {
229         char *name = strtok(NULL, TOK_SEP);
230         if (name != NULL) {
231             desktop_location_t loc;
232             if (locate_desktop(name, &loc)) {
233                 select_monitor(loc.monitor);
234                 select_desktop(loc.desktop);
235             }
236         }
237     } else if (strcmp(cmd, "cycle_monitor") == 0) {
238         char *dir = strtok(NULL, TOK_SEP);
239         if (dir != NULL) {
240             cycle_dir_t d;
241             if (parse_cycle_direction(dir, &d))
242                 cycle_monitor(d);
243         }
244     } else if (strcmp(cmd, "cycle_desktop") == 0) {
245         char *dir = strtok(NULL, TOK_SEP);
246         if (dir != NULL) {
247             cycle_dir_t d;
248             if (parse_cycle_direction(dir, &d)) {
249                 skip_desktop_t k;
250                 char *skip = strtok(NULL, TOK_SEP);
251                 if (parse_skip_desktop(skip, &k))
252                     cycle_desktop(mon, mon->desk, d, k);
253             }
254         }
255     } else if (strcmp(cmd, "cycle") == 0) {
256         if (mon->desk->focus != NULL && mon->desk->focus->client->fullscreen)
257             return;
258         char *dir = strtok(NULL, TOK_SEP);
259         if (dir != NULL) {
260             cycle_dir_t d;
261             if (parse_cycle_direction(dir, &d)) {
262                 skip_client_t k;
263                 char *skip = strtok(NULL, TOK_SEP);
264                 if (parse_skip_client(skip, &k))
265                     cycle_leaf(mon, mon->desk, mon->desk->focus, d, k);
266             }
267         }
268         return;
269     } else if (strcmp(cmd, "nearest") == 0) {
270         if (mon->desk->focus != NULL && mon->desk->focus->client->fullscreen)
271             return;
272         char *arg = strtok(NULL, TOK_SEP);
273         if (arg != NULL) {
274             nearest_arg_t a;
275             if (parse_nearest_argument(arg, &a)) {
276                 skip_client_t k;
277                 char *skip = strtok(NULL, TOK_SEP);
278                 if (parse_skip_client(skip, &k))
279                     nearest_leaf(mon, mon->desk, mon->desk->focus, a, k);
280             }
281         }
282         return;
283     } else if (strcmp(cmd, "circulate") == 0) {
284         if (mon->desk->layout == LAYOUT_MONOCLE
285                 || (mon->desk->focus != NULL && !is_tiled(mon->desk->focus->client)))
286             return;
287         char *dir = strtok(NULL, TOK_SEP);
288         if (dir != NULL) {
289             circulate_dir_t d;
290             if (parse_circulate_direction(dir, &d))
291                 circulate_leaves(mon, mon->desk, d);
292         }
293     } else if (strcmp(cmd, "rule") == 0) {
294         char *name = strtok(NULL, TOK_SEP);
295         if (name != NULL) {
296             rule_t *rule = make_rule();
297             strncpy(rule->cause.name, name, sizeof(rule->cause.name));
298             char *arg = strtok(NULL, TOK_SEP);
299             while (arg != NULL) {
300                 if (strcmp(arg, "floating") == 0) {
301                     rule->effect.floating = true;
302                 } else {
303                     desktop_location_t loc;
304                     if (locate_desktop(arg, &loc)) {
305                         rule->effect.monitor = loc.monitor;
306                         rule->effect.desktop = loc.desktop;
307                     }
308                 }
309                 arg = strtok(NULL, TOK_SEP);
310             }
311             add_rule(rule);
312         }
313         return;
314     } else if (strcmp(cmd, "alternate") == 0) {
315         focus_node(mon, mon->desk, mon->desk->last_focus, true);
316         return;
317     } else if (strcmp(cmd, "alternate_desktop") == 0) {
318         select_desktop(mon->last_desk);
319     } else if (strcmp(cmd, "alternate_monitor") == 0) {
320         select_monitor(last_mon);
321     } else if (strcmp(cmd, "add_in") == 0) {
322         char *name = strtok(NULL, TOK_SEP);
323         if (name != NULL) {
324             monitor_t *m = find_monitor(name);
325             if (m != NULL)
326                 for (name = strtok(NULL, TOK_SEP); name != NULL; name = strtok(NULL, TOK_SEP))
327                     add_desktop(m, name);
328         }
329         return;
330     } else if (strcmp(cmd, "add") == 0) {
331         for (char *name = strtok(NULL, TOK_SEP); name != NULL; name = strtok(NULL, TOK_SEP))
332             add_desktop(mon, name);
333         return;
334     } else if (strcmp(cmd, "focus") == 0) {
335         if (mon->desk->focus != NULL && mon->desk->focus->client->fullscreen)
336             return;
337         char *dir = strtok(NULL, TOK_SEP);
338         if (dir != NULL) {
339             direction_t d;
340             if (parse_direction(dir, &d)) {
341                 node_t *n = find_neighbor(mon->desk->focus, d);
342                 focus_node(mon, mon->desk, n, true);
343             }
344         }
345         if (mon->desk->layout == LAYOUT_TILED)
346             return;
347     } else if (strcmp(cmd, "adopt_orphans") == 0) {
348         adopt_orphans();
349     } else if (strcmp(cmd, "reload_autostart") == 0) {
350         run_autostart();
351     } else if (strcmp(cmd, "reload_settings") == 0) {
352         load_settings();
353     } else if (strcmp(cmd, "quit") == 0) {
354         char *arg = strtok(NULL, TOK_SEP);
355         if (arg != NULL)
356             sscanf(arg, "%i", &exit_status);
357         quit();
358         return;
359     } else {
360         snprintf(rsp, BUFSIZ, "unknown command: %s", cmd);
361         return;
362     }
363
364     arrange(mon, mon->desk);
365 }
366
367 void set_setting(char *name, char *value, char *rsp)
368 {
369     if (name == NULL || value == NULL)
370         return;
371
372     if (strcmp(name, "inner_border_width") == 0) {
373         sscanf(value, "%u", &inner_border_width);
374         border_width = inner_border_width + main_border_width + outer_border_width;
375     } else if (strcmp(name, "main_border_width") == 0) {
376         sscanf(value, "%u", &main_border_width);
377         border_width = inner_border_width + main_border_width + outer_border_width;
378     } else if (strcmp(name, "outer_border_width") == 0) {
379         sscanf(value, "%u", &outer_border_width);
380         border_width = inner_border_width + main_border_width + outer_border_width;
381     } else if (strcmp(name, "window_gap") == 0) {
382         sscanf(value, "%i", &window_gap);
383     } else if (strcmp(name, "left_padding") == 0) {
384         sscanf(value, "%i", &mon->left_padding);
385     } else if (strcmp(name, "right_padding") == 0) {
386         sscanf(value, "%i", &mon->right_padding);
387     } else if (strcmp(name, "top_padding") == 0) {
388         sscanf(value, "%i", &mon->top_padding);
389     } else if (strcmp(name, "bottom_padding") == 0) {
390         sscanf(value, "%i", &mon->bottom_padding);
391     } else if (strcmp(name, "focused_border_color") == 0) {
392         strncpy(focused_border_color, value, sizeof(focused_border_color));
393         focused_border_color_pxl = get_color(focused_border_color);
394     } else if (strcmp(name, "active_border_color") == 0) {
395         strncpy(active_border_color, value, sizeof(active_border_color));
396         active_border_color_pxl = get_color(active_border_color);
397     } else if (strcmp(name, "normal_border_color") == 0) {
398         strncpy(normal_border_color, value, sizeof(normal_border_color));
399         normal_border_color_pxl = get_color(normal_border_color);
400     } else if (strcmp(name, "inner_border_color") == 0) {
401         strncpy(inner_border_color, value, sizeof(inner_border_color));
402         inner_border_color_pxl = get_color(inner_border_color);
403     } else if (strcmp(name, "outer_border_color") == 0) {
404         strncpy(outer_border_color, value, sizeof(outer_border_color));
405         outer_border_color_pxl = get_color(outer_border_color);
406     } else if (strcmp(name, "presel_border_color") == 0) {
407         strncpy(presel_border_color, value, sizeof(presel_border_color));
408         presel_border_color_pxl = get_color(presel_border_color);
409     } else if (strcmp(name, "focused_locked_border_color") == 0) {
410         strncpy(focused_locked_border_color, value, sizeof(focused_locked_border_color));
411         focused_locked_border_color_pxl = get_color(focused_locked_border_color);
412     } else if (strcmp(name, "active_locked_border_color") == 0) {
413         strncpy(active_locked_border_color, value, sizeof(active_locked_border_color));
414         active_locked_border_color_pxl = get_color(active_locked_border_color);
415     } else if (strcmp(name, "normal_locked_border_color") == 0) {
416         strncpy(normal_locked_border_color, value, sizeof(normal_locked_border_color));
417         normal_locked_border_color_pxl = get_color(normal_locked_border_color);
418     } else if (strcmp(name, "urgent_border_color") == 0) {
419         strncpy(urgent_border_color, value, sizeof(urgent_border_color));
420         urgent_border_color_pxl = get_color(urgent_border_color);
421     } else if (strcmp(name, "borderless_monocle") == 0) {
422         bool b;
423         if (parse_bool(value, &b))
424             borderless_monocle = b;
425     } else if (strcmp(name, "gapless_monocle") == 0) {
426         bool b;
427         if (parse_bool(value, &b))
428             gapless_monocle = b;
429     } else if (strcmp(name, "focus_follows_mouse") == 0) {
430         bool b;
431         if (parse_bool(value, &b))
432             focus_follows_mouse = b;
433     } else if (strcmp(name, "adaptative_raise") == 0) {
434         bool b;
435         if (parse_bool(value, &b))
436             adaptative_raise = b;
437     } else if (strcmp(name, "wm_name") == 0) {
438         strncpy(wm_name, value, sizeof(wm_name));
439         ewmh_update_wm_name();
440         return;
441     } else if (strcmp(name, "button_modifier") == 0) {
442         unsigned int m;
443         if (parse_modifier_mask(value, &m)) {
444             ungrab_buttons();
445             button_modifier = m;
446             grab_buttons();
447         }
448         return;
449     } else if (strcmp(name, "numlock_modifier") == 0) {
450         unsigned int m;
451         if (parse_modifier_mask(value, &m)) {
452             ungrab_buttons();
453             numlock_modifier = m;
454             grab_buttons();
455         }
456         return;
457     } else if (strcmp(name, "capslock_modifier") == 0) {
458         unsigned int m;
459         if (parse_modifier_mask(value, &m)) {
460             ungrab_buttons();
461             capslock_modifier = m;
462             grab_buttons();
463         }
464         return;
465     } else {
466         snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
467         return;
468     }
469
470     arrange(mon, mon->desk);
471 }
472
473 void get_setting(char *name, char* rsp)
474 {
475     if (name == NULL)
476         return;
477
478     if (strcmp(name, "inner_border_width") == 0)
479         snprintf(rsp, BUFSIZ, "%u", inner_border_width);
480     else if (strcmp(name, "main_border_width") == 0)
481         snprintf(rsp, BUFSIZ, "%u", main_border_width);
482     else if (strcmp(name, "outer_border_width") == 0)
483         snprintf(rsp, BUFSIZ, "%u", outer_border_width);
484     else if (strcmp(name, "border_width") == 0)
485         snprintf(rsp, BUFSIZ, "%u", border_width);
486     else if (strcmp(name, "window_gap") == 0)
487         snprintf(rsp, BUFSIZ, "%i", window_gap);
488     else if (strcmp(name, "left_padding") == 0)
489         snprintf(rsp, BUFSIZ, "%i", mon->left_padding);
490     else if (strcmp(name, "right_padding") == 0)
491         snprintf(rsp, BUFSIZ, "%i", mon->right_padding);
492     else if (strcmp(name, "top_padding") == 0)
493         snprintf(rsp, BUFSIZ, "%i", mon->top_padding);
494     else if (strcmp(name, "bottom_padding") == 0)
495         snprintf(rsp, BUFSIZ, "%i", mon->bottom_padding);
496     else if (strcmp(name, "focused_border_color") == 0)
497         snprintf(rsp, BUFSIZ, "%s (%06X)", focused_border_color, focused_border_color_pxl);
498     else if (strcmp(name, "active_border_color") == 0)
499         snprintf(rsp, BUFSIZ, "%s (%06X)", active_border_color, active_border_color_pxl);
500     else if (strcmp(name, "normal_border_color") == 0)
501         snprintf(rsp, BUFSIZ, "%s (%06X)", normal_border_color, normal_border_color_pxl);
502     else if (strcmp(name, "inner_border_color") == 0)
503         snprintf(rsp, BUFSIZ, "%s (%06X)", inner_border_color, inner_border_color_pxl);
504     else if (strcmp(name, "outer_border_color") == 0)
505         snprintf(rsp, BUFSIZ, "%s (%06X)", outer_border_color, outer_border_color_pxl);
506     else if (strcmp(name, "presel_border_color") == 0)
507         snprintf(rsp, BUFSIZ, "%s (%06X)", presel_border_color, presel_border_color_pxl);
508     else if (strcmp(name, "focused_locked_border_color") == 0)
509         snprintf(rsp, BUFSIZ, "%s (%06X)", focused_locked_border_color, focused_locked_border_color_pxl);
510     else if (strcmp(name, "active_locked_border_color") == 0)
511         snprintf(rsp, BUFSIZ, "%s (%06X)", active_locked_border_color, active_locked_border_color_pxl);
512     else if (strcmp(name, "normal_locked_border_color") == 0)
513         snprintf(rsp, BUFSIZ, "%s (%06X)", normal_locked_border_color, normal_locked_border_color_pxl);
514     else if (strcmp(name, "urgent_border_color") == 0)
515         snprintf(rsp, BUFSIZ, "%s (%06X)", urgent_border_color, urgent_border_color_pxl);
516     else if (strcmp(name, "borderless_monocle") == 0)
517         snprintf(rsp, BUFSIZ, "%s", BOOLSTR(borderless_monocle));
518     else if (strcmp(name, "gapless_monocle") == 0)
519         snprintf(rsp, BUFSIZ, "%s", BOOLSTR(gapless_monocle));
520     else if (strcmp(name, "focus_follows_mouse") == 0)
521         snprintf(rsp, BUFSIZ, "%s", BOOLSTR(focus_follows_mouse));
522     else if (strcmp(name, "adaptative_raise") == 0)
523         snprintf(rsp, BUFSIZ, "%s", BOOLSTR(adaptative_raise));
524     else if (strcmp(name, "wm_name") == 0)
525         snprintf(rsp, BUFSIZ, "%s", wm_name);
526     else if (strcmp(name, "button_modifier") == 0)
527         print_modifier_mask(rsp, button_modifier);
528     else if (strcmp(name, "numlock_modifier") == 0)
529         print_modifier_mask(rsp, numlock_modifier);
530     else if (strcmp(name, "capslock_modifier") == 0)
531         print_modifier_mask(rsp, capslock_modifier);
532     else
533         snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
534 }
535
536 bool parse_bool(char *value, bool *b)
537 {
538     if (strcmp(value, "true") == 0) {
539         *b = true;
540         return true;
541     } else if (strcmp(value, "false") == 0) {
542         *b = false;
543         return true;
544     }
545     return false;
546 }
547
548 bool parse_layout(char *s, layout_t *l)
549 {
550     if (strcmp(s, "monocle") == 0) {
551         *l = LAYOUT_MONOCLE;
552         return true;
553     } else if (strcmp(s, "tiled") == 0) {
554         *l = LAYOUT_TILED;
555         return true;
556     }
557     return false;
558 }
559
560 bool parse_direction(char *s, direction_t *d)
561 {
562     if (strcmp(s, "up") == 0) {
563         *d = DIR_UP;
564         return true;
565     } else if (strcmp(s, "down") == 0) {
566         *d = DIR_DOWN;
567         return true;
568     } else if (strcmp(s, "left") == 0) {
569         *d = DIR_LEFT;
570         return true;
571     } else if (strcmp(s, "right") == 0) {
572         *d = DIR_RIGHT;
573         return true;
574     }
575     return false;
576 }
577
578 bool parse_nearest_argument(char *s, nearest_arg_t *a)
579 {
580     if (strcmp(s, "older") == 0) {
581         *a = NEAREST_OLDER;
582         return true;
583     } else if (strcmp(s, "newer") == 0) {
584         *a = NEAREST_NEWER;
585         return true;
586     }
587     return false;
588 }
589
590 bool parse_cycle_direction(char *s, cycle_dir_t *d)
591 {
592     if (strcmp(s, "prev") == 0) {
593         *d = CYCLE_PREV;
594         return true;
595     } else if (strcmp(s, "next") == 0) {
596         *d = CYCLE_NEXT;
597         return true;
598     }
599     return false;
600 }
601
602 bool parse_circulate_direction(char *s, circulate_dir_t *d)
603 {
604     if (strcmp(s, "forward") == 0) {
605         *d = CIRCULATE_FORWARD;
606         return true;
607     } else if (strcmp(s, "backward") == 0) {
608         *d = CIRCULATE_BACKWARD;
609         return true;
610     }
611     return false;
612 }
613
614 bool parse_skip_client(char *s, skip_client_t *k)
615 {
616     if (s == NULL) {
617         *k = CLIENT_SKIP_NONE;
618         return true;
619     } else if (strcmp(s, "--skip-floating") == 0) {
620         *k = CLIENT_SKIP_FLOATING;
621         return true;
622     } else if (strcmp(s, "--skip-tiled") == 0) {
623         *k = CLIENT_SKIP_TILED;
624         return true;
625     } else if (strcmp(s, "--skip-class-equal") == 0) {
626         *k = CLIENT_SKIP_CLASS_EQUAL;
627         return true;
628     } else if (strcmp(s, "--skip-class-differ") == 0) {
629         *k = CLIENT_SKIP_CLASS_DIFFER;
630         return true;
631     }
632     return false;
633 }
634
635 bool parse_skip_desktop(char *s, skip_desktop_t *k)
636 {
637     if (s == NULL) {
638         *k = DESKTOP_SKIP_NONE;
639         return true;
640     } else if (strcmp(s, "--skip-free") == 0) {
641         *k = DESKTOP_SKIP_FREE;
642         return true;
643     } else if (strcmp(s, "--skip-occupied") == 0) {
644         *k = DESKTOP_SKIP_OCCUPIED;
645         return true;
646     }
647     return false;
648 }
649
650 bool parse_list_option(char *s, list_option_t *o)
651 {
652     if (s == NULL || strcmp(s, "--verbose") == 0) {
653         *o = LIST_OPTION_VERBOSE;
654         return true;
655     } else if (strcmp(s, "--quiet") == 0) {
656         *o = LIST_OPTION_QUIET;
657         return true;
658     }
659     return false;
660 }
661
662 bool parse_send_option(char *s, send_option_t *o)
663 {
664     if (s == NULL) {
665         *o = SEND_OPTION_DONT_FOLLOW;
666         return true;
667     } else if (strcmp(s, "--follow") == 0) {
668         *o = SEND_OPTION_FOLLOW;
669         return true;
670     }
671     return false;
672 }
673
674 bool parse_rotate(char *s, rotate_t *r)
675 {
676     if (strcmp(s, "clockwise") == 0) {
677         *r = ROTATE_CLOCKWISE;
678         return true;
679     } else if (strcmp(s, "counter_clockwise") == 0) {
680         *r = ROTATE_COUNTER_CLOCKWISE;
681         return true;
682     } else if (strcmp(s, "full_cycle") == 0) {
683         *r = ROTATE_FULL_CYCLE;
684         return true;
685     }
686     return false;
687 }
688
689 bool parse_fence_move(char *s, fence_move_t *m)
690 {
691     if (strcmp(s, "push") == 0) {
692         *m = MOVE_PUSH;
693         return true;
694     } else if (strcmp(s, "pull") == 0) {
695         *m = MOVE_PULL;
696         return true;
697     }
698     return false;
699 }
700
701 bool parse_modifier_mask(char *s, unsigned int *m)
702 {
703     if (strcmp(s, "shift") == 0) {
704         *m = XCB_MOD_MASK_SHIFT;
705         return true;
706     } else if (strcmp(s, "control") == 0) {
707         *m = XCB_MOD_MASK_CONTROL;
708         return true;
709     } else if (strcmp(s, "lock") == 0) {
710         *m = XCB_MOD_MASK_LOCK;
711         return true;
712     } else if (strcmp(s, "mod1") == 0) {
713         *m = XCB_MOD_MASK_1;
714         return true;
715     } else if (strcmp(s, "mod2") == 0) {
716         *m = XCB_MOD_MASK_2;
717         return true;
718     } else if (strcmp(s, "mod3") == 0) {
719         *m = XCB_MOD_MASK_3;
720         return true;
721     } else if (strcmp(s, "mod4") == 0) {
722         *m = XCB_MOD_MASK_4;
723         return true;
724     } else if (strcmp(s, "mod5") == 0) {
725         *m = XCB_MOD_MASK_5;
726         return true;
727     }
728     return false;
729 }
730
731 void print_modifier_mask(char *s, unsigned int m)
732 {
733     switch(m) {
734         case XCB_MOD_MASK_SHIFT:
735             snprintf(s, BUFSIZ, "shift");
736             break;
737         case XCB_MOD_MASK_CONTROL:
738             snprintf(s, BUFSIZ, "control");
739             break;
740         case XCB_MOD_MASK_LOCK:
741             snprintf(s, BUFSIZ, "lock");
742             break;
743         case XCB_MOD_MASK_1:
744             snprintf(s, BUFSIZ, "mod1");
745             break;
746         case XCB_MOD_MASK_2:
747             snprintf(s, BUFSIZ, "mod2");
748             break;
749         case XCB_MOD_MASK_3:
750             snprintf(s, BUFSIZ, "mod3");
751             break;
752         case XCB_MOD_MASK_4:
753             snprintf(s, BUFSIZ, "mod4");
754             break;
755         case XCB_MOD_MASK_5:
756             snprintf(s, BUFSIZ, "mod5");
757             break;
758     }
759 }