aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/ipc.c
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-03-29 10:38:17 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2018-03-29 22:11:08 -0400
commit86ba0fc15d7615b09f0279616d538af5c23bc551 (patch)
tree374d19c070eafb5ea50335d01152416242af1bc0 /swaybar/ipc.c
parentImplement workspace button rendering (diff)
downloadsway-86ba0fc15d7615b09f0279616d538af5c23bc551.tar.gz
sway-86ba0fc15d7615b09f0279616d538af5c23bc551.tar.zst
sway-86ba0fc15d7615b09f0279616d538af5c23bc551.zip
Re-render bar on IPC updates
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r--swaybar/ipc.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index 6b832070..75f17953 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -3,6 +3,7 @@
3#include <string.h> 3#include <string.h>
4#include <strings.h> 4#include <strings.h>
5#include <json-c/json.h> 5#include <json-c/json.h>
6#include <wlr/util/log.h>
6#include "swaybar/config.h" 7#include "swaybar/config.h"
7#include "swaybar/ipc.h" 8#include "swaybar/ipc.h"
8#include "ipc-client.h" 9#include "ipc-client.h"
@@ -288,10 +289,51 @@ void ipc_initialize(struct swaybar *bar, const char *bar_id) {
288 ipc_parse_config(bar->config, res); 289 ipc_parse_config(bar->config, res);
289 free(res); 290 free(res);
290 ipc_get_outputs(bar); 291 ipc_get_outputs(bar);
291 // TODO: subscribe to stuff 292
293 const char *subscribe = "[ \"workspace\", \"mode\" ]";
294 len = strlen(subscribe);
295 free(ipc_single_command(bar->ipc_event_socketfd,
296 IPC_SUBSCRIBE, subscribe, &len));
292} 297}
293 298
294void handle_ipc_event(struct swaybar *bar) { 299bool handle_ipc_event(struct swaybar *bar) {
295 struct ipc_response *resp = ipc_recv_response(bar->ipc_event_socketfd); 300 struct ipc_response *resp = ipc_recv_response(bar->ipc_event_socketfd);
301 if (!resp) {
302 return false;
303 }
304 switch (resp->type) {
305 case IPC_EVENT_WORKSPACE:
306 ipc_get_workspaces(bar);
307 break;
308 case IPC_EVENT_MODE: {
309 json_object *result = json_tokener_parse(resp->payload);
310 if (!result) {
311 free_ipc_response(resp);
312 wlr_log(L_ERROR, "failed to parse payload as json");
313 return false;
314 }
315 json_object *json_change;
316 if (json_object_object_get_ex(result, "change", &json_change)) {
317 const char *change = json_object_get_string(json_change);
318 free(bar->config->mode);
319 if (strcmp(change, "default") == 0) {
320 bar->config->mode = NULL;
321 } else {
322 bar->config->mode = strdup(change);
323 }
324 } else {
325 wlr_log(L_ERROR, "failed to parse response");
326 json_object_put(result);
327 free_ipc_response(resp);
328 return false;
329 }
330 json_object_put(result);
331 break;
332 }
333 default:
334 free_ipc_response(resp);
335 return false;
336 }
296 free_ipc_response(resp); 337 free_ipc_response(resp);
338 return true;
297} 339}