diff options
Diffstat (limited to 'swaybar/tray/sni.c')
-rw-r--r-- | swaybar/tray/sni.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/swaybar/tray/sni.c b/swaybar/tray/sni.c index 200422da..98934e11 100644 --- a/swaybar/tray/sni.c +++ b/swaybar/tray/sni.c | |||
@@ -41,11 +41,15 @@ void sni_icon_ref_free(struct sni_icon_ref *sni_ref) { | |||
41 | } | 41 | } |
42 | 42 | ||
43 | /* Gets the pixmap of an icon */ | 43 | /* Gets the pixmap of an icon */ |
44 | static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { | 44 | static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data, enum property_status status) { |
45 | if (status != PROP_EXISTS) { | ||
46 | return; | ||
47 | } | ||
45 | struct StatusNotifierItem *item = _data; | 48 | struct StatusNotifierItem *item = _data; |
46 | 49 | ||
47 | DBusMessageIter d_struct; /* (iiay) */ | 50 | DBusMessageIter d_struct; /* (iiay) */ |
48 | DBusMessageIter icon; /* ay */ | 51 | DBusMessageIter struct_items; |
52 | DBusMessageIter icon; | ||
49 | 53 | ||
50 | if (dbus_message_iter_get_element_count(iter) == 0) { | 54 | if (dbus_message_iter_get_element_count(iter) == 0) { |
51 | // Can't recurse if there are no items | 55 | // Can't recurse if there are no items |
@@ -54,16 +58,17 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { | |||
54 | } | 58 | } |
55 | 59 | ||
56 | dbus_message_iter_recurse(iter, &d_struct); | 60 | dbus_message_iter_recurse(iter, &d_struct); |
61 | dbus_message_iter_recurse(&d_struct, &struct_items); | ||
57 | 62 | ||
58 | int width; | 63 | int width; |
59 | dbus_message_iter_get_basic(&d_struct, &width); | 64 | dbus_message_iter_get_basic(&struct_items, &width); |
60 | dbus_message_iter_next(&d_struct); | 65 | dbus_message_iter_next(&struct_items); |
61 | 66 | ||
62 | int height; | 67 | int height; |
63 | dbus_message_iter_get_basic(&d_struct, &height); | 68 | dbus_message_iter_get_basic(&struct_items, &height); |
64 | dbus_message_iter_next(&d_struct); | 69 | dbus_message_iter_next(&struct_items); |
65 | 70 | ||
66 | int len = dbus_message_iter_get_element_count(&d_struct); | 71 | int len = dbus_message_iter_get_element_count(&struct_items); |
67 | 72 | ||
68 | if (!len) { | 73 | if (!len) { |
69 | sway_log(L_ERROR, "No icon data"); | 74 | sway_log(L_ERROR, "No icon data"); |
@@ -76,7 +81,7 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { | |||
76 | return; | 81 | return; |
77 | } | 82 | } |
78 | 83 | ||
79 | dbus_message_iter_recurse(&d_struct, &icon); | 84 | dbus_message_iter_recurse(&struct_items, &icon); |
80 | 85 | ||
81 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); | 86 | int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); |
82 | // FIXME support a variable stride | 87 | // FIXME support a variable stride |
@@ -131,9 +136,16 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { | |||
131 | } | 136 | } |
132 | 137 | ||
133 | /* Get an icon by its name */ | 138 | /* Get an icon by its name */ |
134 | static void reply_icon_name(DBusMessageIter *iter, void *_data) { | 139 | static void reply_icon_name(DBusMessageIter *iter, void *_data, enum property_status status) { |
135 | struct StatusNotifierItem *item = _data; | 140 | struct StatusNotifierItem *item = _data; |
136 | 141 | ||
142 | if (status != PROP_EXISTS) { | ||
143 | dbus_get_prop_async(item->name, item->object_path, | ||
144 | (item->kde_special_snowflake ? KDE_IFACE : FD_IFACE), | ||
145 | "IconPixmap", "a(iiay)", reply_icon, item); | ||
146 | return; | ||
147 | } | ||
148 | |||
137 | char *icon_name; | 149 | char *icon_name; |
138 | dbus_message_iter_get_basic(iter, &icon_name); | 150 | dbus_message_iter_get_basic(iter, &icon_name); |
139 | 151 | ||