From: Linus Torvalds Date: Thu, 3 Nov 2011 05:11:31 +0000 (-0700) Subject: Work around some gtk oddity with gtk_combo_box_entries and empty text X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;ds=sidebyside;h=e810d211a6235b504c98604e0288cf22b12ec1b8;p=ext%2Fsubsurface.git Work around some gtk oddity with gtk_combo_box_entries and empty text Setting the gtk_combo_box_entry test to th eempty string doesn't "take": the old text remains. Which does all kinds of funky things when you switch between dives, and the location (or buddy or divemaster) entry contains some random stale entry from another dive. This works around it by using a string with a single space in it instead, and then removing the space when reading. Not pretty, and certainly not correct, but it pinpoints the odd behavior. I'm sure somebody will figure out what the magic gtk incantation is for this. Also remove the never-used flags for whether the entries have changed. They were designed to be set by change callbacks, but we never bothered with it, and just always read the value of the entries instead. Signed-off-by: Linus Torvalds --- diff --git a/info.c b/info.c index 9b71b65..75b34bb 100644 --- a/info.c +++ b/info.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "dive.h" #include "display.h" @@ -20,8 +21,6 @@ static GtkComboBoxEntry *location, *buddy, *divemaster; static GtkTextBuffer *notes; -static int location_changed = 1, notes_changed = 1; -static int divemaster_changed = 1, buddy_changed = 1; static char *get_text(GtkTextBuffer *buffer) { @@ -35,68 +34,73 @@ static char *get_text(GtkTextBuffer *buffer) /* 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) +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; + char *old_text, *new_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; + new_text = get_combo_box_entry_text(location, &dive->location); + if (new_text) { add_location(new_text); - if (text_changed(old_text,dive->location)) - changed = 1; - if (old_text) - g_free(old_text); + changed = 1; } - if (divemaster_changed) { - char *new_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(divemaster)); - old_text = dive->divemaster; - dive->divemaster = new_text; + new_text = get_combo_box_entry_text(divemaster, &dive->divemaster); + if (new_text) { add_people(new_text); - if (text_changed(old_text,dive->divemaster)) - changed = 1; - if (old_text) - g_free(old_text); + changed = 1; } - if (buddy_changed) { - char *new_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(buddy)); - old_text = dive->buddy; - dive->buddy = new_text; + new_text = get_combo_box_entry_text(buddy, &dive->buddy); + if (new_text) { add_people(new_text); - if (text_changed(old_text,dive->buddy)) - changed = 1; - if (old_text) - g_free(old_text); + changed = 1; } - 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); - } + 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); + GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo_box))); + gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), 0); + if (!*text) + text = " "; gtk_entry_set_text(entry, text); }