[PATCH] Fix keyboard navigation of dive list.

Dirk Hohndel dirk at hohndel.org
Thu Jan 31 03:44:59 PST 2013


Carl,

can you send a patch relative to the latest master? Linus implemented
things with a helper function and I want to make sure that what we have
in master now is what you wanted...

/D

Carl Worth <cworth at cworth.org> writes:

> Prefer to use gtk_tree_view_set_cursor instead of
> gtk_tree_selection_select_iter since the latter is unreliable (it
> moves a highlight but does not move the focus rectangle).
> ---
>
> It seems like there should be a way to do this without having to fetch
> a treepath out, pass it back to GTK+, and then just free it again. So,
> this may still not be doing everything the right way, but it at least
> works.
>
> (Linus, when I thought that set_cursor wasn't working, I had stupidly
> fixed only prev_dive and not next_dive when I tested it.)
>
> -Carl
>
>  divelist.c |   22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/divelist.c b/divelist.c
> index 882ba3b..2204e1d 100644
> --- a/divelist.c
> +++ b/divelist.c
> @@ -1338,13 +1338,14 @@ static void fill_dive_list(void)
>  
>  	update_dive_list_units();
>  	if (amount_selected == 0 && gtk_tree_model_get_iter_first(MODEL(dive_list), &iter)) {
> -		GtkTreeSelection *selection;
> +		GtkTreePath *treepath;
>  
>  		/* select the last dive (and make sure it's an actual dive that is selected) */
>  		gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &selected_dive, -1);
>  		first_leaf(MODEL(dive_list), &iter, &selected_dive);
> -		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dive_list.tree_view));
> -		gtk_tree_selection_select_iter(selection, &iter);
> +		treepath = gtk_tree_model_get_path(MODEL(dive_list), &iter);
> +		gtk_tree_view_set_cursor(GTK_TREE_VIEW(dive_list.tree_view), treepath, NULL, FALSE);
> +		gtk_tree_path_free(treepath);
>  	}
>  }
>  
> @@ -2880,7 +2881,8 @@ void select_next_dive(void)
>  {
>  	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));
> +	GtkTreeView *treeview = GTK_TREE_VIEW(dive_list.tree_view);
> +	GtkTreePath *treepath;
>  	int idx;
>  
>  	if (!iter)
> @@ -2897,6 +2899,7 @@ void select_next_dive(void)
>  		}
>  	}
>  	gtk_tree_model_get(MODEL(dive_list), nextiter, DIVE_INDEX, &idx, -1);
> +	/* Is this a trip, not a dive? */
>  	if (idx < 0) {
>  		/* need the first child */
>  		parent = gtk_tree_iter_copy(nextiter);
> @@ -2904,15 +2907,16 @@ void select_next_dive(void)
>  			return;
>  	}
>  	scroll_to_selected(nextiter);
> -	gtk_tree_selection_unselect_all(selection);
> -	gtk_tree_selection_select_iter(selection, nextiter);
> +	treepath = gtk_tree_model_get_path(MODEL(dive_list), nextiter);
> +	gtk_tree_view_set_cursor(treeview, treepath, NULL, FALSE);
> +	gtk_tree_path_free(treepath);
>  }
>  
>  void select_prev_dive(void)
>  {
>  	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));
> +	GtkTreeView *treeview = GTK_TREE_VIEW(dive_list.tree_view);
>  	GtkTreePath *treepath;
>  	int idx;
>  
> @@ -2934,6 +2938,7 @@ void select_prev_dive(void)
>  	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);
> +	/* Is this a trip, not a dive? */
>  	if (idx < 0) {
>  		/* need the last child */
>  		parent = gtk_tree_iter_copy(&previter);
> @@ -2942,8 +2947,7 @@ void select_prev_dive(void)
>  			goto free_path;
>  	}
>  	scroll_to_selected(&previter);
> -	gtk_tree_selection_unselect_all(selection);
> -	gtk_tree_selection_select_iter(selection, &previter);
> +	gtk_tree_view_set_cursor(treeview, treepath, NULL, FALSE);
>  free_path:
>  	gtk_tree_path_free(treepath);
>  }
> -- 
> 1.7.10.4
>
> _______________________________________________
> subsurface mailing list
> subsurface at hohndel.org
> http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface


More information about the subsurface mailing list