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 | |
parent | Implement workspace button rendering (diff) | |
download | sway-86ba0fc15d7615b09f0279616d538af5c23bc551.tar.gz sway-86ba0fc15d7615b09f0279616d538af5c23bc551.tar.zst sway-86ba0fc15d7615b09f0279616d538af5c23bc551.zip |
Re-render bar on IPC updates
-rw-r--r-- | include/swaybar/ipc.h | 3 | ||||
-rw-r--r-- | swaybar/bar.c | 8 | ||||
-rw-r--r-- | swaybar/ipc.c | 46 |
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 | ||
5 | void ipc_initialize(struct swaybar *bar, const char *bar_id); | 6 | void ipc_initialize(struct swaybar *bar, const char *bar_id); |
6 | void handle_ipc_event(struct swaybar *bar); | 7 | bool handle_ipc_event(struct swaybar *bar); |
7 | void ipc_get_workspaces(struct swaybar *bar); | 8 | void 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 | ||
144 | static void ipc_in(int fd, short mask, void *_bar) { | 144 | static 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 | ||
149 | void bar_run(struct swaybar *bar) { | 154 | void 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 | ||
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 | } |