Skip to content
This repository has been archived by the owner on Apr 18, 2023. It is now read-only.

Commit

Permalink
i3bar: properly restart status command after config change
Browse files Browse the repository at this point in the history
  • Loading branch information
orestisfl committed Jan 12, 2021
1 parent 0370c5e commit 6e0b29a
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 5 deletions.
1 change: 1 addition & 0 deletions RELEASE-NOTES-next
Expand Up @@ -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
6 changes: 6 additions & 0 deletions i3bar/include/child.h
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions i3bar/src/child.c
Expand Up @@ -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)

Expand Down Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion i3bar/src/config.c
Expand Up @@ -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;
}
Expand Down
17 changes: 15 additions & 2 deletions i3bar/src/ipc.c
Expand Up @@ -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)
*
Expand All @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 6e0b29a

Please sign in to comment.