Fri, 28 Mar 2025 00:48:48 -0500
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/
--- 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')