Add Purple.Message:attributes

Fri, 28 Mar 2025 00:48:48 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 28 Mar 2025 00:48:48 -0500
changeset 43209
9bdf60700384
parent 43208
b81c104ccbe0
child 43210
ecd09bf0c746

Add Purple.Message:attributes

This is a read-only PangoAttrList for the formatting of the message.

Pango doesn't depend on any UI specific packages so it is safe to use from
libpurple.

Testing Done:
Ran the message tests under valgrind and called in the turtles.

Bugs closed: PIDGIN-18075

Reviewed at https://reviews.imfreedom.org/r/3937/

libpurple/meson.build file | annotate | diff | comparison | revisions
libpurple/purplemessage.c file | annotate | diff | comparison | revisions
libpurple/purplemessage.h file | annotate | diff | comparison | revisions
libpurple/tests/test_message.c file | annotate | diff | comparison | revisions
meson.build file | annotate | diff | comparison | revisions
--- a/libpurple/meson.build	Fri Mar 28 00:32:48 2025 -0500
+++ b/libpurple/meson.build	Fri Mar 28 00:48:48 2025 -0500
@@ -310,7 +310,7 @@
                     dependencies : # static_link_libs
                         [dnsapi, ws2_32, glib, gio, gplugin_dep, libsoup,
                          libxml, gdk_pixbuf, gstreamer, gstreamer_app, json,
-                         seagull_dep, sqlite3, math, birb_dep])
+                         pango_dep, seagull_dep, sqlite3, math, birb_dep])
 
 install_headers(purple_coreheaders,
                 subdir : purple_include_base)
@@ -356,7 +356,7 @@
     sources : [purple_builtheaders] + purple_generated_sources,
     include_directories : [toplevel_inc, libpurple_inc],
     link_with : libpurple,
-    dependencies : [birb_dep, gdk_pixbuf, gstreamer, gplugin_dep, glib, gio])
+    dependencies : [birb_dep, gdk_pixbuf, gstreamer, gplugin_dep, glib, gio, pango_dep])
 
 meson.override_dependency(purple_filebase, libpurple_dep)
 
--- a/libpurple/purplemessage.c	Fri Mar 28 00:32:48 2025 -0500
+++ b/libpurple/purplemessage.c	Fri Mar 28 00:48:48 2025 -0500
@@ -33,6 +33,7 @@
 	PurpleConversationMember *author;
 
 	char *contents;
+	PangoAttrList *attributes;
 
 	guint action : 1;
 	guint event : 1;
@@ -53,6 +54,7 @@
 	PROP_0,
 	PROP_ACTION,
 	PROP_ATTACHMENTS,
+	PROP_ATTRIBUTES,
 	PROP_AUTHOR,
 	PROP_CONTENTS,
 	PROP_DELIVERED,
@@ -99,6 +101,9 @@
 	case PROP_ATTACHMENTS:
 		g_value_set_object(value, purple_message_get_attachments(message));
 		break;
+	case PROP_ATTRIBUTES:
+		g_value_set_boxed(value, purple_message_get_attributes(message));
+		break;
 	case PROP_AUTHOR:
 		g_value_set_object(value, purple_message_get_author(message));
 		break;
@@ -197,9 +202,11 @@
 purple_message_finalize(GObject *obj) {
 	PurpleMessage *message = PURPLE_MESSAGE(obj);
 
-	g_free(message->id);
+	g_clear_pointer(&message->id, g_free);
 	g_clear_object(&message->author);
-	g_free(message->contents);
+
+	g_clear_pointer(&message->contents, g_free);
+	g_clear_pointer(&message->attributes, pango_attr_list_unref);
 
 	g_clear_error(&message->error);
 
@@ -214,6 +221,7 @@
 
 static void
 purple_message_init(PurpleMessage *message) {
+	message->attributes = pango_attr_list_new();
 	message->attachments = purple_attachments_new();
 }
 
@@ -255,6 +263,18 @@
 		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
 	/**
+	 * PurpleMessage:attributes:
+	 *
+	 * The formatting attributes of the message.
+	 *
+	 * Since: 3.0
+	 */
+	properties[PROP_ATTRIBUTES] = g_param_spec_boxed(
+		"attributes", NULL, NULL,
+		PANGO_TYPE_ATTR_LIST,
+		G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+	/**
 	 * PurpleMessage:author:
 	 *
 	 * The author of the message.
@@ -460,6 +480,13 @@
 	return message->attachments;
 }
 
+PangoAttrList *
+purple_message_get_attributes(PurpleMessage *message) {
+	g_return_val_if_fail(PURPLE_IS_MESSAGE(message), NULL);
+
+	return message->attributes;
+}
+
 PurpleConversationMember *
 purple_message_get_author(PurpleMessage *message) {
 	g_return_val_if_fail(PURPLE_IS_MESSAGE(message), NULL);
--- a/libpurple/purplemessage.h	Fri Mar 28 00:32:48 2025 -0500
+++ b/libpurple/purplemessage.h	Fri Mar 28 00:48:48 2025 -0500
@@ -29,6 +29,8 @@
 
 #include <glib-object.h>
 
+#include <pango/pango.h>
+
 #include "purpleattachment.h"
 #include "purpleattachments.h"
 #include "purpleconversationmember.h"
@@ -104,6 +106,18 @@
 PurpleAttachments *purple_message_get_attachments(PurpleMessage *message);
 
 /**
+ * purple_message_get_attributes:
+ *
+ * Gets the formatting attributes of the message.
+ *
+ * Returns: (transfer none): The attributes.
+ *
+ * Since: 3.0
+ */
+PURPLE_AVAILABLE_IN_3_0
+PangoAttrList *purple_message_get_attributes(PurpleMessage *message);
+
+/**
  * purple_message_get_author:
  * @message: The message.
  *
--- a/libpurple/tests/test_message.c	Fri Mar 28 00:32:48 2025 -0500
+++ b/libpurple/tests/test_message.c	Fri Mar 28 00:48:48 2025 -0500
@@ -18,6 +18,8 @@
 
 #include <glib.h>
 
+#include <pango/pango.h>
+
 #include <purple.h>
 
 /******************************************************************************
@@ -51,6 +53,7 @@
 	GDateTime *edited_at1 = NULL;
 	GError *error = NULL;
 	GError *error1 = NULL;
+	PangoAttrList *attributes = NULL;
 	char *id = NULL;
 	char *contents = NULL;
 	gboolean action = FALSE;
@@ -95,6 +98,7 @@
 		message,
 		"action", &action,
 		"attachments", &attachments,
+		"attributes", &attributes,
 		"author", &author1,
 		"contents", &contents,
 		"delivered", &delivered,
@@ -114,6 +118,9 @@
 	g_assert_true(PURPLE_IS_ATTACHMENTS(attachments));
 	g_clear_object(&attachments);
 
+	g_assert_nonnull(attributes);
+	pango_attr_list_unref(attributes);
+
 	g_assert_true(author1 == author);
 	g_clear_object(&author1);
 
--- a/meson.build	Fri Mar 28 00:32:48 2025 -0500
+++ b/meson.build	Fri Mar 28 00:48:48 2025 -0500
@@ -243,6 +243,7 @@
 	message('Versions of libxml2 < 2.6.18 may contain bugs that could cause XMPP messages to be discarded.')
 endif
 
+pango_dep = dependency('pango', version : '>=1.54.0')
 seagull_dep = dependency('seagull', version : '>= 0.1.1')
 sqlite3 = dependency('sqlite3', version : '>= 3.27.0')
 xeme_dep = dependency('xeme')

mercurial