diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-03-29 10:38:17 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-03-29 22:11:08 -0400 |
commit | 86ba0fc15d7615b09f0279616d538af5c23bc551 (patch) | |
tree | 374d19c070eafb5ea50335d01152416242af1bc0 /swaybar/ipc.c | |
parent | Implement workspace button rendering (diff) | |
download | sway-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.c | 46 |
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 | ||
294 | void handle_ipc_event(struct swaybar *bar) { | 299 | bool 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 | } |