commit d8f3e6e19a12514ed6f8c8f470b89fde0f39dc59
parent 04aa41de340b82d4eccc5c0c86fa6f9c178b72d5
Author: Ian Fan <ianfan0@gmail.com>
Date: Tue, 22 Jan 2019 11:43:37 +0000
swaybar: fix workspace command
Escape quotes and backslashes, allowing switching to workspace names
like "1" (including quotes) and \
Diffstat:
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git 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);
}