diff options
Diffstat (limited to 'sway/commands.c')
-rw-r--r-- | sway/commands.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sway/commands.c b/sway/commands.c index dfb3c12d..3181b434 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -214,22 +214,37 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) { free(tmp); sway_log(L_DEBUG, "Executing %s", cmd); + int fd[2]; + pipe(fd); + pid_t pid; + pid_t *child = malloc(sizeof(pid_t)); // malloc'd so that Linux can avoid copying the process space // Fork process if ((pid = fork()) == 0) { // Fork child process again setsid(); - if (fork() == 0) { + if ((*child = fork()) == 0) { execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); /* Not reached */ } - // Close child process - _exit(0); + close(fd[0]); + write(fd[1], child, sizeof(pid_t)); + close(fd[1]); + _exit(0); // Close child process } else if (pid < 0) { return cmd_results_new(CMD_FAILURE, "exec_always", "Command failed (sway could not fork)."); } + close(fd[1]); // close write + read(fd[0], child, sizeof(pid_t)); + close(fd[0]); // cleanup child process wait(0); + if (*child > 0) { + sway_log(L_DEBUG, "Child process created with pid %d", *child); + // TODO: keep track of this pid and open the corresponding view on the current workspace + // blocked pending feature in wlc + } + free(child); return cmd_results_new(CMD_SUCCESS, NULL, NULL); } |