e: Add client api to notifications

Patch by: José Roberto de Souza  <zehortigoza@profusion.mobi>



SVN revision: 82119
This commit is contained in:
José Roberto de Souza 2013-01-03 22:08:10 +00:00 committed by Lucas De Marchi
parent 80a3d9fb7a
commit 84550effc5
4 changed files with 174 additions and 18 deletions

View File

@ -273,3 +273,153 @@ error:
evas_object_del(o);
return NULL;
}
/* client API */
static void
client_notify_cb(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
{
unsigned id = 0;
E_Notification_Client_Send_Cb cb = edbus_pending_data_del(pending, "cb");
EDBus_Connection *conn = edbus_pending_data_del(pending, "conn");
if (edbus_message_error_get(msg, NULL, NULL))
goto end;
if (!edbus_message_arguments_get(msg, "u", &id))
goto end;
end:
cb(data, id);
edbus_connection_unref(conn);
edbus_shutdown();
}
static Eina_Bool
notification_cliend_dbus_send(E_Notification_Notify *notify, E_Notification_Client_Send_Cb cb, const void *data)
{
EDBus_Connection *conn;
EDBus_Message *msg;
EDBus_Message_Iter *main_iter, *actions, *hints;
EDBus_Message_Iter *entry, *var;
EDBus_Pending *p;
EINA_SAFETY_ON_NULL_RETURN_VAL(notify, EINA_FALSE);
edbus_init();
conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
EINA_SAFETY_ON_NULL_RETURN_VAL(conn, EINA_FALSE);
msg = edbus_message_method_call_new(BUS, PATH, INTERFACE, "Notify");
EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
//build message
main_iter = edbus_message_iter_get(msg);
if (!edbus_message_iter_arguments_append(main_iter, "susssas",
notify->app_name,
notify->replaces_id,
notify->icon.icon,
notify->sumary, notify->body,
&actions))
goto error;
edbus_message_iter_container_close(main_iter, actions);
if (!edbus_message_iter_arguments_append(main_iter, "a{sv}", &hints))
goto error;
if (notify->icon.raw.data)
{
EDBus_Message_Iter *st, *data_iter;
int i;
edbus_message_iter_arguments_append(hints, "{sv}", &entry);
edbus_message_iter_arguments_append(entry, "s", "image-data");
var = edbus_message_iter_container_new(entry, 'v', "(iiibiiay)");
edbus_message_iter_arguments_append(var, "(iiibiiay)", &st);
edbus_message_iter_arguments_append(st, "iiibiiay",
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++)
edbus_message_iter_basic_append(data_iter, 'y', notify->icon.raw.data[i]);
edbus_message_iter_container_close(st, data_iter);
edbus_message_iter_container_close(var, st);
edbus_message_iter_container_close(entry, var);
edbus_message_iter_container_close(hints, entry);
}
if (notify->icon.icon_path)
{
edbus_message_iter_arguments_append(hints, "{sv}", &entry);
edbus_message_iter_arguments_append(entry, "s", "image-path");
var = edbus_message_iter_container_new(entry, 'v', "s");
edbus_message_iter_arguments_append(var, "s", notify->icon.icon_path);
edbus_message_iter_container_close(entry, var);
edbus_message_iter_container_close(hints, entry);
}
edbus_message_iter_arguments_append(hints, "{sv}", &entry);
edbus_message_iter_arguments_append(entry, "s", "urgency");
var = edbus_message_iter_container_new(entry, 'v', "y");
edbus_message_iter_arguments_append(var, "y", notify->urgency);
edbus_message_iter_container_close(entry, var);
edbus_message_iter_container_close(hints, entry);
edbus_message_iter_container_close(main_iter, hints);
edbus_message_iter_arguments_append(main_iter, "i", notify->timeout);
p = edbus_connection_send(conn, msg, client_notify_cb, data, 5000);
EINA_SAFETY_ON_NULL_GOTO(p, error);
edbus_pending_data_set(p, "cb", cb);
edbus_pending_data_set(p, "conn", conn);
edbus_message_unref(msg);
return EINA_TRUE;
error:
edbus_message_unref(msg);
return EINA_FALSE;
}
static const char *
null_strings_replace(const char *text)
{
if (!text)
return eina_stringshare_add("");
return text;
}
static void
normalize_notify(E_Notification_Notify *notify)
{
notify->app_name = null_strings_replace(notify->app_name);
notify->body = null_strings_replace(notify->body);
notify->sumary = null_strings_replace(notify->sumary);
notify->icon.icon = null_strings_replace(notify->icon.icon);
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);
if (!n_data)
return notification_cliend_dbus_send(notify, cb, data);
//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)
cb((void *) data, id);
return EINA_TRUE;
}

View File

@ -77,4 +77,8 @@ EAPI void e_notification_notify_free(E_Notification_Notify *notify);
EAPI void e_notification_notify_close(E_Notification_Notify *notify, E_Notification_Notify_Closed_Reason reason);
EAPI Evas_Object *e_notification_notify_raw_image_get(E_Notification_Notify *notify, Evas *evas);
//client
typedef void (*E_Notification_Client_Send_Cb)(void *data, unsigned int id);
EAPI Eina_Bool e_notification_client_send(E_Notification_Notify *notify, E_Notification_Client_Send_Cb cb, const void *data);
#endif

View File

@ -213,13 +213,14 @@ e_modapi_init(E_Module *m)
notification_cfg = _notification_cfg_new();
/* set up the notification daemon */
if (!e_notification_start(_notification_cb_notify,
if (!e_notification_server_register(&server_info, _notification_cb_notify,
_notification_cb_close,
&server_info, notification_cfg))
notification_cfg))
{
e_util_dialog_show(_("Error During DBus Init!"),
_("Error during DBus init! Please check if "
"dbus is correctly installed and running."));
e_util_dialog_show(_("Error during notification server initialization"),
_("Ensure there's no other module acting as a server"
" and that D-Bus is correctly installed and "
" running"));
return NULL;
}
@ -270,7 +271,7 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
e_configure_registry_category_del("extensions");
notification_popup_shutdown();
e_notification_stop();
e_notification_server_unregister();
E_CONFIGURE_OPTION_LIST_CLEAR(cfg_opts);

View File

@ -8,9 +8,9 @@ static int _notification_popup_place(Popup_Data *popup,
int num);
static void _notification_popup_refresh(Popup_Data *popup);
static void _notification_popup_del(unsigned int id,
E_Notification_Closed_Reason reason);
E_Notification_Notify_Closed_Reason reason);
static void _notification_popdown(Popup_Data *popup,
E_Notification_Closed_Reason reason);
E_Notification_Notify_Closed_Reason reason);
#define POPUP_LIMIT 7
static int popups_displayed = 0;
@ -23,7 +23,7 @@ static int next_pos = 0;
static Eina_Bool
_notification_timer_cb(Popup_Data *popup)
{
_notification_popup_del(popup->id, E_NOTIFICATION_CLOSED_REASON_EXPIRED);
_notification_popup_del(popup->id, E_NOTIFICATION_NOTIFY_CLOSED_REASON_EXPIRED);
return EINA_FALSE;
}
@ -96,13 +96,13 @@ notification_popup_shutdown(void)
Popup_Data *popup;
EINA_LIST_FREE(notification_cfg->popups, popup)
_notification_popdown(popup, E_NOTIFICATION_CLOSED_REASON_REQUESTED);
_notification_popdown(popup, E_NOTIFICATION_NOTIFY_CLOSED_REASON_REQUESTED);
}
void
notification_popup_close(unsigned int id)
{
_notification_popup_del(id, E_NOTIFICATION_CLOSED_REASON_REQUESTED);
_notification_popup_del(id, E_NOTIFICATION_NOTIFY_CLOSED_REASON_REQUESTED);
}
static void
@ -121,7 +121,7 @@ _notification_theme_cb_close(Popup_Data *popup,
const char *emission __UNUSED__,
const char *source __UNUSED__)
{
_notification_popup_del(popup->id, E_NOTIFICATION_CLOSED_REASON_DISMISSED);
_notification_popup_del(popup->id, E_NOTIFICATION_NOTIFY_CLOSED_REASON_DISMISSED);
}
static void
@ -378,7 +378,8 @@ _notification_popup_refresh(Popup_Data *popup)
}
else
{
popup->app_icon = e_notification_raw_image_get(popup->e, popup->notif);
popup->app_icon = e_notification_notify_raw_image_get(popup->notif,
popup->e);
evas_object_image_filled_set(popup->app_icon, EINA_TRUE);
evas_object_image_alpha_set(popup->app_icon, EINA_TRUE);
evas_object_image_size_get(popup->app_icon, &w, &h);
@ -447,7 +448,7 @@ _notification_popup_find(unsigned int id)
static void
_notification_popup_del(unsigned int id,
E_Notification_Closed_Reason reason)
E_Notification_Notify_Closed_Reason reason)
{
Popup_Data *popup;
Eina_List *l, *l2;
@ -469,7 +470,7 @@ _notification_popup_del(unsigned int id,
static void
_notification_popdown(Popup_Data *popup,
E_Notification_Closed_Reason reason)
E_Notification_Notify_Closed_Reason reason)
{
if (popup->timer) ecore_timer_del(popup->timer);
e_popup_hide(popup->win);
@ -477,7 +478,7 @@ _notification_popdown(Popup_Data *popup,
evas_object_del(popup->app_icon);
evas_object_del(popup->theme);
e_object_del(E_OBJECT(popup->win));
e_notification_notification_closed(popup->id, reason);
e_notification_notify_close(popup->notif, reason);
e_notification_notify_free(popup->notif);
free(popup);
}