commit 17fe8924f24a9445447dbb3d5a1f775c94203048
parent 1cf737489db68312556d0a215c17e93a573b283f
Author: Brian Ashworth <bosrsf04@gmail.com>
Date: Fri, 14 Sep 2018 08:51:01 -0400
Address ianyfan's comments
wordexp p is now initialized to {0} to prevent a segfault on wordfree
in the failure case.
File paths with single quotes and double quotes are now supported. The
quote can either be wrapped in the other quote or escaped with three
backslashes.
Additionally to make passing file paths with double quotes to swaybg
easier, instead of enclosing the path given to swaybg in quotes, all
spaces, single quotes, and double quotes in the resulting path are now
escaped with a single backslash.
Diffstat:
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git 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) {
"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);
@@ -123,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);
}
diff --git 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) {
wlr_log(WLR_DEBUG, "Setting background for output %d to %s",
output_i, oc->background);
- size_t len = snprintf(NULL, 0, "%s %d \"%s\" %s %s",
+ size_t len = snprintf(NULL, 0, "%s %d %s %s %s",
config->swaybg_command ? config->swaybg_command : "swaybg",
output_i, oc->background, oc->background_option,
oc->background_fallback ? oc->background_fallback : "");
@@ -246,7 +246,7 @@ void apply_output_config(struct output_config *oc, struct sway_output *output) {
wlr_log(WLR_DEBUG, "Unable to allocate swaybg command");
return;
}
- snprintf(command, len + 1, "%s %d \"%s\" %s %s",
+ snprintf(command, len + 1, "%s %d %s %s %s",
config->swaybg_command ? config->swaybg_command : "swaybg",
output_i, oc->background, oc->background_option,
oc->background_fallback ? oc->background_fallback : "");