--- a/libpurple/purplecontactinfo.c Thu Aug 07 21:34:33 2025 -0500 +++ b/libpurple/purplecontactinfo.c Thu Aug 07 21:40:13 2025 -0500 @@ -65,6 +65,7 @@ PROP_TIME_ZONE, PROP_NOTE, PROP_AVATAR, + PROP_AVATAR_FOR_DISPLAY, PROP_PRESENCE, PROP_TAGS, PROP_PERSON, @@ -200,6 +201,9 @@ case PROP_AVATAR: g_value_set_object(value, purple_contact_info_get_avatar(info)); break; + case PROP_AVATAR_FOR_DISPLAY: + g_value_set_object(value, purple_contact_info_get_avatar_for_display(info)); + break; case PROP_PRESENCE: g_value_set_object(value, purple_contact_info_get_presence(info)); break; @@ -502,6 +506,18 @@ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); /** + * PurpleContactInfo:avatar-for-display: + * + * The avatar that should be displayed for this contact info. + * + * Since: 3.0 + */ + properties[PROP_AVATAR_FOR_DISPLAY] = g_param_spec_object( + "avatar-for-display", NULL, NULL, + PURPLE_TYPE_IMAGE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + + /** * PurpleContactInfo:presence: * * The [class@Purple.Presence] for this contact. This is typically @@ -958,6 +974,26 @@ return priv->avatar; } +PurpleImage * +purple_contact_info_get_avatar_for_display(PurpleContactInfo *info) { + PurpleContactInfoPrivate *priv = NULL; + PurpleImage *candidate = NULL; + + g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), NULL); + + priv = purple_contact_info_get_instance_private(info); + + if(PURPLE_IS_PERSON(priv->person)) { + candidate = purple_person_get_avatar_for_display(priv->person); + } + + if(!PURPLE_IS_IMAGE(candidate)) { + candidate = priv->avatar; + } + + return candidate; +} + void purple_contact_info_set_avatar(PurpleContactInfo *info, PurpleImage *avatar) { PurpleContactInfoPrivate *priv = NULL; @@ -967,7 +1003,12 @@ priv = purple_contact_info_get_instance_private(info); if(g_set_object(&priv->avatar, avatar)) { - g_object_notify_by_pspec(G_OBJECT(info), properties[PROP_AVATAR]); + GObject *obj = G_OBJECT(info); + + g_object_freeze_notify(obj); + g_object_notify_by_pspec(obj, properties[PROP_AVATAR]); + g_object_notify_by_pspec(obj, properties[PROP_AVATAR_FOR_DISPLAY]); + g_object_thaw_notify(obj); } } @@ -1017,6 +1058,8 @@ g_object_freeze_notify(G_OBJECT(info)); g_object_notify_by_pspec(G_OBJECT(info), properties[PROP_PERSON]); + g_object_notify_by_pspec(G_OBJECT(info), + properties[PROP_AVATAR_FOR_DISPLAY]); /* Update the name-for-display property */ purple_contact_info_update_name_for_display(info);