From ee9266cf8c8d1d445a52b07160e54411ec949b2f Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Wed, 16 Nov 2022 15:50:34 -0700 Subject: [PATCH] launcher: fudge the interface a bit We want to create a context before knowing the pid it will match with. (cherry picked from commit bdeb9f95651f6c99cc2f4cfb59020ddee202cf36) --- include/sway/desktop/launcher.h | 2 +- sway/commands/exec_always.c | 7 ++++++- sway/desktop/launcher.c | 7 ++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/sway/desktop/launcher.h b/include/sway/desktop/launcher.h index 09b27eb93..91915604d 100644 --- a/include/sway/desktop/launcher.h +++ b/include/sway/desktop/launcher.h @@ -23,6 +23,6 @@ void launcher_ctx_consume(struct launcher_ctx *ctx); void launcher_ctx_destroy(struct launcher_ctx *ctx); -struct launcher_ctx *launcher_ctx_create(pid_t pid); +struct launcher_ctx *launcher_ctx_create(void); #endif diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index 0d3254ae5..13deb9e3b 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c @@ -53,6 +53,7 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { } pid_t pid, child; + struct launcher_ctx *ctx = launcher_ctx_create(); // Fork process if ((pid = fork()) == 0) { // Fork child process again @@ -92,8 +93,12 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { waitpid(pid, NULL, 0); if (child > 0) { sway_log(SWAY_DEBUG, "Child process created with pid %d", child); - launcher_ctx_create(child); + if (ctx != NULL) { + sway_log(SWAY_DEBUG, "Recording workspace for process %d", child); + ctx->pid = child; + } } else { + launcher_ctx_destroy(ctx); return cmd_results_new(CMD_FAILURE, "Second fork() failed"); } diff --git a/sway/desktop/launcher.c b/sway/desktop/launcher.c index 89a93384a..b983dcb0f 100644 --- a/sway/desktop/launcher.c +++ b/sway/desktop/launcher.c @@ -175,13 +175,11 @@ static void token_handle_destroy(struct wl_listener *listener, void *data) { launcher_ctx_destroy(ctx); } -struct launcher_ctx *launcher_ctx_create(pid_t pid) { - sway_log(SWAY_DEBUG, "Recording workspace for process %d", pid); - +struct launcher_ctx *launcher_ctx_create() { struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *ws = seat_get_focused_workspace(seat); if (!ws) { - sway_log(SWAY_DEBUG, "Bailing out, no workspace"); + sway_log(SWAY_DEBUG, "Failed to create launch context. No workspace."); return NULL; } @@ -192,7 +190,6 @@ struct launcher_ctx *launcher_ctx_create(pid_t pid) { ctx->name = strdup(ws->name); ctx->token = token; ctx->node = &ws->node; - ctx->pid = pid; ctx->node_destroy.notify = ctx_handle_node_destroy; wl_signal_add(&ctx->node->events.destroy, &ctx->node_destroy);