diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-12-18 18:13:40 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-12-18 18:13:40 -0500 |
commit | 6555aad7f9234547681aeffd3fa67182cee4c193 (patch) | |
tree | 683793bfcd1cd3a5a53fa27883abde31d71ac09c /sway | |
parent | Merge pull request #357 from sce/fix_swaybar_crashes (diff) | |
parent | Terminate children when freeing output container (diff) | |
download | sway-6555aad7f9234547681aeffd3fa67182cee4c193.tar.gz sway-6555aad7f9234547681aeffd3fa67182cee4c193.tar.zst sway-6555aad7f9234547681aeffd3fa67182cee4c193.zip |
Merge pull request #358 from mikkeloscar/reload-swaybg-swaybar
Reload swaybar/swaybg on config reload.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/commands.c | 9 | ||||
-rw-r--r-- | sway/config.c | 151 | ||||
-rw-r--r-- | sway/container.c | 9 |
3 files changed, 125 insertions, 44 deletions
diff --git a/sway/commands.c b/sway/commands.c index 24d56052..13bc7dc2 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -1094,6 +1094,15 @@ static struct cmd_results *cmd_reload(int argc, char **argv) { | |||
1094 | } | 1094 | } |
1095 | if (!load_config(NULL)) return cmd_results_new(CMD_FAILURE, "reload", "Error(s) reloading config."); | 1095 | if (!load_config(NULL)) return cmd_results_new(CMD_FAILURE, "reload", "Error(s) reloading config."); |
1096 | 1096 | ||
1097 | int i; | ||
1098 | swayc_t *cont = NULL; | ||
1099 | for (i = 0; i < root_container.children->length; ++i) { | ||
1100 | cont = root_container.children->items[i]; | ||
1101 | if (cont->type == C_OUTPUT) { | ||
1102 | load_swaybars(cont, i); | ||
1103 | } | ||
1104 | } | ||
1105 | |||
1097 | arrange_windows(&root_container, -1, -1); | 1106 | arrange_windows(&root_container, -1, -1); |
1098 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 1107 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
1099 | } | 1108 | } |
diff --git a/sway/config.c b/sway/config.c index 970225f4..928d35a8 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -3,6 +3,9 @@ | |||
3 | #include <stdlib.h> | 3 | #include <stdlib.h> |
4 | #include <unistd.h> | 4 | #include <unistd.h> |
5 | #include <wordexp.h> | 5 | #include <wordexp.h> |
6 | #include <sys/types.h> | ||
7 | #include <sys/wait.h> | ||
8 | #include <signal.h> | ||
6 | #include "wayland-desktop-shell-server-protocol.h" | 9 | #include "wayland-desktop-shell-server-protocol.h" |
7 | #include "readline.h" | 10 | #include "readline.h" |
8 | #include "stringop.h" | 11 | #include "stringop.h" |
@@ -360,6 +363,101 @@ void merge_output_config(struct output_config *dst, struct output_config *src) { | |||
360 | } | 363 | } |
361 | } | 364 | } |
362 | 365 | ||
366 | static void invoke_swaybar(swayc_t *output, struct bar_config *bar, int output_i) { | ||
367 | sway_log(L_DEBUG, "Invoking swaybar for output %s[%d] and bar %s", output->name, output_i, bar->id); | ||
368 | |||
369 | size_t bufsize = 4; | ||
370 | char output_id[bufsize]; | ||
371 | snprintf(output_id, bufsize, "%d", output_i); | ||
372 | output_id[bufsize-1] = 0; | ||
373 | |||
374 | char *const cmd[] = { | ||
375 | "swaybar", | ||
376 | "-b", | ||
377 | bar->id, | ||
378 | output_id, | ||
379 | NULL, | ||
380 | }; | ||
381 | |||
382 | pid_t *pid = malloc(sizeof(pid_t)); | ||
383 | *pid = fork(); | ||
384 | if (*pid == 0) { | ||
385 | execvp(cmd[0], cmd); | ||
386 | } | ||
387 | |||
388 | // add swaybar pid to output | ||
389 | list_add(output->bar_pids, pid); | ||
390 | } | ||
391 | |||
392 | void terminate_swaybars(list_t *pids) { | ||
393 | int i, ret; | ||
394 | pid_t *pid; | ||
395 | for (i = 0; i < pids->length; ++i) { | ||
396 | pid = pids->items[i]; | ||
397 | ret = kill(*pid, SIGTERM); | ||
398 | if (ret != 0) { | ||
399 | sway_log(L_ERROR, "Unable to terminate swaybar [pid: %d]", *pid); | ||
400 | } else { | ||
401 | int status; | ||
402 | waitpid(*pid, &status, 0); | ||
403 | } | ||
404 | } | ||
405 | |||
406 | // empty pids list | ||
407 | for (i = 0; i < pids->length; ++i) { | ||
408 | pid = pids->items[i]; | ||
409 | list_del(pids, i); | ||
410 | free(pid); | ||
411 | } | ||
412 | } | ||
413 | |||
414 | void terminate_swaybg(pid_t pid) { | ||
415 | int ret = kill(pid, SIGTERM); | ||
416 | if (ret != 0) { | ||
417 | sway_log(L_ERROR, "Unable to terminate swaybg [pid: %d]", pid); | ||
418 | } else { | ||
419 | int status; | ||
420 | waitpid(pid, &status, 0); | ||
421 | } | ||
422 | } | ||
423 | |||
424 | void load_swaybars(swayc_t *output, int output_idx) { | ||
425 | // Check for bars | ||
426 | list_t *bars = create_list(); | ||
427 | struct bar_config *bar = NULL; | ||
428 | int i; | ||
429 | for (i = 0; i < config->bars->length; ++i) { | ||
430 | bar = config->bars->items[i]; | ||
431 | bool apply = false; | ||
432 | if (bar->outputs) { | ||
433 | int j; | ||
434 | for (j = 0; j < bar->outputs->length; ++j) { | ||
435 | char *o = bar->outputs->items[j]; | ||
436 | if (strcmp(o, "*") || strcasecmp(o, output->name)) { | ||
437 | apply = true; | ||
438 | break; | ||
439 | } | ||
440 | } | ||
441 | } else { | ||
442 | apply = true; | ||
443 | } | ||
444 | if (apply) { | ||
445 | list_add(bars, bar); | ||
446 | } | ||
447 | } | ||
448 | |||
449 | // terminate swaybar processes previously spawned for this | ||
450 | // output. | ||
451 | terminate_swaybars(output->bar_pids); | ||
452 | |||
453 | for (i = 0; i < bars->length; ++i) { | ||
454 | bar = bars->items[i]; | ||
455 | invoke_swaybar(output, bar, output_idx); | ||
456 | } | ||
457 | |||
458 | list_free(bars); | ||
459 | } | ||
460 | |||
363 | void apply_output_config(struct output_config *oc, swayc_t *output) { | 461 | void apply_output_config(struct output_config *oc, swayc_t *output) { |
364 | if (oc && oc->width > 0 && oc->height > 0) { | 462 | if (oc && oc->width > 0 && oc->height > 0) { |
365 | output->width = oc->width; | 463 | output->width = oc->width; |
@@ -407,6 +505,10 @@ void apply_output_config(struct output_config *oc, swayc_t *output) { | |||
407 | 505 | ||
408 | if (oc && oc->background) { | 506 | if (oc && oc->background) { |
409 | 507 | ||
508 | if (output->bg_pid != 0) { | ||
509 | terminate_swaybg(output->bg_pid); | ||
510 | } | ||
511 | |||
410 | sway_log(L_DEBUG, "Setting background for output %d to %s", output_i, oc->background); | 512 | sway_log(L_DEBUG, "Setting background for output %d to %s", output_i, oc->background); |
411 | 513 | ||
412 | size_t bufsize = 4; | 514 | size_t bufsize = 4; |
@@ -421,54 +523,15 @@ void apply_output_config(struct output_config *oc, swayc_t *output) { | |||
421 | oc->background_option, | 523 | oc->background_option, |
422 | NULL, | 524 | NULL, |
423 | }; | 525 | }; |
424 | if (fork() == 0) { | ||
425 | execvp(cmd[0], cmd); | ||
426 | } | ||
427 | } | ||
428 | 526 | ||
429 | // Check for a bar | 527 | output->bg_pid = fork(); |
430 | struct bar_config *bar = NULL; | 528 | if (output->bg_pid == 0) { |
431 | int i; | ||
432 | for (i = 0; i < config->bars->length; ++i) { | ||
433 | bar = config->bars->items[i]; | ||
434 | bool apply = false; | ||
435 | if (bar->outputs) { | ||
436 | int j; | ||
437 | for (j = 0; j < bar->outputs->length; ++j) { | ||
438 | char *o = bar->outputs->items[j]; | ||
439 | if (strcmp(o, "*") || strcasecmp(o, output->name)) { | ||
440 | apply = true; | ||
441 | break; | ||
442 | } | ||
443 | } | ||
444 | } else { | ||
445 | apply = true; | ||
446 | } | ||
447 | if (apply) { | ||
448 | break; | ||
449 | } else { | ||
450 | bar = NULL; | ||
451 | } | ||
452 | } | ||
453 | if (bar) { | ||
454 | sway_log(L_DEBUG, "Invoking swaybar for output %s[%d] and bar %s", output->name, i, bar->id); | ||
455 | |||
456 | size_t bufsize = 4; | ||
457 | char output_id[bufsize]; | ||
458 | snprintf(output_id, bufsize, "%d", output_i); | ||
459 | output_id[bufsize-1] = 0; | ||
460 | |||
461 | char *const cmd[] = { | ||
462 | "swaybar", | ||
463 | "-b", | ||
464 | bar->id, | ||
465 | output_id, | ||
466 | NULL, | ||
467 | }; | ||
468 | if (fork() == 0) { | ||
469 | execvp(cmd[0], cmd); | 529 | execvp(cmd[0], cmd); |
470 | } | 530 | } |
471 | } | 531 | } |
532 | |||
533 | // load swaybars for output | ||
534 | load_swaybars(output, output_i); | ||
472 | } | 535 | } |
473 | 536 | ||
474 | char *do_var_replacement(char *str) { | 537 | char *do_var_replacement(char *str) { |
diff --git a/sway/container.c b/sway/container.c index 36056ff7..b85d2114 100644 --- a/sway/container.c +++ b/sway/container.c | |||
@@ -60,6 +60,13 @@ static void free_swayc(swayc_t *cont) { | |||
60 | if (cont->app_id) { | 60 | if (cont->app_id) { |
61 | free(cont->app_id); | 61 | free(cont->app_id); |
62 | } | 62 | } |
63 | if (cont->bar_pids) { | ||
64 | terminate_swaybars(cont->bar_pids); | ||
65 | free_flat_list(cont->bar_pids); | ||
66 | } | ||
67 | if (cont->bg_pid != 0) { | ||
68 | terminate_swaybg(cont->bg_pid); | ||
69 | } | ||
63 | free(cont); | 70 | free(cont); |
64 | } | 71 | } |
65 | 72 | ||
@@ -109,6 +116,8 @@ swayc_t *new_output(wlc_handle handle) { | |||
109 | output->width = size->w; | 116 | output->width = size->w; |
110 | output->height = size->h; | 117 | output->height = size->h; |
111 | output->unmanaged = create_list(); | 118 | output->unmanaged = create_list(); |
119 | output->bar_pids = create_list(); | ||
120 | output->bg_pid = 0; | ||
112 | 121 | ||
113 | apply_output_config(oc, output); | 122 | apply_output_config(oc, output); |
114 | add_child(&root_container, output); | 123 | add_child(&root_container, output); |