diff options
-rw-r--r-- | sway/commands/output/background.c | 18 | ||||
-rw-r--r-- | sway/config/output.c | 4 |
2 files changed, 19 insertions, 3 deletions
diff --git a/sway/commands/output/background.c b/sway/commands/output/background.c index 2ff5f0d7..9e370d43 100644 --- a/sway/commands/output/background.c +++ b/sway/commands/output/background.c | |||
@@ -61,7 +61,7 @@ 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, " ")) { | 66 | while (strstr(src, " ")) { |
67 | src = realloc(src, strlen(src) + 2); | 67 | src = realloc(src, strlen(src) + 2); |
@@ -123,6 +123,22 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { | |||
123 | } | 123 | } |
124 | free(src); | 124 | free(src); |
125 | } 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 | |||
126 | output->background = src; | 142 | output->background = src; |
127 | output->background_option = strdup(mode); | 143 | output->background_option = strdup(mode); |
128 | } | 144 | } |
diff --git a/sway/config/output.c b/sway/config/output.c index 6f337b66..74d79130 100644 --- a/sway/config/output.c +++ b/sway/config/output.c | |||
@@ -237,7 +237,7 @@ void apply_output_config(struct output_config *oc, struct sway_output *output) { | |||
237 | wlr_log(WLR_DEBUG, "Setting background for output %d to %s", | 237 | wlr_log(WLR_DEBUG, "Setting background for output %d to %s", |
238 | output_i, oc->background); | 238 | output_i, oc->background); |
239 | 239 | ||
240 | size_t len = snprintf(NULL, 0, "%s %d \"%s\" %s %s", | 240 | size_t len = snprintf(NULL, 0, "%s %d %s %s %s", |
241 | config->swaybg_command ? config->swaybg_command : "swaybg", | 241 | config->swaybg_command ? config->swaybg_command : "swaybg", |
242 | output_i, oc->background, oc->background_option, | 242 | output_i, oc->background, oc->background_option, |
243 | oc->background_fallback ? oc->background_fallback : ""); | 243 | oc->background_fallback ? oc->background_fallback : ""); |
@@ -246,7 +246,7 @@ void apply_output_config(struct output_config *oc, struct sway_output *output) { | |||
246 | wlr_log(WLR_DEBUG, "Unable to allocate swaybg command"); | 246 | wlr_log(WLR_DEBUG, "Unable to allocate swaybg command"); |
247 | return; | 247 | return; |
248 | } | 248 | } |
249 | snprintf(command, len + 1, "%s %d \"%s\" %s %s", | 249 | snprintf(command, len + 1, "%s %d %s %s %s", |
250 | config->swaybg_command ? config->swaybg_command : "swaybg", | 250 | config->swaybg_command ? config->swaybg_command : "swaybg", |
251 | output_i, oc->background, oc->background_option, | 251 | output_i, oc->background, oc->background_option, |
252 | oc->background_fallback ? oc->background_fallback : ""); | 252 | oc->background_fallback ? oc->background_fallback : ""); |