diff options
| author | Calvin Lee <cyrus296@gmail.com> | 2017-11-15 13:16:21 -0700 |
|---|---|---|
| committer | Calvin Lee <cyrus296@gmail.com> | 2017-12-29 12:11:51 -0700 |
| commit | 13b81f9fb91ee20a41ccdd955c2539d46ef6b6e1 (patch) | |
| tree | 675e1fbd1e6500633c01e418a0b055cb3fe8d1db | |
| parent | 87035380e33c7da10b53c6da713c56f3d89a1577 (diff) | |
Fix `get_icon`
Property reply functions are now notified if there was an error with the
property instead of silent failure. Also issues in `get_item` were
resolved.
| -rw-r--r-- | include/swaybar/tray/dbus.h | 14 | ||||
| -rw-r--r-- | swaybar/tray/dbus.c | 10 | ||||
| -rw-r--r-- | swaybar/tray/sni.c | 30 | ||||
| -rw-r--r-- | swaybar/tray/tray.c | 10 |
4 files changed, 47 insertions, 17 deletions
diff --git a/include/swaybar/tray/dbus.h b/include/swaybar/tray/dbus.h index 125ce96f..c693e6f7 100644 --- a/include/swaybar/tray/dbus.h +++ b/include/swaybar/tray/dbus.h @@ -5,6 +5,13 @@ #include <dbus/dbus.h> extern DBusConnection *conn; +enum property_status { + PROP_EXISTS, /* Will give iter */ + PROP_ERROR, /* Will not give iter */ + PROP_BAD_DATA, /* Will not give iter */ + PROP_WRONG_SIG, /* Will give iter, please be careful */ +}; + /** * Checks the signature of the given iter against `sig`. Prefer to * `dbus_message_iter_get_signature` as this one frees the intermediate string. @@ -15,8 +22,9 @@ bool dbus_message_iter_check_signature(DBusMessageIter *iter, const char *sig); * Fetches the property and calls `callback` with a message iter pointing it. * Performs error handling and signature checking. * - * Returns: true if message is successfully sent (will not necessarily arrive) - * and false otherwise + * Returns: true if message is successfully sent and false otherwise. If there + * is an error getting a property, `callback` will still be run, but with + * `status` set to the error. * * NOTE: `expected_signature` must remain valid until the message reply is * received, please only use 'static signatures. @@ -26,7 +34,7 @@ bool dbus_get_prop_async(const char *destination, const char *iface, const char *prop, const char *expected_signature, - void(*callback)(DBusMessageIter *iter, void *data), + void(*callback)(DBusMessageIter *iter, void *data, enum property_status status), void *data); /** * Should be called in main loop to dispatch events diff --git a/swaybar/tray/dbus.c b/swaybar/tray/dbus.c index 4439fb83..08abf65c 100644 --- a/swaybar/tray/dbus.c +++ b/swaybar/tray/dbus.c @@ -138,7 +138,7 @@ static void dispatch_status(DBusConnection *connection, DBusDispatchStatus new_s struct async_prop_data { char const *sig; - void(*callback)(DBusMessageIter *, void *); + void(*callback)(DBusMessageIter *, void *, enum property_status); void *usr_data; }; @@ -160,6 +160,7 @@ static void get_prop_callback(DBusPendingCall *pending, void *_data) { DBUS_TYPE_INVALID); sway_log(L_INFO, "Failure to get property: %s", msg); + data->callback(NULL, data->usr_data, PROP_ERROR); goto bail; } @@ -169,16 +170,18 @@ static void get_prop_callback(DBusPendingCall *pending, void *_data) { dbus_message_iter_init(reply, &iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { sway_log(L_ERROR, "Property relpy type incorrect"); + data->callback(NULL, data->usr_data, PROP_BAD_DATA); goto bail; } dbus_message_iter_recurse(&iter, &variant); if (!dbus_message_iter_check_signature(&variant, data->sig)) { sway_log(L_INFO, "Property returned has incorrect signatue."); + data->callback(&variant, data->usr_data, PROP_WRONG_SIG); goto bail; } - data->callback(&variant, data->usr_data); + data->callback(&variant, data->usr_data, PROP_EXISTS); bail: if (reply) { @@ -199,7 +202,8 @@ bool dbus_message_iter_check_signature(DBusMessageIter *iter, const char *sig) { bool dbus_get_prop_async(const char *destination, const char *path, const char *iface, const char *prop, const char *expected_signature, - void(*callback)(DBusMessageIter *, void *), void *usr_data) { + void(*callback)(DBusMessageIter *, void *, enum property_status), + void *usr_data) { struct async_prop_data *data = malloc(sizeof(struct async_prop_data)); if (!data) { return false; 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) { } /* Gets the pixmap of an icon */ -static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { +static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data, enum property_status status) { + if (status != PROP_EXISTS) { + return; + } struct StatusNotifierItem *item = _data; DBusMessageIter d_struct; /* (iiay) */ - DBusMessageIter icon; /* ay */ + DBusMessageIter struct_items; + DBusMessageIter icon; if (dbus_message_iter_get_element_count(iter) == 0) { // Can't recurse if there are no items @@ -54,16 +58,17 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { } dbus_message_iter_recurse(iter, &d_struct); + dbus_message_iter_recurse(&d_struct, &struct_items); int width; - dbus_message_iter_get_basic(&d_struct, &width); - dbus_message_iter_next(&d_struct); + dbus_message_iter_get_basic(&struct_items, &width); + dbus_message_iter_next(&struct_items); int height; - dbus_message_iter_get_basic(&d_struct, &height); - dbus_message_iter_next(&d_struct); + dbus_message_iter_get_basic(&struct_items, &height); + dbus_message_iter_next(&struct_items); - int len = dbus_message_iter_get_element_count(&d_struct); + int len = dbus_message_iter_get_element_count(&struct_items); if (!len) { sway_log(L_ERROR, "No icon data"); @@ -76,7 +81,7 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { return; } - dbus_message_iter_recurse(&d_struct, &icon); + dbus_message_iter_recurse(&struct_items, &icon); int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); // FIXME support a variable stride @@ -131,9 +136,16 @@ static void reply_icon(DBusMessageIter *iter /* a(iiay) */, void *_data) { } /* Get an icon by its name */ -static void reply_icon_name(DBusMessageIter *iter, void *_data) { +static void reply_icon_name(DBusMessageIter *iter, void *_data, enum property_status status) { struct StatusNotifierItem *item = _data; + if (status != PROP_EXISTS) { + dbus_get_prop_async(item->name, item->object_path, + (item->kde_special_snowflake ? KDE_IFACE : FD_IFACE), + "IconPixmap", "a(iiay)", reply_icon, item); + return; + } + char *icon_name; dbus_message_iter_get_basic(iter, &icon_name); diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index 89e7c3e2..3c5492f7 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c @@ -38,7 +38,10 @@ static void register_host(char *name) { dbus_message_unref(message); } -static void get_items_reply(DBusMessageIter *iter, void *_data) { +static void get_items_reply(DBusMessageIter *iter, void *_data, enum property_status status) { + if (status != PROP_EXISTS) { + return; + } DBusMessageIter array; // O(n) function, could be faster dynamically reading values @@ -60,7 +63,10 @@ static void get_items_reply(DBusMessageIter *iter, void *_data) { } } } -static void get_obj_items_reply(DBusMessageIter *iter, void *_data) { +static void get_obj_items_reply(DBusMessageIter *iter, void *_data, enum property_status status) { + if (status != PROP_EXISTS) { + return; + } DBusMessageIter array; DBusMessageIter dstruct; |
