pidgin/prefs/pidginprefs.c

changeset 41380
e3934b4c2950
parent 41371
fe57d9ddc7ce
child 41381
acedeb1e8804
equal deleted inserted replaced
41379:b271cf41c92d 41380:e3934b4c2950
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)
384 } else { 363 } else {
385 g_return_val_if_reached(NULL); 364 g_return_val_if_reached(NULL);
386 } 365 }
387 366
388 label = pidgin_prefs_dropdown_from_list_with_cb(box, title, &dropdown, 367 label = pidgin_prefs_dropdown_from_list_with_cb(box, title, &dropdown,
389 menuitems, initial, pidgin_prefs_dropdown_from_list_cb); 368 menuitems, initial);
390 369
391 g_object_set_data(G_OBJECT(dropdown), "key", (gpointer)key); 370 g_object_set_data(G_OBJECT(dropdown), "key", (gpointer)key);
392 371
393 return label; 372 return label;
394 } 373 }

mercurial