diff options
Diffstat (limited to 'pidgin')
-rw-r--r-- | pidgin/pidgincontactlist.c | 53 | ||||
-rw-r--r-- | pidgin/resources/ContactList/widget.ui | 36 |
2 files changed, 81 insertions, 8 deletions
diff --git a/pidgin/pidgincontactlist.c b/pidgin/pidgincontactlist.c index 91a4047927..fd09bbe6a4 100644 --- a/pidgin/pidgincontactlist.c +++ b/pidgin/pidgincontactlist.c @@ -168,6 +168,57 @@ pidgin_contact_list_message_visible_cb(G_GNUC_UNUSED GtkListItem *item, return !purple_strempty(message); } +static char * +pidgin_contact_list_get_primitive_as_string(G_GNUC_UNUSED GObject *self, + PurplePresence *presence, + G_GNUC_UNUSED gpointer data) +{ + PurplePresencePrimitive primitive; + GDateTime *idle = NULL; + GString *str = g_string_new(NULL); + const char *tmp = NULL; + + if(!PURPLE_IS_PRESENCE(presence)) { + return g_string_free(str, FALSE); + } + + primitive = purple_presence_get_primitive(presence); + tmp = purple_presence_primitive_to_string(primitive); + if(tmp != NULL) { + g_string_append_printf(str, " - %s", tmp); + } + + idle = purple_presence_get_idle_time(presence); + if(idle != NULL) { + GDateTime *now = NULL; + GTimeSpan duration; + guint days; + guint hours; + guint minutes; + + now = g_date_time_new_now_utc(); + duration = g_date_time_difference(now, idle); + g_date_time_unref(now); + + days = duration / G_TIME_SPAN_DAY; + duration %= G_TIME_SPAN_DAY; + hours = duration / G_TIME_SPAN_HOUR; + duration %= G_TIME_SPAN_HOUR; + minutes = duration / G_TIME_SPAN_MINUTE; + + if(days > 0) { + g_string_append_printf(str, _(" Idle %dd %dh %02dm"), days, hours, + minutes); + } else if(hours > 0) { + g_string_append_printf(str, _(" Idle %dh %02dm"), hours, minutes); + } else if(minutes > 0) { + g_string_append_printf(str, _(" Idle %02dm"), minutes); + } + } + + return g_string_free(str, FALSE); +} + /****************************************************************************** * GObject Implementation *****************************************************************************/ @@ -212,6 +263,8 @@ pidgin_contact_list_class_init(PidginContactListClass *klass) { pidgin_contact_list_activate_cb); gtk_widget_class_bind_template_callback(widget_class, pidgin_contact_list_message_visible_cb); + gtk_widget_class_bind_template_callback(widget_class, + pidgin_contact_list_get_primitive_as_string); } /****************************************************************************** diff --git a/pidgin/resources/ContactList/widget.ui b/pidgin/resources/ContactList/widget.ui index d32a3e055b..db28d6f354 100644 --- a/pidgin/resources/ContactList/widget.ui +++ b/pidgin/resources/ContactList/widget.ui @@ -70,14 +70,34 @@ along with this library; if not, see <https://www.gnu.org/licenses/>. <property name="vexpand">1</property> <property name="valign">center</property> <child> - <object class="GtkLabel"> - <property name="xalign">0</property> - <property name="use-markup">1</property> - <binding name="label"> - <lookup name="name-for-display" type="PurplePerson"> - <lookup name="item">GtkListItem</lookup> - </lookup> - </binding> + <object class="GtkBox"> + <property name="orientation">horizontal</property> + + <child> + <object class="GtkLabel"> + <property name="xalign">0</property> + <property name="use-markup">1</property> + <binding name="label"> + <lookup name="name-for-display" type="PurplePerson"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </binding> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="xalign">0</property> + <binding name="label"> + <closure type="gchararray" function="pidgin_contact_list_get_primitive_as_string"> + <lookup name="presence" type="PurpleContactInfo"> + <lookup name="priority-contact-info" type="PurplePerson"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </lookup> + </closure> + </binding> + </object> + </child> </object> </child> <child> |