pidgin/prefs/pidginprefs.c

changeset 41385
d2f5ce624a49
parent 41384
4c6807a2260d
child 41386
2bf2cc598a0e
equal deleted inserted replaced
41384:4c6807a2260d 41385:d2f5ce624a49
583 583
584 prefs = NULL; 584 prefs = NULL;
585 } 585 }
586 586
587 #ifdef USE_VV 587 #ifdef USE_VV
588 static GList * 588 static void
589 get_vv_device_menuitems(PurpleMediaElementType type) 589 populate_vv_device_menuitems(PurpleMediaElementType type, GtkListStore *store)
590 { 590 {
591 GList *result = NULL; 591 PurpleMediaManager *manager = NULL;
592 GList *i; 592 GList *devices;
593 593
594 i = purple_media_manager_enumerate_elements(purple_media_manager_get(), 594 gtk_list_store_clear(store);
595 type); 595
596 for (; i; i = g_list_delete_link(i, i)) { 596 manager = purple_media_manager_get();
597 PurpleMediaElementInfo *info = i->data; 597 devices = purple_media_manager_enumerate_elements(manager, type);
598 598 for (; devices; devices = g_list_delete_link(devices, devices)) {
599 result = g_list_append(result, 599 PurpleMediaElementInfo *info = devices->data;
600 purple_media_element_info_get_name(info)); 600 GtkTreeIter iter;
601 result = g_list_append(result, 601 const gchar *name, *id;
602 purple_media_element_info_get_id(info)); 602
603 name = purple_media_element_info_get_name(info);
604 id = purple_media_element_info_get_id(info);
605
606 gtk_list_store_append(store, &iter);
607 gtk_list_store_set(store, &iter, PREF_DROPDOWN_TEXT, name,
608 PREF_DROPDOWN_VALUE, id, -1);
609
603 g_object_unref(info); 610 g_object_unref(info);
604 } 611 }
605
606 return result;
607 } 612 }
608 613
609 static GstElement * 614 static GstElement *
610 create_test_element(PurpleMediaElementType type) 615 create_test_element(PurpleMediaElementType type)
611 { 616 {
972 977
973 static void 978 static void
974 bind_vv_dropdown(PidginPrefCombo *combo, PurpleMediaElementType element_type) 979 bind_vv_dropdown(PidginPrefCombo *combo, PurpleMediaElementType element_type)
975 { 980 {
976 const gchar *preference_key; 981 const gchar *preference_key;
977 GList *devices; 982 GtkTreeModel *model;
978 983
979 preference_key = purple_media_type_to_preference_key(element_type); 984 preference_key = purple_media_type_to_preference_key(element_type);
980 devices = get_vv_device_menuitems(element_type); 985 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo));
981 986 populate_vv_device_menuitems(element_type, GTK_LIST_STORE(model));
982 if (g_list_find_custom(devices, purple_prefs_get_string(preference_key),
983 (GCompareFunc)strcmp) == NULL)
984 {
985 GList *next = g_list_next(devices);
986 if (next)
987 purple_prefs_set_string(preference_key, next->data);
988 }
989 987
990 combo->type = PURPLE_PREF_STRING; 988 combo->type = PURPLE_PREF_STRING;
991 combo->key = preference_key; 989 combo->key = preference_key;
992 pidgin_prefs_bind_dropdown_from_list(combo, devices); 990 pidgin_prefs_bind_dropdown(combo);
993 g_list_free_full(devices, g_free);
994 } 991 }
995 992
996 static void 993 static void
997 bind_vv_frame(PidginPrefsWindow *win, PidginPrefCombo *combo, 994 bind_vv_frame(PidginPrefsWindow *win, PidginPrefCombo *combo,
998 PurpleMediaElementType type) 995 PurpleMediaElementType type)
1014 static void 1011 static void
1015 device_list_changed_cb(PurpleMediaManager *manager, GtkWidget *widget) 1012 device_list_changed_cb(PurpleMediaManager *manager, GtkWidget *widget)
1016 { 1013 {
1017 PidginPrefCombo *combo; 1014 PidginPrefCombo *combo;
1018 PurpleMediaElementType media_type; 1015 PurpleMediaElementType media_type;
1016 guint signal_id;
1019 GtkTreeModel *model; 1017 GtkTreeModel *model;
1020 1018
1021 combo = g_object_get_data(G_OBJECT(widget), "vv_combo"); 1019 combo = g_object_get_data(G_OBJECT(widget), "vv_combo");
1022 media_type = (PurpleMediaElementType)g_object_get_data(G_OBJECT(widget), 1020 media_type = (PurpleMediaElementType)g_object_get_data(G_OBJECT(widget),
1023 "vv_media_type"); 1021 "vv_media_type");
1024 1022
1025 /* Unbind original connections so we can repopulate the combo box. */ 1023 /* Block signals so pref doesn't get re-saved while changing UI. */
1026 g_object_disconnect(combo->combo, "any-signal::changed", 1024 signal_id = g_signal_lookup("changed", GTK_TYPE_COMBO_BOX);
1027 G_CALLBACK(bind_dropdown_set), combo, NULL); 1025 g_signal_handlers_block_matched(combo->combo, G_SIGNAL_MATCH_ID, signal_id,
1026 0, NULL, NULL, NULL);
1027
1028 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo)); 1028 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo));
1029 gtk_list_store_clear(GTK_LIST_STORE(model)); 1029 populate_vv_device_menuitems(media_type, GTK_LIST_STORE(model));
1030 1030
1031 bind_vv_dropdown(combo, media_type); 1031 g_signal_handlers_unblock_matched(combo->combo, G_SIGNAL_MATCH_ID,
1032 signal_id, 0, NULL, NULL, NULL);
1032 } 1033 }
1033 1034
1034 static GtkWidget * 1035 static GtkWidget *
1035 vv_page(PidginPrefsWindow *win) 1036 vv_page(PidginPrefsWindow *win)
1036 { 1037 {

mercurial