mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 22:33:24 +00:00
Avoid pointless calls to dive planner
Stupid Gtk. Seriously. So in order to get a notification if the user selects the drop down for the gas with the mouse I need to connect to the "changed" signal for the combobox. But that also fires whenever the user types something into the GtkEntry. Which means we once again get called for all kinds of silly partial names. Instead we want to handle the manual entry in the "focus-out" callback (the user has hit tab or something else to move away from the GtkEntry - let's assume that this is the text he wants us to use) and only respond to the changed signal on the combobox if the user selected something from the dropdown. The easiest way to do that (I think) is to check the text with the strings stored in the model. If this indeed matches a string stored in the model then most likely this is something the user selected from the dropdown. But more importantly if it isn't in the model, then we KNOW that this is just a partial string that was typed in. And we can ignore that one. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
7a18edddbb
commit
bf395ebf45
3 changed files with 17 additions and 6 deletions
|
@ -94,8 +94,16 @@ extern int process_ui_events(void);
|
||||||
extern void update_progressbar(progressbar_t *progress, double value);
|
extern void update_progressbar(progressbar_t *progress, double value);
|
||||||
extern void update_progressbar_text(progressbar_t *progress, const char *text);
|
extern void update_progressbar_text(progressbar_t *progress, const char *text);
|
||||||
|
|
||||||
|
// info.c
|
||||||
|
enum {
|
||||||
|
MATCH_EXACT,
|
||||||
|
MATCH_PREPEND,
|
||||||
|
MATCH_AFTER
|
||||||
|
} found_string_entry;
|
||||||
|
|
||||||
extern GtkWidget *create_date_time_widget(struct tm *time, GtkWidget **cal, GtkWidget **h, GtkWidget **m);
|
extern GtkWidget *create_date_time_widget(struct tm *time, GtkWidget **cal, GtkWidget **h, GtkWidget **m);
|
||||||
extern void add_string_list_entry(const char *string, GtkListStore *list);
|
extern void add_string_list_entry(const char *string, GtkListStore *list);
|
||||||
|
extern int match_list(GtkListStore *list, const char *string);
|
||||||
|
|
||||||
extern GtkWidget *dive_profile_widget(void);
|
extern GtkWidget *dive_profile_widget(void);
|
||||||
extern GtkWidget *dive_info_frame(void);
|
extern GtkWidget *dive_info_frame(void);
|
||||||
|
|
7
info.c
7
info.c
|
@ -312,11 +312,6 @@ static GtkTextView *text_view(GtkWidget *box, const char *label, enum writable w
|
||||||
return GTK_TEXT_VIEW(view);
|
return GTK_TEXT_VIEW(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum {
|
|
||||||
MATCH_EXACT,
|
|
||||||
MATCH_PREPEND,
|
|
||||||
MATCH_AFTER
|
|
||||||
} found_string_entry;
|
|
||||||
static GtkTreeIter string_entry_location;
|
static GtkTreeIter string_entry_location;
|
||||||
|
|
||||||
static gboolean match_string_entry(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
|
static gboolean match_string_entry(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
|
||||||
|
@ -345,7 +340,7 @@ static gboolean match_string_entry(GtkTreeModel *model, GtkTreePath *path, GtkTr
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int match_list(GtkListStore *list, const char *string)
|
int match_list(GtkListStore *list, const char *string)
|
||||||
{
|
{
|
||||||
found_string_entry = MATCH_PREPEND;
|
found_string_entry = MATCH_PREPEND;
|
||||||
gtk_tree_model_foreach(GTK_TREE_MODEL(list), match_string_entry, (void *)string);
|
gtk_tree_model_foreach(GTK_TREE_MODEL(list), match_string_entry, (void *)string);
|
||||||
|
|
|
@ -563,6 +563,14 @@ static void gas_changed_cb(GtkWidget *combo, gpointer data)
|
||||||
int idx = data - NULL;
|
int idx = data - NULL;
|
||||||
|
|
||||||
gastext = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
|
gastext = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
|
||||||
|
/* stupidly this gets called for two reasons:
|
||||||
|
* a) any keystroke into the entry field
|
||||||
|
* b) mouse selection of a dropdown
|
||||||
|
* we only care about b) (a) is handled much better with the focus-out event)
|
||||||
|
* so let's check that the text returned is actually in our model before going on
|
||||||
|
*/
|
||||||
|
if (match_list(gas_model, gastext) != MATCH_EXACT)
|
||||||
|
return;
|
||||||
o2 = he = 0;
|
o2 = he = 0;
|
||||||
if (!validate_gas(gastext, &o2, &he)) {
|
if (!validate_gas(gastext, &o2, &he)) {
|
||||||
/* this should never happen as only validated texts should be
|
/* this should never happen as only validated texts should be
|
||||||
|
|
Loading…
Add table
Reference in a new issue