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

Commit

Permalink
Merge remote-tracking branch 'vanilla/next' into gaps-next
Browse files Browse the repository at this point in the history
  • Loading branch information
Airblader committed Jan 17, 2021
2 parents 5bf25e2 + e4f12ac commit 4791b22
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 9 deletions.
3 changes: 3 additions & 0 deletions RELEASE-NOTES-next
Expand Up @@ -24,3 +24,6 @@ strongly encouraged to upgrade.
• fix workspaces not moving to assigned output after output becomes available
• 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
• i3bar: exit with 1 when a wrong command line argument is used
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
8 changes: 6 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 Expand Up @@ -139,6 +139,10 @@ static void cleanup(void) {
if (stdin_io != NULL) {
ev_io_stop(main_loop, stdin_io);
FREE(stdin_io);
close(stdin_fd);
stdin_fd = 0;
close(child_stdin);
child_stdin = 0;
}

if (child_sig != NULL) {
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
20 changes: 15 additions & 5 deletions i3bar/src/ipc.c
Expand Up @@ -155,9 +155,6 @@ static void got_workspace_event(char *event) {
static void got_output_event(char *event) {
DLOG("Got output event!\n");
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL);
if (!config.disable_ws) {
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_WORKSPACES, NULL);
}
}

/*
Expand All @@ -170,6 +167,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 +196,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 +211,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
4 changes: 3 additions & 1 deletion i3bar/src/main.c
Expand Up @@ -128,11 +128,13 @@ int main(int argc, char **argv) {
break;
default:
print_usage(argv[0]);
exit(EXIT_SUCCESS);
exit(EXIT_FAILURE);
break;
}
}

LOG("i3bar version " I3_VERSION "\n");

main_loop = ev_default_loop(0); /* needed in init_xcb_early */
char *atom_sock_path = init_xcb_early();

Expand Down

0 comments on commit 4791b22

Please sign in to comment.