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) { "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); + char *ptr = strstr(src, " ") + 1; + memmove(ptr + 1, ptr, strlen(ptr) + 1); + *ptr = '\\'; + } if (wordexp(src, &p, 0) != 0 || p.we_wordv[0] == NULL) { struct cmd_results *cmd_res = cmd_results_new(CMD_INVALID, "output", "Invalid syntax (%s)", src); @@ -71,7 +77,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) { return cmd_res; } free(src); - src = strdup(p.we_wordv[0]); + src = join_args(p.we_wordv, p.we_wordc); wordfree(&p); if (!src) { wlr_log(WLR_ERROR, "Failed to duplicate string"); @@ -117,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/server.c b/sway/server.c index 58843944..9440c10f 100644 --- a/sway/server.c +++ b/sway/server.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include "list.h" #include "sway/config.h" diff --git a/sway/tree/view.c b/sway/tree/view.c index d02abf30..78f85de2 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -34,8 +34,6 @@ void view_init(struct sway_view *view, enum sway_view_type type, view->marks = create_list(); view->allow_request_urgent = true; wl_signal_init(&view->events.unmap); - - view->container = container_create(view); } void view_destroy(struct sway_view *view) { diff --git a/swaybar/i3bar.c b/swaybar/i3bar.c index 1345ee9b..0becae5d 100644 --- a/swaybar/i3bar.c +++ b/swaybar/i3bar.c @@ -8,22 +8,19 @@ #include "swaybar/config.h" #include "swaybar/status_line.h" -static void i3bar_block_free(struct i3bar_block *block) { - if (!block) { +void i3bar_block_unref(struct i3bar_block *block) { + if (block == NULL) { return; } - free(block->full_text); - free(block->short_text); - free(block->align); - free(block->name); - free(block->instance); - free(block->color); - free(block); -} -void i3bar_block_unref(struct i3bar_block *block) { if (--block->ref_count == 0) { - i3bar_block_free(block); + free(block->full_text); + free(block->short_text); + free(block->align); + free(block->name); + free(block->instance); + free(block->color); + free(block); } }