Use GtkListStore for populating VV device prefs

Tue, 17 May 2022 01:58:53 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Tue, 17 May 2022 01:58:53 -0500
changeset 41385
d2f5ce624a49
parent 41384
4c6807a2260d
child 41386
2bf2cc598a0e

Use GtkListStore for populating VV device prefs

This is more in line with standard usage of combo boxes, instead of using an
intermediary list of values.

pidgin/prefs/pidginprefs.c file | annotate | diff | comparison | revisions
--- a/pidgin/prefs/pidginprefs.c	Tue May 17 01:58:53 2022 -0500
+++ b/pidgin/prefs/pidginprefs.c	Tue May 17 01:58:53 2022 -0500
@@ -585,25 +585,30 @@
 }
 
 #ifdef USE_VV
-static GList *
-get_vv_device_menuitems(PurpleMediaElementType type)
+static void
+populate_vv_device_menuitems(PurpleMediaElementType type, GtkListStore *store)
 {
-	GList *result = NULL;
-	GList *i;
+	PurpleMediaManager *manager = NULL;
+	GList *devices;
+
+	gtk_list_store_clear(store);
 
-	i = purple_media_manager_enumerate_elements(purple_media_manager_get(),
-			type);
-	for (; i; i = g_list_delete_link(i, i)) {
-		PurpleMediaElementInfo *info = i->data;
+	manager = purple_media_manager_get();
+	devices = purple_media_manager_enumerate_elements(manager, type);
+	for (; devices; devices = g_list_delete_link(devices, devices)) {
+		PurpleMediaElementInfo *info = devices->data;
+		GtkTreeIter iter;
+		const gchar *name, *id;
 
-		result = g_list_append(result,
-				purple_media_element_info_get_name(info));
-		result = g_list_append(result,
-				purple_media_element_info_get_id(info));
+		name = purple_media_element_info_get_name(info);
+		id = purple_media_element_info_get_id(info);
+
+		gtk_list_store_append(store, &iter);
+		gtk_list_store_set(store, &iter, PREF_DROPDOWN_TEXT, name,
+		                   PREF_DROPDOWN_VALUE, id, -1);
+
 		g_object_unref(info);
 	}
-
-	return result;
 }
 
 static GstElement *
@@ -974,23 +979,15 @@
 bind_vv_dropdown(PidginPrefCombo *combo, PurpleMediaElementType element_type)
 {
 	const gchar *preference_key;
-	GList *devices;
+	GtkTreeModel *model;
 
 	preference_key = purple_media_type_to_preference_key(element_type);
-	devices = get_vv_device_menuitems(element_type);
-
-	if (g_list_find_custom(devices, purple_prefs_get_string(preference_key),
-		(GCompareFunc)strcmp) == NULL)
-	{
-		GList *next = g_list_next(devices);
-		if (next)
-			purple_prefs_set_string(preference_key, next->data);
-	}
+	model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo));
+	populate_vv_device_menuitems(element_type, GTK_LIST_STORE(model));
 
 	combo->type = PURPLE_PREF_STRING;
 	combo->key = preference_key;
-	pidgin_prefs_bind_dropdown_from_list(combo, devices);
-	g_list_free_full(devices, g_free);
+	pidgin_prefs_bind_dropdown(combo);
 }
 
 static void
@@ -1016,19 +1013,23 @@
 {
 	PidginPrefCombo *combo;
 	PurpleMediaElementType media_type;
+	guint signal_id;
 	GtkTreeModel *model;
 
 	combo = g_object_get_data(G_OBJECT(widget), "vv_combo");
 	media_type = (PurpleMediaElementType)g_object_get_data(G_OBJECT(widget),
 			"vv_media_type");
 
-	/* Unbind original connections so we can repopulate the combo box. */
-	g_object_disconnect(combo->combo, "any-signal::changed",
-	                    G_CALLBACK(bind_dropdown_set), combo, NULL);
+	/* Block signals so pref doesn't get re-saved while changing UI. */
+	signal_id = g_signal_lookup("changed", GTK_TYPE_COMBO_BOX);
+	g_signal_handlers_block_matched(combo->combo, G_SIGNAL_MATCH_ID, signal_id,
+	                                0, NULL, NULL, NULL);
+
 	model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo));
-	gtk_list_store_clear(GTK_LIST_STORE(model));
+	populate_vv_device_menuitems(media_type, GTK_LIST_STORE(model));
 
-	bind_vv_dropdown(combo, media_type);
+	g_signal_handlers_unblock_matched(combo->combo, G_SIGNAL_MATCH_ID,
+	                                  signal_id, 0, NULL, NULL, NULL);
 }
 
 static GtkWidget *

mercurial