i3bar: properly restart status command after config change
This commit is contained in:
parent
0370c5e297
commit
6e0b29a65b
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user