2013-01-03 14:07:56 -08:00
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
typedef struct _Notification_Data
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Connection *conn;
|
|
|
|
Eldbus_Service_Interface *iface;
|
2013-01-11 02:34:29 -08:00
|
|
|
E_Notification_Notify_Cb notify_cb;
|
|
|
|
E_Notification_Close_Cb close_cb;
|
|
|
|
void *data;
|
2013-01-03 14:07:56 -08:00
|
|
|
const E_Notification_Server_Info *server_info;
|
|
|
|
} Notification_Data;
|
|
|
|
|
|
|
|
static Notification_Data *n_data = NULL;
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
hints_dict_iter(void *data, const void *key, Eldbus_Message_Iter *var)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
E_Notification_Notify *n = data;
|
|
|
|
if (!strcmp(key, "image-data") || !strcmp(key, "image_data"))
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *st, *data_iter;
|
2013-01-03 14:07:56 -08:00
|
|
|
int w, h, r, bits, channels;
|
|
|
|
Eina_Bool alpha;
|
|
|
|
unsigned char *raw_data;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_iter_arguments_get(var, "(iiibiiay)", &st))
|
2013-01-03 14:07:56 -08:00
|
|
|
return;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_iter_arguments_get(st, "iiibiiay", &w, &h, &r,
|
2013-01-03 14:07:56 -08:00
|
|
|
&alpha, &bits, &channels,
|
|
|
|
&data_iter))
|
|
|
|
return;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_fixed_array_get(data_iter, 'y', &raw_data,
|
2013-01-03 14:07:56 -08:00
|
|
|
&n->icon.raw.data_size);
|
|
|
|
n->icon.raw.width = w;
|
|
|
|
n->icon.raw.height = h;
|
|
|
|
n->icon.raw.has_alpha = alpha;
|
|
|
|
n->icon.raw.rowstride = r;
|
|
|
|
n->icon.raw.bits_per_sample = bits;
|
|
|
|
n->icon.raw.channels = channels;
|
|
|
|
n->icon.raw.data = malloc(sizeof(char) * n->icon.raw.data_size);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(n->icon.raw.data);
|
2013-01-11 02:34:29 -08:00
|
|
|
memcpy(n->icon.raw.data, raw_data, sizeof(char) * n->icon.raw.data_size);
|
2013-01-03 14:07:56 -08:00
|
|
|
}
|
|
|
|
else if (!strcmp(key, "urgency"))
|
|
|
|
{
|
|
|
|
unsigned char urgency;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "y", &urgency);
|
2013-01-03 14:07:56 -08:00
|
|
|
if (urgency < 3)
|
|
|
|
n->urgency = urgency;
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "image-path") || !strcmp(key, "image_path"))
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_get(var, "s", &n->icon.icon_path);
|
2013-01-03 14:07:56 -08:00
|
|
|
n->icon.icon_path = eina_stringshare_add(n->icon.icon_path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static Eldbus_Message *
|
|
|
|
notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
E_Notification_Notify *n;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *actions_iter, *hints_iter;
|
|
|
|
Eldbus_Message *reply;
|
2013-01-03 14:07:56 -08:00
|
|
|
|
|
|
|
if (!n_data->notify_cb)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
n = calloc(1, sizeof(E_Notification_Notify));
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(n, NULL);
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "susssasa{sv}i", &n->app_name,
|
2013-01-03 14:07:56 -08:00
|
|
|
&n->replaces_id, &n->icon.icon, &n->sumary,
|
|
|
|
&n->body, &actions_iter, &hints_iter,
|
|
|
|
&n->timeout))
|
|
|
|
{
|
|
|
|
ERR("Reading message.");
|
|
|
|
free(n);
|
|
|
|
return NULL;
|
|
|
|
}
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_dict_iterate(hints_iter, "sv", hints_dict_iter, n);
|
2013-01-03 14:07:56 -08:00
|
|
|
n->app_name = eina_stringshare_add(n->app_name);
|
|
|
|
n->icon.icon = eina_stringshare_add(n->icon.icon);
|
|
|
|
n->sumary = eina_stringshare_add(n->sumary);
|
|
|
|
n->body = eina_stringshare_add(n->body);
|
|
|
|
|
2013-01-03 14:08:00 -08:00
|
|
|
n->id = n_data->notify_cb(n_data->data, n);
|
2013-04-23 08:08:29 -07:00
|
|
|
reply = eldbus_message_method_return_new(msg);
|
|
|
|
eldbus_message_arguments_append(reply, "u", n->id);
|
2013-01-03 14:07:56 -08:00
|
|
|
return reply;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static Eldbus_Message *
|
|
|
|
close_notification_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
unsigned id;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "u", &id))
|
2013-01-03 14:07:56 -08:00
|
|
|
return NULL;
|
|
|
|
if (n_data->close_cb)
|
|
|
|
n_data->close_cb(n_data->data, id);
|
2013-04-23 08:08:29 -07:00
|
|
|
return eldbus_message_method_return_new(msg);
|
2013-01-03 14:07:56 -08:00
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static Eldbus_Message *
|
|
|
|
capabilities_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
|
2013-01-03 14:07:56 -08:00
|
|
|
int i;
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *main_iter, *array;
|
2013-01-03 14:07:56 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
main_iter = eldbus_message_iter_get(reply);
|
|
|
|
eldbus_message_iter_arguments_append(main_iter, "as", &array);
|
2013-01-03 14:07:56 -08:00
|
|
|
|
|
|
|
for (i = 0; n_data->server_info->capabilities[i]; i++)
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_append(array, "s",
|
2013-01-11 02:34:29 -08:00
|
|
|
n_data->server_info->capabilities[i]);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_container_close(main_iter, array);
|
2013-01-03 14:07:56 -08:00
|
|
|
return reply;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static Eldbus_Message *
|
|
|
|
server_info_cb(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
|
|
|
|
eldbus_message_arguments_append(reply, "ssss", n_data->server_info->name,
|
2013-01-03 14:07:56 -08:00
|
|
|
n_data->server_info->vendor,
|
|
|
|
n_data->server_info->version,
|
|
|
|
n_data->server_info->spec_version);
|
|
|
|
return reply;
|
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static const Eldbus_Method methods[] = {
|
2013-01-03 14:07:56 -08:00
|
|
|
{ "Notify",
|
2013-04-23 08:08:29 -07:00
|
|
|
ELDBUS_ARGS({"s", "app_name"}, {"u", "replaces_id"}, {"s", "app_icon"}, {"s", "summary"}, {"s", "body"}, {"as", "actions"}, {"a{sv}", "hints"}, {"i", "expire_timeout"}),
|
|
|
|
ELDBUS_ARGS({"u", "id"}), notify_cb },
|
|
|
|
{ "CloseNotification", ELDBUS_ARGS({"u", "id"}), NULL, close_notification_cb },
|
|
|
|
{ "GetCapabilities", NULL, ELDBUS_ARGS({"as", "capabilities"}),
|
2013-01-11 02:34:29 -08:00
|
|
|
capabilities_cb },
|
2013-01-03 14:08:00 -08:00
|
|
|
{ "GetServerInformation", NULL,
|
2013-04-23 08:08:29 -07:00
|
|
|
ELDBUS_ARGS({"s", "name"}, {"s", "vendor"}, {"s", "version"}, {"s", "spec_version"}),
|
2013-01-11 02:34:29 -08:00
|
|
|
server_info_cb },
|
2013-01-03 14:08:00 -08:00
|
|
|
{ }
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
SIGNAL_NOTIFICATION_CLOSED = 0,
|
|
|
|
SIGNAL_ACTION_INVOKED,
|
2013-01-03 14:07:56 -08:00
|
|
|
};
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static const Eldbus_Signal signals[] = {
|
2013-01-03 14:08:00 -08:00
|
|
|
[SIGNAL_NOTIFICATION_CLOSED] =
|
2013-04-23 08:08:29 -07:00
|
|
|
{ "NotificationClosed", ELDBUS_ARGS({"u", "id"}, {"u", "reason"}) },
|
2013-01-03 14:08:00 -08:00
|
|
|
[SIGNAL_ACTION_INVOKED] =
|
2013-04-23 08:08:29 -07:00
|
|
|
{ "ActionInvoked", ELDBUS_ARGS({"u", "id"}, {"s", "action_key"}) },
|
2013-01-03 14:08:00 -08:00
|
|
|
{ }
|
2013-01-03 14:07:56 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define PATH "/org/freedesktop/Notifications"
|
|
|
|
#define BUS "org.freedesktop.Notifications"
|
|
|
|
#define INTERFACE "org.freedesktop.Notifications"
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
static const Eldbus_Service_Interface_Desc desc = {
|
2013-01-03 14:07:56 -08:00
|
|
|
INTERFACE, methods, signals, NULL, NULL, NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
2013-01-03 14:08:00 -08:00
|
|
|
e_notification_server_register(const E_Notification_Server_Info *server_info, E_Notification_Notify_Cb n_cb, E_Notification_Close_Cb close_cb, const void *data)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(server_info, EINA_FALSE);
|
|
|
|
if (n_data)
|
|
|
|
return EINA_FALSE;
|
|
|
|
n_data = calloc(1, sizeof(Notification_Data));
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(n_data, EINA_FALSE);
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_init();
|
|
|
|
n_data->conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
|
|
|
|
n_data->iface = eldbus_service_interface_register(n_data->conn, PATH, &desc);
|
2013-01-03 14:08:00 -08:00
|
|
|
n_data->notify_cb = n_cb;
|
2013-01-03 14:07:56 -08:00
|
|
|
n_data->close_cb = close_cb;
|
2013-01-11 02:34:29 -08:00
|
|
|
n_data->data = (void *)data;
|
2013-01-03 14:07:56 -08:00
|
|
|
n_data->server_info = server_info;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_name_request(n_data->conn, BUS,
|
|
|
|
ELDBUS_NAME_REQUEST_FLAG_REPLACE_EXISTING, NULL, NULL);
|
2013-01-03 14:08:00 -08:00
|
|
|
|
2013-01-03 14:07:56 -08:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2013-01-03 14:08:00 -08:00
|
|
|
e_notification_server_unregister(void)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(n_data);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_service_interface_unregister(n_data->iface);
|
|
|
|
eldbus_connection_unref(n_data->conn);
|
|
|
|
eldbus_shutdown();
|
2013-01-03 14:07:56 -08:00
|
|
|
free(n_data);
|
|
|
|
n_data = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_notification_notify_free(E_Notification_Notify *notify)
|
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(notify);
|
|
|
|
eina_stringshare_del(notify->app_name);
|
|
|
|
eina_stringshare_del(notify->body);
|
|
|
|
eina_stringshare_del(notify->icon.icon);
|
|
|
|
if (notify->icon.icon_path)
|
|
|
|
eina_stringshare_del(notify->icon.icon_path);
|
|
|
|
eina_stringshare_del(notify->sumary);
|
|
|
|
if (notify->icon.raw.data)
|
|
|
|
free(notify->icon.raw.data);
|
|
|
|
free(notify);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2013-01-03 14:08:00 -08:00
|
|
|
e_notification_notify_close(E_Notification_Notify *notify, E_Notification_Notify_Closed_Reason reason)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN(n_data);
|
2013-01-03 14:08:00 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN(notify);
|
|
|
|
EINA_SAFETY_ON_FALSE_RETURN(reason <= E_NOTIFICATION_NOTIFY_CLOSED_REASON_UNDEFINED);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_service_signal_emit(n_data->iface, SIGNAL_NOTIFICATION_CLOSED,
|
2013-01-03 14:08:00 -08:00
|
|
|
notify->id, reason);
|
2013-01-03 14:07:56 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Evas_Object *
|
2013-01-03 14:08:00 -08:00
|
|
|
e_notification_notify_raw_image_get(E_Notification_Notify *notify, Evas *evas)
|
2013-01-03 14:07:56 -08:00
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
unsigned char *imgdata;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(notify, NULL);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(evas, NULL);
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(notify->icon.raw.data, NULL);
|
|
|
|
|
|
|
|
o = evas_object_image_filled_add(evas);
|
|
|
|
evas_object_resize(o, notify->icon.raw.width, notify->icon.raw.height);
|
|
|
|
evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
|
|
|
|
evas_object_image_alpha_set(o, notify->icon.raw.has_alpha);
|
|
|
|
evas_object_image_size_set(o, notify->icon.raw.width, notify->icon.raw.height);
|
|
|
|
|
|
|
|
imgdata = evas_object_image_data_get(o, EINA_TRUE);
|
|
|
|
EINA_SAFETY_ON_NULL_GOTO(imgdata, error);
|
|
|
|
|
|
|
|
if (notify->icon.raw.bits_per_sample == 8)
|
|
|
|
{
|
|
|
|
/* Although not specified.
|
|
|
|
* The data are very likely to come from a GdkPixbuf
|
|
|
|
* which align each row on a 4-bytes boundary when using RGB.
|
|
|
|
* And is RGBA otherwise. */
|
|
|
|
int x, y, *d;
|
|
|
|
unsigned char *s;
|
|
|
|
int rowstride = evas_object_image_stride_get(o);
|
|
|
|
|
|
|
|
for (y = 0; y < notify->icon.raw.height; y++)
|
|
|
|
{
|
|
|
|
s = notify->icon.raw.data + (y * notify->icon.raw.rowstride);
|
|
|
|
d = (int *)(imgdata + (y * rowstride));
|
|
|
|
|
|
|
|
for (x = 0; x < notify->icon.raw.width;
|
|
|
|
x++, s += notify->icon.raw.channels, d++)
|
|
|
|
{
|
|
|
|
if (notify->icon.raw.has_alpha)
|
|
|
|
*d = (s[3] << 24) | (s[0] << 16) | (s[1] << 8) | (s[2]);
|
|
|
|
else
|
|
|
|
*d = (0xff << 24) | (s[0] << 16) | (s[1] << 8) | (s[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
evas_object_image_data_update_add(o, 0, 0, notify->icon.raw.width,
|
|
|
|
notify->icon.raw.height);
|
|
|
|
evas_object_image_data_set(o, imgdata);
|
|
|
|
|
|
|
|
return o;
|
|
|
|
error:
|
|
|
|
evas_object_del(o);
|
|
|
|
return NULL;
|
|
|
|
}
|
2013-01-03 14:08:10 -08:00
|
|
|
|
|
|
|
/* client API */
|
|
|
|
|
|
|
|
static void
|
2013-04-23 08:08:29 -07:00
|
|
|
client_notify_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
|
2013-01-03 14:08:10 -08:00
|
|
|
{
|
|
|
|
unsigned id = 0;
|
2013-04-23 08:08:29 -07:00
|
|
|
E_Notification_Client_Send_Cb cb = eldbus_pending_data_del(pending, "cb");
|
|
|
|
Eldbus_Connection *conn = eldbus_pending_data_del(pending, "conn");
|
|
|
|
if (eldbus_message_error_get(msg, NULL, NULL))
|
2013-01-03 14:08:10 -08:00
|
|
|
goto end;
|
2013-04-23 08:08:29 -07:00
|
|
|
if (!eldbus_message_arguments_get(msg, "u", &id))
|
2013-01-03 14:08:10 -08:00
|
|
|
goto end;
|
|
|
|
end:
|
|
|
|
cb(data, id);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_connection_unref(conn);
|
|
|
|
eldbus_shutdown();
|
2013-01-03 14:08:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2013-01-03 14:08:19 -08:00
|
|
|
notification_client_dbus_send(E_Notification_Notify *notify, E_Notification_Client_Send_Cb cb, const void *data)
|
2013-01-03 14:08:10 -08:00
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Connection *conn;
|
|
|
|
Eldbus_Message *msg;
|
|
|
|
Eldbus_Message_Iter *main_iter, *actions, *hints;
|
|
|
|
Eldbus_Message_Iter *entry, *var;
|
|
|
|
Eldbus_Pending *p;
|
2013-01-03 14:08:10 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(notify, EINA_FALSE);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_init();
|
|
|
|
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
|
2013-01-03 14:08:10 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(conn, EINA_FALSE);
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
msg = eldbus_message_method_call_new(BUS, PATH, INTERFACE, "Notify");
|
2013-01-03 14:08:10 -08:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
|
|
|
|
|
|
|
|
//build message
|
2013-04-23 08:08:29 -07:00
|
|
|
main_iter = eldbus_message_iter_get(msg);
|
|
|
|
if (!eldbus_message_iter_arguments_append(main_iter, "susssas",
|
2013-01-11 02:34:29 -08:00
|
|
|
notify->app_name ? : "",
|
2013-01-03 14:08:10 -08:00
|
|
|
notify->replaces_id,
|
2013-01-11 02:34:29 -08:00
|
|
|
notify->icon.icon ? : "",
|
|
|
|
notify->sumary ? : "",
|
|
|
|
notify->body ? : "",
|
2013-01-03 14:08:10 -08:00
|
|
|
&actions))
|
|
|
|
goto error;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_container_close(main_iter, actions);
|
|
|
|
if (!eldbus_message_iter_arguments_append(main_iter, "a{sv}", &hints))
|
2013-01-03 14:08:10 -08:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
if (notify->icon.raw.data)
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
Eldbus_Message_Iter *st, *data_iter;
|
2013-01-03 14:08:10 -08:00
|
|
|
int i;
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_append(hints, "{sv}", &entry);
|
|
|
|
eldbus_message_iter_arguments_append(entry, "s", "image-data");
|
|
|
|
var = eldbus_message_iter_container_new(entry, 'v', "(iiibiiay)");
|
|
|
|
eldbus_message_iter_arguments_append(var, "(iiibiiay)", &st);
|
|
|
|
eldbus_message_iter_arguments_append(st, "iiibiiay",
|
2013-01-03 14:08:10 -08:00
|
|
|
notify->icon.raw.width,
|
|
|
|
notify->icon.raw.height,
|
|
|
|
notify->icon.raw.rowstride,
|
|
|
|
notify->icon.raw.has_alpha,
|
|
|
|
notify->icon.raw.bits_per_sample,
|
|
|
|
notify->icon.raw.channels,
|
|
|
|
&data_iter);
|
|
|
|
for (i = 0; i < notify->icon.raw.data_size; i++)
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_basic_append(data_iter, 'y', notify->icon.raw.data[i]);
|
|
|
|
eldbus_message_iter_container_close(st, data_iter);
|
|
|
|
eldbus_message_iter_container_close(var, st);
|
|
|
|
eldbus_message_iter_container_close(entry, var);
|
|
|
|
eldbus_message_iter_container_close(hints, entry);
|
2013-01-03 14:08:10 -08:00
|
|
|
}
|
|
|
|
if (notify->icon.icon_path)
|
|
|
|
{
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_append(hints, "{sv}", &entry);
|
|
|
|
eldbus_message_iter_arguments_append(entry, "s", "image-path");
|
|
|
|
var = eldbus_message_iter_container_new(entry, 'v', "s");
|
|
|
|
eldbus_message_iter_arguments_append(var, "s", notify->icon.icon_path);
|
|
|
|
eldbus_message_iter_container_close(entry, var);
|
|
|
|
eldbus_message_iter_container_close(hints, entry);
|
2013-01-03 14:08:10 -08:00
|
|
|
}
|
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_append(hints, "{sv}", &entry);
|
|
|
|
eldbus_message_iter_arguments_append(entry, "s", "urgency");
|
|
|
|
var = eldbus_message_iter_container_new(entry, 'v', "y");
|
|
|
|
eldbus_message_iter_arguments_append(var, "y", notify->urgency);
|
|
|
|
eldbus_message_iter_container_close(entry, var);
|
|
|
|
eldbus_message_iter_container_close(hints, entry);
|
2013-01-03 14:08:10 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_container_close(main_iter, hints);
|
2013-01-03 14:08:10 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_iter_arguments_append(main_iter, "i", notify->timeout);
|
2013-01-03 14:08:10 -08:00
|
|
|
|
2013-04-23 08:08:29 -07:00
|
|
|
p = eldbus_connection_send(conn, msg, client_notify_cb, data, 5000);
|
2013-01-03 14:08:10 -08:00
|
|
|
EINA_SAFETY_ON_NULL_GOTO(p, error);
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_pending_data_set(p, "cb", cb);
|
|
|
|
eldbus_pending_data_set(p, "conn", conn);
|
2013-01-15 06:34:50 -08:00
|
|
|
|
2013-01-03 14:08:10 -08:00
|
|
|
return EINA_TRUE;
|
2013-01-15 06:34:50 -08:00
|
|
|
|
2013-01-03 14:08:10 -08:00
|
|
|
error:
|
2013-04-23 08:08:29 -07:00
|
|
|
eldbus_message_unref(msg);
|
2013-01-03 14:08:10 -08:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
normalize_notify(E_Notification_Notify *notify)
|
|
|
|
{
|
|
|
|
if (!notify->timeout)
|
|
|
|
notify->timeout = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Eina_Bool
|
|
|
|
e_notification_client_send(E_Notification_Notify *notify, E_Notification_Client_Send_Cb cb, const void *data)
|
|
|
|
{
|
|
|
|
unsigned id;
|
|
|
|
E_Notification_Notify *copy;
|
|
|
|
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(notify, EINA_FALSE);
|
|
|
|
normalize_notify(notify);
|
2013-01-03 14:08:19 -08:00
|
|
|
|
2013-01-03 14:08:10 -08:00
|
|
|
if (!n_data)
|
2013-01-03 14:08:19 -08:00
|
|
|
return notification_client_dbus_send(notify, cb, data);
|
2013-01-03 14:08:10 -08:00
|
|
|
|
|
|
|
//local
|
|
|
|
copy = malloc(sizeof(E_Notification_Notify));
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(copy, EINA_FALSE);
|
|
|
|
memcpy(copy, notify, sizeof(E_Notification_Notify));
|
|
|
|
|
|
|
|
copy->app_name = eina_stringshare_add(notify->app_name);
|
|
|
|
copy->body = eina_stringshare_add(notify->body);
|
|
|
|
copy->sumary = eina_stringshare_add(notify->sumary);
|
|
|
|
copy->icon.icon = eina_stringshare_add(notify->icon.icon);
|
|
|
|
if (notify->icon.icon_path)
|
|
|
|
copy->icon.icon_path = eina_stringshare_add(notify->icon.icon_path);
|
|
|
|
|
|
|
|
id = n_data->notify_cb(n_data->data, copy);
|
|
|
|
if (cb)
|
2013-01-11 02:34:29 -08:00
|
|
|
cb((void *)data, id);
|
2013-01-03 14:08:10 -08:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2013-01-11 02:34:29 -08:00
|
|
|
|