diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/im-menu-item.c | 85 | ||||
-rw-r--r-- | src/im-menu-item.h | 2 | ||||
-rw-r--r-- | src/indicator-messages.c | 8 |
3 files changed, 78 insertions, 17 deletions
diff --git a/src/im-menu-item.c b/src/im-menu-item.c index eaf65a6..7a139fd 100644 --- a/src/im-menu-item.c +++ b/src/im-menu-item.c @@ -43,6 +43,9 @@ struct _ImMenuItemPrivate IndicateListenerIndicator * indicator; glong seconds; + gboolean show_time; + + guint time_update_min; GtkHBox * hbox; GtkLabel * user; @@ -161,6 +164,13 @@ static void im_menu_item_dispose (GObject *object) { G_OBJECT_CLASS (im_menu_item_parent_class)->dispose (object); + + ImMenuItem * self = IM_MENU_ITEM(object); + ImMenuItemPrivate * priv = IM_MENU_ITEM_GET_PRIVATE(self); + + if (priv->time_update_min != 0) { + g_source_remove(priv->time_update_min); + } } static void @@ -190,6 +200,62 @@ icon_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateL } static void +update_time (ImMenuItem * self) +{ + ImMenuItemPrivate * priv = IM_MENU_ITEM_GET_PRIVATE(self); + + if (!priv->show_time) { + gtk_label_set_label(priv->time, ""); + return; + } + + gchar * timestring = NULL; + + GTimeVal current_time; + g_get_current_time(¤t_time); + + guint elapsed_seconds = current_time.tv_sec - priv->seconds; + guint elapsed_minutes = elapsed_seconds / 60; + + if (elapsed_seconds % 60 > 55) { + /* We're using fuzzy timers, so we need fuzzy comparisons */ + elapsed_minutes += 1; + } + + if (elapsed_minutes < 60) { + timestring = g_strdup_printf(ngettext("%d m", "%d m", elapsed_minutes), elapsed_minutes); + } else { + guint elapsed_hours = elapsed_minutes / 60; + + if (elapsed_minutes % 60 > 55) { + /* We're using fuzzy timers, so we need fuzzy comparisons */ + elapsed_hours += 1; + } + + timestring = g_strdup_printf(ngettext("%d h", "%d h", elapsed_hours), elapsed_hours); + } + + if (timestring != NULL) { + gtk_label_set_label(priv->time, timestring); + gtk_widget_show(GTK_WIDGET(priv->time)); + + g_free(timestring); + } + + return; +} + +static gboolean +time_update_cb (gpointer data) +{ + ImMenuItem * self = IM_MENU_ITEM(data); + + update_time(self); + + return TRUE; +} + +static void time_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, GTimeVal * propertydata, gpointer data) { g_debug("Got Time info"); @@ -208,18 +274,11 @@ time_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateL priv->seconds = propertydata->tv_sec; - time_t timet; - struct tm * structtm; - - timet = propertydata->tv_sec; - structtm = localtime(&timet); + update_time(self); - /* I can't imagine needing more than 80 characters */ - gchar timestring[80]; - strftime(timestring, 80, _("%I:%M"), structtm); - - gtk_label_set_label(priv->time, timestring); - gtk_widget_show(GTK_WIDGET(priv->time)); + if (priv->time_update_min == 0) { + g_timeout_add_seconds(60, time_update_cb, self); + } g_signal_emit(G_OBJECT(self), signals[TIME_CHANGED], 0, priv->seconds, TRUE); @@ -281,7 +340,7 @@ indicator_modified_cb (IndicateListener * listener, IndicateListenerServer * ser } ImMenuItem * -im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator) +im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gboolean show_time) { g_debug("Building a new IM Menu Item"); ImMenuItem * self = g_object_new(IM_MENU_ITEM_TYPE, NULL); @@ -291,6 +350,8 @@ im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server, priv->listener = listener; priv->server = server; priv->indicator = indicator; + priv->show_time = show_time; + priv->time_update_min = 0; indicate_listener_get_property(listener, server, indicator, "sender", sender_cb, self); indicate_listener_get_property_time(listener, server, indicator, "time", time_cb, self); diff --git a/src/im-menu-item.h b/src/im-menu-item.h index 34da453..f1f95ea 100644 --- a/src/im-menu-item.h +++ b/src/im-menu-item.h @@ -52,7 +52,7 @@ struct _ImMenuItem { }; GType im_menu_item_get_type (void); -ImMenuItem * im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator); +ImMenuItem * im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gboolean show_time); glong im_menu_item_get_seconds (ImMenuItem * menuitem); G_END_DECLS diff --git a/src/indicator-messages.c b/src/indicator-messages.c index c600460..e8fed5b 100644 --- a/src/indicator-messages.c +++ b/src/indicator-messages.c @@ -112,7 +112,7 @@ imList_sort (gconstpointer a, gconstpointer b) return (gint)(im_menu_item_get_seconds(IM_MENU_ITEM(pb->menuitem)) - im_menu_item_get_seconds(IM_MENU_ITEM(pa->menuitem))); } -void +static void server_added (IndicateListener * listener, IndicateListenerServer * server, gchar * type, gpointer data) { g_debug("Server Added '%s' of type '%s'.", INDICATE_LISTENER_SERVER_DBUS_NAME(server), type); @@ -227,7 +227,7 @@ im_time_changed (ImMenuItem * imitem, glong seconds, gpointer data) return; } -void +static void server_removed (IndicateListener * listener, IndicateListenerServer * server, gchar * type, gpointer data) { g_debug("Removing server: %s", INDICATE_LISTENER_SERVER_DBUS_NAME(server)); @@ -342,13 +342,13 @@ subtype_cb (IndicateListener * listener, IndicateListenerServer * server, Indica g_debug("Message subtype: %s", propertydata); - if (!strcmp(propertydata, "im")) { + if (!strcmp(propertydata, "im") || !strcmp(propertydata, "login")) { imList_t * listItem = g_new(imList_t, 1); listItem->server = server; listItem->indicator = indicator; g_debug("Building IM Item"); - ImMenuItem * menuitem = im_menu_item_new(listener, server, indicator); + ImMenuItem * menuitem = im_menu_item_new(listener, server, indicator, !strcmp(propertydata, "im")); g_object_ref(G_OBJECT(menuitem)); listItem->menuitem = GTK_WIDGET(menuitem); |