void open_url(GtkWindow *parent, const gchar * url) { #ifdef WINDOWS ShellExecute(NULL, NULL, (char *) url, NULL, ".\\", 0); #else /* WINDOWS */ const gchar *browsers[] = { "xdg-open", "gnome-open", "kfmclient openURL", "sensible-browser", "firefox", "epiphany", "iceweasel", "seamonkey", "galeon", "mozilla", "opera", "konqueror", "netscape", "links -g", "chromium-browser", "chromium", "chrome", "safari", "camino", "omniweb", "icab", NULL }; gint i=0; const gchar *browser = g_getenv("BROWSER"); if (browser == NULL || browser[0] == '\0') { /* $BROWSER not set -> use first entry */ browser = browsers[i++]; } do { if (spawn_command_line_async(browser, url)) { return; } browser = browsers[i++]; } while(browser); a_dialog_error_msg ( parent, _("Could not launch web browser.") ); #endif /* WINDOWS */ }
static void georef_layer_export_params ( gpointer *pass_along[2] ) { VikGeorefLayer *vgl = VIK_GEOREF_LAYER(pass_along[0]); GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { FILE *f = g_fopen ( gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ), "w" ); gtk_widget_destroy ( file_selector ); if ( !f ) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]), _("The file you requested could not be opened for writing.") ); return; } else { fprintf ( f, "%f\n%f\n%f\n%f\n%f\n%f\n", vgl->mpp_easting, vgl->mpp_northing, 0.0, 0.0, vgl->corner.easting, vgl->corner.northing ); fclose ( f ); f = NULL; } } else gtk_widget_destroy ( file_selector ); }
void new_email(GtkWindow *parent, const gchar * address) { gchar *uri = g_strdup_printf("mailto:%s", address); #ifdef WINDOWS ShellExecute(NULL, NULL, (char *) uri, NULL, ".\\", 0); #else /* WINDOWS */ if (!spawn_command_line_async("xdg-email", uri)) a_dialog_error_msg ( parent, _("Could not create new email.") ); #endif /* WINDOWS */ g_free(uri); uri = NULL; }
static void georef_layer_dialog_load ( changeable_widgets *cw ) { GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { gdouble values[4]; gint answer = world_file_read_file ( gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector)), values ); if ( answer == 1 ) a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("The World file you requested could not be opened for reading.") ); else if ( answer == 2 ) a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("Unexpected end of file reading World file.") ); else // NB answer should == 0 for success set_widget_values ( cw, values ); } gtk_widget_destroy ( file_selector ); }
static gboolean world_file_read_line ( gchar *buffer, gint size, FILE *f, GtkWidget *widget, gboolean use_value ) { if (!fgets ( buffer, 1024, f )) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(widget), _("Unexpected end of file reading World file.") ); g_free ( buffer ); fclose ( f ); f = NULL; return FALSE; } if ( use_value ) { gdouble val = g_strtod ( buffer, NULL ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(widget), val > 0 ? val : -val ); } return TRUE; }
static void georef_layer_dialog_load ( GtkWidget *pass_along[4] ) { GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { FILE *f = g_fopen ( gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ), "r" ); gtk_widget_destroy ( file_selector ); if ( !f ) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]), _("The World file you requested could not be opened for reading.") ); return; } else { gchar *buffer = g_malloc ( 1024 * sizeof(gchar) ); if ( world_file_read_line ( buffer, 1024, f, pass_along[0], TRUE ) && world_file_read_line ( buffer, 1024, f, pass_along[0], FALSE) && world_file_read_line ( buffer, 1024, f, pass_along[0], FALSE ) && world_file_read_line ( buffer, 1024, f, pass_along[1], TRUE) && world_file_read_line ( buffer, 1024, f, pass_along[2], TRUE ) && world_file_read_line ( buffer, 1024, f, pass_along[3], TRUE ) ) { g_free ( buffer ); fclose ( f ); f = NULL; } } } else gtk_widget_destroy ( file_selector ); /* do your jazz We need a file selection dialog file opener for reading, if NULL, send error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]) ) does that catch directories too? read lines -- if not enough lines, give error. if anything outside, give error. define range with #define CONSTANTS put 'em in thar widgets, and that's it. */ }
static GList *select_from_list (GtkWindow *parent, GList *list, const gchar *title, const gchar *msg ) { GtkTreeIter iter; GtkCellRenderer *renderer; GtkWidget *view; gchar *latlon_string; int column_runner; GtkWidget *dialog = gtk_dialog_new_with_buttons (title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); /* When something is selected then OK */ gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) /* Default to not apply - as initially nothing is selected! */ response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); #endif GtkWidget *label = gtk_label_new ( msg ); GtkTreeStore *store = gtk_tree_store_new ( 6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN ); GList *list_runner = list; while (list_runner) { gpx_meta_data_t *gpx_meta_data = (gpx_meta_data_t *)list_runner->data; // To keep display compact three digits of precision for lat/lon should be plenty latlon_string = g_strdup_printf("(%.3f,%.3f)", gpx_meta_data->ll.lat, gpx_meta_data->ll.lon); gtk_tree_store_append(store, &iter, NULL); gtk_tree_store_set ( store, &iter, 0, gpx_meta_data->name, 1, gpx_meta_data->desc, 2, gpx_meta_data->timestamp, 3, latlon_string, 4, gpx_meta_data->vis, 5, gpx_meta_data->in_current_view, -1 ); list_runner = g_list_next ( list_runner ); g_free ( latlon_string ); } view = gtk_tree_view_new(); renderer = gtk_cell_renderer_text_new(); column_runner = 0; GtkTreeViewColumn *column; column = gtk_tree_view_column_new_with_attributes ( _("Name"), renderer, "text", column_runner, NULL); gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); column_runner++; column = gtk_tree_view_column_new_with_attributes ( _("Description"), renderer, "text", column_runner, NULL); gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); column_runner++; column = gtk_tree_view_column_new_with_attributes ( _("Time"), renderer, "text", column_runner, NULL); gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); column_runner++; column = gtk_tree_view_column_new_with_attributes ( _("Lat/Lon"), renderer, "text", column_runner, NULL); gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); column_runner++; column = gtk_tree_view_column_new_with_attributes ( _("Privacy"), renderer, "text", column_runner, NULL); // AKA Visibility gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); GtkCellRenderer *renderer_toggle = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer_toggle), "activatable", FALSE, NULL); // No user action - value is just for display column_runner++; column = gtk_tree_view_column_new_with_attributes ( _("Within Current View"), renderer_toggle, "active", column_runner, NULL); gtk_tree_view_column_set_sort_column_id (column, column_runner); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE ); g_object_unref(store); GtkWidget *scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolledwindow, TRUE, TRUE, 0); // Ensure a reasonable number of items are shown, but let the width be automatically sized gtk_widget_set_size_request ( dialog, -1, 400) ; gtk_widget_show_all ( dialog ); if ( response_w ) gtk_widget_grab_focus ( response_w ); while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) { // Possibily not the fastest method but we don't have thousands of entries to process... GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); GList *selected = NULL; // because we don't store the full data in the gtk model, we have to scan & look it up if ( gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter) ) { do { if ( gtk_tree_selection_iter_is_selected ( selection, &iter ) ) { // For every selected item, // compare the name from the displayed view to every gpx entry to find the gpx this selection represents gchar* name; gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, 0, &name, -1 ); // I believe the name of these items to be always unique list_runner = list; while (list_runner) { if ( !strcmp ( ((gpx_meta_data_t*)list_runner->data)->name, name ) ) { gpx_meta_data_t *copied = copy_gpx_meta_data_t (list_runner->data); selected = g_list_prepend (selected, copied); break; } list_runner = g_list_next ( list_runner ); } } } while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL(store), &iter ) ); } if ( selected ) { gtk_widget_destroy ( dialog ); return selected; } a_dialog_error_msg(parent, _("Nothing was selected")); } gtk_widget_destroy ( dialog ); return NULL; }
GList *a_select_geoname_from_list(GtkWindow *parent, GList *geonames, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg) { GtkTreeIter iter; GtkCellRenderer *renderer; GtkCellRenderer *toggle_render; GtkWidget *view; found_geoname *geoname; gchar *latlon_string; int column_runner; gboolean checked; gboolean to_copy; GtkWidget *dialog = gtk_dialog_new_with_buttons (title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); /* When something is selected then OK */ gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) /* Default to not apply - as initially nothing is selected! */ response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); #endif GtkWidget *label = gtk_label_new ( msg ); GtkTreeStore *store; if (multiple_selection_allowed) { store = gtk_tree_store_new(4, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } else { store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } GList *geoname_runner = geonames; while (geoname_runner) { geoname = (found_geoname *)geoname_runner->data; latlon_string = g_strdup_printf("(%f,%f)", geoname->ll.lat, geoname->ll.lon); gtk_tree_store_append(store, &iter, NULL); if (multiple_selection_allowed) { gtk_tree_store_set(store, &iter, 0, FALSE, 1, geoname->name, 2, geoname->country, 3, latlon_string, -1); } else { gtk_tree_store_set(store, &iter, 0, geoname->name, 1, geoname->country, 2, latlon_string, -1); } geoname_runner = g_list_next(geoname_runner); g_free(latlon_string); } view = gtk_tree_view_new(); renderer = gtk_cell_renderer_text_new(); column_runner = 0; if (multiple_selection_allowed) { toggle_render = gtk_cell_renderer_toggle_new(); g_object_set(toggle_render, "activatable", TRUE, NULL); g_signal_connect(toggle_render, "toggled", (GCallback) buttonToggled, GTK_TREE_MODEL(store)); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, "Select", toggle_render, "active", column_runner, NULL); column_runner++; } gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, "Name", renderer, "text", column_runner, NULL); column_runner++; gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, "Country", renderer, "text", column_runner, NULL); column_runner++; gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(view), -1, "Lat/Lon", renderer, "text", column_runner, NULL); gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(view), TRUE); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), multiple_selection_allowed ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_BROWSE ); g_object_unref(store); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), label, FALSE, FALSE, 0); gtk_widget_show ( label ); gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), view, FALSE, FALSE, 0); gtk_widget_show ( view ); if ( response_w ) gtk_widget_grab_focus ( response_w ); while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) { GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); GList *selected_geonames = NULL; gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter); geoname_runner = geonames; while (geoname_runner) { to_copy = FALSE; if (multiple_selection_allowed) { gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &checked, -1); if (checked) { to_copy = TRUE; } } else { if (gtk_tree_selection_iter_is_selected(selection, &iter)) { to_copy = TRUE; } } if (to_copy) { found_geoname *copied = copy_found_geoname(geoname_runner->data); selected_geonames = g_list_prepend(selected_geonames, copied); } geoname_runner = g_list_next(geoname_runner); gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter); } if (selected_geonames) { gtk_widget_destroy ( dialog ); return (selected_geonames); } a_dialog_error_msg(parent, _("Nothing was selected")); } gtk_widget_destroy ( dialog ); return NULL; }
/** * Start request for New OSM Access Token */ static void new_access_token_cb ( ) { GtkWindow *parent = GTK_WINDOW(a_vik_window_get_a_window()); const gchar *access_token_key_pref = a_preferences_get(OSM_ACCESS_TOKEN_KEY)->s; const gchar *access_token_secret_pref = a_preferences_get(OSM_ACCESS_TOKEN_SECRET)->s; if ( access_token_key_pref && access_token_secret_pref && strlen(access_token_key_pref) > 1 && strlen(access_token_secret_pref) > 1 ) { // Check to really override existing values... if ( !a_dialog_yes_or_no(parent, _("Do you want to overwrite existing values?"), NULL) ) return; } gchar *request_key = NULL; gchar *request_secret = NULL; // Request gint grt = get_request_tokens ( &request_key, &request_secret ); if ( grt != 0 ) g_warning ( "get_request_tokens() returned %d", grt ); if ( !request_key || !request_secret ) { a_dialog_error_msg ( parent, _("Not able to generate OSM request tokens.") ); return; } // JOSM uses some kind of Out of Bound 'OOB' method which doesn't direct the user to the webpage. // However I'm unclear how this works at a low level // it's possible that liboauth doesn't support this 1.0A feature anyway // Auto authorize if possible... // gboolean authorized = liboauth_authorize_url ( request_key ); // if ( !authorized ) { // msg(); // return; // } // So for now just direct user to OSM website (you will have to enter credentials there & grant permissions) gchar *authorize_url = get_authorize_url ( request_key ); g_debug ( "%s:%s", __FUNCTION__, authorize_url ); if ( authorize_url ) { gtk_show_uri ( gdk_screen_get_default(), authorize_url, GDK_CURRENT_TIME, NULL ); } g_free ( authorize_url ); GtkWidget *dialog = gtk_message_dialog_new ( parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, _("Waiting for authorization approval.\nEnsure you have granted access at the website before continuing here.")); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); if ( gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK ) { gtk_widget_destroy ( dialog ); return; } gtk_widget_destroy ( dialog ); gchar *access_token_key = NULL; gchar *access_token_secret = NULL; gint gnat = get_new_access_tokens ( request_key, request_secret, &access_token_key, &access_token_secret ); if ( gnat != 0 ) g_warning ( "get_new_access_tokens() returned %d", gnat ); if ( !access_token_key || !access_token_key ) { a_dialog_error_msg ( parent, _("No Authorization.") ); return; } // Save the values VikLayerParamData vlp_data; VikLayerParam *pref_key = a_preferences_get_param ( OSM_ACCESS_TOKEN_KEY ); VikLayerParam *pref_secret = a_preferences_get_param ( OSM_ACCESS_TOKEN_SECRET ); if ( !pref_key || !pref_secret ) { g_critical ("%s: preference not found", __FUNCTION__); return; } // Unfortunately since the callback mechanism in preferences only allows a function call with no parameters // we have no way of accessing the dialog to effect any updates, other than closing it a_uibuilder_factory_close ( GTK_RESPONSE_REJECT ); // Note since we are in an event handler already, using GTK_RESPONSE_ACCEPT means this signal // is processed after this current function finishes. // This then in turn means it would save the values from the dialog, // overwriting the values set here :( // The current side effect is that any other preferences the user has modified in the dialog are lost // Now apply the new values vlp_data.s = access_token_key; a_preferences_run_setparam ( vlp_data, pref_key ); vlp_data.s = access_token_secret; a_preferences_run_setparam ( vlp_data, pref_secret ); a_preferences_save_to_file (); g_free ( access_token_key ); g_free ( access_token_secret ); // On success mention can remove username/password if they already exist VikLayerParamData *pref_user = a_preferences_get ( OSM_USERNAME ); VikLayerParamData *pref_pwd = a_preferences_get ( OSM_PASSWORD ); if ( pref_user && pref_pwd && pref_user->s && pref_pwd->s && strlen(pref_user->s) > 1 ) { a_dialog_info_msg ( parent, _("OSM Username and Password preferences are not required anymore. You can now remove them.") ); return; } }
GList *a_dialog_select_from_list ( GtkWindow *parent, GList *names, gboolean multiple_selection_allowed, const gchar *title, const gchar *msg ) { GtkTreeIter iter; GtkCellRenderer *renderer; GtkWidget *view; GtkWidget *dialog = gtk_dialog_new_with_buttons (title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); /* When something is selected then OK */ gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) /* Default to not apply - as initially nothing is selected! */ response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_REJECT ); #endif GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING); GtkWidget *scrolledwindow; GList *runner = names; while (runner) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, runner->data, -1); runner = g_list_next(runner); } view = gtk_tree_view_new(); renderer = gtk_cell_renderer_text_new(); // Use the column header to display the message text, // this makes the overall widget allocation simple as treeview takes up all the space GtkTreeViewColumn *column; column = gtk_tree_view_column_new_with_attributes (msg, renderer, "text", 0, NULL ); gtk_tree_view_column_set_sort_column_id (column, 0); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); gtk_tree_selection_set_mode( gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), multiple_selection_allowed ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_BROWSE ); g_object_unref(store); scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); gtk_container_add ( GTK_CONTAINER(scrolledwindow), view ); gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0 ); // Ensure a reasonable number of items are shown, but let the width be automatically sized gtk_widget_set_size_request ( dialog, -1, 400) ; gtk_widget_show_all ( dialog ); if ( response_w ) gtk_widget_grab_focus ( response_w ); while ( gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT ) { GList *names_selected = NULL; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_selected_foreach(selection, get_selected_foreach_func, &names_selected); if (names_selected) { gtk_widget_destroy ( dialog ); return names_selected; } a_dialog_error_msg(parent, _("Nothing was selected")); } gtk_widget_destroy ( dialog ); return NULL; }
/* depending on type of filter, often only vtl or track will be given. * the other can be NULL. */ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikDataSourceInterface *source_interface, VikTrwLayer *vtl, VikTrack *track ) { /* for manual dialogs */ GtkWidget *dialog = NULL; GtkWidget *status; gchar *cmd, *extra; gchar *cmd_off = NULL; gchar *extra_off = NULL; acq_dialog_widgets_t *w; gpointer user_data; /* for UI builder */ gpointer pass_along_data; VikLayerParamData *paramdatas = NULL; w_and_interface_t *wi; /*** INIT AND CHECK EXISTENCE ***/ if ( source_interface->init_func ) user_data = source_interface->init_func(); else user_data = NULL; pass_along_data = user_data; if ( source_interface->check_existence_func ) { gchar *error_str = source_interface->check_existence_func(); if ( error_str ) { a_dialog_error_msg ( GTK_WINDOW(vw), error_str ); g_free ( error_str ); return; } } /* BUILD UI & GET OPTIONS IF NECESSARY. */ /* POSSIBILITY 0: NO OPTIONS. DO NOTHING HERE. */ /* POSSIBILITY 1: ADD_SETUP_WIDGETS_FUNC */ if ( source_interface->add_setup_widgets_func ) { dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); #endif source_interface->add_setup_widgets_func(dialog, vvp, user_data); gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); if ( response_w ) gtk_widget_grab_focus ( response_w ); if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { source_interface->cleanup_func(user_data); gtk_widget_destroy(dialog); return; } } /* POSSIBILITY 2: UI BUILDER */ else if ( source_interface->params ) { paramdatas = a_uibuilder_run_dialog ( source_interface->window_title, GTK_WINDOW(vw), source_interface->params, source_interface->params_count, source_interface->params_groups, source_interface->params_groups_count, source_interface->params_defaults ); if ( paramdatas ) pass_along_data = paramdatas; else return; /* TODO: do we have to free anything here? */ } /* CREATE INPUT DATA & GET COMMAND STRING */ if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER ) { gchar *name_src = write_tmp_trwlayer ( vtl ); ((VikDataSourceGetCmdStringFuncWithInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src ); g_free ( name_src ); /* TODO: delete the tmp file? or delete it only after we're done with it? */ } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK ) { gchar *name_src = write_tmp_trwlayer ( vtl ); gchar *name_src_track = write_tmp_track ( track ); ((VikDataSourceGetCmdStringFuncWithInputInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src, name_src_track ); g_free ( name_src ); g_free ( name_src_track ); } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRACK ) { gchar *name_src_track = write_tmp_track ( track ); ((VikDataSourceGetCmdStringFuncWithInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src_track ); g_free ( name_src_track ); } else source_interface->get_cmd_string_func ( pass_along_data, &cmd, &extra ); /* Get data for Off command */ if ( source_interface->off_func ) { source_interface->off_func ( pass_along_data, &cmd_off, &extra_off ); } /* cleanup for option dialogs */ if ( source_interface->add_setup_widgets_func ) { gtk_widget_destroy(dialog); dialog = NULL; } else if ( source_interface->params ) { a_uibuilder_free_paramdatas ( paramdatas, source_interface->params, source_interface->params_count ); } /*** LET'S DO IT! ***/ if ( ! cmd ) return; w = g_malloc(sizeof(*w)); wi = g_malloc(sizeof(*wi)); wi->w = w; wi->w->source_interface = source_interface; wi->cmd = cmd; wi->extra = extra; /* usually input data type (?) */ dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); gtk_dialog_set_response_sensitive ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT, FALSE ); gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); w->dialog = dialog; w->ok = TRUE; status = gtk_label_new (_("Status: detecting gpsbabel")); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), status, FALSE, FALSE, 5 ); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); gtk_widget_show_all(status); w->status = status; w->vw = vw; w->vlp = vlp; w->vvp = vvp; if ( source_interface->add_progress_widgets_func ) { source_interface->add_progress_widgets_func ( dialog, user_data ); } w->user_data = user_data; g_thread_create((GThreadFunc)get_from_anything, wi, FALSE, NULL ); gtk_dialog_run ( GTK_DIALOG(dialog) ); if ( w->ok ) w->ok = FALSE; /* tell thread to stop. TODO: add mutex */ else { if ( cmd_off ) { /* Turn off */ a_babel_convert_from (NULL, cmd_off, NULL, extra_off, NULL); } g_free ( w ); /* thread has finished; free w */ } gtk_widget_destroy ( dialog ); }
/* depending on type of filter, often only vtl or track will be given. * the other can be NULL. */ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikDataSourceInterface *source_interface, VikTrwLayer *vtl, VikTrack *track ) { /* for manual dialogs */ GtkWidget *dialog = NULL; GtkWidget *status; gchar *cmd = NULL; gchar *extra = NULL; gchar *cmd_off = NULL; gchar *extra_off = NULL; acq_dialog_widgets_t *w; gpointer user_data; gpointer options = NULL; /* for UI builder */ gpointer pass_along_data; VikLayerParamData *paramdatas = NULL; w_and_interface_t *wi; /*** INIT AND CHECK EXISTENCE ***/ if ( source_interface->init_func ) user_data = source_interface->init_func(); else user_data = NULL; pass_along_data = user_data; if ( source_interface->check_existence_func ) { gchar *error_str = source_interface->check_existence_func(); if ( error_str ) { a_dialog_error_msg ( GTK_WINDOW(vw), error_str ); g_free ( error_str ); return; } } /* BUILD UI & GET OPTIONS IF NECESSARY. */ /* POSSIBILITY 0: NO OPTIONS. DO NOTHING HERE. */ /* POSSIBILITY 1: ADD_SETUP_WIDGETS_FUNC */ if ( source_interface->add_setup_widgets_func ) { dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); GtkWidget *response_w = NULL; #if GTK_CHECK_VERSION (2, 20, 0) response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); #endif source_interface->add_setup_widgets_func(dialog, vvp, user_data); gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); if ( response_w ) gtk_widget_grab_focus ( response_w ); if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { source_interface->cleanup_func(user_data); gtk_widget_destroy(dialog); return; } } /* POSSIBILITY 2: UI BUILDER */ else if ( source_interface->params ) { paramdatas = a_uibuilder_run_dialog ( source_interface->window_title, GTK_WINDOW(vw), source_interface->params, source_interface->params_count, source_interface->params_groups, source_interface->params_groups_count, source_interface->params_defaults ); if ( paramdatas ) pass_along_data = paramdatas; else return; /* TODO: do we have to free anything here? */ } /* CREATE INPUT DATA & GET COMMAND STRING */ if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER ) { gchar *name_src = write_tmp_trwlayer ( vtl ); ((VikDataSourceGetCmdStringFuncWithInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src ); g_free ( name_src ); /* TODO: delete the tmp file? or delete it only after we're done with it? */ } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK ) { gchar *name_src = write_tmp_trwlayer ( vtl ); gchar *name_src_track = write_tmp_track ( track ); ((VikDataSourceGetCmdStringFuncWithInputInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src, name_src_track ); g_free ( name_src ); g_free ( name_src_track ); } else if ( source_interface->inputtype == VIK_DATASOURCE_INPUTTYPE_TRACK ) { gchar *name_src_track = write_tmp_track ( track ); ((VikDataSourceGetCmdStringFuncWithInput) source_interface->get_cmd_string_func) ( pass_along_data, &cmd, &extra, name_src_track ); g_free ( name_src_track ); } else if ( source_interface->get_cmd_string_func ) source_interface->get_cmd_string_func ( pass_along_data, &cmd, &extra, &options ); /* Get data for Off command */ if ( source_interface->off_func ) { source_interface->off_func ( pass_along_data, &cmd_off, &extra_off ); } /* cleanup for option dialogs */ if ( source_interface->add_setup_widgets_func ) { gtk_widget_destroy(dialog); dialog = NULL; } else if ( source_interface->params ) { a_uibuilder_free_paramdatas ( paramdatas, source_interface->params, source_interface->params_count ); } w = g_malloc(sizeof(*w)); wi = g_malloc(sizeof(*wi)); wi->w = w; wi->w->source_interface = source_interface; wi->cmd = cmd; wi->extra = extra; /* usually input data type (?) */ wi->options = options; wi->vtl = vtl; wi->creating_new_layer = (!vtl); dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); gtk_dialog_set_response_sensitive ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT, FALSE ); gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); w->dialog = dialog; w->running = TRUE; status = gtk_label_new (_("Working...")); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), status, FALSE, FALSE, 5 ); gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); // May not want to see the dialog at all if ( source_interface->is_thread || source_interface->keep_dialog_open ) gtk_widget_show_all(dialog); w->status = status; w->vw = vw; w->vlp = vlp; w->vvp = vvp; if ( source_interface->add_progress_widgets_func ) { source_interface->add_progress_widgets_func ( dialog, user_data ); } w->user_data = user_data; if (source_interface->mode == VIK_DATASOURCE_ADDTOLAYER) { VikLayer *current_selected = vik_layers_panel_get_selected ( w->vlp ); if ( IS_VIK_TRW_LAYER(current_selected) ) { wi->vtl = VIK_TRW_LAYER(current_selected); wi->creating_new_layer = FALSE; } } else if ( source_interface->mode == VIK_DATASOURCE_MANUAL_LAYER_MANAGEMENT ) { // Don't create in acquire - as datasource will perform the necessary actions wi->creating_new_layer = FALSE; VikLayer *current_selected = vik_layers_panel_get_selected ( w->vlp ); if ( IS_VIK_TRW_LAYER(current_selected) ) wi->vtl = VIK_TRW_LAYER(current_selected); } if ( wi->creating_new_layer ) { wi->vtl = VIK_TRW_LAYER ( vik_layer_create ( VIK_LAYER_TRW, w->vvp, NULL, FALSE ) ); vik_layer_rename ( VIK_LAYER ( wi->vtl ), _(source_interface->layer_title) ); } if ( source_interface->is_thread ) { if ( cmd ) { g_thread_create((GThreadFunc)get_from_anything, wi, FALSE, NULL ); gtk_dialog_run ( GTK_DIALOG(dialog) ); if (w->running) { // Cancel and mark for thread to finish w->running = FALSE; // NB Thread will free memory } else { if ( cmd_off ) { /* Turn off */ a_babel_convert_from (NULL, cmd_off, extra_off, NULL, NULL, NULL); g_free ( cmd_off ); } if ( extra_off ) g_free ( extra_off ); // Thread finished by normal completion - free memory g_free ( w ); g_free ( wi ); } } else { // This shouldn't happen... gtk_label_set_text ( GTK_LABEL(w->status), _("Unable to create command\nAcquire method failed.") ); gtk_dialog_run (GTK_DIALOG (dialog)); } } else { // bypass thread method malarkly - you'll just have to wait... if ( source_interface->process_func ) { gboolean result = source_interface->process_func ( wi->vtl, cmd, extra, (BabelStatusFunc) progress_func, w, options ); if ( !result ) a_dialog_msg ( GTK_WINDOW(vw), GTK_MESSAGE_ERROR, _("Error: acquisition failed."), NULL ); } g_free ( cmd ); g_free ( extra ); g_free ( options ); on_complete_process ( wi ); // Actually show it if necessary if ( wi->w->source_interface->keep_dialog_open ) gtk_dialog_run ( GTK_DIALOG(dialog) ); g_free ( w ); g_free ( wi ); } gtk_widget_destroy ( dialog ); }