summaryrefslogtreecommitdiffstats
path: root/info.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-11-02 22:11:31 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-11-02 22:11:31 -0700
commite810d211a6235b504c98604e0288cf22b12ec1b8 (patch)
tree3c011b4b2fa91bf6e09d4132d541fe8743744f71 /info.c
parent38ccc152140d03b6df1de587a8887663886fff7b (diff)
downloadsubsurface-e810d211a6235b504c98604e0288cf22b12ec1b8.tar.gz
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 <torvalds@linux-foundation.org>
Diffstat (limited to 'info.c')
-rw-r--r--info.c78
1 files changed, 41 insertions, 37 deletions
diff --git a/info.c b/info.c
index 9b71b6591..75b34bb78 100644
--- 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);
}