aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-09-14 15:57:53 -0400
committerLibravatar GitHub <noreply@github.com>2018-09-14 15:57:53 -0400
commitf5ecc89c68e9ff94acc1fdbb856cd3ec32d29f04 (patch)
treebbb36fed5e7f9a49aab8f4aea3fd72ad814f8076
parentMerge pull request #2628 from RyanDwyer/remove-rejigger-assertion (diff)
parentAddress ianyfan's comments (diff)
downloadsway-f5ecc89c68e9ff94acc1fdbb856cd3ec32d29f04.tar.gz
sway-f5ecc89c68e9ff94acc1fdbb856cd3ec32d29f04.tar.zst
sway-f5ecc89c68e9ff94acc1fdbb856cd3ec32d29f04.zip
Merge pull request #2629 from RedSoxFan/fix-654
Allow spaces in background file path
-rw-r--r--sway/commands/output/background.c26
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 }