aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/swaybar/ipc.h3
-rw-r--r--swaybar/bar.c8
-rw-r--r--swaybar/ipc.c46
3 files changed, 53 insertions, 4 deletions
diff --git a/include/swaybar/ipc.h b/include/swaybar/ipc.h
index f3881bd0..278baef0 100644
--- a/include/swaybar/ipc.h
+++ b/include/swaybar/ipc.h
@@ -1,9 +1,10 @@
1#ifndef _SWAYBAR_IPC_H 1#ifndef _SWAYBAR_IPC_H
2#define _SWAYBAR_IPC_H 2#define _SWAYBAR_IPC_H
3#include <stdbool.h>
3#include "swaybar/bar.h" 4#include "swaybar/bar.h"
4 5
5void ipc_initialize(struct swaybar *bar, const char *bar_id); 6void ipc_initialize(struct swaybar *bar, const char *bar_id);
6void handle_ipc_event(struct swaybar *bar); 7bool handle_ipc_event(struct swaybar *bar);
7void ipc_get_workspaces(struct swaybar *bar); 8void ipc_get_workspaces(struct swaybar *bar);
8 9
9#endif 10#endif
diff --git a/swaybar/bar.c b/swaybar/bar.c
index 68dea408..90fd5ad4 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -143,11 +143,17 @@ static void display_in(int fd, short mask, void *_bar) {
143 143
144static void ipc_in(int fd, short mask, void *_bar) { 144static void ipc_in(int fd, short mask, void *_bar) {
145 struct swaybar *bar = (struct swaybar *)_bar; 145 struct swaybar *bar = (struct swaybar *)_bar;
146 handle_ipc_event(bar); 146 if (handle_ipc_event(bar)) {
147 struct swaybar_output *output;
148 wl_list_for_each(output, &bar->outputs, link) {
149 render_frame(bar, output);
150 }
151 }
147} 152}
148 153
149void bar_run(struct swaybar *bar) { 154void bar_run(struct swaybar *bar) {
150 add_event(wl_display_get_fd(bar->display), POLLIN, display_in, bar); 155 add_event(wl_display_get_fd(bar->display), POLLIN, display_in, bar);
156 add_event(bar->ipc_event_socketfd, POLLIN, ipc_in, bar);
151 while (1) { 157 while (1) {
152 event_loop_poll(); 158 event_loop_poll();
153 } 159 }
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}