diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index a966696c..c7461b53 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c @@ -28,13 +28,22 @@ struct cmd_results *cmd_exec_validate(int argc, char **argv) { struct cmd_results *cmd_exec_process(int argc, char **argv) { struct cmd_results *error = NULL; char *cmd = NULL; + bool matched_container_id = false; bool no_startup_id = false; - if (strcmp(argv[0], "--no-startup-id") == 0) { - no_startup_id = true; - --argc; ++argv; - if ((error = checkarg(argc, argv[-1], EXPECTED_AT_LEAST, 1))) { - return error; + int argv_counter = -1; + while (argc > 0 && has_prefix(*argv, "--")) { + if (strcmp(argv[0], "--matched-container-id") == 0) { + matched_container_id = true; + } else if (strcmp(argv[0], "--no-startup-id") == 0) { + no_startup_id = true; + } else { + return cmd_results_new(CMD_INVALID, "Unrecognized argument '%s'", *argv); } + --argc; ++argv; --argv_counter; + } + + if ((error = checkarg(argc, argv[argv_counter], EXPECTED_AT_LEAST, 1))) { + return error; } if (argc == 1 && (argv[0][0] == '\'' || argv[0][0] == '"')) { @@ -61,6 +70,26 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { } } + if (matched_container_id && config->handler_context.node != NULL) { + size_t con_id = config->handler_context.node->id; + int con_id_len = snprintf(NULL, 0, "%zu", con_id); + if (con_id_len < 0) { + sway_log(SWAY_ERROR, "Unable to determine buffer length for SWAY_EXEC_CON_ID"); + goto no_con_id_export; + } + // accommodate \0 + con_id_len++; + char* con_id_str = malloc(con_id_len); + if (!con_id_str) { + sway_log(SWAY_ERROR, "Unable to allocate buffer for SWAY_EXEC_CON_ID"); + goto no_con_id_export; + } + snprintf(con_id_str, con_id_len, "%zu", con_id); + setenv("SWAY_EXEC_CON_ID", con_id_str, 1); + free(con_id_str); + } +no_con_id_export: + execlp("sh", "sh", "-c", cmd, (void*)NULL); sway_log_errno(SWAY_ERROR, "execve failed"); _exit(0); // Close child process diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 53393bcc..e28349d6 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd @@ -703,10 +703,13 @@ The default colors are: windows that are spawned in floating mode, not windows that become floating afterwards. -*exec* - Executes _shell command_ with sh. +*exec* [--matched-container-id] [--no-startup-id] + Executes _shell command_ with sh. The _--matched-container-id_ option + exports matched container if following a criteria match or the focused + node otherwise in SWAY_EXEC_CON_ID. The _--no_startup_id_ option prevents + exporting of DESKTOP_STARTUP_ID. -*exec_always* +*exec_always* [--matched-container-id] [--no-startup-id] Like *exec*, but the shell command will be executed _again_ after *reload*. *floating_maximum_size* x