--- 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 @@
-get_vv_device_menuitems(PurpleMediaElementType type)
+populate_vv_device_menuitems(PurpleMediaElementType type, GtkListStore *store)
+ PurpleMediaManager *manager = NULL; + gtk_list_store_clear(store); - i = purple_media_manager_enumerate_elements(purple_media_manager_get(),
- 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; + 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);
@@ -974,23 +979,15 @@
bind_vv_dropdown(PidginPrefCombo *combo, PurpleMediaElementType element_type)
const gchar *preference_key;
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);
- 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); @@ -1016,19 +1013,23 @@
PurpleMediaElementType media_type;
combo = g_object_get_data(G_OBJECT(widget), "vv_combo");
media_type = (PurpleMediaElementType)g_object_get_data(G_OBJECT(widget),
- /* 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, 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);