swaybar: fix workspace command
Escape quotes and backslashes, allowing switching to workspace names like "1" (including quotes) and \
This commit is contained in:
parent
04aa41de34
commit
d8f3e6e19a
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue