]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Work around some gtk oddity with gtk_combo_box_entries and empty text
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 3 Nov 2011 05:11:31 +0000 (22:11 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 3 Nov 2011 05:11:31 +0000 (22:11 -0700)
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 <torvalds@linux-foundation.org>
info.c

diff --git a/info.c b/info.c
index 9b71b659166f6b41dd1474057d6e15531c7a4720..75b34bb782c85da7fbee0bd8a35e2296b857b75f 100644 (file)
--- a/info.c
+++ b/info.c
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <time.h>
+#include <ctype.h>
 
 #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);
 }