# HG changeset patch # User Tim Ringenbach # Date 1103077798 0 # Node ID 28135f8c226d8c3445ca72e36988c0dfbd2f5921 # Parent a7a4db67040c140dc8556e214977201fd38ea2b2 [gaim-migrate @ 11603] I call this lazy contact priority computation. Be careful not to use contact->priority directly, unless you know what you're doing. committer: Tailor Script diff -r a7a4db67040c -r 28135f8c226d src/blist.c --- a/src/blist.c Wed Dec 15 02:17:59 2004 +0000 +++ b/src/blist.c Wed Dec 15 02:29:58 2004 +0000 @@ -121,7 +121,14 @@ } } -void gaim_contact_compute_priority_buddy(GaimContact *contact) +void gaim_contact_invalidate_priority_buddy(GaimContact *contact) +{ + g_return_if_fail(contact != NULL); + + contact->priority_valid = FALSE; +} + +static void gaim_contact_compute_priority_buddy(GaimContact *contact) { GaimBlistNode *bnode; GaimBuddy *new_priority = NULL; @@ -160,6 +167,7 @@ } contact->priority = new_priority; + contact->priority_valid = TRUE; } static gboolean blist_save_callback(gpointer data) @@ -327,7 +335,7 @@ * because something, somewhere changed. Calling the stuff below * certainly won't hurt anything. Unless you're on a K6-2 300. */ - gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); + gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); if (ops && ops->update) ops->update(gaimbuddylist, (GaimBlistNode *)buddy); } @@ -821,7 +829,7 @@ if (!bnode->parent->child) { gaim_blist_remove_contact((GaimContact*)bnode->parent); } else { - gaim_contact_compute_priority_buddy((GaimContact*)bnode->parent); + gaim_contact_invalidate_priority_buddy((GaimContact*)bnode->parent); ops->update(gaimbuddylist, bnode->parent); } } @@ -861,7 +869,7 @@ g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); - gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); + gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); schedule_blist_save(); @@ -913,7 +921,7 @@ if (contact->alias) return contact->alias; - return gaim_buddy_get_alias(contact->priority); + return gaim_buddy_get_alias(gaim_contact_get_priority_buddy(contact)); } gboolean gaim_contact_on_account(GaimContact *c, GaimAccount *account) @@ -1255,7 +1263,7 @@ /* Re-sort the contact */ if (contact->priority == buddy) { - gaim_contact_compute_priority_buddy(contact); + gaim_contact_invalidate_priority_buddy(contact); if (ops && ops->update) ops->update(gaimbuddylist, cnode); } @@ -1392,6 +1400,9 @@ { g_return_val_if_fail(contact != NULL, NULL); + if (!contact->priority_valid) + gaim_contact_compute_priority_buddy(contact); + return contact->priority; } @@ -1715,7 +1726,7 @@ } if (recompute || gaim_blist_node_get_bool(cnode, "show_offline")) { - gaim_contact_compute_priority_buddy((GaimContact*)cnode); + gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); ops->update(gaimbuddylist, cnode); } } else if (GAIM_BLIST_NODE_IS_CHAT(cnode) && @@ -1768,7 +1779,7 @@ } } if (recompute) { - gaim_contact_compute_priority_buddy((GaimContact*)cnode); + gaim_contact_invalidate_priority_buddy((GaimContact*)cnode); if (ops && ops->update) ops->update(gaimbuddylist, cnode); } @@ -2323,7 +2334,7 @@ return; if (exp_acct && ! gaim_group_on_account(group, exp_acct)) - return; + return; group_name = g_markup_escape_text(group->name, -1); fprintf(file, "\t\t\n", group_name); diff -r a7a4db67040c -r 28135f8c226d src/blist.h --- a/src/blist.h Wed Dec 15 02:17:59 2004 +0000 +++ b/src/blist.h Wed Dec 15 02:29:58 2004 +0000 @@ -131,6 +131,7 @@ int currentsize; /**< The number of buddies in this contact corresponding to online accounts */ int online; /**< The number of buddies in this contact who are currently online */ GaimBuddy *priority; /**< The "top" buddy for this contact */ + gboolean priority_valid; /**< Is priority valid? */ }; @@ -511,14 +512,14 @@ */ gboolean gaim_contact_on_account(GaimContact *contact, GaimAccount *account); - /** - * Re-calculates the priority buddy for a contact. + * Invalidates the priority buddy so that the next call to + * gaim_contact_get_priority_buddy recomputes it. * - * @param contact The contact. + * @param contact The contact + * @return The highest priority buddy */ -void gaim_contact_compute_priority_buddy(GaimContact *contact); - +void gaim_contact_invalidate_priority_buddy(GaimContact *contact); /** * Removes a buddy from the buddy list and frees the memory allocated to it. * diff -r a7a4db67040c -r 28135f8c226d src/status.c --- a/src/status.c Wed Dec 15 02:17:59 2004 +0000 +++ b/src/status.c Wed Dec 15 02:29:58 2004 +0000 @@ -1341,7 +1341,7 @@ } } - gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); + gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); if (ops != NULL && ops->update != NULL) ops->update(gaim_get_blist(), (GaimBlistNode *)buddy);