]> git.lizzy.rs Git - bspwm.git/blob - messages.c
Don't need to apply layout after "close"
[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
14 void process_message(char *msg, char *rsp)
15 {
16     char *cmd = strtok(msg, TOKEN_SEP);
17
18     if (cmd == NULL)
19         return;
20
21     if (strcmp(cmd, "get") == 0) {
22         char *name = strtok(NULL, TOKEN_SEP);
23         get_setting(name, rsp);
24         return;
25     } else if (strcmp(cmd, "set") == 0) {
26         char *name = strtok(NULL, TOKEN_SEP);
27         char *value = strtok(NULL, TOKEN_SEP);
28         set_setting(name, value, rsp);
29         return;
30     } else if (strcmp(cmd, "dump") == 0) {
31         dump_tree(desk, desk->root, rsp, 0);
32         return;
33     } else if (strcmp(cmd, "list") == 0) {
34         list_desktops(rsp);
35         return;
36     } else if (strcmp(cmd, "windows") == 0) {
37         list_windows(rsp);
38         return;
39     } else if (strcmp(cmd, "close") == 0) {
40         window_close(desk->focus);
41         return;
42     } else if (strcmp(cmd, "kill") == 0) {
43         window_kill(desk, desk->focus);
44     } else if (strcmp(cmd, "magnetise") == 0) {
45         char *cor = strtok(NULL, TOKEN_SEP);
46         if (cor != NULL) {
47             corner_t c;
48             if (parse_corner(cor, &c)) {
49                 magnetise_tree(desk->root, c);
50             }
51         }
52     } else if (strcmp(cmd, "rotate") == 0) {
53         char *deg = strtok(NULL, TOKEN_SEP);
54         if (deg != NULL) {
55             rotate_t r;
56             if (parse_rotate(deg, &r)) {
57                 rotate_tree(desk->root, r);
58             }
59         }
60     } else if (strcmp(cmd, "layout") == 0) {
61         char *lyt = strtok(NULL, TOKEN_SEP);
62         if (lyt != NULL) {
63             layout_t l;
64             if (parse_layout(lyt, &l)) {
65                 desk->layout = l;
66             }
67         }
68     } else if (strcmp(cmd, "shift") == 0) {
69         char *dir = strtok(NULL, TOKEN_SEP);
70         if (dir != NULL) {
71             direction_t d;
72             if (parse_direction(dir, &d)) {
73                 swap_nodes(desk->focus, find_neighbor(desk->focus, d));
74             }
75         }
76     } else if (strcmp(cmd, "toggle_fullscreen") == 0) {
77         if (desk->focus != NULL)
78             toggle_fullscreen(desk->focus->client);
79     } else if (strcmp(cmd, "toggle_floating") == 0) {
80         split_mode = MODE_AUTOMATIC;
81         toggle_floating(desk->focus);
82     } else if (strcmp(cmd, "toggle_locked") == 0) {
83         if (desk->focus != NULL)
84             toggle_locked(desk->focus->client);
85     } else if (strcmp(cmd, "ratio") == 0) {
86         char *value = strtok(NULL, TOKEN_SEP);
87         if (value != NULL && desk->focus != NULL)
88             sscanf(value, "%lf", &desk->focus->split_ratio);
89     } else if (strcmp(cmd, "cancel") == 0) {
90         split_mode = MODE_AUTOMATIC;
91         window_draw_border(desk->focus, true);
92         return;
93     } else if (strcmp(cmd, "presel") == 0) {
94         if (desk->focus == NULL || !is_tiled(desk->focus->client) || desk->layout != LAYOUT_TILED)
95             return;
96         char *dir = strtok(NULL, TOKEN_SEP);
97         if (dir != NULL) {
98             direction_t d;
99             if (parse_direction(dir, &d)) {
100                 split_mode = MODE_MANUAL;
101                 split_dir = d;
102                 window_draw_border(desk->focus, true);
103             }
104         }
105         return;
106     } else if (strcmp(cmd, "push") == 0 || strcmp(cmd, "pull") == 0) {
107         char *dir = strtok(NULL, TOKEN_SEP);
108         if (dir != NULL) {
109             fence_move_t m;
110             direction_t d;
111             if (parse_fence_move(cmd, &m) && parse_direction(dir, &d)) {
112                 move_fence(desk->focus, d, m);
113             }
114         }
115     } else if (strcmp(cmd, "send_to") == 0) {
116         char *name = strtok(NULL, TOKEN_SEP);
117         if (name != NULL) {
118             desktop_t *d = find_desktop(name);
119             transfer_node(desk, d, desk->focus);
120         }
121     } else if (strcmp(cmd, "rename") == 0) {
122         char *cur_name = strtok(NULL, TOKEN_SEP);
123         if (cur_name != NULL) {
124             desktop_t *d = find_desktop(cur_name);
125             if (d != NULL) {
126                 char *new_name = strtok(NULL, TOKEN_SEP);
127                 if (new_name != NULL) {
128                     strncpy(d->name, new_name, sizeof(d->name));
129                     ewmh_update_desktop_names();
130                 }
131             }
132         }
133     } else if (strcmp(cmd, "use") == 0) {
134         char *name = strtok(NULL, TOKEN_SEP);
135         if (name != NULL) {
136             desktop_t *d = find_desktop(name);
137             select_desktop(d);
138         }
139     } else if (strcmp(cmd, "cycle_desktop") == 0) {
140         char *dir = strtok(NULL, TOKEN_SEP);
141         if (dir != NULL) {
142             cycle_dir_t d;
143             if (parse_cycle_direction(dir, &d)) {
144                 cycle_desktop(d);
145             }
146         }
147     } else if (strcmp(cmd, "cycle") == 0) {
148         if (desk->focus != NULL && desk->focus->client->fullscreen)
149             return;
150         char *dir = strtok(NULL, TOKEN_SEP);
151         if (dir != NULL) {
152             cycle_dir_t d;
153             if (parse_cycle_direction(dir, &d)) {
154                 skip_client_t k;
155                 char *skip = strtok(NULL, TOKEN_SEP);
156                 if (parse_skip_client(skip, &k))
157                     cycle_leaf(desk, desk->focus, d, k);
158             }
159         }
160         return;
161     } else if (strcmp(cmd, "rule") == 0) {
162         char *name = strtok(NULL, TOKEN_SEP);
163         if (name != NULL) {
164             rule_t *rule = make_rule();
165             strncpy(rule->cause.name, name, sizeof(rule->cause.name));
166             char *arg = strtok(NULL, TOKEN_SEP);
167             while (arg != NULL) {
168                 if (strcmp(arg, "floating") == 0)
169                     rule->effect.floating = true;
170                 arg = strtok(NULL, TOKEN_SEP);
171             }
172             rule->next = rule_head;
173             rule_head = rule;
174         }
175         return;
176     } else if (strcmp(cmd, "alternate") == 0) {
177         select_desktop(last_desk);
178     } else if (strcmp(cmd, "add") == 0) {
179         char *name = strtok(NULL, TOKEN_SEP);
180         if (name != NULL) {
181             add_desktop(name);
182         }
183         return;
184     } else if (strcmp(cmd, "focus") == 0) {
185         if (desk->focus != NULL && desk->focus->client->fullscreen)
186             return;
187         char *dir = strtok(NULL, TOKEN_SEP);
188         if (dir != NULL) {
189             direction_t d;
190             if (parse_direction(dir, &d)) {
191                 node_t *n = find_neighbor(desk->focus, d);
192                 focus_node(desk, n, true);
193             }
194         }
195         return;
196     } else if (strcmp(cmd, "reload") == 0) {
197         load_settings();
198         run_autostart();
199     } else if (strcmp(cmd, "reload_autostart") == 0) {
200         run_autostart();
201     } else if (strcmp(cmd, "reload_settings") == 0) {
202         load_settings();
203     } else if (strcmp(cmd, "quit") == 0) {
204         quit();
205         return;
206     } else {
207         snprintf(rsp, BUFSIZ, "unknown command: %s", cmd);
208         return;
209     }
210
211     apply_layout(desk, desk->root, root_rect);
212 }
213
214 void set_setting(char *name, char *value, char *rsp)
215 {
216     if (name == NULL || value == NULL)
217         return;
218
219     if (strcmp(name, "inner_border_width") == 0) {
220         sscanf(value, "%u", &inner_border_width);
221         border_width = inner_border_width + main_border_width + outer_border_width;
222     } else if (strcmp(name, "main_border_width") == 0) {
223         sscanf(value, "%u", &main_border_width);
224         border_width = inner_border_width + main_border_width + outer_border_width;
225     } else if (strcmp(name, "outer_border_width") == 0) {
226         sscanf(value, "%u", &outer_border_width);
227         border_width = inner_border_width + main_border_width + outer_border_width;
228     } else if (strcmp(name, "window_gap") == 0) {
229         sscanf(value, "%i", &window_gap);
230         update_root_dimensions();
231     } else if (strcmp(name, "left_padding") == 0) {
232         sscanf(value, "%i", &left_padding);
233         update_root_dimensions();
234     } else if (strcmp(name, "right_padding") == 0) {
235         sscanf(value, "%i", &right_padding);
236         update_root_dimensions();
237     } else if (strcmp(name, "top_padding") == 0) {
238         sscanf(value, "%i", &top_padding);
239         update_root_dimensions();
240     } else if (strcmp(name, "bottom_padding") == 0) {
241         sscanf(value, "%i", &bottom_padding);
242         update_root_dimensions();
243     } else if (strcmp(name, "active_border_color") == 0) {
244         strncpy(active_border_color, value, sizeof(active_border_color));
245         active_border_color_pxl = get_color(active_border_color);
246     } else if (strcmp(name, "normal_border_color") == 0) {
247         strncpy(normal_border_color, value, sizeof(normal_border_color));
248         normal_border_color_pxl = get_color(normal_border_color);
249     } else if (strcmp(name, "inner_border_color") == 0) {
250         strncpy(inner_border_color, value, sizeof(inner_border_color));
251         inner_border_color_pxl = get_color(inner_border_color);
252     } else if (strcmp(name, "outer_border_color") == 0) {
253         strncpy(outer_border_color, value, sizeof(outer_border_color));
254         outer_border_color_pxl = get_color(outer_border_color);
255     } else if (strcmp(name, "presel_border_color") == 0) {
256         strncpy(presel_border_color, value, sizeof(presel_border_color));
257         presel_border_color_pxl = get_color(presel_border_color);
258     } else if (strcmp(name, "active_locked_border_color") == 0) {
259         strncpy(active_locked_border_color, value, sizeof(active_locked_border_color));
260         active_locked_border_color_pxl = get_color(active_locked_border_color);
261     } else if (strcmp(name, "normal_locked_border_color") == 0) {
262         strncpy(normal_locked_border_color, value, sizeof(normal_locked_border_color));
263         normal_locked_border_color_pxl = get_color(normal_locked_border_color);
264     } else if (strcmp(name, "urgent_border_color") == 0) {
265         strncpy(urgent_border_color, value, sizeof(urgent_border_color));
266         urgent_border_color_pxl = get_color(urgent_border_color);
267     } else if (strcmp(name, "borderless_monocle") == 0) {
268         bool b;
269         if (parse_bool(value, &b))
270             borderless_monocle = b;
271     } else if (strcmp(name, "wm_name") == 0) {
272         strncpy(wm_name, value, sizeof(wm_name));
273         ewmh_update_wm_name();
274         return;
275     } else {
276         snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
277         return;
278     }
279
280     apply_layout(desk, desk->root, root_rect);
281 }
282
283 void get_setting(char *name, char* rsp)
284 {
285     if (name == NULL)
286         return;
287
288     if (strcmp(name, "inner_border_width") == 0)
289         snprintf(rsp, BUFSIZ, "%u", inner_border_width);
290     else if (strcmp(name, "main_border_width") == 0)
291         snprintf(rsp, BUFSIZ, "%u", main_border_width);
292     else if (strcmp(name, "outer_border_width") == 0)
293         snprintf(rsp, BUFSIZ, "%u", outer_border_width);
294     else if (strcmp(name, "border_width") == 0)
295         snprintf(rsp, BUFSIZ, "%u", border_width);
296     else if (strcmp(name, "window_gap") == 0)
297         snprintf(rsp, BUFSIZ, "%i", window_gap);
298     else if (strcmp(name, "left_padding") == 0)
299         snprintf(rsp, BUFSIZ, "%i", left_padding);
300     else if (strcmp(name, "right_padding") == 0)
301         snprintf(rsp, BUFSIZ, "%i", right_padding);
302     else if (strcmp(name, "top_padding") == 0)
303         snprintf(rsp, BUFSIZ, "%i", top_padding);
304     else if (strcmp(name, "bottom_padding") == 0)
305         snprintf(rsp, BUFSIZ, "%i", bottom_padding);
306     else if (strcmp(name, "active_border_color") == 0)
307         snprintf(rsp, BUFSIZ, "%s (%06X)", active_border_color, active_border_color_pxl);
308     else if (strcmp(name, "normal_border_color") == 0)
309         snprintf(rsp, BUFSIZ, "%s (%06X)", normal_border_color, normal_border_color_pxl);
310     else if (strcmp(name, "inner_border_color") == 0)
311         snprintf(rsp, BUFSIZ, "%s (%06X)", inner_border_color, inner_border_color_pxl);
312     else if (strcmp(name, "outer_border_color") == 0)
313         snprintf(rsp, BUFSIZ, "%s (%06X)", outer_border_color, outer_border_color_pxl);
314     else if (strcmp(name, "presel_border_color") == 0)
315         snprintf(rsp, BUFSIZ, "%s (%06X)", presel_border_color, presel_border_color_pxl);
316     else if (strcmp(name, "active_locked_border_color") == 0)
317         snprintf(rsp, BUFSIZ, "%s (%06X)", active_locked_border_color, active_locked_border_color_pxl);
318     else if (strcmp(name, "normal_locked_border_color") == 0)
319         snprintf(rsp, BUFSIZ, "%s (%06X)", normal_locked_border_color, normal_locked_border_color_pxl);
320     else if (strcmp(name, "urgent_border_color") == 0)
321         snprintf(rsp, BUFSIZ, "%s (%06X)", urgent_border_color, urgent_border_color_pxl);
322     else if (strcmp(name, "borderless_monocle") == 0)
323         snprintf(rsp, BUFSIZ, "%s", BOOLSTR(borderless_monocle));
324     else if (strcmp(name, "wm_name") == 0)
325         snprintf(rsp, BUFSIZ, "%s", wm_name);
326     else
327         snprintf(rsp, BUFSIZ, "unknown setting: %s", name);
328 }
329
330
331 bool parse_bool(char *value, bool *b)
332 {
333     if (strcmp(value, "true") == 0) {
334         *b = true;
335         return true;
336     } else if (strcmp(value, "false") == 0) {
337         *b = false;
338         return true;
339     }
340     return false;
341 }
342
343 bool parse_layout(char *s, layout_t *l)
344 {
345     if (strcmp(s, "monocle") == 0) {
346         *l = LAYOUT_MONOCLE;
347         return true;
348     } else if (strcmp(s, "tiled") == 0) {
349         *l = LAYOUT_TILED;
350         return true;
351     }
352     return false;
353 }
354
355 bool parse_direction(char *s, direction_t *d)
356 {
357     if (strcmp(s, "up") == 0) {
358         *d = DIR_UP;
359         return true;
360     } else if (strcmp(s, "down") == 0) {
361         *d = DIR_DOWN;
362         return true;
363     } else if (strcmp(s, "left") == 0) {
364         *d = DIR_LEFT;
365         return true;
366     } else if (strcmp(s, "right") == 0) {
367         *d = DIR_RIGHT;
368         return true;
369     }
370     return false;
371 }
372
373 bool parse_cycle_direction(char *s, cycle_dir_t *d)
374 {
375     if (strcmp(s, "prev") == 0) {
376         *d = CYCLE_PREV;
377         return true;
378     } else if (strcmp(s, "next") == 0) {
379         *d = CYCLE_NEXT;
380         return true;
381     }
382     return false;
383 }
384
385 bool parse_skip_client(char *s, skip_client_t *k)
386 {
387     if (s == NULL || strcmp(s, "--skip-none") == 0) {
388         *k = SKIP_NONE;
389         return true;
390     } else if (strcmp(s, "--skip-floating") == 0) {
391         *k = SKIP_FLOATING;
392         return true;
393     } else if (strcmp(s, "--skip-tiled") == 0) {
394         *k = SKIP_TILED;
395         return true;
396     } else if (strcmp(s, "--skip-class-equal") == 0) {
397         *k = SKIP_CLASS_EQUAL;
398         return true;
399     } else if (strcmp(s, "--skip-class-differ") == 0) {
400         *k = SKIP_CLASS_DIFFER;
401         return true;
402     }
403     return false;
404 }
405
406 bool parse_corner(char *s, corner_t *c)
407 {
408     if (strcmp(s, "top_left") == 0) {
409         *c = TOP_LEFT;
410         return true;
411     } else if (strcmp(s, "top_right") == 0) {
412         *c = TOP_RIGHT;
413         return true;
414     } else if (strcmp(s, "bottom_left") == 0) {
415         *c = BOTTOM_LEFT;
416         return true;
417     } else if (strcmp(s, "bottom_right") == 0) {
418         *c = BOTTOM_RIGHT;
419         return true;
420     }
421     return false;
422 }
423
424 bool parse_rotate(char *s, rotate_t *r)
425 {
426     if (strcmp(s, "clockwise") == 0) {
427         *r = ROTATE_CLOCKWISE;
428         return true;
429     } else if (strcmp(s, "counter_clockwise") == 0) {
430         *r = ROTATE_COUNTER_CLOCKWISE;
431         return true;
432     } else if (strcmp(s, "full_cycle") == 0) {
433         *r = ROTATE_FULL_CYCLE;
434         return true;
435     }
436     return false;
437 }
438
439 bool parse_fence_move(char *s, fence_move_t *m)
440 {
441     if (strcmp(s, "push") == 0) {
442         *m = MOVE_PUSH;
443         return true;
444     } else if (strcmp(s, "pull") == 0) {
445         *m = MOVE_PULL;
446         return true;
447     }
448     return false;
449 }
450