discomfitor pushed a commit to branch master.
commit 53d8c89791b981d2d6a24111c151ae1fe3591352
Author: Mike Blumenkrantz <[email protected]>
Date: Thu Apr 25 09:12:43 2013 +0100
unbreak notification callbacks, fix notification crashes
this should not have been committed as-is, and I'm very disappointed at the
lack of testing here.
---
src/bin/e_notification.c | 37 +++++++++++++++--------------
src/bin/e_notification.h | 9 ++++---
src/modules/illume-indicator/e_mod_notify.c | 4 ++--
src/modules/notification/e_mod_main.c | 8 +------
src/modules/notification/e_mod_main.h | 2 +-
src/modules/notification/e_mod_popup.c | 18 +++++++-------
6 files changed, 37 insertions(+), 41 deletions(-)
diff --git a/src/bin/e_notification.c b/src/bin/e_notification.c
index 756837f..8626008 100644
--- a/src/bin/e_notification.c
+++ b/src/bin/e_notification.c
@@ -13,6 +13,21 @@ typedef struct _Notification_Data
static Notification_Data *n_data = NULL;
static void
+_notification_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);
+}
+
+static void
hints_dict_iter(void *data, const void *key, Eldbus_Message_Iter *var)
{
E_Notification_Notify *n = data;
@@ -64,8 +79,7 @@ notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Messag
if (!n_data->notify_cb)
return NULL;
- n = calloc(1, sizeof(E_Notification_Notify));
- EINA_SAFETY_ON_NULL_RETURN_VAL(n, NULL);
+ n = E_OBJECT_ALLOC(E_Notification_Notify, E_NOTIFICATION_TYPE,
_notification_free);
if (!eldbus_message_arguments_get(msg, "susssasa{sv}i", &n->app_name,
&n->replaces_id, &n->icon.icon, &n->sumary,
@@ -73,7 +87,7 @@ notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Messag
&n->timeout))
{
ERR("Reading message.");
- free(n);
+ e_object_del(E_OBJECT(n));
return NULL;
}
eldbus_message_iter_dict_iterate(hints_iter, "sv", hints_dict_iter, n);
@@ -82,9 +96,11 @@ notify_cb(const Eldbus_Service_Interface *iface EINA_UNUSED,
const Eldbus_Messag
n->sumary = eina_stringshare_add(n->sumary);
n->body = eina_stringshare_add(n->body);
+ e_object_ref(E_OBJECT(n));
n->id = n_data->notify_cb(n_data->data, n);
reply = eldbus_message_method_return_new(msg);
eldbus_message_arguments_append(reply, "u", n->id);
+ e_object_unref(E_OBJECT(n));
return reply;
}
@@ -196,21 +212,6 @@ e_notification_server_unregister(void)
}
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
e_notification_notify_close(E_Notification_Notify *notify,
E_Notification_Notify_Closed_Reason reason)
{
EINA_SAFETY_ON_NULL_RETURN(n_data);
diff --git a/src/bin/e_notification.h b/src/bin/e_notification.h
index 554ecdd..b92a15d 100644
--- a/src/bin/e_notification.h
+++ b/src/bin/e_notification.h
@@ -1,8 +1,9 @@
+#ifndef E_TYPEDEFS
+
#ifndef _E_NOTIFICATION_H
#define _E_NOTIFICATION_H
-#include <Eldbus.h>
-#include <Eina.h>
+#define E_NOTIFICATION_TYPE 0x12342166
typedef enum _E_Notification_Notify_Urgency
{
@@ -21,6 +22,7 @@ typedef enum _E_Notification_Notify_Closed_Reason
typedef struct _E_Notification_Notify
{
+ E_Object e_obj_inherit;
unsigned int id;
const char *app_name;
unsigned replaces_id;
@@ -73,7 +75,6 @@ EAPI Eina_Bool e_notification_server_register(const
E_Notification_Server_Info *
*/
EAPI void e_notification_server_unregister(void);
-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);
@@ -82,3 +83,5 @@ 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
+
+#endif
diff --git a/src/modules/illume-indicator/e_mod_notify.c
b/src/modules/illume-indicator/e_mod_notify.c
index 607f362..75d7b84 100644
--- a/src/modules/illume-indicator/e_mod_notify.c
+++ b/src/modules/illume-indicator/e_mod_notify.c
@@ -58,7 +58,7 @@ _e_mod_notify_cb_add(void *data EINA_UNUSED,
E_Notification_Notify *n)
if (n->replaces_id && (nwin = _e_mod_notify_find(n->replaces_id)))
{
if (nwin->notify)
- e_notification_notify_free(nwin->notify);
+ e_object_del(E_OBJECT(nwin->notify));
nwin->notify = n;
nwin->id = _notify_id;
_e_mod_notify_refresh(nwin);
@@ -247,7 +247,7 @@ _e_mod_notify_cb_free(Ind_Notify_Win *nwin)
nwin->win = NULL;
e_notification_notify_close(nwin->notify,
E_NOTIFICATION_NOTIFY_CLOSED_REASON_REQUESTED);
- e_notification_notify_free(nwin->notify);
+ e_object_del(E_OBJECT(nwin->notify));
_nwins = eina_list_remove(_nwins, nwin);
E_FREE(nwin);
}
diff --git a/src/modules/notification/e_mod_main.c
b/src/modules/notification/e_mod_main.c
index de924e3..f5fda9b 100644
--- a/src/modules/notification/e_mod_main.c
+++ b/src/modules/notification/e_mod_main.c
@@ -14,18 +14,12 @@ static unsigned int
_notification_notify(E_Notification_Notify *n)
{
unsigned int new_id;
- int popuped;
if (e_desklock_state_get()) return 0;
notification_cfg->next_id++;
new_id = notification_cfg->next_id;
- popuped = notification_popup_notify(n, new_id);
- if (!popuped)
- {
- n->urgency = 4;
- notification_popup_notify(n, new_id);
- }
+ notification_popup_notify(n, new_id);
return new_id;
}
diff --git a/src/modules/notification/e_mod_main.h
b/src/modules/notification/e_mod_main.h
index 502d5e6..fe06ef3 100644
--- a/src/modules/notification/e_mod_main.h
+++ b/src/modules/notification/e_mod_main.h
@@ -71,7 +71,7 @@ struct _Popup_Data
};
-int notification_popup_notify(E_Notification_Notify *n, unsigned int id);
+void notification_popup_notify(E_Notification_Notify *n, unsigned int id);
void notification_popup_shutdown(void);
void notification_popup_close(unsigned int id);
diff --git a/src/modules/notification/e_mod_popup.c
b/src/modules/notification/e_mod_popup.c
index c544c69..9a77a91 100644
--- a/src/modules/notification/e_mod_popup.c
+++ b/src/modules/notification/e_mod_popup.c
@@ -28,7 +28,7 @@ _notification_timer_cb(Popup_Data *popup)
return EINA_FALSE;
}
-int
+void
notification_popup_notify(E_Notification_Notify *n,
unsigned int id)
{
@@ -37,13 +37,13 @@ notification_popup_notify(E_Notification_Notify *n,
switch (n->urgency)
{
case E_NOTIFICATION_NOTIFY_URGENCY_LOW:
- if (!notification_cfg->show_low) return 0;
+ if (!notification_cfg->show_low) return;
break;
case E_NOTIFICATION_NOTIFY_URGENCY_NORMAL:
- if (!notification_cfg->show_normal) return 0;
+ if (!notification_cfg->show_normal) return;
break;
case E_NOTIFICATION_NOTIFY_URGENCY_CRITICAL:
- if (!notification_cfg->show_critical) return 0;
+ if (!notification_cfg->show_critical) return;
break;
default:
break;
@@ -54,7 +54,7 @@ notification_popup_notify(E_Notification_Notify *n,
if (n->replaces_id && (popup = _notification_popup_find(n->replaces_id)))
{
if (popup->notif)
- e_notification_notify_free(popup->notif);
+ e_object_del(E_OBJECT(popup->notif));
popup->notif = n;
popup->id = id;
@@ -66,9 +66,9 @@ notification_popup_notify(E_Notification_Notify *n,
popup = _notification_popup_new(n, id);
if (!popup)
{
- e_notification_notify_free(n);
+ e_object_del(E_OBJECT(n));
ERR("Error creating popup");
- return 0;
+ return;
}
notification_cfg->popups = eina_list_append(notification_cfg->popups,
popup);
edje_object_signal_emit(popup->theme, "notification,new",
"notification");
@@ -87,8 +87,6 @@ notification_popup_notify(E_Notification_Notify *n,
if (n->timeout > 0)
popup->timer = ecore_timer_add(n->timeout,
(Ecore_Task_Cb)_notification_timer_cb, popup);
-
- return 1;
}
void
@@ -500,7 +498,7 @@ _notification_popdown(Popup_Data *popup,
if (popup->notif)
{
e_notification_notify_close(popup->notif, reason);
- e_notification_notify_free(popup->notif);
+ e_object_del(E_OBJECT(popup->notif));
}
popup->notif = NULL;
if (popup->pending) return;
--
------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr