aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--swaybar/tray/tray.c31
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) {