# HG changeset patch
# Node ID 9ab7f1cbacc1
# Parent  4eda25f19952
diff --git a/pidgin/prefs/pidginprefs.c b/pidgin/prefs/pidginprefs.c
--- a/pidgin/prefs/pidginprefs.c
+++ b/pidgin/prefs/pidginprefs.c
@@ -203,90 +203,72 @@ enum {
 	PREF_DROPDOWN_COUNT
 };
 
-typedef struct
+static void
+dropdown_set(GtkComboBox *combo_box, G_GNUC_UNUSED gpointer data)
 {
-	PurplePrefType type;
-	union {
-		const char *string;
-		int integer;
-		gboolean boolean;
-	} value;
-} PidginPrefValue;
-
-typedef void (*PidginPrefsDropdownCallback)(GtkComboBox *combo_box,
-	PidginPrefValue value);
-
-static void
-dropdown_set(GtkComboBox *combo_box, gpointer _cb)
-{
-	PidginPrefsDropdownCallback cb = _cb;
 	GtkTreeIter iter;
 	GtkTreeModel *tree_model;
-	PidginPrefValue active;
+	PurplePrefType type;
+	const char *key;
 
 	tree_model = gtk_combo_box_get_model(combo_box);
-	if (!gtk_combo_box_get_active_iter(combo_box, &iter))
+	if (!gtk_combo_box_get_active_iter(combo_box, &iter)) {
 		return;
-	active.type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo_box),
-		"type"));
-
-	g_object_set_data(G_OBJECT(combo_box), "previously_active",
-		g_object_get_data(G_OBJECT(combo_box), "current_active"));
-	g_object_set_data(G_OBJECT(combo_box), "current_active",
-		GINT_TO_POINTER(gtk_combo_box_get_active(combo_box)));
-
-	if (active.type == PURPLE_PREF_INT) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&active.value.integer, -1);
-	}
-	else if (active.type == PURPLE_PREF_STRING) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&active.value.string, -1);
-	}
-	else if (active.type == PURPLE_PREF_BOOLEAN) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&active.value.boolean, -1);
 	}
 
-	cb(combo_box, active);
+	type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo_box), "type"));
+	key = g_object_get_data(G_OBJECT(combo_box), "key");
+	if (type == PURPLE_PREF_INT) {
+		gint value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_int(key, value);
+	} else if (type == PURPLE_PREF_STRING) {
+		const char *value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_string(key, value);
+	} else if (type == PURPLE_PREF_BOOLEAN) {
+		gboolean value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_bool(key, value);
+	} else {
+		g_return_if_reached();
+	}
 }
 
-static GtkWidget *
-pidgin_prefs_dropdown_from_list_with_cb(GtkWidget *box, const gchar *title,
-	GtkComboBox **dropdown_out, GList *menuitems,
-	PidginPrefValue initial, PidginPrefsDropdownCallback cb)
+GtkWidget *
+pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title,
+		PurplePrefType type, const char *key, GList *menuitems)
 {
-	GtkWidget *dropdown;
+	GtkWidget *dropdown = NULL;
 	GtkWidget *label = NULL;
 	GtkListStore *store = NULL;
-	GtkTreeIter iter;
 	GtkTreeIter active;
 	GtkCellRenderer *renderer;
-	gpointer current_active;
+	gint pref_int_value = 0;
+	const gchar *pref_str_value = NULL;
+	gboolean pref_bool_value = FALSE;
 
 	g_return_val_if_fail(menuitems != NULL, NULL);
 
-	if (initial.type == PURPLE_PREF_INT) {
+	if (type == PURPLE_PREF_INT) {
+		pref_int_value = purple_prefs_get_int(key);
 		store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_INT);
-	} else if (initial.type == PURPLE_PREF_STRING) {
+	} else if (type == PURPLE_PREF_STRING) {
+		pref_str_value = purple_prefs_get_string(key);
 		store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_STRING);
-	} else if (initial.type == PURPLE_PREF_BOOLEAN) {
+	} else if (type == PURPLE_PREF_BOOLEAN) {
+		pref_bool_value = purple_prefs_get_bool(key);
 		store = gtk_list_store_new(PREF_DROPDOWN_COUNT, G_TYPE_STRING, G_TYPE_BOOLEAN);
 	} else {
-		g_warn_if_reached();
-		return NULL;
+		g_return_val_if_reached(NULL);
 	}
 
 	dropdown = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
-	if (dropdown_out != NULL)
-		*dropdown_out = GTK_COMBO_BOX(dropdown);
-	g_object_set_data(G_OBJECT(dropdown), "type", GINT_TO_POINTER(initial.type));
+	g_object_set_data(G_OBJECT(dropdown), "type", GINT_TO_POINTER(type));
 
 	for (; menuitems != NULL; menuitems = g_list_next(menuitems)) {
 		const PurpleKeyValuePair *menu_item = menuitems->data;
-		int int_value  = 0;
-		const char *str_value  = NULL;
-		gboolean bool_value = FALSE;
+		GtkTreeIter iter;
 
 		if (menu_item->key == NULL) {
 			break;
@@ -294,36 +276,29 @@ pidgin_prefs_dropdown_from_list_with_cb(
 
 		gtk_list_store_append(store, &iter);
 		gtk_list_store_set(store, &iter,
-				   PREF_DROPDOWN_TEXT, menu_item->key,
+		                   PREF_DROPDOWN_TEXT, menu_item->key,
 		                   -1);
 
-		if (initial.type == PURPLE_PREF_INT) {
-			int_value = GPOINTER_TO_INT(menu_item->value);
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, int_value,
-			                   -1);
-		}
-		else if (initial.type == PURPLE_PREF_STRING) {
-			str_value = (const char *)menu_item->value;
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, str_value,
-			                   -1);
-		}
-		else if (initial.type == PURPLE_PREF_BOOLEAN) {
-			bool_value = (gboolean)GPOINTER_TO_INT(menu_item->value);
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, bool_value,
-			                   -1);
-		}
+		if (type == PURPLE_PREF_INT) {
+			gint value = GPOINTER_TO_INT(menu_item->value);
+			gtk_list_store_set(store, &iter, PREF_DROPDOWN_VALUE, value, -1);
+			if (pref_int_value == value) {
+				active = iter;
+			}
 
-		if ((initial.type == PURPLE_PREF_INT &&
-			initial.value.integer == int_value) ||
-			(initial.type == PURPLE_PREF_STRING &&
-			purple_strequal(initial.value.string, str_value)) ||
-			(initial.type == PURPLE_PREF_BOOLEAN &&
-			(initial.value.boolean == bool_value))) {
+		} else if (type == PURPLE_PREF_STRING) {
+			const gchar *value = (const gchar *)menu_item->value;
+			gtk_list_store_set(store, &iter, PREF_DROPDOWN_VALUE, value, -1);
+			if (purple_strequal(pref_str_value, value)) {
+				active = iter;
+			}
 
-			active = iter;
+		} else if (type == PURPLE_PREF_BOOLEAN) {
+			gboolean value = (gboolean)GPOINTER_TO_INT(menu_item->value);
+			gtk_list_store_set(store, &iter, PREF_DROPDOWN_VALUE, value, -1);
+			if (pref_bool_value == value) {
+				active = iter;
+			}
 		}
 	}
 
@@ -334,60 +309,11 @@ pidgin_prefs_dropdown_from_list_with_cb(
 	                               NULL);
 
 	gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dropdown), &active);
-	current_active = GINT_TO_POINTER(gtk_combo_box_get_active(GTK_COMBO_BOX(
-		dropdown)));
-	g_object_set_data(G_OBJECT(dropdown), "current_active", current_active);
-	g_object_set_data(G_OBJECT(dropdown), "previously_active", current_active);
 
-	g_signal_connect(G_OBJECT(dropdown), "changed",
-		G_CALLBACK(dropdown_set), cb);
+	g_signal_connect(dropdown, "changed", G_CALLBACK(dropdown_set), NULL);
 
 	pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label);
 
-	return label;
-}
-
-static void
-pidgin_prefs_dropdown_from_list_cb(GtkComboBox *combo_box,
-	PidginPrefValue value)
-{
-	const char *key;
-
-	key = g_object_get_data(G_OBJECT(combo_box), "key");
-
-	if (value.type == PURPLE_PREF_INT) {
-		purple_prefs_set_int(key, value.value.integer);
-	} else if (value.type == PURPLE_PREF_STRING) {
-		purple_prefs_set_string(key, value.value.string);
-	} else if (value.type == PURPLE_PREF_BOOLEAN) {
-		purple_prefs_set_bool(key, value.value.boolean);
-	} else {
-		g_return_if_reached();
-	}
-}
-
-GtkWidget *
-pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title,
-		PurplePrefType type, const char *key, GList *menuitems)
-{
-	PidginPrefValue initial;
-	GtkComboBox *dropdown = NULL;
-	GtkWidget *label;
-
-	initial.type = type;
-	if (type == PURPLE_PREF_INT) {
-		initial.value.integer = purple_prefs_get_int(key);
-	} else if (type == PURPLE_PREF_STRING) {
-		initial.value.string = purple_prefs_get_string(key);
-	} else if (type == PURPLE_PREF_BOOLEAN) {
-		initial.value.boolean = purple_prefs_get_bool(key);
-	} else {
-		g_return_val_if_reached(NULL);
-	}
-
-	label = pidgin_prefs_dropdown_from_list_with_cb(box, title, &dropdown,
-		menuitems, initial, pidgin_prefs_dropdown_from_list_cb);
-
 	g_object_set_data(G_OBJECT(dropdown), "key", (gpointer)key);
 
 	return label;
@@ -431,21 +357,6 @@ pidgin_prefs_dropdown(GtkWidget *box, co
 }
 
 static void
-pidgin_prefs_bind_dropdown_from_list_cb(GtkComboBox *combo_box,
-	PidginPrefCombo *combo)
-{
-	if (combo->type == PURPLE_PREF_INT) {
-		purple_prefs_set_int(combo->key, combo->value.integer);
-	} else if (combo->type == PURPLE_PREF_STRING) {
-		purple_prefs_set_string(combo->key, combo->value.string);
-	} else if (combo->type == PURPLE_PREF_BOOLEAN) {
-		purple_prefs_set_bool(combo->key, combo->value.boolean);
-	} else {
-		g_return_if_reached();
-	}
-}
-
-static void
 bind_dropdown_set(GtkComboBox *combo_box, gpointer data)
 {
 	PidginPrefCombo *combo = data;
@@ -456,101 +367,21 @@ bind_dropdown_set(GtkComboBox *combo_box
 	if (!gtk_combo_box_get_active_iter(combo_box, &iter))
 		return;
 
-	combo->previously_active = combo->current_active;
-	combo->current_active = gtk_combo_box_get_active(combo_box);
-
 	if (combo->type == PURPLE_PREF_INT) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&combo->value.integer, -1);
-	}
-	else if (combo->type == PURPLE_PREF_STRING) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&combo->value.string, -1);
-	}
-	else if (combo->type == PURPLE_PREF_BOOLEAN) {
-		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE,
-			&combo->value.boolean, -1);
-	}
-
-	combo->cb(combo_box, combo);
-}
-
-void
-pidgin_prefs_bind_dropdown_from_list(PidginPrefCombo *combo, GList *menuitems)
-{
-	gchar *text;
-	GtkListStore *store = NULL;
-	GtkTreeIter iter;
-	GtkTreeIter active;
-
-	g_return_if_fail(menuitems != NULL);
-
-	if (combo->type == PURPLE_PREF_INT) {
-		combo->value.integer = purple_prefs_get_int(combo->key);
+		gint value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_int(combo->key, value);
 	} else if (combo->type == PURPLE_PREF_STRING) {
-		combo->value.string = purple_prefs_get_string(combo->key);
+		const gchar *value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_string(combo->key, value);
 	} else if (combo->type == PURPLE_PREF_BOOLEAN) {
-		combo->value.boolean = purple_prefs_get_bool(combo->key);
+		gboolean value;
+		gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+		purple_prefs_set_bool(combo->key, value);
 	} else {
 		g_return_if_reached();
 	}
-
-	store = GTK_LIST_STORE(
-			gtk_combo_box_get_model(GTK_COMBO_BOX(combo->combo)));
-
-	while (menuitems != NULL && (text = (char *)menuitems->data) != NULL) {
-		int int_value = 0;
-		const char *str_value = NULL;
-		gboolean bool_value = FALSE;
-
-		menuitems = g_list_next(menuitems);
-		g_return_if_fail(menuitems != NULL);
-
-		gtk_list_store_append(store, &iter);
-		gtk_list_store_set(store, &iter,
-		                   PREF_DROPDOWN_TEXT, text,
-		                   -1);
-
-		if (combo->type == PURPLE_PREF_INT) {
-			int_value = GPOINTER_TO_INT(menuitems->data);
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, int_value,
-			                   -1);
-		}
-		else if (combo->type == PURPLE_PREF_STRING) {
-			str_value = (const char *)menuitems->data;
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, str_value,
-			                   -1);
-		}
-		else if (combo->type == PURPLE_PREF_BOOLEAN) {
-			bool_value = (gboolean)GPOINTER_TO_INT(menuitems->data);
-			gtk_list_store_set(store, &iter,
-			                   PREF_DROPDOWN_VALUE, bool_value,
-			                   -1);
-		}
-
-		if ((combo->type == PURPLE_PREF_INT &&
-			combo->value.integer == int_value) ||
-			(combo->type == PURPLE_PREF_STRING &&
-			purple_strequal(combo->value.string, str_value)) ||
-			(combo->type == PURPLE_PREF_BOOLEAN &&
-			(combo->value.boolean == bool_value))) {
-
-			active = iter;
-		}
-
-		menuitems = g_list_next(menuitems);
-	}
-
-	gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo->combo), &active);
-	combo->current_active = gtk_combo_box_get_active(
-			GTK_COMBO_BOX(combo->combo));
-	combo->previously_active = combo->current_active;
-
-	combo->cb = pidgin_prefs_bind_dropdown_from_list_cb;
-	g_signal_connect(G_OBJECT(combo->combo), "changed",
-			G_CALLBACK(bind_dropdown_set), combo);
 }
 
 void
@@ -559,13 +390,16 @@ pidgin_prefs_bind_dropdown(PidginPrefCom
 	GtkTreeModel *store = NULL;
 	GtkTreeIter iter;
 	GtkTreeIter active;
+	int pref_int_value = 0;
+	const char *pref_str_value = NULL;
+	gboolean pref_bool_value = FALSE;
 
 	if (combo->type == PURPLE_PREF_INT) {
-		combo->value.integer = purple_prefs_get_int(combo->key);
+		pref_int_value = purple_prefs_get_int(combo->key);
 	} else if (combo->type == PURPLE_PREF_STRING) {
-		combo->value.string = purple_prefs_get_string(combo->key);
+		pref_str_value = purple_prefs_get_string(combo->key);
 	} else if (combo->type == PURPLE_PREF_BOOLEAN) {
-		combo->value.boolean = purple_prefs_get_bool(combo->key);
+		pref_bool_value = purple_prefs_get_bool(combo->key);
 	} else {
 		g_return_if_reached();
 	}
@@ -577,33 +411,26 @@ pidgin_prefs_bind_dropdown(PidginPrefCom
 	}
 
 	do {
-		int int_value = 0;
-		const char *str_value = NULL;
-		gboolean bool_value = FALSE;
-
 		if (combo->type == PURPLE_PREF_INT) {
-			gtk_tree_model_get(store, &iter,
-			                   PREF_DROPDOWN_VALUE, &int_value,
-			                   -1);
-			if (combo->value.integer == int_value) {
+			gint value = 0;
+			gtk_tree_model_get(store, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+			if (pref_int_value == value) {
 				active = iter;
 				break;
 			}
-		}
-		else if (combo->type == PURPLE_PREF_STRING) {
-			gtk_tree_model_get(store, &iter,
-			                   PREF_DROPDOWN_VALUE, &str_value,
-			                   -1);
-			if (purple_strequal(combo->value.string, str_value)) {
+
+		} else if (combo->type == PURPLE_PREF_STRING) {
+			const gchar *value = NULL;
+			gtk_tree_model_get(store, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+			if (purple_strequal(pref_str_value, value)) {
 				active = iter;
 				break;
 			}
-		}
-		else if (combo->type == PURPLE_PREF_BOOLEAN) {
-			gtk_tree_model_get(store, &iter,
-			                   PREF_DROPDOWN_VALUE, &bool_value,
-			                   -1);
-			if (combo->value.boolean == bool_value) {
+
+		} else if (combo->type == PURPLE_PREF_BOOLEAN) {
+			gboolean value = FALSE;
+			gtk_tree_model_get(store, &iter, PREF_DROPDOWN_VALUE, &value, -1);
+			if (pref_bool_value == value) {
 				active = iter;
 				break;
 			}
@@ -612,11 +439,6 @@ pidgin_prefs_bind_dropdown(PidginPrefCom
 
 	gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo->combo), &active);
 
-	combo->current_active = gtk_combo_box_get_active(
-			GTK_COMBO_BOX(combo->combo));
-	combo->previously_active = combo->current_active;
-
-	combo->cb = pidgin_prefs_bind_dropdown_from_list_cb;
 	g_signal_connect(G_OBJECT(combo->combo), "changed",
 			G_CALLBACK(bind_dropdown_set), combo);
 }
@@ -671,25 +493,30 @@ delete_prefs(GtkWidget *asdf, void *gdsa
 }
 
 #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 *
@@ -1060,23 +887,15 @@ static void
 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
@@ -1102,19 +921,23 @@ device_list_changed_cb(PurpleMediaManage
 {
 	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 *
diff --git a/pidgin/prefs/pidginprefsinternal.h b/pidgin/prefs/pidginprefsinternal.h
--- a/pidgin/prefs/pidginprefsinternal.h
+++ b/pidgin/prefs/pidginprefsinternal.h
@@ -31,21 +31,10 @@
 
 typedef struct _PidginPrefCombo PidginPrefCombo;
 
-typedef void (*PidginPrefsBindDropdownCallback)(GtkComboBox *combo_box,
-	PidginPrefCombo *combo);
-
 struct _PidginPrefCombo {
 	GtkWidget *combo;
 	PurplePrefType type;
 	const gchar *key;
-	union {
-		const char *string;
-		int integer;
-		gboolean boolean;
-	} value;
-	gint previously_active;
-	gint current_active;
-	PidginPrefsBindDropdownCallback cb;
 };
 
 G_BEGIN_DECLS
@@ -57,9 +46,6 @@ G_GNUC_INTERNAL
 void pidgin_prefs_bind_dropdown(PidginPrefCombo *combo);
 
 G_GNUC_INTERNAL
-void pidgin_prefs_bind_dropdown_from_list(PidginPrefCombo *combo, GList *menuitems);
-
-G_GNUC_INTERNAL
 void pidgin_prefs_bind_entry(const char *key, GtkWidget *entry);
 
 G_GNUC_INTERNAL
