libpurple/purplecontactinfo.c

changeset 43302
e7b0bbfec5d5
parent 43301
0e43dc8462e8
--- 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);

mercurial