| 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 { |