Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions sway/commands/exec_always.c
Original file line number Diff line number Diff line change
Expand Up @@ -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] == '"')) {
Expand All @@ -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
Expand Down
9 changes: 6 additions & 3 deletions sway/sway.5.scd
Original file line number Diff line number Diff line change
Expand Up @@ -697,10 +697,13 @@ The default colors are:
windows that are spawned in floating mode, not windows that become floating
afterwards.

*exec* <shell command>
Executes _shell command_ with sh.
*exec* [--matched-container-id] [--no-startup-id] <shell command>
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* <shell command>
*exec_always* [--matched-container-id] [--no-startup-id] <shell command>
Like *exec*, but the shell command will be executed _again_ after *reload*.

*floating_maximum_size* <width> x <height>
Expand Down