From d8f3e6e19a12514ed6f8c8f470b89fde0f39dc59 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Tue, 22 Jan 2019 11:43:37 +0000 Subject: swaybar: fix workspace command Escape quotes and backslashes, allowing switching to workspace names like "1" (including quotes) and \ --- swaybar/ipc.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'swaybar') diff --git a/swaybar/ipc.c b/swaybar/ipc.c index dbb593fb..46565202 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c @@ -13,10 +13,27 @@ #include "util.h" void ipc_send_workspace_command(struct swaybar *bar, const char *ws) { - const char *fmt = "workspace \"%s\""; - uint32_t size = snprintf(NULL, 0, fmt, ws); - char *command = malloc(sizeof(char) * (size + 1)); - snprintf(command, size, fmt, ws); + uint32_t size = strlen("workspace \"\"") + strlen(ws); + for (size_t i = 0; i < strlen(ws); ++i) { + if (ws[i] == '"' || ws[i] == '\\') { + ++size; + } + } + + char *command = malloc(size) + 1; + if (!command) { + return; + } + + strcpy(command, "workspace \""); + strcpy(&command[size - 1], "\""); + for (size_t i = 0, d = strlen("workspace \""); i < strlen(ws); ++i) { + if (ws[i] == '"' || ws[i] == '\\') { + command[d++] = '\\'; + } + command[d++] = ws[i]; + } + ipc_single_command(bar->ipc_socketfd, IPC_COMMAND, command, &size); free(command); } -- cgit v1.2.3-54-g00ecf