diff options
author | Ian Fan <ianfan0@gmail.com> | 2018-12-17 14:08:16 +0000 |
---|---|---|
committer | Ian Fan <ianfan0@gmail.com> | 2018-12-31 20:40:18 +0000 |
commit | 371089f62c2894ff55478c2a4298505e3ed12f3f (patch) | |
tree | aa2029f0a2ecf39ee4016d2761b17b2b51dfd838 /swaybar/tray/tray.c | |
parent | swaybar: draw a sad face if SNI has no icon (diff) | |
download | sway-371089f62c2894ff55478c2a4298505e3ed12f3f.tar.gz sway-371089f62c2894ff55478c2a4298505e3ed12f3f.tar.zst sway-371089f62c2894ff55478c2a4298505e3ed12f3f.zip |
swaybar: handle new and lost StatusNotifierWatcher
Diffstat (limited to 'swaybar/tray/tray.c')
-rw-r--r-- | swaybar/tray/tray.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index f186ed86..acc300af 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c | |||
@@ -12,6 +12,27 @@ | |||
12 | #include "list.h" | 12 | #include "list.h" |
13 | #include "log.h" | 13 | #include "log.h" |
14 | 14 | ||
15 | static int handle_lost_watcher(sd_bus_message *msg, | ||
16 | void *data, sd_bus_error *error) { | ||
17 | char *service, *old_owner, *new_owner; | ||
18 | int ret = sd_bus_message_read(msg, "sss", &service, &old_owner, &new_owner); | ||
19 | if (ret < 0) { | ||
20 | wlr_log(WLR_ERROR, "Failed to parse owner change message: %s", strerror(-ret)); | ||
21 | return ret; | ||
22 | } | ||
23 | |||
24 | if (!*new_owner) { | ||
25 | struct swaybar_tray *tray = data; | ||
26 | if (strcmp(service, "org.freedesktop.StatusNotifierWatcher") == 0) { | ||
27 | tray->watcher_xdg = create_watcher("freedesktop", tray->bus); | ||
28 | } else if (strcmp(service, "org.kde.StatusNotifierWatcher") == 0) { | ||
29 | tray->watcher_kde = create_watcher("kde", tray->bus); | ||
30 | } | ||
31 | } | ||
32 | |||
33 | return 0; | ||
34 | } | ||
35 | |||
15 | struct swaybar_tray *create_tray(struct swaybar *bar) { | 36 | struct swaybar_tray *create_tray(struct swaybar *bar) { |
16 | wlr_log(WLR_DEBUG, "Initializing tray"); | 37 | wlr_log(WLR_DEBUG, "Initializing tray"); |
17 | 38 | ||
@@ -33,6 +54,14 @@ struct swaybar_tray *create_tray(struct swaybar *bar) { | |||
33 | tray->watcher_xdg = create_watcher("freedesktop", tray->bus); | 54 | tray->watcher_xdg = create_watcher("freedesktop", tray->bus); |
34 | tray->watcher_kde = create_watcher("kde", tray->bus); | 55 | tray->watcher_kde = create_watcher("kde", tray->bus); |
35 | 56 | ||
57 | ret = sd_bus_match_signal(bus, NULL, "org.freedesktop.DBus", | ||
58 | "/org/freedesktop/DBus", "org.freedesktop.DBus", | ||
59 | "NameOwnerChanged", handle_lost_watcher, tray); | ||
60 | if (ret < 0) { | ||
61 | wlr_log(WLR_ERROR, "Failed to subscribe to unregistering events: %s", | ||
62 | strerror(-ret)); | ||
63 | } | ||
64 | |||
36 | tray->items = create_list(); | 65 | tray->items = create_list(); |
37 | 66 | ||
38 | init_host(&tray->host_xdg, "freedesktop", tray); | 67 | init_host(&tray->host_xdg, "freedesktop", tray); |