diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-11-09 19:46:39 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-11-09 21:46:56 +0100 |
commit | 7f515eb7e53c5ab6d8dde4d2e6876464ed7fdeae (patch) | |
tree | f92ba6756103c85a431f18d9333c26374ce29ceb /divelist.c | |
parent | 51003eaed71ea823dc8ce88e7de0e785a50b24cb (diff) | |
download | subsurface-7f515eb7e53c5ab6d8dde4d2e6876464ed7fdeae.tar.gz |
Fix dive trip merging logic
We used to have very spotty logic for picking the dive trip when
merging two dives. It turns out that that spotty logic almost never
really matters, because in practice you'll never hit the situation of
merging two dives with different dive trips, but it *can* happen.
In particular, it happens when you use multiple dive computers, and
end up loading the dives from one computer on top of the dives of your
other computer. If the clocks of the dive computers was set
sufficiently close to each other, the dive merging logic will kick in
and you may now have slightly different times for the dives that get
merged, and the trip merging logic got *really* confused.
The trip management also depends on the trip dates being updated
correctly when the dives associated with a trip are updated (whether
added or removed), and the trip merging code did none of that.
This fixes it all up. Hopefully correctly.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'divelist.c')
-rw-r--r-- | divelist.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/divelist.c b/divelist.c index 498210e1f..8819f4ab1 100644 --- a/divelist.c +++ b/divelist.c @@ -1025,7 +1025,7 @@ void insert_trip(dive_trip_t **dive_trip_p) #endif } -static inline void delete_trip(GList *trip) +static inline void delete_trip_list_entry(GList *trip) { dive_trip_t *dive_trip = (dive_trip_t *)g_list_nth_data(trip, 0); if (dive_trip->location) @@ -1035,6 +1035,12 @@ static inline void delete_trip(GList *trip) dump_trip_list(); #endif } + +void delete_trip(dive_trip_t *trip) +{ + delete_trip_list_entry(find_trip(trip->when)); +} + static dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) { dive_trip_t *dive_trip = calloc(sizeof(dive_trip_t),1); @@ -1693,7 +1699,7 @@ static void remove_from_trip(GtkTreePath *path) /* if this was the last dive on the trip, remove the trip */ if (! gtk_tree_model_iter_has_child(MODEL(dive_list), &parent)) { gtk_tree_store_remove(STORE(dive_list), &parent); - delete_trip(find_trip(dive->divetrip->when)); + delete_trip(dive->divetrip); free(dive->divetrip); } /* mark the dive as intentionally at the top level */ @@ -1803,7 +1809,7 @@ void remove_trip(GtkTreePath *trippath, gboolean force_no_trip) } /* finally, remove the trip */ gtk_tree_store_remove(STORE(dive_list), &parent); - delete_trip(find_trip(dive_trip->when)); + delete_trip(dive_trip); free(dive_trip); #ifdef DEBUG_TRIP dump_trip_list(); @@ -1858,7 +1864,7 @@ void merge_trips_cb(GtkWidget *menuitem, GtkTreePath *trippath) } update_trip_timestamp(&prevtripiter, DIVE_TRIP(prevtrip)); free(DIVE_TRIP(trip)); - delete_trip(trip); + delete_trip_list_entry(trip); gtk_tree_store_remove(STORE(dive_list), &thistripiter); mark_divelist_changed(TRUE); } @@ -1975,7 +1981,7 @@ static void delete_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path) if (dive->divetrip == divetrip_to_update) divetrip_to_update->when = dive->when; else - delete_trip(find_trip(divetrip_to_update->when)); + delete_trip(divetrip_to_update); } continue; } @@ -1984,7 +1990,7 @@ static void delete_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path) * that needs to be updated, check if this dive is still in that trip; * if not, delete the trip */ if (divetrip_needs_update && dive->divetrip != divetrip_to_update) { - delete_trip(find_trip(divetrip_to_update->when)); + delete_trip(divetrip_to_update); divetrip_needs_update = FALSE; } /* if this dive is part of a divetrip and is the first dive that @@ -2044,7 +2050,7 @@ static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path) if (dive->divetrip && dive->when == dive->divetrip->when) { struct dive *next_dive = get_dive(idx + 1); if (!next_dive || next_dive->divetrip != dive->divetrip) - delete_trip(find_trip(dive->when)); + delete_trip(dive->divetrip); else next_dive->divetrip->when = next_dive->when; } |