diff options
| -rw-r--r-- | swaybar/ipc.c | 25 | 
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);  } | 
