From 425bde705a072effe6232cb3fa4fecdcb8849639 Mon Sep 17 00:00:00 2001 From: Jason Conti Date: Tue, 17 May 2011 16:15:41 -0400 Subject: Adding a timestamp to the messages. Currently sends a timestamp string across dbus, but ideally it will send an integer, and the indicator can decide how to display it (time ago in words, custom time format, etc). --- src/dbus-shared.h | 11 ++++++----- src/indicator-notifications.c | 33 ++++++++++++++++----------------- src/notification.c | 21 +++++++++++++++++++++ src/notification.h | 24 ++++++++++++++---------- src/notifications-service.c | 4 ++++ 5 files changed, 61 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/dbus-shared.h b/src/dbus-shared.h index 76d30ab..da93e73 100644 --- a/src/dbus-shared.h +++ b/src/dbus-shared.h @@ -24,8 +24,9 @@ with this program. If not, see . #define MENU_OBJ "/com/launchpad/RecentNotifications/indicator/menu" -#define NOTIFICATION_MENUITEM_TYPE "notification-menuitem" -#define NOTIFICATION_MENUITEM_PROP_APP_NAME "notification-menuitem-prop-app-name" -#define NOTIFICATION_MENUITEM_PROP_APP_ICON "notification-menuitem-prop-app-icon" -#define NOTIFICATION_MENUITEM_PROP_SUMMARY "notification-menuitem-prop-summary" -#define NOTIFICATION_MENUITEM_PROP_BODY "notification-menuitem-prop-body" +#define NOTIFICATION_MENUITEM_TYPE "notification-menuitem" +#define NOTIFICATION_MENUITEM_PROP_APP_NAME "notification-menuitem-prop-app-name" +#define NOTIFICATION_MENUITEM_PROP_APP_ICON "notification-menuitem-prop-app-icon" +#define NOTIFICATION_MENUITEM_PROP_SUMMARY "notification-menuitem-prop-summary" +#define NOTIFICATION_MENUITEM_PROP_BODY "notification-menuitem-prop-body" +#define NOTIFICATION_MENUITEM_PROP_TIMESTAMP_STRING "notification-menuitem-prop-timestamp-string" diff --git a/src/indicator-notifications.c b/src/indicator-notifications.c index 9178958..72e806c 100644 --- a/src/indicator-notifications.c +++ b/src/indicator-notifications.c @@ -290,23 +290,22 @@ new_notification_menuitem(DbusmenuMenuitem *new_item, DbusmenuMenuitem *parent, g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); g_return_val_if_fail(IS_INDICATOR_NOTIFICATIONS(user_data), FALSE); - const gchar *app_name = dbusmenu_menuitem_property_get(new_item, - NOTIFICATION_MENUITEM_PROP_APP_NAME); - const gchar *summary = dbusmenu_menuitem_property_get(new_item, - NOTIFICATION_MENUITEM_PROP_SUMMARY); - const gchar *body = dbusmenu_menuitem_property_get(new_item, - NOTIFICATION_MENUITEM_PROP_BODY); - - gchar *escaped_app_name = g_markup_escape_text(app_name, strlen(app_name)); - gchar *escaped_summary = g_markup_escape_text(summary, strlen(summary)); - gchar *escaped_body = g_markup_escape_text(body, strlen(body)); - - gchar *markup = g_strdup_printf("%s\n%s\n%s %s", - escaped_summary, escaped_body, _("from"), escaped_app_name); - - g_free(escaped_app_name); - g_free(escaped_summary); - g_free(escaped_body); + gchar *app_name = g_markup_escape_text(dbusmenu_menuitem_property_get(new_item, + NOTIFICATION_MENUITEM_PROP_APP_NAME), -1); + gchar *summary = g_markup_escape_text(dbusmenu_menuitem_property_get(new_item, + NOTIFICATION_MENUITEM_PROP_SUMMARY), -1); + gchar *body = g_markup_escape_text(dbusmenu_menuitem_property_get(new_item, + NOTIFICATION_MENUITEM_PROP_BODY), -1); + gchar *timestamp_string = g_markup_escape_text(dbusmenu_menuitem_property_get(new_item, + NOTIFICATION_MENUITEM_PROP_TIMESTAMP_STRING), -1); + + gchar *markup = g_strdup_printf("%s\n%s\n%s %s %s", + summary, body, timestamp_string, _("from"), app_name); + + g_free(app_name); + g_free(summary); + g_free(body); + g_free(timestamp_string); GtkWidget *hbox = gtk_hbox_new(FALSE, 0); diff --git a/src/notification.c b/src/notification.c index 10f83e8..d99a1f8 100644 --- a/src/notification.c +++ b/src/notification.c @@ -42,6 +42,7 @@ notification_init(Notification *self) self->priv->summary = NULL; self->priv->body = NULL; self->priv->expire_timeout = 0; + self->priv->timestamp = NULL; } static void @@ -69,6 +70,11 @@ notification_dispose(GObject *object) self->priv->body = NULL; } + if(self->priv->timestamp != NULL) { + g_date_time_unref(self->priv->timestamp); + self->priv->timestamp = NULL; + } + G_OBJECT_CLASS(notification_parent_class)->dispose(object); } @@ -83,6 +89,9 @@ notification_new_from_dbus_message(GDBusMessage *message) { Notification *self = notification_new(); + /* timestamp */ + self->priv->timestamp = g_date_time_new_now_local(); + GVariant *body = g_dbus_message_get_body(message); GVariant *child = NULL; g_assert(g_variant_is_of_type(body, G_VARIANT_TYPE_TUPLE)); @@ -146,6 +155,18 @@ notification_get_body(Notification *self) return self->priv->body; } +gint64 +notification_get_timestamp(Notification *self) +{ + return g_date_time_to_unix(self->priv->timestamp); +} + +gchar* +notification_timestamp_for_locale(Notification *self) +{ + return g_date_time_format(self->priv->timestamp, "%X %x"); +} + void notification_print(Notification *self) { diff --git a/src/notification.h b/src/notification.h index a11036f..d9a67fe 100644 --- a/src/notification.h +++ b/src/notification.h @@ -8,6 +8,7 @@ #include #include #include +#include G_BEGIN_DECLS @@ -33,16 +34,17 @@ struct _NotificationClass }; struct _NotificationPrivate { - gchar *app_name; - gsize app_name_length; - guint32 replaces_id; - gchar *app_icon; - gsize app_icon_length; - gchar *summary; - gsize summary_length; - gchar *body; - gsize body_length; - gint expire_timeout; + gchar *app_name; + gsize app_name_length; + guint32 replaces_id; + gchar *app_icon; + gsize app_icon_length; + gchar *summary; + gsize summary_length; + gchar *body; + gsize body_length; + gint expire_timeout; + GDateTime *timestamp; }; #define NOTIFICATION_GET_PRIVATE(o) \ @@ -55,6 +57,8 @@ const gchar *notification_get_app_name(Notification *); const gchar *notification_get_app_icon(Notification *); const gchar *notification_get_summary(Notification *); const gchar *notification_get_body(Notification *); +gint64 notification_get_timestamp(Notification *); +gchar *notification_timestamp_for_locale(Notification *); void notification_print(Notification *); G_END_DECLS diff --git a/src/notifications-service.c b/src/notifications-service.c index 72f6dee..38fa247 100644 --- a/src/notifications-service.c +++ b/src/notifications-service.c @@ -75,11 +75,14 @@ add_notification_item(gpointer user_data) dbusmenu_menuitem_child_delete(root, empty_item); } + gchar *timestamp_string = notification_timestamp_for_locale(note); + item = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_TYPE, NOTIFICATION_MENUITEM_TYPE); dbusmenu_menuitem_property_set(item, NOTIFICATION_MENUITEM_PROP_APP_NAME, notification_get_app_name(note)); dbusmenu_menuitem_property_set(item, NOTIFICATION_MENUITEM_PROP_SUMMARY, notification_get_summary(note)); dbusmenu_menuitem_property_set(item, NOTIFICATION_MENUITEM_PROP_BODY, notification_get_body(note)); + dbusmenu_menuitem_property_set(item, NOTIFICATION_MENUITEM_PROP_TIMESTAMP_STRING, timestamp_string); dbusmenu_menuitem_child_prepend(root, item); g_queue_push_head(notification_items, item); length++; @@ -97,6 +100,7 @@ add_notification_item(gpointer user_data) /* Notify the indicator that a new message has been added */ notifications_interface_message_added(dbus); + g_free(timestamp_string); g_object_unref(note); return FALSE; -- cgit v1.2.3