Mercurial > pidgin
diff finch/gntlog.c @ 23392:eac0561dfd55
propagate from branch 'im.pidgin.pidgin.2.4.3' (head 260d5ee6ca276e761c5b0bd1b612edc5743eaf67)
to branch 'im.pidgin.pidgin' (head dba36543cdde6db127857b0edfdc3ad1969bbd39)
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Thu, 26 Jun 2008 19:08:55 +0000 |
parents | 5f9793c8510a |
children | 3da0957e7821 53c27ca1bb71 |
line wrap: on
line diff
--- a/finch/gntlog.c Thu Jun 26 19:08:38 2008 +0000 +++ b/finch/gntlog.c Thu Jun 26 19:08:55 2008 +0000 @@ -61,8 +61,12 @@ if (viewer->contact != NULL) return g_direct_hash(viewer->contact); - return g_str_hash(viewer->screenname) + - g_str_hash(purple_account_get_username(viewer->account)); + if (viewer->account) { + return g_str_hash(viewer->screenname) + + g_str_hash(purple_account_get_username(viewer->account)); + } + + return (guint)viewer; } static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) @@ -84,10 +88,14 @@ return FALSE; } - normal = g_strdup(purple_normalize(a->account, a->screenname)); - ret = (a->account == b->account) && - !strcmp(normal, purple_normalize(b->account, b->screenname)); - g_free(normal); + if (a->screenname && b->screenname) { + normal = g_strdup(purple_normalize(a->account, a->screenname)); + ret = (a->account == b->account) && + !strcmp(normal, purple_normalize(b->account, b->screenname)); + g_free(normal); + } else { + ret = (a == b); + } return ret; } @@ -302,7 +310,7 @@ /* Label ************/ text = g_strdup_printf("%s", title); - lv->label = gnt_label_new(text); + lv->label = gnt_label_new_with_format(text, GNT_TEXT_FLAG_BOLD); g_free(text); gnt_box_add_widget(GNT_BOX(vbox), lv->label); @@ -348,14 +356,28 @@ return lv; } -void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) { +static void +our_logging_blows(PurpleLogSet *set, PurpleLogSet *setagain, GList **list) +{ + /* The iteration happens on the first list. So we use the shorter list in front */ + if (set->type != PURPLE_LOG_IM) + return; + *list = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM, set->name, set->account), *list); +} + +void finch_log_show(PurpleLogType type, const char *screenname, PurpleAccount *account) +{ struct log_viewer_hash_t *ht; FinchLogViewer *lv = NULL; const char *name = screenname; char *title; + GList *logs = NULL; + int size = 0; - g_return_if_fail(account != NULL); - g_return_if_fail(screenname != NULL); + if (type != PURPLE_LOG_IM) { + g_return_if_fail(account != NULL); + g_return_if_fail(screenname != NULL); + } ht = g_new0(struct log_viewer_hash_t, 1); @@ -383,20 +405,35 @@ } else { PurpleBuddy *buddy; - buddy = purple_find_buddy(account, screenname); - if (buddy != NULL) - name = purple_buddy_get_contact_alias(buddy); - - title = g_strdup_printf(_("Conversations with %s"), name); + if (screenname) { + buddy = purple_find_buddy(account, screenname); + if (buddy != NULL) + name = purple_buddy_get_contact_alias(buddy); + title = g_strdup_printf(_("Conversations with %s"), name); + } else { + title = g_strdup(_("All Conversations")); + } } - display_log_viewer(ht, purple_log_get_logs(type, screenname, account), - title, purple_log_get_total_size(type, screenname, account)); + if (screenname) { + logs = purple_log_get_logs(type, screenname, account); + size = purple_log_get_total_size(type, screenname, account); + } else { + /* This will happen only for IMs */ + GHashTable *table = purple_log_get_log_sets(); + g_hash_table_foreach(table, (GHFunc)our_logging_blows, &logs); + g_hash_table_destroy(table); + logs = g_list_sort(logs, purple_log_compare); + size = 0; + } + + display_log_viewer(ht, logs, title, size); g_free(title); } -void finch_log_show_contact(PurpleContact *contact) { +void finch_log_show_contact(PurpleContact *contact) +{ struct log_viewer_hash_t *ht; PurpleBlistNode *child; FinchLogViewer *lv = NULL;