+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(const char *old, const char *new)
+{
+ return ((old && strcmp(old,new)) ||
+ (!old && strcmp("",new)));
+}
+
+static char *get_combo_box_entry_text(GtkComboBoxEntry *combo_box, char **textp)
+{
+ char *old = *textp;
+ const gchar *new;
+ GtkEntry *entry;
+
+ entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo_box)));
+ new = gtk_entry_get_text(entry);
+ while (isspace(*new))
+ new++;
+ if (!text_changed(old,new))
+ return NULL;
+ free(old);
+ *textp = strdup(new);
+ return *textp;
+}
+
+
+void flush_dive_info_changes(struct dive *dive)
+{
+ char *old_text, *new_text;
+ int changed = 0;
+
+ if (!dive)
+ return;
+
+ new_text = get_combo_box_entry_text(location, &dive->location);
+ if (new_text) {
+ add_location(new_text);
+ changed = 1;
+ }
+
+ new_text = get_combo_box_entry_text(divemaster, &dive->divemaster);
+ if (new_text) {
+ add_people(new_text);
+ changed = 1;
+ }
+
+ new_text = get_combo_box_entry_text(buddy, &dive->buddy);
+ if (new_text) {
+ add_people(new_text);
+ changed = 1;
+ }
+
+ 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_get_child(GTK_BIN(combo_box)));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), -1);
+ if (!*text)
+ gtk_entry_set_text(entry, " ");
+ 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)