add cursor_offset field.
authorKristian Rietveld <kris@gtk.org>
Fri, 16 Feb 2007 21:35:31 +0000 (21:35 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Fri, 16 Feb 2007 21:35:31 +0000 (21:35 +0000)
2007-02-16  Kristian Rietveld  <kris@gtk.org>

* gtk/gtktreeprivate.h: add cursor_offset field.

* gtk/gtktreeview.c (gtk_tree_view_init),
(gtk_tree_view_move_cursor_page_up_down): fix off by one error
in page up/down handling by memorizing the offset into the cursor
row.  (Fixes #399809, reported by Bruce Bowler).

svn path=/trunk/; revision=17316

ChangeLog
gtk/gtktreeprivate.h
gtk/gtktreeview.c

index bd9ba208b9d376f25c9a0ee2d921c83c8ca2e74c..2db17797f762ce3faf4a16765800dd2e261c3619 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-02-16  Kristian Rietveld  <kris@gtk.org>
+
+       * gtk/gtktreeprivate.h: add cursor_offset field.
+
+       * gtk/gtktreeview.c (gtk_tree_view_init),
+       (gtk_tree_view_move_cursor_page_up_down): fix off by one error
+       in page up/down handling by memorizing the offset into the cursor
+       row.  (Fixes #399809, reported by Bruce Bowler).
+
 2007-02-16  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_search_dialog_hide): send
index 0d3b3e0a61694e54ccb88a9d85e32a08fa00c445..0e0a332f0ed03f6e255f12acb60fd3a3f84f9c6a 100644 (file)
@@ -121,6 +121,7 @@ struct _GtkTreeViewPrivate
   /* we cache it for simplicity of the code */
   gint dy;
   gint drag_column_x;
+  gint cursor_offset;
 
   GtkTreeViewColumn *expander_column;
   GtkTreeViewColumn *edited_column;
index ce4221115aa2cbf32f8998165acfb148ba78c69e..61ba802cdcb266996b7d01ed921263f7aed6062d 100644 (file)
@@ -1284,6 +1284,7 @@ gtk_tree_view_init (GtkTreeView *tree_view)
 
   /* We need some padding */
   tree_view->priv->dy = 0;
+  tree_view->priv->cursor_offset = 0;
   tree_view->priv->n_columns = 0;
   tree_view->priv->header_height = 1;
   tree_view->priv->x_drag = 0;
@@ -9625,13 +9626,25 @@ gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
 
   y = _gtk_rbtree_node_find_offset (cursor_tree, cursor_node);
   window_y = RBTREE_Y_TO_TREE_WINDOW_Y (tree_view, y);
+  y += tree_view->priv->cursor_offset;
   y += count * (int)tree_view->priv->vadjustment->page_increment;
   y = CLAMP (y, (gint)tree_view->priv->vadjustment->lower,  (gint)tree_view->priv->vadjustment->upper - vertical_separator);
 
   if (y >= tree_view->priv->height)
     y = tree_view->priv->height - 1;
 
-  y -= _gtk_rbtree_find_offset (tree_view->priv->tree, y, &cursor_tree, &cursor_node);
+  tree_view->priv->cursor_offset =
+    _gtk_rbtree_find_offset (tree_view->priv->tree, y,
+                            &cursor_tree, &cursor_node);
+
+  if (tree_view->priv->cursor_offset >= BACKGROUND_HEIGHT (cursor_node))
+    {
+      _gtk_rbtree_next_full (cursor_tree, cursor_node,
+                            &cursor_tree, &cursor_node);
+      tree_view->priv->cursor_offset -= BACKGROUND_HEIGHT (cursor_node);
+    }
+
+  y -= tree_view->priv->cursor_offset;
   cursor_path = _gtk_tree_view_find_path (tree_view, cursor_tree, cursor_node);
   g_return_if_fail (cursor_path != NULL);
   gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE, FALSE);