void motorway_select_cb(GtkWidget *w, gpointer *data) { GHashTable *table = (GHashTable*)g_object_get_data(G_OBJECT(w), "motorwayTable"); HildonTouchSelector *selector = HILDON_TOUCH_SELECTOR(g_object_get_data(G_OBJECT(w), "motorwaySelector")); gchar *selectionText = hildon_touch_selector_get_current_text(selector); int *selectionId = g_hash_table_lookup(table, (gpointer*)selectionText); struct prefs_found_args *args = g_new(struct prefs_found_args, 1); moflow_request *req = moflow_init_request(); req->motorway_id = *selectionId; moflow_req_generate_url(req); args->table = table; args->request = req; moflow_get_async(client, req, prefs_found, (gpointer*)args); GtkWidget *window = gtk_widget_get_toplevel(w); gtk_widget_destroy(window); }
/* Shows a dialog asking user to select a preset. If allow_new is TRUE, then * user can specify a new preset. In this case, allow_new will become TRUE if * user selects a new preset, or FALSE if she is selecting an already * existent */ static xmlDoc *dialog_choose_preset(gpointer parent, gboolean *allow_new) { GList *presets; GList *node; GtkWidget *selector; GtkWidget *dialog; xmlDoc *preset; xmlDoc *preset_selected = NULL; gchar *preset_name_selected; gint response; presets = presets_preload_all(); if (!presets && !allow_new) { hildon_banner_show_information(GTK_WIDGET(parent), NULL, "No available presets"); return NULL; } /* Check if user can specify a new preset */ if (allow_new && *allow_new) { selector = hildon_touch_selector_entry_new_text(); } else { selector = hildon_touch_selector_new_text(); } node = presets; while (node) { preset = (xmlDoc *) node->data; hildon_touch_selector_append_text( HILDON_TOUCH_SELECTOR(selector), preset->name); node = g_list_next(node); } dialog = hildon_picker_dialog_new(parent); hildon_picker_dialog_set_selector(HILDON_PICKER_DIALOG(dialog), HILDON_TOUCH_SELECTOR(selector)); response = gtk_dialog_run(GTK_DIALOG(dialog)); if (response != GTK_RESPONSE_DELETE_EVENT) { preset_name_selected = hildon_touch_selector_get_current_text( HILDON_TOUCH_SELECTOR(selector)); } else { preset_name_selected = NULL; } /* NOTE: There is a bug in hildon that prevent using gtk_widget_destroy when a hildon_touch_selector_entry is usedcd, as it segs fault. The bad part is that using hide_all makes a leak. */ if (allow_new && *allow_new) { gtk_widget_hide_all(dialog); } else { gtk_widget_destroy(dialog); } /* Check the selected xmlDoc, freeing remaining */ node = presets; while (node) { preset = (xmlDoc *) node->data; if (preset_name_selected && g_utf8_collate(preset->name, preset_name_selected) == 0) { preset_selected = preset; } else { xmlFreeDoc(preset); } node = g_list_next(node); } g_list_free(presets); if (preset_name_selected) { /* User asks for new presets */ if (allow_new && *allow_new) { if (preset_selected) { *allow_new = FALSE; g_free(preset_name_selected); } else { preset_selected = xmlNewDoc(BAD_CAST "1.0"); preset_selected->name = preset_name_selected; *allow_new = TRUE; } } else { g_free(preset_name_selected); } } return preset_selected; }