pidgin/pidgin

36732747258f
Parents 931b9adb4ab5
Children c36543f2ec67
Only open new conversations if they are not already open

Testing Done:
Double-clicked twice on a contact and verified that only one conversation was opened.

Reviewed at https://reviews.imfreedom.org/r/2981/
--- a/pidgin/pidgindisplaywindow.c Tue Mar 05 02:04:55 2024 -0600
+++ b/pidgin/pidgindisplaywindow.c Thu Mar 07 21:34:06 2024 -0600
@@ -106,6 +106,18 @@
return (conversation_a == conversation_b);
}
+static gboolean
+pidgin_display_window_find_conversation_by_id(gconstpointer a,
+ G_GNUC_UNUSED gconstpointer b,
+ gpointer user_data)
+{
+ PidginDisplayItem *item_a = PIDGIN_DISPLAY_ITEM((gpointer)a);
+ const char *a_id = pidgin_display_item_get_id(item_a);
+ const char *id = user_data;
+
+ return purple_strequal(a_id, id);
+}
+
/******************************************************************************
* Actions
*****************************************************************************/
@@ -486,6 +498,7 @@
PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
const char *account_id = NULL;
char *id = NULL;
+ gboolean item_exists = FALSE;
GtkWidget *parent = gtk_widget_get_parent(pidgin_conversation);
@@ -496,17 +509,24 @@
account_id = purple_contact_info_get_id(info);
id = g_strdup_printf("%s-%s", account_id, conversation_id);
- item = pidgin_display_item_new(pidgin_conversation, id);
- g_free(id);
- g_object_set_data(G_OBJECT(item), "conversation", purple_conversation);
+ item_exists =
+ g_list_store_find_with_equal_func_full(window->conversation_model,
+ NULL,
+ pidgin_display_window_find_conversation_by_id,
+ id,
+ NULL);
+ if (!item_exists) {
+ item = pidgin_display_item_new(pidgin_conversation, id);
+ g_object_set_data(G_OBJECT(item), "conversation", purple_conversation);
- g_object_bind_property(purple_conversation, "title",
- item, "title",
- G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+ g_object_bind_property(purple_conversation, "title",
+ item, "title",
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
- g_list_store_append(window->conversation_model, item);
- g_clear_object(&item);
-
+ g_list_store_append(window->conversation_model, item);
+ g_clear_object(&item);
+ }
+ g_free(id);
if(GTK_IS_WIDGET(parent)) {
g_object_unref(pidgin_conversation);
}