Fix Catching NewIcon Signal

The unique name was not copied out of the wire marshalled DBus message
data so `sni_uniq_cmp` would always match against junk data.
This commit is contained in:
Calvin Lee 2017-06-08 05:36:17 -07:00
parent 1451ee8fd1
commit 0a71aa6e97
2 changed files with 13 additions and 4 deletions

View file

@ -397,11 +397,16 @@ static void get_unique_name(struct StatusNotifierItem *item) {
return; return;
} }
char *unique_name;
if (!dbus_message_get_args(reply, NULL, if (!dbus_message_get_args(reply, NULL,
DBUS_TYPE_STRING, &item->unique_name, DBUS_TYPE_STRING, &unique_name,
DBUS_TYPE_INVALID)) { DBUS_TYPE_INVALID)) {
item->unique_name = NULL;
sway_log(L_ERROR, "Error parsing method args"); sway_log(L_ERROR, "Error parsing method args");
} else {
if (item->unique_name) {
free(item->unique_name);
}
item->unique_name = strdup(unique_name);
} }
dbus_message_unref(reply); dbus_message_unref(reply);
@ -434,14 +439,14 @@ struct StatusNotifierItem *sni_create(const char *name) {
return item; return item;
} }
/* Return true if `item` has a name of `str` */ /* Return 0 if `item` has a name of `str` */
int sni_str_cmp(const void *_item, const void *_str) { int sni_str_cmp(const void *_item, const void *_str) {
const struct StatusNotifierItem *item = _item; const struct StatusNotifierItem *item = _item;
const char *str = _str; const char *str = _str;
return strcmp(item->name, str); return strcmp(item->name, str);
} }
/* Returns true if `item` has a unique name of `str` */ /* Returns 0 if `item` has a unique name of `str` */
int sni_uniq_cmp(const void *_item, const void *_str) { int sni_uniq_cmp(const void *_item, const void *_str) {
const struct StatusNotifierItem *item = _item; const struct StatusNotifierItem *item = _item;
const char *str = _str; const char *str = _str;
@ -456,6 +461,9 @@ void sni_free(struct StatusNotifierItem *item) {
return; return;
} }
free(item->name); free(item->name);
if (item->unique_name) {
free(item->unique_name);
}
if (item->image) { if (item->image) {
cairo_surface_destroy(item->image); cairo_surface_destroy(item->image);
} }

View file

@ -179,6 +179,7 @@ static DBusHandlerResult signal_handler(DBusConnection *connection,
name = dbus_message_get_sender(message); name = dbus_message_get_sender(message);
if ((index = list_seq_find(tray->items, sni_uniq_cmp, name)) != -1) { if ((index = list_seq_find(tray->items, sni_uniq_cmp, name)) != -1) {
item = tray->items->items[index]; item = tray->items->items[index];
sway_log(L_INFO, "NewIcon signal from item %s", item->name);
get_icon(item); get_icon(item);
} }