aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCalvin Lee <cyrus296@gmail.com>2017-11-15 13:16:21 -0700
committerCalvin Lee <cyrus296@gmail.com>2017-12-29 12:11:51 -0700
commit13b81f9fb91ee20a41ccdd955c2539d46ef6b6e1 (patch)
tree675e1fbd1e6500633c01e418a0b055cb3fe8d1db
parent87035380e33c7da10b53c6da713c56f3d89a1577 (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.h14
-rw-r--r--swaybar/tray/dbus.c10
-rw-r--r--swaybar/tray/sni.c30
-rw-r--r--swaybar/tray/tray.c10
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;