diff --git a/include/sway/desktop/launcher.h b/include/sway/desktop/launcher.h index 927d7a37..09b27eb9 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); -void launcher_ctx_create(pid_t pid); +struct launcher_ctx *launcher_ctx_create(pid_t pid); #endif diff --git a/include/sway/server.h b/include/sway/server.h index 6a5a60c8..8a3cd2f2 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -114,6 +114,8 @@ struct sway_server { struct wlr_xdg_activation_v1 *xdg_activation_v1; struct wl_listener xdg_activation_v1_request_activate; + struct wl_list pending_launcher_ctxs; // launcher_ctx::link + // The timeout for transactions, after which a transaction is applied // regardless of readiness. size_t txn_timeout_ms; diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index d67e416f..0d3254ae 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c @@ -9,6 +9,7 @@ #include "sway/config.h" #include "sway/server.h" #include "sway/desktop/launcher.h" +#include "sway/server.h" #include "sway/tree/container.h" #include "sway/tree/root.h" #include "sway/tree/workspace.h" diff --git a/sway/desktop/launcher.c b/sway/desktop/launcher.c index 810a04ef..89a93384 100644 --- a/sway/desktop/launcher.c +++ b/sway/desktop/launcher.c @@ -11,8 +11,6 @@ #include "sway/tree/root.h" #include "log.h" -static struct wl_list launcher_ctxs; - /** * Get the pid of a parent process given the pid of a child process. * @@ -73,8 +71,7 @@ void launcher_ctx_destroy(struct launcher_ctx *ctx) { } struct launcher_ctx *launcher_ctx_find_pid(pid_t pid) { - if (!launcher_ctxs.prev && !launcher_ctxs.next) { - wl_list_init(&launcher_ctxs); + if (wl_list_empty(&server.pending_launcher_ctxs)) { return NULL; } @@ -83,7 +80,7 @@ struct launcher_ctx *launcher_ctx_find_pid(pid_t pid) { do { struct launcher_ctx *_ctx = NULL; - wl_list_for_each(_ctx, &launcher_ctxs, link) { + wl_list_for_each(_ctx, &server.pending_launcher_ctxs, link) { if (pid == _ctx->pid) { ctx = _ctx; sway_log(SWAY_DEBUG, @@ -178,17 +175,14 @@ static void token_handle_destroy(struct wl_listener *listener, void *data) { launcher_ctx_destroy(ctx); } -void launcher_ctx_create(pid_t pid) { +struct launcher_ctx *launcher_ctx_create(pid_t pid) { sway_log(SWAY_DEBUG, "Recording workspace for process %d", pid); - if (!launcher_ctxs.prev && !launcher_ctxs.next) { - wl_list_init(&launcher_ctxs); - } 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"); - return; + return NULL; } struct launcher_ctx *ctx = calloc(1, sizeof(struct launcher_ctx)); @@ -206,5 +200,7 @@ void launcher_ctx_create(pid_t pid) { ctx->token_destroy.notify = token_handle_destroy; wl_signal_add(&token->events.destroy, &ctx->token_destroy); - wl_list_insert(&launcher_ctxs, &ctx->link); + wl_list_init(&ctx->link); + wl_list_insert(&server.pending_launcher_ctxs, &ctx->link); + return ctx; } diff --git a/sway/server.c b/sway/server.c index f6720755..554ceb86 100644 --- a/sway/server.c +++ b/sway/server.c @@ -215,6 +215,8 @@ bool server_init(struct sway_server *server) { wl_signal_add(&server->xdg_activation_v1->events.request_activate, &server->xdg_activation_v1_request_activate); + wl_list_init(&server->pending_launcher_ctxs); + // Avoid using "wayland-0" as display socket char name_candidate[16]; for (unsigned int i = 1; i <= 32; ++i) {