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.
This commit is contained in:
Brian Ashworth 2018-09-14 08:51:01 -04:00
parent 1cf737489d
commit 17fe8924f2
2 changed files with 19 additions and 3 deletions

View file

@ -61,7 +61,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
"Missing background scaling mode."); "Missing background scaling mode.");
} }
wordexp_t p; wordexp_t p = {0};
char *src = join_args(argv, j); char *src = join_args(argv, j);
while (strstr(src, " ")) { while (strstr(src, " ")) {
src = realloc(src, strlen(src) + 2); src = realloc(src, strlen(src) + 2);
@ -123,6 +123,22 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
} }
free(src); free(src);
} else { } 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 = src;
output->background_option = strdup(mode); output->background_option = strdup(mode);
} }

View file

@ -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", wlr_log(WLR_DEBUG, "Setting background for output %d to %s",
output_i, oc->background); 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", config->swaybg_command ? config->swaybg_command : "swaybg",
output_i, oc->background, oc->background_option, output_i, oc->background, oc->background_option,
oc->background_fallback ? oc->background_fallback : ""); 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"); wlr_log(WLR_DEBUG, "Unable to allocate swaybg command");
return; 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", config->swaybg_command ? config->swaybg_command : "swaybg",
output_i, oc->background, oc->background_option, output_i, oc->background, oc->background_option,
oc->background_fallback ? oc->background_fallback : ""); oc->background_fallback ? oc->background_fallback : "");