diff options
-rw-r--r-- | swaybar/tray/tray.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index d5fb3ea9..0a4f2955 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c @@ -1,19 +1,48 @@ #include <cairo.h> #include <stdint.h> #include <stdlib.h> +#include <string.h> #include "swaybar/bar.h" #include "swaybar/tray/tray.h" #include "log.h" struct swaybar_tray *create_tray(struct swaybar *bar) { wlr_log(WLR_DEBUG, "Initializing tray"); - return NULL; + + sd_bus *bus; + int ret = sd_bus_open_user(&bus); + if (ret < 0) { + wlr_log(WLR_ERROR, "Failed to connect to user bus: %s", strerror(-ret)); + return NULL; + } + + struct swaybar_tray *tray = calloc(1, sizeof(struct swaybar_tray)); + if (!tray) { + return NULL; + } + tray->bar = bar; + tray->bus = bus; + tray->fd = sd_bus_get_fd(tray->bus); + return tray; } void destroy_tray(struct swaybar_tray *tray) { + if (!tray) { + return; + } + sd_bus_flush_close_unref(tray->bus); + free(tray); } void tray_in(int fd, short mask, void *data) { + sd_bus *bus = data; + int ret; + while ((ret = sd_bus_process(bus, NULL)) > 0) { + // This space intentionally left blank + } + if (ret < 0) { + wlr_log(WLR_ERROR, "Failed to process bus: %s", strerror(-ret)); + } } uint32_t render_tray(cairo_t *cairo, struct swaybar_output *output, double *x) { |