tray: complete watcher d-bus interface

This commit is contained in:
Ian Fan 2020-04-02 13:24:18 +01:00
parent 1be66c98f2
commit 83e7d68e31

View file

@ -39,6 +39,9 @@ static int handle_lost_service(sd_bus_message *msg,
sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface, sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
"StatusNotifierItemUnregistered", "s", id); "StatusNotifierItemUnregistered", "s", id);
free(id); free(id);
sd_bus_emit_properties_changed(watcher->bus, obj_path,
watcher->interface, "RegisteredStatusNotifierItems", NULL);
if (using_standard_protocol(watcher)) { if (using_standard_protocol(watcher)) {
break; break;
} }
@ -50,6 +53,11 @@ static int handle_lost_service(sd_bus_message *msg,
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]);
list_del(watcher->hosts, idx); list_del(watcher->hosts, idx);
if (watcher->hosts->length == 0) {
sd_bus_emit_properties_changed(watcher->bus, obj_path,
watcher->interface, "IsStatusNotifierHostRegistered", NULL);
}
} }
} }
@ -86,6 +94,9 @@ static int register_sni(sd_bus_message *msg, void *data, sd_bus_error *error) {
list_add(watcher->items, id); list_add(watcher->items, id);
sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface, sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
"StatusNotifierItemRegistered", "s", id); "StatusNotifierItemRegistered", "s", id);
sd_bus_emit_properties_changed(watcher->bus, obj_path,
watcher->interface, "RegisteredStatusNotifierItems", NULL);
} else { } else {
sway_log(SWAY_DEBUG, "Status Notifier Item '%s' already registered", id); sway_log(SWAY_DEBUG, "Status Notifier Item '%s' already registered", id);
free(id); free(id);
@ -108,6 +119,11 @@ static int register_host(sd_bus_message *msg, void *data, sd_bus_error *error) {
list_add(watcher->hosts, strdup(service)); list_add(watcher->hosts, strdup(service));
sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface, sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
"StatusNotifierHostRegistered", "s", service); "StatusNotifierHostRegistered", "s", service);
if (watcher->hosts->length == 1) {
sd_bus_emit_properties_changed(watcher->bus, obj_path,
watcher->interface, "IsStatusNotifierHostRegistered", NULL);
}
} else { } else {
sway_log(SWAY_DEBUG, "Status Notifier Host '%s' already registered", service); sway_log(SWAY_DEBUG, "Status Notifier Host '%s' already registered", service);
} }
@ -135,10 +151,10 @@ static int is_host_registered(sd_bus *bus, const char *obj_path,
static const sd_bus_vtable watcher_vtable[] = { static const sd_bus_vtable watcher_vtable[] = {
SD_BUS_VTABLE_START(0), SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("RegisterStatusNotifierItem", "s", "", register_sni, SD_BUS_METHOD_WITH_NAMES("RegisterStatusNotifierItem", "s", SD_BUS_PARAM(service),
SD_BUS_VTABLE_UNPRIVILEGED), "", /* void */, register_sni, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_METHOD("RegisterStatusNotifierHost", "s", "", register_host, SD_BUS_METHOD_WITH_NAMES("RegisterStatusNotifierHost", "s", SD_BUS_PARAM(service),
SD_BUS_VTABLE_UNPRIVILEGED), "", /* void */, register_host, SD_BUS_VTABLE_UNPRIVILEGED),
SD_BUS_PROPERTY("RegisteredStatusNotifierItems", "as", get_registered_snis, SD_BUS_PROPERTY("RegisteredStatusNotifierItems", "as", get_registered_snis,
0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
SD_BUS_PROPERTY("IsStatusNotifierHostRegistered", "b", is_host_registered, SD_BUS_PROPERTY("IsStatusNotifierHostRegistered", "b", is_host_registered,
@ -146,15 +162,16 @@ static const sd_bus_vtable watcher_vtable[] = {
SD_BUS_PROPERTY("ProtocolVersion", "i", NULL, SD_BUS_PROPERTY("ProtocolVersion", "i", NULL,
offsetof(struct swaybar_watcher, version), offsetof(struct swaybar_watcher, version),
SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_SIGNAL("StatusNotifierItemRegistered", "s", 0), SD_BUS_SIGNAL_WITH_NAMES("StatusNotifierItemRegistered", "s",
SD_BUS_SIGNAL("StatusNotifierItemUnregistered", "s", 0), SD_BUS_PARAM(service), 0),
SD_BUS_SIGNAL_WITH_NAMES("StatusNotifierItemUnregistered", "s",
SD_BUS_PARAM(service), 0),
SD_BUS_SIGNAL("StatusNotifierHostRegistered", NULL, 0), SD_BUS_SIGNAL("StatusNotifierHostRegistered", NULL, 0),
SD_BUS_VTABLE_END SD_BUS_VTABLE_END
}; };
struct swaybar_watcher *create_watcher(char *protocol, sd_bus *bus) { struct swaybar_watcher *create_watcher(char *protocol, sd_bus *bus) {
struct swaybar_watcher *watcher = struct swaybar_watcher *watcher = calloc(1, sizeof(struct swaybar_watcher));
calloc(1, sizeof(struct swaybar_watcher));
if (!watcher) { if (!watcher) {
return NULL; return NULL;
} }
@ -183,8 +200,8 @@ struct swaybar_watcher *create_watcher(char *protocol, sd_bus *bus) {
ret = sd_bus_request_name(bus, watcher->interface, 0); ret = sd_bus_request_name(bus, watcher->interface, 0);
if (ret < 0) { if (ret < 0) {
if (-ret == EEXIST) { if (-ret == EEXIST) {
sway_log(SWAY_DEBUG, "Failed to acquire service name '%s':" sway_log(SWAY_DEBUG, "Failed to acquire service name '%s': "
"another tray is already running", watcher->interface); "another watcher is already running", watcher->interface);
} else { } else {
sway_log(SWAY_ERROR, "Failed to acquire service name '%s': %s", sway_log(SWAY_ERROR, "Failed to acquire service name '%s': %s",
watcher->interface, strerror(-ret)); watcher->interface, strerror(-ret));