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) { | |||
61 | "Missing background scaling mode."); | 61 | "Missing background scaling mode."); |
62 | } | 62 | } |
63 | 63 | ||
64 | wordexp_t p; | 64 | wordexp_t p = {0}; |
65 | char *src = join_args(argv, j); | 65 | char *src = join_args(argv, j); |
66 | while (strstr(src, " ")) { | ||
67 | src = realloc(src, strlen(src) + 2); | ||
68 | char *ptr = strstr(src, " ") + 1; | ||
69 | memmove(ptr + 1, ptr, strlen(ptr) + 1); | ||
70 | *ptr = '\\'; | ||
71 | } | ||
66 | if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { | 72 | if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { |
67 | struct cmd_results *cmd_res = cmd_results_new(CMD_INVALID, "output", | 73 | struct cmd_results *cmd_res = cmd_results_new(CMD_INVALID, "output", |
68 | "Invalid syntax (%s)", src); | 74 | "Invalid syntax (%s)", src); |
@@ -71,7 +77,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { | |||
71 | return cmd_res; | 77 | return cmd_res; |
72 | } | 78 | } |
73 | free(src); | 79 | free(src); |
74 | src = strdup(p.we_wordv[0]); | 80 | src = join_args(p.we_wordv, p.we_wordc); |
75 | wordfree(&p); | 81 | wordfree(&p); |
76 | if (!src) { | 82 | if (!src) { |
77 | wlr_log(WLR_ERROR, "Failed to duplicate string"); | 83 | wlr_log(WLR_ERROR, "Failed to duplicate string"); |
@@ -117,6 +123,22 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { | |||
117 | } | 123 | } |
118 | free(src); | 124 | free(src); |
119 | } else { | 125 | } else { |
126 | // Escape spaces and quotes in the final path for swaybg | ||
127 | for (size_t i = 0; i < strlen(src); i++) { | ||
128 | switch (src[i]) { | ||
129 | case ' ': | ||
130 | case '\'': | ||
131 | case '\"': | ||
132 | src = realloc(src, strlen(src) + 2); | ||
133 | memmove(src + i + 1, src + i, strlen(src + i) + 1); | ||
134 | *(src + i) = '\\'; | ||
135 | i++; | ||
136 | break; | ||
137 | default: | ||
138 | break; | ||
139 | } | ||
140 | } | ||
141 | |||
120 | output->background = src; | 142 | output->background = src; |
121 | output->background_option = strdup(mode); | 143 | output->background_option = strdup(mode); |
122 | } | 144 | } |