tray: when a service is lost, remove all matching items
Before, only the first matching item would be removed, which could leave stale items.
This commit is contained in:
parent
cfacf85755
commit
26d6360feb
|
@ -18,10 +18,6 @@ static int cmp_id(const void *item, const void *cmp_to) {
|
||||||
return strcmp(item, 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,
|
static int handle_lost_service(sd_bus_message *msg,
|
||||||
void *data, sd_bus_error *error) {
|
void *data, sd_bus_error *error) {
|
||||||
char *service, *old_owner, *new_owner;
|
char *service, *old_owner, *new_owner;
|
||||||
|
@ -33,18 +29,23 @@ static int handle_lost_service(sd_bus_message *msg,
|
||||||
|
|
||||||
if (!*new_owner) {
|
if (!*new_owner) {
|
||||||
struct swaybar_watcher *watcher = data;
|
struct swaybar_watcher *watcher = data;
|
||||||
int idx = list_seq_find(watcher->items,
|
for (int idx = 0; idx < watcher->items->length; ++idx) {
|
||||||
using_standard_protocol(watcher) ? cmp_id : cmp_service, service);
|
|
||||||
if (idx != -1) {
|
|
||||||
char *id = watcher->items->items[idx];
|
char *id = watcher->items->items[idx];
|
||||||
sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id);
|
int cmp_res = using_standard_protocol(watcher) ?
|
||||||
list_del(watcher->items, idx);
|
cmp_id(id, service) : strncmp(id, service, strlen(service));
|
||||||
sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
|
if (cmp_res == 0) {
|
||||||
"StatusNotifierItemUnregistered", "s", id);
|
sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id);
|
||||||
free(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) {
|
if (idx != -1) {
|
||||||
sway_log(SWAY_DEBUG, "Unregistering Status Notifier Host '%s'", service);
|
sway_log(SWAY_DEBUG, "Unregistering Status Notifier Host '%s'", service);
|
||||||
free(watcher->hosts->items[idx]);
|
free(watcher->hosts->items[idx]);
|
||||||
|
|
Loading…
Reference in a new issue