diff options
| author | Calvin Lee <cyrus296@gmail.com> | 2017-10-25 12:49:34 -0600 |
|---|---|---|
| committer | Calvin Lee <cyrus296@gmail.com> | 2017-12-29 12:11:51 -0700 |
| commit | 4231061e4d80a19a6f2dde0bfb63b7a7b277bd4a (patch) | |
| tree | ca5a21c04d5f30aeb156f5ef2541a2c667861652 | |
| parent | bd121999cab98b8deefbbff4f39460c08071024e (diff) | |
Allow multiple object paths for each connection
| -rw-r--r-- | include/swaybar/tray/sni.h | 11 | ||||
| -rw-r--r-- | swaybar/tray/sni.c | 11 | ||||
| -rw-r--r-- | swaybar/tray/tray.c | 7 |
3 files changed, 27 insertions, 2 deletions
diff --git a/include/swaybar/tray/sni.h b/include/swaybar/tray/sni.h index 22991e53..95c10b9f 100644 --- a/include/swaybar/tray/sni.h +++ b/include/swaybar/tray/sni.h @@ -54,6 +54,17 @@ int sni_str_cmp(const void *item, const void *str); */ int sni_uniq_cmp(const void *item, const void *str); + +struct ObjName { + const void *obj_path; + const void *name; +}; +/** + * Returns 0 if `item` has a name of `obj_name->name` and object path of + * `obj_name->obj_path`. + */ +int sni_obj_name_cmp(const void *item, const void *obj_name); + /** * Gets an icon for the given item if found. * diff --git a/swaybar/tray/sni.c b/swaybar/tray/sni.c index 44d7ad91..7e09f414 100644 --- a/swaybar/tray/sni.c +++ b/swaybar/tray/sni.c @@ -484,6 +484,17 @@ int sni_uniq_cmp(const void *_item, const void *_str) { } return strcmp(item->unique_name, str); } +int sni_obj_name_cmp(const void *_item, const void *_obj_name) { + const struct StatusNotifierItem *item = _item; + const struct ObjName *obj_name = _obj_name; + + if (strcmp(item->name, obj_name->name) == 0 && + strcmp(item->object_path, obj_name->obj_path) == 0) { + return 0; + } + return 1; +} + void sni_free(struct StatusNotifierItem *item) { if (!item) { return; diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index 01532e1c..5cc7e902 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c @@ -291,8 +291,11 @@ static DBusHandlerResult signal_handler(DBusConnection *connection, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - // TODO allow one unique name to have multiple items - if (list_seq_find(tray->items, sni_str_cmp, unique_name) == -1) { + struct ObjName obj_name = { + object_path, + unique_name, + }; + if (list_seq_find(tray->items, sni_obj_name_cmp, &obj_name) == -1) { struct StatusNotifierItem *item = sni_create_from_obj_path(unique_name, object_path); |
