aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolò Chieffo <84yelo3@gmail.com>2010-04-01 16:37:28 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-04-01 16:37:28 +0800
commita0783366242adb859dcdaedfe188edd7bd49911b (patch)
tree7d350ee928e53ae10f036e9afaccf970fc7a7a23
parentaf87c9c1f8da17892f8694299df79bf50ec7663d (diff)
downloadgsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar.gz
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar.bz2
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar.lz
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar.xz
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.tar.zst
gsoc2013-empathy-a0783366242adb859dcdaedfe188edd7bd49911b.zip
Support append hint in notifications (#607446)
-rw-r--r--src/empathy-chat-window.c58
-rw-r--r--src/empathy-status-icon.c53
2 files changed, 79 insertions, 32 deletions
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index e18ae2583..9f5fb6c26 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -1223,9 +1223,12 @@ chat_window_notification_closed_cb (NotifyNotification *notify,
}
g_object_unref (notify);
- priv->notification = NULL;
free_notification_data (cb_data);
- priv->notification_data = NULL;
+
+ if (priv->notification == notify) {
+ priv->notification = NULL;
+ priv->notification_data = NULL;
+ }
}
static void
@@ -1239,7 +1242,8 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
const char *body;
GdkPixbuf *pixbuf;
EmpathyChatWindowPriv *priv = GET_PRIV (window);
- gboolean res;
+ gboolean res, has_x_canonical_append;
+ NotifyNotification *notification = priv->notification;
if (!empathy_notify_manager_notification_is_enabled (priv->notify_mgr)) {
return;
@@ -1255,9 +1259,14 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
header = empathy_contact_get_name (sender);
body = empathy_message_get_body (message);
escaped = g_markup_escape_text (body, -1);
-
- if (priv->notification != NULL) {
- notify_notification_update (priv->notification,
+ has_x_canonical_append = empathy_notify_manager_has_capability (
+ priv->notify_mgr, EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND);
+
+ if (notification != NULL && !has_x_canonical_append) {
+ /* if the notification server supports x-canonical-append, it is
+ better to not use notify_notification_update to avoid
+ overwriting the current notification message */
+ notify_notification_update (notification,
header, escaped, NULL);
} else {
NotificationData *cb_data = cb_data = g_slice_new0 (NotificationData);
@@ -1265,23 +1274,39 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
cb_data->chat = g_object_ref (chat);
cb_data->window = window;
- priv->notification_data = cb_data;
- priv->notification = notify_notification_new (header, escaped, NULL, NULL);
- notify_notification_set_timeout (priv->notification, NOTIFY_EXPIRES_DEFAULT);
+ /* if the notification server supports x-canonical-append,
+ the hint will be added, so that the message from the
+ just created notification will be automatically appended
+ to an existing notification with the same title.
+ In this way the previous message will not be lost: the new
+ message will appear below it, in the same notification */
+ notification = notify_notification_new (header, escaped, NULL, NULL);
+
+ if (priv->notification == NULL) {
+ priv->notification = notification;
+ priv->notification_data = cb_data;
+ }
+
+ notify_notification_set_timeout (notification, NOTIFY_EXPIRES_DEFAULT);
- g_signal_connect (priv->notification, "closed",
+ g_signal_connect (notification, "closed",
G_CALLBACK (chat_window_notification_closed_cb), cb_data);
+
+ if (has_x_canonical_append) {
+ notify_notification_set_hint_string (notification,
+ EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "");
+ }
}
pixbuf = empathy_notify_manager_get_pixbuf_for_notification (priv->notify_mgr,
sender, EMPATHY_IMAGE_NEW_MESSAGE);
if (pixbuf != NULL) {
- notify_notification_set_icon_from_pixbuf (priv->notification, pixbuf);
+ notify_notification_set_icon_from_pixbuf (notification, pixbuf);
g_object_unref (pixbuf);
}
- notify_notification_show (priv->notification, NULL);
+ notify_notification_show (notification, NULL);
g_free (escaped);
}
@@ -1784,13 +1809,9 @@ chat_window_finalize (GObject *object)
if (priv->notification != NULL) {
notify_notification_close (priv->notification, NULL);
- g_object_unref (priv->notification);
priv->notification = NULL;
- if (priv->notification_data != NULL)
- {
- free_notification_data (priv->notification_data);
- priv->notification_data = NULL;
- }
+ free_notification_data (priv->notification_data);
+ priv->notification_data = NULL;
}
if (priv->contact_targets) {
@@ -1992,6 +2013,7 @@ empathy_chat_window_init (EmpathyChatWindow *window)
priv->chats_new_msg = NULL;
priv->chats_composing = NULL;
priv->current_chat = NULL;
+ priv->notification = NULL;
priv->notify_mgr = empathy_notify_manager_dup_singleton ();
diff --git a/src/empathy-status-icon.c b/src/empathy-status-icon.c
index d1ea96c98..382234078 100644
--- a/src/empathy-status-icon.c
+++ b/src/empathy-status-icon.c
@@ -95,8 +95,10 @@ status_icon_notification_closed_cb (NotifyNotification *notification,
#ifdef notify_notification_get_closed_reason
reason = notify_notification_get_closed_reason (notification);
#endif
- if (priv->notification) {
- g_object_unref (priv->notification);
+
+ g_object_unref (notification);
+
+ if (priv->notification == notification) {
priv->notification = NULL;
}
@@ -122,9 +124,8 @@ status_icon_notification_closed_cb (NotifyNotification *notification,
static void
notification_close_helper (EmpathyStatusIconPriv *priv)
{
- if (priv->notification) {
+ if (priv->notification != NULL) {
notify_notification_close (priv->notification, NULL);
- g_object_unref (priv->notification);
priv->notification = NULL;
}
}
@@ -154,24 +155,49 @@ status_icon_update_notification (EmpathyStatusIcon *icon)
if (priv->event) {
gchar *message_esc = NULL;
+ gboolean has_x_canonical_append;
+ NotifyNotification *notification = priv->notification;
if (priv->event->message != NULL)
message_esc = g_markup_escape_text (priv->event->message, -1);
- if (priv->notification) {
- notify_notification_update (priv->notification,
+ has_x_canonical_append =
+ empathy_notify_manager_has_capability (priv->notify_mgr,
+ EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND);
+
+ if (notification != NULL && ! has_x_canonical_append) {
+ /* if the notification server supports x-canonical-append, it is
+ better to not use notify_notification_update to avoid
+ overwriting the current notification message */
+ notify_notification_update (notification,
priv->event->header, message_esc,
NULL);
} else {
- priv->notification = notify_notification_new_with_status_icon
+ /* if the notification server supports x-canonical-append,
+ the hint will be added, so that the message from the
+ just created notification will be automatically appended
+ to an existing notification with the same title.
+ In this way the previous message will not be lost: the new
+ message will appear below it, in the same notification */
+ notification = notify_notification_new_with_status_icon
(priv->event->header, message_esc, NULL, priv->icon);
- notify_notification_set_timeout (priv->notification,
+
+ if (priv->notification == NULL) {
+ priv->notification = notification;
+ }
+
+ notify_notification_set_timeout (notification,
NOTIFY_EXPIRES_DEFAULT);
+ if (has_x_canonical_append) {
+ notify_notification_set_hint_string (notification,
+ EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "");
+ }
+
if (empathy_notify_manager_has_capability (priv->notify_mgr,
EMPATHY_NOTIFY_MANAGER_CAP_ACTIONS) &&
priv->event->type != EMPATHY_EVENT_TYPE_PRESENCE) {
- notify_notification_add_action (priv->notification,
+ notify_notification_add_action (notification,
"respond",
_("Respond"),
(NotifyActionCallback) notification_action_cb,
@@ -179,7 +205,7 @@ status_icon_update_notification (EmpathyStatusIcon *icon)
NULL);
}
- g_signal_connect (priv->notification, "closed",
+ g_signal_connect (notification, "closed",
G_CALLBACK (status_icon_notification_closed_cb), icon);
}
@@ -188,12 +214,11 @@ status_icon_update_notification (EmpathyStatusIcon *icon)
priv->event->icon_name);
if (pixbuf != NULL) {
- notify_notification_set_icon_from_pixbuf (priv->notification,
- pixbuf);
+ notify_notification_set_icon_from_pixbuf (notification, pixbuf);
g_object_unref (pixbuf);
}
- notify_notification_show (priv->notification, NULL);
+ notify_notification_show (notification, NULL);
g_free (message_esc);
} else {
@@ -402,7 +427,6 @@ status_icon_presence_changed_cb (EmpathyStatusIcon *icon)
if (priv->notification) {
notify_notification_close (priv->notification, NULL);
- g_object_unref (priv->notification);
priv->notification = NULL;
}
}
@@ -652,6 +676,7 @@ empathy_status_icon_init (EmpathyStatusIcon *icon)
G_CALLBACK (status_icon_popup_menu_cb),
icon);
+ priv->notification = NULL;
priv->notify_mgr = empathy_notify_manager_dup_singleton ();
}