+/**
+ * Open a program at the specified date
+ * Mainly for Stellarium - http://stellarium.org/
+ * But could work with any program that accepts the same command line options...
+ * FUTURE: Allow configuring of command line options + format or parameters
+ */
+static void trw_layer_astro_open ( VikTrwLayer *vtl, const gchar *date_str, const gchar *time_str, const gchar *lat_str, const gchar *lon_str, const gchar *alt_str )
+{
+ GError *err = NULL;
+ gchar *tmp;
+ gint fd = g_file_open_tmp ( "vik-astro-XXXXXX.ini", &tmp, &err );
+ if (fd < 0) {
+ g_warning ( "%s: Failed to open temporary file: %s", __FUNCTION__, err->message );
+ g_clear_error ( &err );
+ return;
+ }
+ gchar *cmd = g_strdup_printf ( "%s %s %s %s %s %s %s %s %s %s %s %s %s %s",
+ astro_program, "-c", tmp, "--full-screen no", "--sky-date", date_str, "--sky-time", time_str, "--latitude", lat_str, "--longitude", lon_str, "--altitude", alt_str );
+ g_warning ( "%s", cmd );
+ if ( ! g_spawn_command_line_async ( cmd, &err ) ) {
+ a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("Could not launch %s"), astro_program );
+ g_warning ( "%s", err->message );
+ g_error_free ( err );
+ }
+ util_add_to_deletion_list ( tmp );
+ g_free ( tmp );
+ g_free ( cmd );
+}
+
+// Format of stellarium lat & lon seems designed to be particularly awkward
+// who uses ' & " in the parameters for the command line?!
+// -1d4'27.48"
+// +53d58'16.65"
+static gchar *convert_to_dms ( gdouble dec )
+{
+ gdouble tmp;
+ gchar sign_c = ' ';
+ gint val_d, val_m;
+ gdouble val_s;
+ gchar *result = NULL;
+
+ if ( dec > 0 )
+ sign_c = '+';
+ else if ( dec < 0 )
+ sign_c = '-';
+ else // Nul value
+ sign_c = ' ';
+
+ // Degrees
+ tmp = fabs(dec);
+ val_d = (gint)tmp;
+
+ // Minutes
+ tmp = (tmp - val_d) * 60;
+ val_m = (gint)tmp;
+
+ // Seconds
+ val_s = (tmp - val_m) * 60;
+
+ // Format
+ result = g_strdup_printf ( "%c%dd%d\\\'%.4f\\\"", sign_c, val_d, val_m, val_s );
+ return result;
+}
+
+/**
+ * Open an astronomy program at the date & position of the track center, trackpoint or waypoint
+ */
+static void trw_layer_astro ( menu_array_sublayer values )
+{
+ VikTrwLayer *vtl = VIK_TRW_LAYER(values[MA_VTL]);
+
+ if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_TRACK ) {
+ VikTrack *trk = (VikTrack *) g_hash_table_lookup ( vtl->tracks, values[MA_SUBLAYER_ID] );
+ if ( ! trk )
+ return;
+
+ VikTrackpoint *tp = NULL;
+ if ( vtl->current_tpl )
+ // Current Trackpoint
+ tp = VIK_TRACKPOINT(vtl->current_tpl->data);
+ else if ( trk->trackpoints )
+ // Otherwise first trackpoint
+ tp = VIK_TRACKPOINT(trk->trackpoints->data);
+ else
+ // Give up
+ return;
+
+ if ( tp->has_timestamp ) {
+ gchar date_buf[20];
+ strftime (date_buf, sizeof(date_buf), "%Y%m%d", gmtime(&(tp->timestamp)));
+ gchar time_buf[20];
+ strftime (time_buf, sizeof(time_buf), "%H:%M:%S", gmtime(&(tp->timestamp)));
+ struct LatLon ll;
+ vik_coord_to_latlon ( &tp->coord, &ll );
+ gchar *lat_str = convert_to_dms ( ll.lat );
+ gchar *lon_str = convert_to_dms ( ll.lon );
+ gchar alt_buf[20];
+ snprintf (alt_buf, sizeof(alt_buf), "%d", (gint)round(tp->altitude) );
+ trw_layer_astro_open ( vtl, date_buf, time_buf, lat_str, lon_str, alt_buf);
+ g_free ( lat_str );
+ g_free ( lon_str );
+ }
+ else
+ a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This track has no date information.") );
+ }
+ else if ( GPOINTER_TO_INT(values[MA_SUBTYPE]) == VIK_TRW_LAYER_SUBLAYER_WAYPOINT ) {
+ VikWaypoint *wpt = (VikWaypoint *) g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] );
+ if ( ! wpt )
+ return;
+
+ if ( wpt->has_timestamp ) {
+ gchar date_buf[20];
+ strftime (date_buf, sizeof(date_buf), "%Y%m%d", gmtime(&(wpt->timestamp)));
+ gchar time_buf[20];
+ strftime (time_buf, sizeof(time_buf), "%H:%M:%S", gmtime(&(wpt->timestamp)));
+ struct LatLon ll;
+ vik_coord_to_latlon ( &wpt->coord, &ll );
+ gchar *lat_str = convert_to_dms ( ll.lat );
+ gchar *lon_str = convert_to_dms ( ll.lon );
+ gchar alt_buf[20];
+ snprintf (alt_buf, sizeof(alt_buf), "%d", (gint)round(wpt->altitude) );
+ trw_layer_astro_open ( vtl, date_buf, time_buf, lat_str, lon_str, alt_buf );
+ g_free ( lat_str );
+ g_free ( lon_str );
+ }
+ else
+ a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_LAYER(vtl), _("This waypoint has no date information.") );
+ }
+}
+