[empathy] Support append hint in notifications (#607446)



commit a0783366242adb859dcdaedfe188edd7bd49911b
Author: Nicolò Chieffo <84yelo3 gmail com>
Date:   Thu Apr 1 10:37:28 2010 +0200

    Support append hint in notifications (#607446)

 src/empathy-chat-window.c |   58 +++++++++++++++++++++++++++++++--------------
 src/empathy-status-icon.c |   53 ++++++++++++++++++++++++++++++-----------
 2 files changed, 79 insertions(+), 32 deletions(-)
---
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index e18ae25..9f5fb6c 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 d1ea96c..3822340 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 ();
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]