X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=info.c;h=aa38c053ecaefd74482a0ee6d46c98fc6c3b7b89;hb=19a1693f580223a9b4e8bd35c3980f20e69c2f13;hp=c1779cc452ac6a96fab304eb7adfbf5aeb5846ab;hpb=3a6c1f767d527c2247eefb264f68adf3f3770608;p=ext%2Fsubsurface.git diff --git a/info.c b/info.c index c1779cc..aa38c05 100644 --- a/info.c +++ b/info.c @@ -1,3 +1,13 @@ +/* info.c */ +/* creates the UI for the info frame - + * controlled through the following interfaces: + * + * void flush_dive_info_changes(struct dive *dive) + * void show_dive_info(struct dive *dive) + * + * called from gtk-ui: + * GtkWidget *extended_dive_info_widget(void) + */ #include #include #include @@ -5,6 +15,7 @@ #include "dive.h" #include "display.h" +#include "display-gtk.h" #include "divelist.h" static GtkEntry *location, *buddy, *divemaster; @@ -22,30 +33,59 @@ static char *get_text(GtkTextBuffer *buffer) 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) { - g_free(dive->location); + old_text = dive->location; dive->location = gtk_editable_get_chars(GTK_EDITABLE(location), 0, -1); + if (text_changed(old_text,dive->location)) + changed = 1; + if (old_text) + g_free(old_text); } if (divemaster_changed) { - g_free(dive->divemaster); + old_text = dive->divemaster; dive->divemaster = gtk_editable_get_chars(GTK_EDITABLE(divemaster), 0, -1); + if (text_changed(old_text,dive->divemaster)) + changed = 1; + if (old_text) + g_free(old_text); } if (buddy_changed) { - g_free(dive->buddy); + old_text = dive->buddy; dive->buddy = gtk_editable_get_chars(GTK_EDITABLE(buddy), 0, -1); + if (text_changed(old_text,dive->buddy)) + changed = 1; + if (old_text) + g_free(old_text); } if (notes_changed) { - g_free(dive->notes); + 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); } #define SET_TEXT_ENTRY(x) \ @@ -111,7 +151,6 @@ static GtkTextBuffer *text_view(GtkWidget *box, const char *label) GtkWidget* scrolled_window = gtk_scrolled_window_new(0, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); - gtk_widget_show(scrolled_window); view = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);