+static char *get_text(GtkTextBuffer *buffer)
+{
+ GtkTextIter start;
+ GtkTextIter end;
+
+ gtk_text_buffer_get_start_iter(buffer, &start);
+ gtk_text_buffer_get_end_iter(buffer, &end);
+ return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+}
+
+/* old is NULL or a valid string, new is a valid string
+ * NOTW: NULL and "" need to be treated as "unchanged" */
+static int text_changed(char *old, char *new)
+{
+ return ((old && strcmp(old,new)) ||
+ (!old && strcmp("",new)));
+}
+
+void flush_dive_info_changes(struct dive *dive)
+{
+ char *old_text;
+ int changed = 0;
+
+ if (!dive)
+ return;
+
+ if (location_changed) {
+ char *new_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(location));
+ old_text = dive->location;
+ dive->location = new_text;
+ add_location(new_text);
+ if (text_changed(old_text,dive->location))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
+ }
+
+ if (divemaster_changed) {
+ char *new_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(divemaster));
+ old_text = dive->divemaster;
+ dive->divemaster = new_text;
+ add_people(new_text);
+ if (text_changed(old_text,dive->divemaster))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
+ }
+
+ if (buddy_changed) {
+ char *new_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(buddy));
+ old_text = dive->buddy;
+ dive->buddy = new_text;
+ add_people(new_text);
+ if (text_changed(old_text,dive->buddy))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
+ }
+
+ if (notes_changed) {
+ old_text = dive->notes;
+ dive->notes = get_text(notes);
+ if (text_changed(old_text,dive->notes))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
+ }
+ if (changed)
+ mark_divelist_changed(TRUE);
+}
+
+static void set_combo_box_entry_text(GtkComboBoxEntry *combo_box, const char *text)
+{
+ GtkEntry *entry = GTK_ENTRY(GTK_BIN(combo_box)->child);
+ gtk_entry_set_text(entry, text);
+}
+
+#define SET_TEXT_ENTRY(x) \
+ set_combo_box_entry_text(x, dive && dive->x ? dive->x : "")
+
+void show_dive_info(struct dive *dive)