| 211 int integer; |
211 int integer; |
| 212 gboolean boolean; |
212 gboolean boolean; |
| 213 } value; |
213 } value; |
| 214 } PidginPrefValue; |
214 } PidginPrefValue; |
| 215 |
215 |
| 216 typedef void (*PidginPrefsDropdownCallback)(GtkComboBox *combo_box, |
216 static void |
| 217 PidginPrefValue value); |
217 dropdown_set(GtkComboBox *combo_box, G_GNUC_UNUSED gpointer data) |
| 218 |
218 { |
| 219 static void |
|
| 220 dropdown_set(GtkComboBox *combo_box, gpointer _cb) |
|
| 221 { |
|
| 222 PidginPrefsDropdownCallback cb = _cb; |
|
| 223 GtkTreeIter iter; |
219 GtkTreeIter iter; |
| 224 GtkTreeModel *tree_model; |
220 GtkTreeModel *tree_model; |
| 225 PidginPrefValue active; |
221 PurplePrefType type; |
| |
222 const char *key; |
| 226 |
223 |
| 227 tree_model = gtk_combo_box_get_model(combo_box); |
224 tree_model = gtk_combo_box_get_model(combo_box); |
| 228 if (!gtk_combo_box_get_active_iter(combo_box, &iter)) |
225 if (!gtk_combo_box_get_active_iter(combo_box, &iter)) { |
| 229 return; |
226 return; |
| 230 active.type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo_box), |
227 } |
| 231 "type")); |
|
| 232 |
228 |
| 233 g_object_set_data(G_OBJECT(combo_box), "previously_active", |
229 g_object_set_data(G_OBJECT(combo_box), "previously_active", |
| 234 g_object_get_data(G_OBJECT(combo_box), "current_active")); |
230 g_object_get_data(G_OBJECT(combo_box), "current_active")); |
| 235 g_object_set_data(G_OBJECT(combo_box), "current_active", |
231 g_object_set_data(G_OBJECT(combo_box), "current_active", |
| 236 GINT_TO_POINTER(gtk_combo_box_get_active(combo_box))); |
232 GINT_TO_POINTER(gtk_combo_box_get_active(combo_box))); |
| 237 |
233 |
| 238 if (active.type == PURPLE_PREF_INT) { |
234 type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo_box), "type")); |
| 239 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, |
235 key = g_object_get_data(G_OBJECT(combo_box), "key"); |
| 240 &active.value.integer, -1); |
236 if (type == PURPLE_PREF_INT) { |
| 241 } |
237 gint value; |
| 242 else if (active.type == PURPLE_PREF_STRING) { |
238 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1); |
| 243 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, |
239 purple_prefs_set_int(key, value); |
| 244 &active.value.string, -1); |
240 } else if (type == PURPLE_PREF_STRING) { |
| 245 } |
241 const char *value; |
| 246 else if (active.type == PURPLE_PREF_BOOLEAN) { |
242 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1); |
| 247 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, |
243 purple_prefs_set_string(key, value); |
| 248 &active.value.boolean, -1); |
244 } else if (type == PURPLE_PREF_BOOLEAN) { |
| 249 } |
245 gboolean value; |
| 250 |
246 gtk_tree_model_get(tree_model, &iter, PREF_DROPDOWN_VALUE, &value, -1); |
| 251 cb(combo_box, active); |
247 purple_prefs_set_bool(key, value); |
| |
248 } else { |
| |
249 g_return_if_reached(); |
| |
250 } |
| 252 } |
251 } |
| 253 |
252 |
| 254 static GtkWidget * |
253 static GtkWidget * |
| 255 pidgin_prefs_dropdown_from_list_with_cb(GtkWidget *box, const gchar *title, |
254 pidgin_prefs_dropdown_from_list_with_cb(GtkWidget *box, const gchar *title, |
| 256 GtkComboBox **dropdown_out, GList *menuitems, |
255 GtkComboBox **dropdown_out, GList *menuitems, |
| 257 PidginPrefValue initial, PidginPrefsDropdownCallback cb) |
256 PidginPrefValue initial) |
| 258 { |
257 { |
| 259 GtkWidget *dropdown; |
258 GtkWidget *dropdown; |
| 260 GtkWidget *label = NULL; |
259 GtkWidget *label = NULL; |
| 261 GtkListStore *store = NULL; |
260 GtkListStore *store = NULL; |
| 262 GtkTreeIter iter; |
261 GtkTreeIter iter; |
| 337 current_active = GINT_TO_POINTER(gtk_combo_box_get_active(GTK_COMBO_BOX( |
336 current_active = GINT_TO_POINTER(gtk_combo_box_get_active(GTK_COMBO_BOX( |
| 338 dropdown))); |
337 dropdown))); |
| 339 g_object_set_data(G_OBJECT(dropdown), "current_active", current_active); |
338 g_object_set_data(G_OBJECT(dropdown), "current_active", current_active); |
| 340 g_object_set_data(G_OBJECT(dropdown), "previously_active", current_active); |
339 g_object_set_data(G_OBJECT(dropdown), "previously_active", current_active); |
| 341 |
340 |
| 342 g_signal_connect(G_OBJECT(dropdown), "changed", |
341 g_signal_connect(dropdown, "changed", G_CALLBACK(dropdown_set), NULL); |
| 343 G_CALLBACK(dropdown_set), cb); |
|
| 344 |
342 |
| 345 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label); |
343 pidgin_add_widget_to_vbox(GTK_BOX(box), title, NULL, dropdown, FALSE, &label); |
| 346 |
344 |
| 347 return label; |
345 return label; |
| 348 } |
|
| 349 |
|
| 350 static void |
|
| 351 pidgin_prefs_dropdown_from_list_cb(GtkComboBox *combo_box, |
|
| 352 PidginPrefValue value) |
|
| 353 { |
|
| 354 const char *key; |
|
| 355 |
|
| 356 key = g_object_get_data(G_OBJECT(combo_box), "key"); |
|
| 357 |
|
| 358 if (value.type == PURPLE_PREF_INT) { |
|
| 359 purple_prefs_set_int(key, value.value.integer); |
|
| 360 } else if (value.type == PURPLE_PREF_STRING) { |
|
| 361 purple_prefs_set_string(key, value.value.string); |
|
| 362 } else if (value.type == PURPLE_PREF_BOOLEAN) { |
|
| 363 purple_prefs_set_bool(key, value.value.boolean); |
|
| 364 } else { |
|
| 365 g_return_if_reached(); |
|
| 366 } |
|
| 367 } |
346 } |
| 368 |
347 |
| 369 GtkWidget * |
348 GtkWidget * |
| 370 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title, |
349 pidgin_prefs_dropdown_from_list(GtkWidget *box, const gchar *title, |
| 371 PurplePrefType type, const char *key, GList *menuitems) |
350 PurplePrefType type, const char *key, GList *menuitems) |