i3bar: properly restart status command after config change

This commit is contained in:
Orestis Floros 2021-01-12 08:41:19 +01:00
parent 0370c5e297
commit 6e0b29a65b
No known key found for this signature in database
GPG Key ID: A09DBD7D3222C1C3
5 changed files with 24 additions and 5 deletions

View File

@ -25,3 +25,4 @@ strongly encouraged to upgrade.
• fix duplicate bindcode after i3-config-wizard
• clear pixmap before drawing to prevent visual grabage in clients using 'Shape'
• i3bar: properly close file descriptors
• i3bar: properly restart status command after config change

View File

@ -42,6 +42,12 @@ typedef struct {
bool click_events_init;
} i3bar_child;
/*
* Remove all blocks from the given statusline.
* If free_resources is set, the fields of each status block will be free'd.
*/
void clear_statusline(struct statusline_head *head, bool free_resources);
/*
* Start a child process with the specified command and reroute stdin.
* We actually start a $SHELL to execute the command so we don't have to care

View File

@ -27,7 +27,7 @@
#include <yajl/yajl_parse.h>
/* Global variables for child_*() */
i3bar_child child;
i3bar_child child = {0};
#define DLOG_CHILD DLOG("%s: pid=%ld stopped=%d stop_signal=%d cont_signal=%d click_events=%d click_events_init=%d\n", \
__func__, (long)child.pid, child.stopped, child.stop_signal, child.cont_signal, child.click_events, child.click_events_init)
@ -66,7 +66,7 @@ int child_stdin;
* Remove all blocks from the given statusline.
* If free_resources is set, the fields of each status block will be free'd.
*/
static void clear_statusline(struct statusline_head *head, bool free_resources) {
void clear_statusline(struct statusline_head *head, bool free_resources) {
struct status_block *first;
while (!TAILQ_EMPTY(head)) {
first = TAILQ_FIRST(head);

View File

@ -184,7 +184,6 @@ static int config_string_cb(void *params_, const unsigned char *val, size_t _len
if (!strcmp(cur_key, "status_command")) {
DLOG("command = %.*s\n", len, val);
FREE(config.command);
sasprintf(&config.command, "%.*s", len, val);
return 1;
}

View File

@ -170,6 +170,15 @@ static void got_mode_event(char *event) {
draw_bars(false);
}
static bool strings_differ(char *a, char *b) {
const bool a_null = (a == NULL);
const bool b_null = (b == NULL);
if (a_null != b_null) {
return true;
}
return strcmp(a, b) != 0;
}
/*
* Called, when a barconfig_update event arrives (i.e. i3 changed the bar hidden_state or mode)
*
@ -190,8 +199,11 @@ static void got_bar_config_update(char *event) {
/* update the configuration with the received settings */
DLOG("Received bar config update \"%s\"\n", event);
char *old_command = config.command ? sstrdup(config.command) : NULL;
char *old_command = config.command;
config.command = NULL;
bar_display_mode_t old_mode = config.hide_on_modifier;
parse_config_json(event);
if (old_mode != config.hide_on_modifier) {
reconfig_windows(true);
@ -202,8 +214,9 @@ static void got_bar_config_update(char *event) {
init_colors(&(config.colors));
/* restart status command process */
if (old_command && strcmp(old_command, config.command) != 0) {
if (strings_differ(old_command, config.command)) {
kill_child();
clear_statusline(&statusline_head, true);
start_child(config.command);
}
free(old_command);