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:
parent
1cf737489d
commit
17fe8924f2
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 : "");
|
||||
|
|
Loading…
Reference in a new issue