aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Fan <ianfan0@gmail.com>2019-01-22 11:43:37 +0000
committeremersion <contact@emersion.fr>2019-01-22 18:48:33 +0100
commitd8f3e6e19a12514ed6f8c8f470b89fde0f39dc59 (patch)
tree89a75ecad4a25b16a6734593b094429f139cbc0e
parent04aa41de340b82d4eccc5c0c86fa6f9c178b72d5 (diff)
swaybar: fix workspace command
Escape quotes and backslashes, allowing switching to workspace names like "1" (including quotes) and \
-rw-r--r--swaybar/ipc.c25
1 files changed, 21 insertions, 4 deletions
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);
}