mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
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>
This commit is contained in:
parent
38ccc15214
commit
e810d211a6
1 changed files with 41 additions and 37 deletions
78
info.c
78
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue