diff --git a/i3bar/CHANGELOG b/i3bar/CHANGELOG index 0106447e..b8030e43 100644 --- a/i3bar/CHANGELOG +++ b/i3bar/CHANGELOG @@ -1,8 +1,13 @@ +v0.6 +===== +- Add manpage +- Implement hide-on-modifier +- Custom colors can be set from the commandline +- Use double-buffering - Bugfix: Correctly render long text - Bugfix: Don't segfault on SIGCHILD -- Implement hide-on-modifier -- Use double-buffering - +- Bugfix: Double-fork() to avoid zombies +- Some minor bugfixes v0.5 ===== diff --git a/i3bar/doc/i3bar.man b/i3bar/doc/i3bar.man index c41371b8..9ee7f7ce 100644 --- a/i3bar/doc/i3bar.man +++ b/i3bar/doc/i3bar.man @@ -1,7 +1,7 @@ i3bar(1) ======== Axel Wagner -v0.5, September 2010 +v0.6, September 2010 == NAME diff --git a/i3bar/src/child.c b/i3bar/src/child.c index 08d2bed9..3092d527 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -101,67 +100,41 @@ void child_sig_cb(struct ev_loop *loop, ev_child *watcher, int revents) { /* * 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 - * about arguments and such. - * We also double-fork() to avoid zombies and pass the pid of the child through a - * temporary pipe back to i3bar + * about arguments and such * */ void start_child(char *command) { child_pid = 0; if (command != NULL) { - int fd[2], tmp[2]; - /* This pipe will be used to communicate between e.g. i3status and i3bar */ + int fd[2]; pipe(fd); - /* We also need this temporary pipe to get back the pid of i3status */ - pipe(tmp); - switch (fork()) { + child_pid = fork(); + switch (child_pid) { case -1: ELOG("Couldn't fork()\n"); exit(EXIT_FAILURE); case 0: - /* Double-fork(), so the child gets reparented to init */ - switch(child_pid = fork()) { - case -1: - ELOG("Couldn't fork() twice\n"); - exit(EXIT_FAILURE); - case 0: - /* Child-process. Reroute stdout and start shell */ - close(fd[0]); + /* Child-process. Reroute stdout and start shell */ + close(fd[0]); - dup2(fd[1], STDOUT_FILENO); + dup2(fd[1], STDOUT_FILENO); - static const char *shell = NULL; + static const char *shell = NULL; - if ((shell = getenv("SHELL")) == NULL) - shell = "/bin/sh"; + if ((shell = getenv("SHELL")) == NULL) + shell = "/bin/sh"; - execl(shell, shell, "-c", command, (char*) NULL); - return; - default: - /* Temporary parent. We tell i3bar about the pid of i3status and exit */ - write(tmp[1], &child_pid, sizeof(int)); - close(tmp[0]); - close(tmp[1]); - exit(EXIT_SUCCESS); - } + execl(shell, shell, "-c", command, (char*) NULL); + return; default: /* Parent-process. Rerout stdin */ close(fd[1]); dup2(fd[0], STDIN_FILENO); - /* We also need to get the pid of i3status from the temporary pipe */ - size_t rec = 0; - while (rec < sizeof(int)) { - rec += read(tmp[0], &child_pid, sizeof(int) - rec); - } - /* The temporary pipe is no longer needed */ - close(tmp[0]); - close(tmp[1]); break; } } - wait(0); /* We set O_NONBLOCK because blocking is evil in event-driven software */ fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); @@ -184,6 +157,7 @@ void start_child(char *command) { */ void kill_child() { if (child_pid != 0) { + kill(child_pid, SIGCONT); kill(child_pid, SIGTERM); } cleanup();