Notify that the n-items property changed when extend Purple.ConversationMembers

Fri, 28 Mar 2025 00:05:51 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 28 Mar 2025 00:05:51 -0500
changeset 43207
5f232d909647
parent 43206
58f66e90f24a
child 43208
b81c104ccbe0

Notify that the n-items property changed when extend Purple.ConversationMembers

Testing Done:
Ran the unit tests under valgrind and called in the turtles. Also joined a channel on IRCv3 and verified that the member count was correct without any additional join/parts.

Bugs closed: PIDGIN-18074

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

libpurple/purpleconversationmembers.c file | annotate | diff | comparison | revisions
libpurple/tests/test_conversation_members.c file | annotate | diff | comparison | revisions
--- a/libpurple/purpleconversationmembers.c	Fri Mar 28 00:03:57 2025 -0500
+++ b/libpurple/purpleconversationmembers.c	Fri Mar 28 00:05:51 2025 -0500
@@ -371,7 +371,10 @@
 	g_ptr_array_extend_and_steal(members1->members, members2->members);
 
 	g_list_model_items_changed(G_LIST_MODEL(members1), position, 0, moving);
+	g_object_notify_by_pspec(G_OBJECT(members1), properties[PROP_N_ITEMS]);
+
 	g_list_model_items_changed(G_LIST_MODEL(members2), 0, moving, 0);
+	g_object_notify_by_pspec(G_OBJECT(members2), properties[PROP_N_ITEMS]);
 
 	g_object_unref(G_OBJECT(members2));
 }
--- a/libpurple/tests/test_conversation_members.c	Fri Mar 28 00:03:57 2025 -0500
+++ b/libpurple/tests/test_conversation_members.c	Fri Mar 28 00:05:51 2025 -0500
@@ -268,11 +268,21 @@
  * Extend Tests
  *****************************************************************************/
 static void
-test_purple_conversation_members_extend_counter_cb(G_GNUC_UNUSED GListModel *model,
-                                                   G_GNUC_UNUSED guint position,
-                                                   G_GNUC_UNUSED guint removed,
-                                                   G_GNUC_UNUSED guint added,
-                                                   gpointer data)
+test_purple_conversation_members_extend_items_changed_counter(G_GNUC_UNUSED GListModel *model,
+                                                              G_GNUC_UNUSED guint position,
+                                                              G_GNUC_UNUSED guint removed,
+                                                              G_GNUC_UNUSED guint added,
+                                                              gpointer data)
+{
+	guint *counter = data;
+
+	*counter = *counter + 1;
+}
+
+static void
+test_purple_conversation_members_extend_notify_counter(G_GNUC_UNUSED GObject *obj,
+                                                       G_GNUC_UNUSED GParamSpec *pspec,
+                                                       gpointer data)
 {
 	guint *counter = data;
 
@@ -309,27 +319,37 @@
 	PurpleConversationMember *member = NULL;
 	PurpleConversationMembers *existing_members = NULL;
 	PurpleConversationMembers *new_members = NULL;
-	guint existing_counter = 0;
-	guint new_counter = 0;
+	guint existing_items_changed_counter = 0;
+	guint existing_n_items_counter = 0;
+	guint new_items_changed_counter = 0;
+	guint new_n_items_counter = 0;
 	guint n_items = 0;
 
 	existing_members = purple_conversation_members_new();
 	g_signal_connect(existing_members, "items-changed",
-	                 G_CALLBACK(test_purple_conversation_members_extend_counter_cb),
-	                 &existing_counter);
+	                 G_CALLBACK(test_purple_conversation_members_extend_items_changed_counter),
+	                 &existing_items_changed_counter);
+	g_signal_connect(existing_members, "notify::n-items",
+	                 G_CALLBACK(test_purple_conversation_members_extend_notify_counter),
+	                 &existing_n_items_counter);
 
 	new_members = purple_conversation_members_new();
 	g_signal_connect(new_members, "items-changed",
-	                 G_CALLBACK(test_purple_conversation_members_extend_counter_cb),
-	                 &new_counter);
+	                 G_CALLBACK(test_purple_conversation_members_extend_items_changed_counter),
+	                 &new_items_changed_counter);
+	g_signal_connect(new_members, "notify::n-items",
+	                 G_CALLBACK(test_purple_conversation_members_extend_notify_counter),
+	                 &new_n_items_counter);
 
 	/* Add a member to the existing members. */
-	existing_counter = 0;
+	existing_items_changed_counter = 0;
+	existing_n_items_counter = 0;
 	info = purple_contact_info_new(NULL);
 	member = purple_conversation_members_add_member(existing_members, info,
 	                                                FALSE, NULL);
 	g_assert_true(PURPLE_IS_CONVERSATION_MEMBER(member));
-	g_assert_cmpuint(existing_counter, ==, 1);
+	g_assert_cmpuint(existing_items_changed_counter, ==, 1);
+	g_assert_cmpuint(existing_n_items_counter, ==, 1);
 	n_items = g_list_model_get_n_items(G_LIST_MODEL(existing_members));
 	g_assert_cmpuint(n_items, ==, 1);
 	g_clear_object(&info);
@@ -338,7 +358,8 @@
 	for(guint i = 0; i < 3; i++) {
 		char *id = g_uuid_string_random();
 
-		new_counter = 0;
+		new_items_changed_counter = 0;
+		new_n_items_counter = 0;
 		info = purple_contact_info_new(id);
 		g_free(id);
 
@@ -347,12 +368,15 @@
 		g_assert_true(PURPLE_IS_CONVERSATION_MEMBER(member));
 		n_items = g_list_model_get_n_items(G_LIST_MODEL(new_members));
 		g_assert_cmpuint(n_items, ==, i + 1);
-		g_assert_cmpuint(new_counter, ==, 1);
+		g_assert_cmpuint(new_items_changed_counter, ==, 1);
+		g_assert_cmpuint(new_n_items_counter, ==, 1);
 		g_clear_object(&info);
 	}
 
-	existing_counter = 0;
-	new_counter = 0;
+	existing_items_changed_counter = 0;
+	existing_n_items_counter = 0;
+	new_items_changed_counter = 0;
+	new_n_items_counter = 0;
 
 	/* Add some signal handlers that'll verify the items-changed signal was
 	 * emitted properly.
@@ -364,8 +388,10 @@
 	                 G_CALLBACK(test_purple_conversation_members_extend_new_cb),
 	                 NULL);
 	purple_conversation_members_extend(existing_members, new_members);
-	g_assert_cmpuint(existing_counter, ==, 1);
-	g_assert_cmpuint(new_counter, ==, 1);
+	g_assert_cmpuint(existing_items_changed_counter, ==, 1);
+	g_assert_cmpuint(existing_n_items_counter, ==, 1);
+	g_assert_cmpuint(new_items_changed_counter, ==, 1);
+	g_assert_cmpuint(new_n_items_counter, ==, 1);
 
 	g_assert_finalize_object(existing_members);
 }

mercurial