From 05990b107de746064486f4f1c79a2383e1dfd63f Mon Sep 17 00:00:00 2001
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Sun, 10 Feb 2013 12:06:18 -0800
Subject: [PATCH] Fix saving of changed GPS entry

We can't use gps_changed() in the gps_map_callback function, because that
will actually change the GPS data in the dive being edited, which in turn
will then cause us to later (when we *really* want to change it) not match
the master dive data any more, and think we shouldn't edit the dive at
all.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
---
 info.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/info.c b/info.c
index 6a568120f..46b370892 100644
--- a/info.c
+++ b/info.c
@@ -669,22 +669,27 @@ static void update_gps_entry(int lat, int lon)
 	}
 }
 
+#if HAVE_OSM_GPS_MAP
 static void update_gps_entry_callback(float lat, float lon)
 {
 	update_gps_entry(lat * 1000000, lon * 1000000);
+	location_update.set_by_hand = 1;
 }
 
-#if HAVE_OSM_GPS_MAP
 static gboolean gps_map_callback(GtkWidget *w, gpointer data)
 {
+	double latitude, longitude;
 	const char *gps_text = NULL;
-	struct dive *dive = location_update.dive;
+	struct dive fake_dive;
+
+	memset(&fake_dive, 0, sizeof(fake_dive));
 	if (location_update.entry) {
 		gps_text = gtk_entry_get_text(location_update.entry);
-		(void)gps_changed(dive, NULL, gps_text);
+		parse_gps_text(gps_text, &latitude, &longitude);
+		fake_dive.latitude.udeg = rint(latitude * 1000000);
+		fake_dive.longitude.udeg = rint(longitude * 1000000);
 	}
-	show_gps_location(dive, update_gps_entry_callback);
-	location_update.set_by_hand = 1;
+	show_gps_location(&fake_dive, update_gps_entry_callback);
 	return TRUE;
 }
 #endif