summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--divelist.c60
-rw-r--r--gtk-gui.c2
2 files changed, 33 insertions, 29 deletions
diff --git a/divelist.c b/divelist.c
index 5df8fbb57..e389d038f 100644
--- a/divelist.c
+++ b/divelist.c
@@ -2663,7 +2663,7 @@ static GtkTreeIter *get_iter_from_idx(int idx)
void select_next_dive(void)
{
- GtkTreeIter *nextiter;
+ GtkTreeIter *nextiter, *parent;
GtkTreeIter *iter = get_iter_from_idx(selected_dive);
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view));
GtkTreePath *treepath;
@@ -2673,31 +2673,33 @@ void select_next_dive(void)
return;
nextiter = gtk_tree_iter_copy(iter);
if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter)) {
- if (!gtk_tree_model_iter_parent(MODEL(dive_list), nextiter, iter))
+ if (!gtk_tree_model_iter_parent(MODEL(dive_list), nextiter, iter)) {
/* we're at the last top level node */
return;
- if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter))
+ }
+ if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter)) {
/* last trip */
return;
- gtk_tree_model_get(MODEL(dive_list), nextiter, DIVE_INDEX, &idx, -1);
- if (idx < 0) {
- /* need the first child */
- GtkTreeIter *parent = gtk_tree_iter_copy(nextiter);
- if (! gtk_tree_model_iter_children(MODEL(dive_list), nextiter, parent))
- return;
}
}
+ gtk_tree_model_get(MODEL(dive_list), nextiter, DIVE_INDEX, &idx, -1);
+ if (idx < 0) {
+ /* need the first child */
+ parent = gtk_tree_iter_copy(nextiter);
+ if (! gtk_tree_model_iter_children(MODEL(dive_list), nextiter, parent))
+ return;
+ }
treepath = gtk_tree_model_get_path(MODEL(dive_list), nextiter);
gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath);
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(dive_list.tree_view), treepath, NULL, FALSE, 0, 0);
+ gtk_tree_selection_unselect_all(selection);
gtk_tree_selection_select_iter(selection, nextiter);
- gtk_tree_selection_unselect_iter(selection, iter);
gtk_tree_path_free(treepath);
}
void select_prev_dive(void)
{
- GtkTreeIter previter;
+ GtkTreeIter previter, *parent;
GtkTreeIter *iter = get_iter_from_idx(selected_dive);
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view));
GtkTreePath *treepath;
@@ -2709,29 +2711,31 @@ void select_prev_dive(void)
if (!gtk_tree_path_prev(treepath)) {
if (!gtk_tree_model_iter_parent(MODEL(dive_list), &previter, iter))
/* we're at the last top level node */
- return;
+ goto free_path;
+ gtk_tree_path_free(treepath);
treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
if (!gtk_tree_path_prev(treepath))
/* first trip */
- return;
- if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
- return;
- gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &idx, -1);
- if (idx < 0) {
- /* need the last child */
- GtkTreeIter *parent = gtk_tree_iter_copy(&previter);
- if (! gtk_tree_model_iter_nth_child(MODEL(dive_list), &previter, parent,
- gtk_tree_model_iter_n_children(MODEL(dive_list), parent) - 1))
- return;
- }
- treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
- } else {
+ goto free_path;
if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
- return;
+ goto free_path;
}
+ if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
+ goto free_path;
+ gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &idx, -1);
+ if (idx < 0) {
+ /* need the last child */
+ parent = gtk_tree_iter_copy(&previter);
+ if (! gtk_tree_model_iter_nth_child(MODEL(dive_list), &previter, parent,
+ gtk_tree_model_iter_n_children(MODEL(dive_list), parent) - 1))
+ goto free_path;
+ }
+ gtk_tree_path_free(treepath);
+ treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
gtk_tree_view_expand_to_path(GTK_TREE_VIEW(dive_list.tree_view), treepath);
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(dive_list.tree_view), treepath, NULL, FALSE, 0, 0);
+ gtk_tree_selection_unselect_all(selection);
gtk_tree_selection_select_iter(selection, &previter);
- gtk_tree_selection_unselect_iter(selection, iter);
- gtk_tree_path_free(treepath);
+ free_path:
+ gtk_tree_path_free(treepath);
}
diff --git a/gtk-gui.c b/gtk-gui.c
index 7c63a49b0..43e0d14e7 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -1147,7 +1147,7 @@ static void switch_page(GtkNotebook *notebook, gint arg1, gpointer user_data)
static gboolean on_key_press(GtkWidget *w, GdkEventKey *event, GtkWidget *divelist)
{
- if (event->type != GDK_KEY_PRESS)
+ if (event->type != GDK_KEY_PRESS || event->state != 0)
return FALSE;
switch (event->keyval) {
case GDK_Up: