2013-01-03 14:07:26 -08:00
|
|
|
#include "e_mod_notifier_host_private.h"
|
|
|
|
|
|
|
|
#define WATCHER_BUS "org.kde.StatusNotifierWatcher"
|
|
|
|
#define WATCHER_PATH "/StatusNotifierWatcher"
|
|
|
|
#define WATCHER_IFACE "org.kde.StatusNotifierWatcher"
|
|
|
|
|
|
|
|
#define ITEM_IFACE "org.kde.StatusNotifierItem"
|
|
|
|
|
|
|
|
#define HOST_REGISTRER "/bla" //TODO check what watcher expect we send to him
|
|
|
|
|
2014-03-13 09:40:27 -07:00
|
|
|
#undef ERR
|
|
|
|
#define ERR(...) fprintf(stderr, __VA_ARGS__)
|
|
|
|
|
2013-01-03 14:07:33 -08:00
|
|
|
extern const char *Category_Names[];
|
2013-01-03 14:07:26 -08:00
|
|
|
extern const char *Status_Names[];
|
|
|
|
|
|
|
|
typedef struct _Notifier_Host_Data {
|
|
|
|
Instance_Notifier_Host *host_inst;
|
|
|
|
void *data;
|
|
|
|
} Notifier_Host_Data;
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
service_string_parse(const char *item, const char **path, const char **bus_id)
|
|
|
|
{
|
2014-05-08 13:57:26 -07:00
|
|
|
const char *p;
|
|
|
|
|
|
|
|
p = strchr(item, '/');
|
|
|
|
if (!p) return EINA_FALSE;
|
|
|
|
*path = eina_stringshare_add(p);
|
|
|
|
*bus_id = eina_stringshare_add_length(item, p - item);
|
|
|
|
return EINA_TRUE;
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Notifier_Item *
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_find(const char *path, const char *bus_id, Context_Notifier_Host *ctx)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item;
|
2013-01-09 14:38:21 -08:00
|
|
|
EINA_INLIST_FOREACH(ctx->item_list, item)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
if (item->bus_id == bus_id && item->path == path)
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2013-01-03 14:07:33 -08:00
|
|
|
id_find(const char *s, const char *names[])
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
unsigned i;
|
2013-01-03 14:07:33 -08:00
|
|
|
|
|
|
|
for (i = 0; names[i]; i++)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
2013-01-03 14:07:33 -08:00
|
|
|
if (!strcmp(s, names[i]))
|
|
|
|
return i;
|
|
|
|
}
|
2013-01-03 14:07:26 -08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-09-22 15:38:34 -07:00
|
|
|
static void
|
|
|
|
icon_pixmap_deserialize(Eldbus_Message_Iter *variant, uint32_t **data, int *w, int *h)
|
|
|
|
{
|
|
|
|
Eldbus_Message_Iter *iter, *struc;
|
2015-10-14 03:18:41 -07:00
|
|
|
int tmpw, tmph;
|
2015-09-22 15:38:34 -07:00
|
|
|
|
|
|
|
*data = NULL;
|
|
|
|
*w = *h = 0;
|
|
|
|
eldbus_message_iter_arguments_get(variant, "a(iiay)", &iter);
|
|
|
|
while (eldbus_message_iter_get_and_next(iter, 'r', &struc))
|
|
|
|
{
|
|
|
|
Eldbus_Message_Iter *imgdata;
|
|
|
|
|
2015-10-14 03:18:41 -07:00
|
|
|
if (eldbus_message_iter_arguments_get(struc, "iiay", &tmpw, &tmph, &imgdata))
|
2015-09-22 15:38:34 -07:00
|
|
|
{
|
|
|
|
uint32_t *img;
|
|
|
|
int len;
|
|
|
|
|
2015-10-14 03:18:41 -07:00
|
|
|
//only take this img if it has a higher resolution
|
|
|
|
if (tmpw > *w || tmph > *h)
|
2015-09-22 15:38:34 -07:00
|
|
|
{
|
2015-10-14 03:18:41 -07:00
|
|
|
*w = tmpw;
|
|
|
|
*h = tmph;
|
|
|
|
if (eldbus_message_iter_fixed_array_get(imgdata, 'y', &img, &len))
|
|
|
|
{
|
|
|
|
unsigned int pos;
|
|
|
|
|
|
|
|
*data = malloc(len * sizeof(int));
|
|
|
|
for (pos = 0; pos < (unsigned int)len; pos++)
|
|
|
|
(*data)[pos] = eina_swap32(img[pos]);
|
|
|
|
}
|
2015-09-22 15:38:34 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-03 14:07:26 -08:00
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
item_prop_get(void *data, const void *key, Eldbus_Message_Iter *var)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
|
|
|
|
if (!strcmp(key, "Category"))
|
|
|
|
{
|
|
|
|
const char *category;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &category);
|
2013-01-03 14:07:33 -08:00
|
|
|
item->category = id_find(category, Category_Names);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
else if (!strcmp(key, "IconName"))
|
|
|
|
{
|
|
|
|
const char *name;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &name);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->icon_name, name);
|
|
|
|
}
|
2015-09-22 15:38:34 -07:00
|
|
|
else if (!strcmp(key, "IconPixmap"))
|
|
|
|
{
|
|
|
|
free(item->imgdata);
|
|
|
|
icon_pixmap_deserialize(var, &item->imgdata, &item->imgw, &item->imgh);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "AttentionIconPixmap"))
|
|
|
|
{
|
|
|
|
free(item->attnimgdata);
|
|
|
|
icon_pixmap_deserialize(var, &item->attnimgdata, &item->attnimgw, &item->attnimgh);
|
|
|
|
}
|
2013-01-03 14:07:26 -08:00
|
|
|
else if (!strcmp(key, "AttentionIconName"))
|
|
|
|
{
|
|
|
|
const char *name;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &name);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->attention_icon_name, name);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "IconThemePath"))
|
|
|
|
{
|
|
|
|
const char *path;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &path);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->icon_path, path);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Menu"))
|
|
|
|
{
|
|
|
|
const char *path;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "o", &path);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->menu_path, path);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Status"))
|
|
|
|
{
|
|
|
|
const char *status;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &status);
|
2013-01-03 14:07:33 -08:00
|
|
|
item->status = id_find(status, Status_Names);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Id"))
|
|
|
|
{
|
|
|
|
const char *id;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &id);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->id, id);
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Title"))
|
|
|
|
{
|
|
|
|
const char *title;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &title);
|
2013-01-03 14:07:26 -08:00
|
|
|
eina_stringshare_replace(&item->title, title);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
props_changed(void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *interface, *menu = item->menu_path;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *changed, *invalidate;
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "sa{sv}as", &interface, &changed, &invalidate))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error reading message");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_dict_iterate(changed, "sv", item_prop_get, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
|
|
|
|
if (menu != item->menu_path)
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Connection *conn = eldbus_object_connection_get(eldbus_proxy_object_get(item->proxy));
|
2013-01-03 14:07:40 -08:00
|
|
|
item->dbus_item = NULL;
|
2013-01-03 14:07:26 -08:00
|
|
|
e_dbusmenu_unload(item->menu_data);
|
2013-01-03 14:07:40 -08:00
|
|
|
item->menu_data = e_dbusmenu_load(conn, item->bus_id, item->menu_path,
|
|
|
|
item);
|
|
|
|
e_dbusmenu_update_cb_set(item->menu_data, systray_notifier_update_menu);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
props_get_all_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
const char *error, *error_name;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *dict;
|
2013-01-03 14:07:26 -08:00
|
|
|
Notifier_Item *item = data;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Connection *conn;
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (eldbus_message_error_get(msg, &error, &error_name))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("%s %s", error, error_name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "a{sv}", &dict))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error getting arguments.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_dict_iterate(dict, "sv", item_prop_get, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
|
|
|
|
if (!item->menu_path)
|
|
|
|
ERR("Notifier item %s dont have menu path.", item->menu_path);
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
conn = eldbus_object_connection_get(eldbus_proxy_object_get(item->proxy));
|
2013-01-03 14:07:26 -08:00
|
|
|
item->menu_data = e_dbusmenu_load(conn, item->bus_id, item->menu_path, item);
|
2013-01-03 14:07:40 -08:00
|
|
|
e_dbusmenu_update_cb_set(item->menu_data, systray_notifier_update_menu);
|
2013-01-03 14:07:26 -08:00
|
|
|
|
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2013-04-23 08:08:29 -07:00
|
|
|
basic_prop_get(const char *propname, void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *var;
|
2013-01-03 14:07:26 -08:00
|
|
|
const char *error, *error_msg;
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (eldbus_message_error_get(msg, &error, &error_msg))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("%s %s", error, error_msg);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "v", &var))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error reading message.");
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
item_prop_get(data, propname, var);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2015-09-22 15:38:34 -07:00
|
|
|
static void
|
|
|
|
attention_icon_pixmap_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
Eldbus_Message_Iter *variant;
|
|
|
|
|
|
|
|
if (!eldbus_message_arguments_get(msg, "v", &variant)) return;
|
|
|
|
free(item->attnimgdata);
|
|
|
|
icon_pixmap_deserialize(variant, &item->attnimgdata, &item->attnimgw, &item->attnimgh);
|
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
2013-01-03 14:07:26 -08:00
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
attention_icon_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *propname = "AttentionIconName";
|
|
|
|
basic_prop_get(propname, item, msg);
|
2015-09-22 15:38:34 -07:00
|
|
|
if ((!item->attention_icon_name) || (!item->attention_icon_name[0]))
|
|
|
|
eldbus_proxy_property_get(item->proxy, "AttentionIconPixmap", attention_icon_pixmap_get_cb, item);
|
|
|
|
else
|
|
|
|
systray_notifier_item_update(item);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
new_attention_icon_cb(void *data, const Eldbus_Message *msg EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_property_get(item->proxy, "AttentionIconName", attention_icon_get_cb, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
2015-09-22 15:38:34 -07:00
|
|
|
static void
|
|
|
|
icon_pixmap_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
Eldbus_Message_Iter *variant;
|
|
|
|
|
|
|
|
if (!eldbus_message_arguments_get(msg, "v", &variant)) return;
|
|
|
|
free(item->imgdata);
|
|
|
|
icon_pixmap_deserialize(variant, &item->imgdata, &item->imgw, &item->imgh);
|
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
2013-01-03 14:07:26 -08:00
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
icon_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *propname = "IconName";
|
|
|
|
basic_prop_get(propname, item, msg);
|
2015-09-22 15:38:34 -07:00
|
|
|
if ((!item->icon_name) || (!item->icon_name[0]))
|
|
|
|
eldbus_proxy_property_get(item->proxy, "IconPixmap", icon_pixmap_get_cb, item);
|
|
|
|
else
|
|
|
|
systray_notifier_item_update(item);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
new_icon_cb(void *data, const Eldbus_Message *msg EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_property_get(item->proxy, "IconName", icon_get_cb, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
title_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *propname = "Title";
|
|
|
|
basic_prop_get(propname, item, msg);
|
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
new_title_cb(void *data, const Eldbus_Message *msg EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_property_get(item->proxy, "Title", title_get_cb, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
new_icon_theme_path_cb(void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *path;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "s", &path))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error reading message.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
eina_stringshare_replace(&item->icon_path, path);
|
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
new_status_cb(void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Notifier_Item *item = data;
|
|
|
|
const char *status;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "s", &status))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error reading message.");
|
|
|
|
return;
|
|
|
|
}
|
2013-01-03 14:07:33 -08:00
|
|
|
item->status = id_find(status, Status_Names);
|
2013-01-03 14:07:26 -08:00
|
|
|
systray_notifier_item_update(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_add(const char *path, const char *bus_id, Context_Notifier_Host *ctx)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Proxy *proxy;
|
2015-10-14 13:30:41 -07:00
|
|
|
Notifier_Item_Cache *nic;
|
2013-01-03 14:07:26 -08:00
|
|
|
Notifier_Item *item = calloc(1, sizeof(Notifier_Item));
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Signal_Handler *s;
|
2013-01-03 14:07:26 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(item);
|
|
|
|
|
|
|
|
item->path = path;
|
|
|
|
item->bus_id = bus_id;
|
2013-01-09 14:38:21 -08:00
|
|
|
ctx->item_list = eina_inlist_append(ctx->item_list,
|
|
|
|
EINA_INLIST_GET(item));
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
proxy = eldbus_proxy_get(eldbus_object_get(ctx->conn, bus_id, path),
|
2013-01-03 14:07:26 -08:00
|
|
|
ITEM_IFACE);
|
|
|
|
item->proxy = proxy;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_property_get_all(proxy, props_get_all_cb, item);
|
|
|
|
s = eldbus_proxy_properties_changed_callback_add(proxy, props_changed, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2013-04-23 08:08:29 -07:00
|
|
|
s = eldbus_proxy_signal_handler_add(proxy, "NewAttentionIcon",
|
2013-01-03 14:07:26 -08:00
|
|
|
new_attention_icon_cb, item);
|
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2013-04-23 08:08:29 -07:00
|
|
|
s = eldbus_proxy_signal_handler_add(proxy, "NewIcon",
|
2013-01-03 14:07:26 -08:00
|
|
|
new_icon_cb, item);
|
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2013-04-23 08:08:29 -07:00
|
|
|
s = eldbus_proxy_signal_handler_add(proxy, "NewIconThemePath",
|
2013-01-03 14:07:26 -08:00
|
|
|
new_icon_theme_path_cb, item);
|
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2013-04-23 08:08:29 -07:00
|
|
|
s = eldbus_proxy_signal_handler_add(proxy, "NewStatus", new_status_cb, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2013-04-23 08:08:29 -07:00
|
|
|
s = eldbus_proxy_signal_handler_add(proxy, "NewTitle", new_title_cb, item);
|
2013-01-03 14:07:26 -08:00
|
|
|
item->signals = eina_list_append(item->signals, s);
|
2015-10-14 13:30:41 -07:00
|
|
|
if (eina_hash_find(systray_ctx_get()->config->items, bus_id)) return;
|
|
|
|
nic = malloc(sizeof(Notifier_Item_Cache));
|
|
|
|
nic->path = eina_stringshare_ref(path);
|
|
|
|
eina_hash_add(systray_ctx_get()->config->items, bus_id, nic);
|
|
|
|
e_config_save_queue();
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
notifier_item_add_cb(void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
const char *item, *bus, *path;
|
2013-01-09 14:38:21 -08:00
|
|
|
Context_Notifier_Host *ctx = data;
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "s", &item))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error getting arguments from msg.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
DBG("add %s", item);
|
|
|
|
if (service_string_parse(item, &path, &bus))
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_add(path, bus, ctx);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
notifier_item_del_cb(void *data, const Eldbus_Message *msg)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
const char *service, *bus, *path;
|
|
|
|
Notifier_Item *item;
|
2013-01-09 14:38:21 -08:00
|
|
|
Context_Notifier_Host *ctx = data;
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "s", &service))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error getting arguments from msg.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
DBG("service %s", service);
|
|
|
|
if (!service_string_parse(service, &path, &bus))
|
|
|
|
return;
|
2013-01-09 14:38:21 -08:00
|
|
|
item = notifier_item_find(path, bus, ctx);
|
2013-01-03 14:07:26 -08:00
|
|
|
if (item)
|
|
|
|
systray_notifier_item_free(item);
|
|
|
|
eina_stringshare_del(path);
|
|
|
|
eina_stringshare_del(bus);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
notifier_items_get_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
const char *item;
|
|
|
|
const char *error, *error_msg;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *array, *variant;
|
2013-01-09 14:38:21 -08:00
|
|
|
Context_Notifier_Host *ctx = data;
|
2013-01-03 14:07:26 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (eldbus_message_error_get(msg, &error, &error_msg))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("%s %s", error, error_msg);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "v", &variant))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error getting arguments from msg.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_iter_arguments_get(variant, "as", &array))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
ERR("Error getting arguments from msg.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
while (eldbus_message_iter_get_and_next(array, 's', &item))
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
const char *bus, *path;
|
|
|
|
if (service_string_parse(item, &path, &bus))
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_add(path, bus, ctx);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-03 14:07:45 -08:00
|
|
|
static void
|
2015-10-04 05:41:07 -07:00
|
|
|
item_registered_local_cb(void *data, const char *bus, const char *path)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
2013-01-09 14:38:21 -08:00
|
|
|
Context_Notifier_Host *ctx = data;
|
2015-10-04 05:41:07 -07:00
|
|
|
notifier_item_add(eina_stringshare_add(path), eina_stringshare_add(bus), ctx);
|
2013-01-03 14:07:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2015-10-04 05:41:07 -07:00
|
|
|
item_unregistered_local_cb(void *data, const char *bus, const char *path)
|
2013-01-03 14:07:45 -08:00
|
|
|
{
|
2013-01-09 14:38:21 -08:00
|
|
|
Context_Notifier_Host *ctx = data;
|
2013-01-03 14:07:45 -08:00
|
|
|
Notifier_Item *item;
|
2015-10-04 05:41:07 -07:00
|
|
|
Eina_Stringshare *s, *p;
|
2013-01-03 14:07:45 -08:00
|
|
|
|
2015-09-22 15:38:34 -07:00
|
|
|
s = eina_stringshare_add(bus);
|
2015-10-04 05:41:07 -07:00
|
|
|
p = eina_stringshare_add(path);
|
|
|
|
item = notifier_item_find(p, s, ctx);
|
2013-01-03 14:07:45 -08:00
|
|
|
if (item)
|
|
|
|
systray_notifier_item_free(item);
|
2015-09-22 15:38:34 -07:00
|
|
|
eina_stringshare_del(s);
|
2015-10-04 05:41:07 -07:00
|
|
|
eina_stringshare_del(p);
|
2013-01-03 14:07:45 -08:00
|
|
|
}
|
|
|
|
|
2015-10-14 13:55:23 -07:00
|
|
|
void
|
|
|
|
systray_notifier_dbus_init(Context_Notifier_Host *ctx)
|
2013-01-03 14:07:45 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Object *obj;
|
2013-01-03 14:07:45 -08:00
|
|
|
|
2015-10-14 13:55:23 -07:00
|
|
|
eldbus_init();
|
2013-01-03 14:07:45 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
obj = eldbus_object_get(ctx->conn, WATCHER_BUS, WATCHER_PATH);
|
|
|
|
ctx->watcher = eldbus_proxy_get(obj, WATCHER_IFACE);
|
|
|
|
eldbus_proxy_call(ctx->watcher, "RegisterStatusNotifierHost", NULL, NULL, -1, "s",
|
2013-01-03 14:07:26 -08:00
|
|
|
HOST_REGISTRER);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_property_get(ctx->watcher, "RegisteredStatusNotifierItems",
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_items_get_cb, ctx);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_signal_handler_add(ctx->watcher, "StatusNotifierItemRegistered",
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_add_cb, ctx);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_proxy_signal_handler_add(ctx->watcher, "StatusNotifierItemUnregistered",
|
2013-01-09 14:38:21 -08:00
|
|
|
notifier_item_del_cb, ctx);
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|
|
|
|
|
2013-01-09 14:38:21 -08:00
|
|
|
void systray_notifier_dbus_shutdown(Context_Notifier_Host *ctx)
|
2013-01-03 14:07:26 -08:00
|
|
|
{
|
|
|
|
Eina_Inlist *safe_list;
|
|
|
|
Notifier_Item *item;
|
|
|
|
|
2013-01-09 14:38:21 -08:00
|
|
|
ERR("systray_notifier_dbus_shutdown");
|
|
|
|
|
|
|
|
EINA_INLIST_FOREACH_SAFE(ctx->item_list, safe_list, item)
|
2013-01-03 14:07:26 -08:00
|
|
|
systray_notifier_item_free(item);
|
|
|
|
|
2013-01-09 14:38:21 -08:00
|
|
|
if (!ctx->watcher)
|
2013-01-03 14:07:45 -08:00
|
|
|
systray_notifier_dbus_watcher_stop();
|
|
|
|
else
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Object *obj;
|
|
|
|
obj = eldbus_proxy_object_get(ctx->watcher);
|
|
|
|
eldbus_proxy_unref(ctx->watcher);
|
|
|
|
eldbus_object_unref(obj);
|
2013-01-09 14:38:21 -08:00
|
|
|
ctx->watcher = NULL;
|
2013-01-03 14:07:45 -08:00
|
|
|
}
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_connection_unref(ctx->conn);
|
|
|
|
eldbus_shutdown();
|
2013-01-03 14:07:26 -08:00
|
|
|
}
|