diff options
author | Ian Fan <ianfan0@gmail.com> | 2019-02-16 11:01:15 +0000 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2019-02-16 21:49:16 +0100 |
commit | 26d6360febeb364a9c7e20844ad03c796e4f08c3 (patch) | |
tree | 9d2f0ec0189ffb443fffd24465c93e88c6a1adc4 /swaybar | |
parent | cfacf85755849997ae3b25d2fa241378e0ebf0b9 (diff) |
tray: when a service is lost, remove all matching items
Before, only the first matching item would be removed, which could leave
stale items.
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/tray/watcher.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/swaybar/tray/watcher.c b/swaybar/tray/watcher.c index 38151071..432837d0 100644 --- a/swaybar/tray/watcher.c +++ b/swaybar/tray/watcher.c @@ -18,10 +18,6 @@ static int cmp_id(const void *item, const void *cmp_to) { return strcmp(item, cmp_to); } -static int cmp_service(const void *item, const void *cmp_to) { - return strncmp(item, cmp_to, strlen(cmp_to)); -} - static int handle_lost_service(sd_bus_message *msg, void *data, sd_bus_error *error) { char *service, *old_owner, *new_owner; @@ -33,18 +29,23 @@ static int handle_lost_service(sd_bus_message *msg, if (!*new_owner) { struct swaybar_watcher *watcher = data; - int idx = list_seq_find(watcher->items, - using_standard_protocol(watcher) ? cmp_id : cmp_service, service); - if (idx != -1) { + for (int idx = 0; idx < watcher->items->length; ++idx) { char *id = watcher->items->items[idx]; - sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id); - list_del(watcher->items, idx); - sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface, - "StatusNotifierItemUnregistered", "s", id); - free(id); + int cmp_res = using_standard_protocol(watcher) ? + cmp_id(id, service) : strncmp(id, service, strlen(service)); + if (cmp_res == 0) { + sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id); + list_del(watcher->items, idx--); + sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface, + "StatusNotifierItemUnregistered", "s", id); + free(id); + if (using_standard_protocol(watcher)) { + break; + } + } } - idx = list_seq_find(watcher->hosts, cmp_id, service); + int idx = list_seq_find(watcher->hosts, cmp_id, service); if (idx != -1) { sway_log(SWAY_DEBUG, "Unregistering Status Notifier Host '%s'", service); free(watcher->hosts->items[idx]); |