diff options
-rw-r--r-- | sway/commands/output/background.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/sway/commands/output/background.c b/sway/commands/output/background.c index ddad679d..9e370d43 100644 --- a/sway/commands/output/background.c +++ b/sway/commands/output/background.c @@ -61,8 +61,14 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { "Missing background scaling mode."); } - wordexp_t p; + wordexp_t p = {0}; char *src = join_args(argv, j); + while (strstr(src, " ")) { + src = realloc(src, strlen(src) + 2); + char *ptr = strstr(src, " ") + 1; + memmove(ptr + 1, ptr, strlen(ptr) + 1); + *ptr = '\\'; + } if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { struct cmd_results *cmd_res = cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); @@ -71,7 +77,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { return cmd_res; } free(src); - src = strdup(p.we_wordv[0]); + src = join_args(p.we_wordv, p.we_wordc); wordfree(&p); if (!src) { wlr_log(WLR_ERROR, "Failed to duplicate string"); @@ -117,6 +123,22 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { } free(src); } else { + // Escape spaces and quotes in the final path for swaybg + for (size_t i = 0; i < strlen(src); i++) { + switch (src[i]) { + case ' ': + case '\'': + case '\"': + src = realloc(src, strlen(src) + 2); + memmove(src + i + 1, src + i, strlen(src + i) + 1); + *(src + i) = '\\'; + i++; + break; + default: + break; + } + } + output->background = src; output->background_option = strdup(mode); } |