aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCalvin Lee <cyrus296@gmail.com>2017-10-25 12:49:34 -0600
committerCalvin Lee <cyrus296@gmail.com>2017-12-29 12:11:51 -0700
commit4231061e4d80a19a6f2dde0bfb63b7a7b277bd4a (patch)
treeca5a21c04d5f30aeb156f5ef2541a2c667861652
parentbd121999cab98b8deefbbff4f39460c08071024e (diff)
Allow multiple object paths for each connection
-rw-r--r--include/swaybar/tray/sni.h11
-rw-r--r--swaybar/tray/sni.c11
-rw-r--r--swaybar/tray/tray.c7
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);