diff options
author | Patryk Zawadzki <patrys@pld-linux.org> | 2009-06-16 21:37:08 +0800 |
---|---|---|
committer | Patryk Zawadzki <patrys@pld-linux.org> | 2009-06-16 21:37:08 +0800 |
commit | 40d33622db46952e016cc8e540403cccb7ba6103 (patch) | |
tree | f26977dd5915f8df13e60faa61b943890bb6575f | |
parent | cea163a21118f4f06aa6c37fa4463f9666a63019 (diff) | |
download | gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar.gz gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar.bz2 gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar.lz gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar.xz gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.tar.zst gsoc2013-empathy-40d33622db46952e016cc8e540403cccb7ba6103.zip |
Introduce empathy_contact_equal, adapt themes
Fixed adium and boxes theme engines to check if contacts refer to
the same id instead of comparing pointers. This fixes bug #585885.
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.c | 4 | ||||
-rw-r--r-- | libempathy-gtk/empathy-theme-boxes.c | 2 | ||||
-rw-r--r-- | libempathy/empathy-contact.c | 37 | ||||
-rw-r--r-- | libempathy/empathy-contact.h | 4 |
4 files changed, 43 insertions, 4 deletions
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c index 82384acd1..321d1998c 100644 --- a/libempathy-gtk/empathy-theme-adium.c +++ b/libempathy-gtk/empathy-theme-adium.c @@ -500,7 +500,8 @@ theme_adium_append_message (EmpathyChatView *view, } /* Get the right html/func to add the message */ - if (priv->last_contact == sender) { + func = "appendMessage"; + if (empathy_contact_equal (priv->last_contact, sender)) { func = "appendNextMessage"; if (empathy_contact_is_user (sender)) { html = priv->out_nextcontent_html; @@ -512,7 +513,6 @@ theme_adium_append_message (EmpathyChatView *view, } } if (!html) { - func = "appendMessage"; if (empathy_contact_is_user (sender)) { html = priv->out_content_html; len = priv->out_content_len; diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c index 199132956..64d95d4f2 100644 --- a/libempathy-gtk/empathy-theme-boxes.c +++ b/libempathy-gtk/empathy-theme-boxes.c @@ -210,7 +210,7 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme, /* Only insert a header if the previously inserted block is not the same * as this one. */ - if (last_contact == contact) { + if (empathy_contact_equal (last_contact, contact)) { return; } diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c index 8e07fb9f6..bad6ef470 100644 --- a/libempathy/empathy-contact.c +++ b/libempathy/empathy-contact.c @@ -1082,3 +1082,40 @@ empathy_contact_set_location (EmpathyContact *contact, priv->location = g_hash_table_ref (location); g_object_notify (G_OBJECT (contact), "location"); } + +/** + * empathy_contact_equal: + * @contact1: an #EmpathyContact + * @contact2: an #EmpathyContact + * + * Returns FALSE if one of the contacts is NULL but the other is not. + * Otherwise returns TRUE if both pointer are equal or if they bith + * refer to the same id. + * It's only necessary to call this function if your contact objects + * come from logs where contacts are created dynamically and comparing + * pointers is not enough. + */ +gboolean +empathy_contact_equal (gconstpointer contact1, + gconstpointer contact2) +{ + EmpathyContact *c1; + EmpathyContact *c2; + const gchar *id1; + const gchar *id2; + + if ((contact1 == NULL) != (contact2 == NULL)) { + return FALSE; + } + if (contact1 == contact2) { + return TRUE; + } + c1 = EMPATHY_CONTACT (contact1); + c2 = EMPATHY_CONTACT (contact2); + id1 = empathy_contact_get_id (c1); + id2 = empathy_contact_get_id (c2); + if (!tp_strdiff (id1, id2)) { + return TRUE; + } + return FALSE; +} diff --git a/libempathy/empathy-contact.h b/libempathy/empathy-contact.h index f4418768e..f88831342 100644 --- a/libempathy/empathy-contact.h +++ b/libempathy/empathy-contact.h @@ -125,7 +125,9 @@ gboolean empathy_avatar_save_to_file (EmpathyAvatar *avatar, GHashTable * empathy_contact_get_location (EmpathyContact *contact); void empathy_contact_set_location (EmpathyContact *contact, - GHashTable *location); + GHashTable *location); +gboolean empathy_contact_equal (gconstpointer contact1, + gconstpointer contact2); G_END_DECLS |