Fri, 28 Mar 2025 00:05:51 -0500
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); }