From 4e4748e890f3c19b6d1e8cb72f316c33e25b846a Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Wed, 13 Jun 2007 13:27:00 +0000 Subject: [PATCH] Audit of GtkTreeView coordinate system usage. (#142494). 2007-06-13 Kristian Rietveld Audit of GtkTreeView coordinate system usage. (#142494). * gtk/gtktreeview.[ch]: general documentation updates, (gtk_tree_view_scroll_to_cell), (gtk_tree_view_get_dest_row_at_pos): update coordinate translations, (gtk_tree_view_tree_to_widget_coords), (gtk_tree_view_widget_to_tree_coords): Deprecated, (gtk_tree_view_convert_.*_coords): 6 new functions for doing transformations between coordinate systems. * gtk/gtk.symbols: updated. * tests/testtooltips.c (query_tooltip_tree_view_cb): fix testcase with new gtk_tree_view_convert_widget_to_bin_window_coords(). * docs/reference/gtk/Makefile.am * docs/reference/gtk/images/tree-view-coordinates.png: add new image. * docs/reference/gtk/tmpl/gtktreeview.sgml: eloborate on the different coordinate systems. svn path=/trunk/; revision=18119 --- ChangeLog | 23 ++ docs/reference/gtk/Makefile.am | 1 + .../gtk/images/tree-view-coordinates.png | Bin 0 -> 25518 bytes docs/reference/gtk/tmpl/gtktreeview.sgml | 52 ++- gtk/gtk.symbols | 10 + gtk/gtktreeview.c | 307 ++++++++++++++---- gtk/gtktreeview.h | 35 ++ tests/testtooltips.c | 8 +- 8 files changed, 360 insertions(+), 76 deletions(-) create mode 100644 docs/reference/gtk/images/tree-view-coordinates.png diff --git a/ChangeLog b/ChangeLog index 85d89e5b7e..66bf4e83c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2007-06-13 Kristian Rietveld + + Audit of GtkTreeView coordinate system usage. (#142494). + + * gtk/gtktreeview.[ch]: general documentation updates, + (gtk_tree_view_scroll_to_cell), (gtk_tree_view_get_dest_row_at_pos): + update coordinate translations, + (gtk_tree_view_tree_to_widget_coords), + (gtk_tree_view_widget_to_tree_coords): Deprecated, + (gtk_tree_view_convert_.*_coords): 6 new functions for doing + transformations between coordinate systems. + + * gtk/gtk.symbols: updated. + + * tests/testtooltips.c (query_tooltip_tree_view_cb): fix testcase + with new gtk_tree_view_convert_widget_to_bin_window_coords(). + + * docs/reference/gtk/Makefile.am + * docs/reference/gtk/images/tree-view-coordinates.png: add new image. + + * docs/reference/gtk/tmpl/gtktreeview.sgml: eloborate on the + different coordinate systems. + 2007-06-13 Kristian Rietveld * gtk/gtkcellrendererprogress.c diff --git a/docs/reference/gtk/Makefile.am b/docs/reference/gtk/Makefile.am index e01054f5d8..8316e7a125 100644 --- a/docs/reference/gtk/Makefile.am +++ b/docs/reference/gtk/Makefile.am @@ -313,6 +313,7 @@ HTML_IMAGES = \ $(srcdir)/images/statusbar.png \ $(srcdir)/images/toggle-button.png \ $(srcdir)/images/toolbar.png \ + $(srcdir)/images/tree-view-coordinates.png \ $(srcdir)/images/volumebutton.png \ $(srcdir)/images/window.png diff --git a/docs/reference/gtk/images/tree-view-coordinates.png b/docs/reference/gtk/images/tree-view-coordinates.png new file mode 100644 index 0000000000000000000000000000000000000000..af21d555a61c696b1d20e154132160964f13205e GIT binary patch literal 25518 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%0Au}*wYs3?La~#<* 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 + +Several different coordinate systems are exposed in the GtkTreeView API. +These are: + + + + + Widget coordinates -- coordinates relative to the widget (usually widget->window. + Bin window coordinates -- coordinates relative to the window that GtkTreeView renders to. + Tree coordinates -- coordinates relative to the entire scrollable area of GtkTreeView. These coordinates start at (0, 0) for row 0 of the tree. + + + + +Several functions are available for converting between the different +coordinate systems. The most common translations are between widget and bin window coordinates and between bin window and tree coordinates. For the former +you can use gtk_tree_view_convert_widget_to_bin_window_coords () +(and vice versa), for the latter gtk_tree_view_convert_bin_window_to_tree_coords () (and vice versa). + + #GtkTreeViewColumn, #GtkTreeSelection, #GtkTreeDnd, #GtkTreeMode, #GtkTreeSortable, #GtkTreeModelSort, #GtkListStore, #GtkTreeStore, #GtkCellRenderer, #GtkCellEditable, #GtkCellRendererPixbuf, #GtkCellRendererText, #GtkCellRendererToggle @@ -35,21 +55,21 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @arg3: @@ -60,7 +80,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @Returns: @@ -70,7 +90,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @@ -79,7 +99,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @@ -88,7 +108,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @@ -97,7 +117,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @Returns: @@ -105,7 +125,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @Returns: @@ -113,7 +133,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @Returns: @@ -122,7 +142,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @@ -131,7 +151,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @Returns: @@ -139,7 +159,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @Returns: @@ -149,7 +169,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @arg1: @arg2: @Returns: @@ -159,7 +179,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @Returns: @@ -167,7 +187,7 @@ they work together. -@treeview: the object which received the signal. +@tree_view: the object which received the signal. @Returns: diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 5355e25592..10aee0609d 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -4328,6 +4328,12 @@ gtk_tree_view_column_set_widget gtk_tree_view_append_column gtk_tree_view_collapse_all gtk_tree_view_collapse_row +gtk_tree_view_convert_bin_window_to_tree_coords +gtk_tree_view_convert_bin_window_to_widget_coords +gtk_tree_view_convert_tree_to_bin_window_coords +gtk_tree_view_convert_tree_to_widget_coords +gtk_tree_view_convert_widget_to_bin_window_coords +gtk_tree_view_convert_widget_to_tree_coords gtk_tree_view_create_row_drag_icon gtk_tree_view_enable_model_drag_dest gtk_tree_view_enable_model_drag_source @@ -4408,10 +4414,14 @@ gtk_tree_view_set_search_equal_func gtk_tree_view_set_search_position_func gtk_tree_view_set_show_expanders gtk_tree_view_set_vadjustment +#ifndef GTK_DISABLE_DEPRECATED gtk_tree_view_tree_to_widget_coords +#endif gtk_tree_view_unset_rows_drag_dest gtk_tree_view_unset_rows_drag_source +#ifndef GTK_DISABLE_DEPRECATED gtk_tree_view_widget_to_tree_coords +#endif gtk_tree_view_columns_autosize #endif #endif diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 76fc9e5c58..268389808f 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -61,10 +61,13 @@ #define BACKGROUND_HEIGHT(node) (GTK_RBNODE_GET_HEIGHT (node)) #define CELL_HEIGHT(node, separator) ((BACKGROUND_HEIGHT (node)) - (separator)) +/* Translate from bin_window coordinates to rbtree (tree coordinates) and + * vice versa. + */ #define TREE_WINDOW_Y_TO_RBTREE_Y(tree_view,y) ((y) + tree_view->priv->dy) #define RBTREE_Y_TO_TREE_WINDOW_Y(tree_view,y) ((y) - tree_view->priv->dy) -/* This is in Window coordinates */ +/* This is in bin_window coordinates */ #define BACKGROUND_FIRST_PIXEL(tree_view,tree,node) (RBTREE_Y_TO_TREE_WINDOW_Y (tree_view, _gtk_rbtree_node_find_offset ((tree), (node)))) #define CELL_FIRST_PIXEL(tree_view,tree,node,separator) (BACKGROUND_FIRST_PIXEL (tree_view,tree,node) + separator/2) @@ -457,12 +460,6 @@ static GtkTreeViewColumn *gtk_tree_view_get_drop_column (GtkTreeView *tree GtkTreeViewColumn *column, gint drop_position); -static void gtk_tree_view_tree_window_to_tree_coords (GtkTreeView *tree_view, - gint wx, - gint wy, - gint *tx, - gint *ty); - static gboolean scroll_row_timeout (gpointer data); static void add_scroll_timeout (GtkTreeView *tree_view); static void remove_scroll_timeout (GtkTreeView *tree_view); @@ -2973,7 +2970,7 @@ static gboolean coords_are_over_arrow (GtkTreeView *tree_view, GtkRBTree *tree, GtkRBNode *node, - /* these are in window coords */ + /* these are in bin window coords */ gint x, gint y) { @@ -3039,7 +3036,7 @@ static void do_prelight (GtkTreeView *tree_view, GtkRBTree *tree, GtkRBNode *node, - /* these are in tree_window coords */ + /* these are in bin_window coords */ gint x, gint y) { @@ -3135,7 +3132,7 @@ static void prelight_or_select (GtkTreeView *tree_view, GtkRBTree *tree, GtkRBNode *node, - /* these are in tree_window coords */ + /* these are in bin_window coords */ gint x, gint y) { @@ -6697,6 +6694,7 @@ scroll_row_timeout (gpointer data) static gboolean set_destination_row (GtkTreeView *tree_view, GdkDragContext *context, + /* coordinates relative to the widget */ gint x, gint y, GdkDragAction *suggested_action, @@ -7106,6 +7104,7 @@ gtk_tree_view_drag_leave (GtkWidget *widget, static gboolean gtk_tree_view_drag_motion (GtkWidget *widget, GdkDragContext *context, + /* coordinates relative to the widget */ gint x, gint y, guint time) @@ -7171,6 +7170,7 @@ gtk_tree_view_drag_motion (GtkWidget *widget, static gboolean gtk_tree_view_drag_drop (GtkWidget *widget, GdkDragContext *context, + /* coordinates relative to the widget */ gint x, gint y, guint time) @@ -7235,6 +7235,7 @@ gtk_tree_view_drag_drop (GtkWidget *widget, static void gtk_tree_view_drag_data_received (GtkWidget *widget, GdkDragContext *context, + /* coordinates relative to the widget */ gint x, gint y, GtkSelectionData *selection_data, @@ -7949,6 +7950,7 @@ gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, static void gtk_tree_view_put (GtkTreeView *tree_view, GtkWidget *child_widget, + /* in tree coordinates */ gint x, gint y, gint width, @@ -7978,6 +7980,7 @@ gtk_tree_view_put (GtkTreeView *tree_view, void _gtk_tree_view_child_move_resize (GtkTreeView *tree_view, GtkWidget *widget, + /* in tree coordinates */ gint x, gint y, gint width, @@ -9366,6 +9369,7 @@ static void gtk_tree_view_draw_arrow (GtkTreeView *tree_view, GtkRBTree *tree, GtkRBNode *node, + /* in bin_window coordinates */ gint x, gint y) { @@ -11375,7 +11379,7 @@ gtk_tree_view_set_column_drag_function (GtkTreeView *tree_view, * * Scrolls the tree view such that the top-left corner of the visible * area is @tree_x, @tree_y, where @tree_x and @tree_y are specified - * in tree window coordinates. The @tree_view must be realized before + * in tree coordinates. The @tree_view must be realized before * this function is called. If it isn't, you probably want to be * using gtk_tree_view_scroll_to_cell(). * @@ -11482,9 +11486,10 @@ gtk_tree_view_scroll_to_cell (GtkTreeView *tree_view, gint dest_x, dest_y; gtk_tree_view_get_background_area (tree_view, path, column, &cell_rect); - gtk_tree_view_tree_window_to_tree_coords (tree_view, cell_rect.x, cell_rect.y, &(cell_rect.x), &(cell_rect.y)); gtk_tree_view_get_visible_rect (tree_view, &vis_rect); + cell_rect.y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, cell_rect.y); + dest_x = vis_rect.x; dest_y = vis_rect.y; @@ -12490,23 +12495,29 @@ gtk_tree_view_get_bin_window (GtkTreeView *tree_view) /** * gtk_tree_view_get_path_at_pos: * @tree_view: A #GtkTreeView. - * @x: The x position to be identified. - * @y: The y position to be identified. + * @x: The x position to be identified (relative to bin_window). + * @y: The y position to be identified (relative to bin_window). * @path: A pointer to a #GtkTreePath pointer to be filled in, or %NULL * @column: A pointer to a #GtkTreeViewColumn pointer to be filled in, or %NULL * @cell_x: A pointer where the X coordinate relative to the cell can be placed, or %NULL * @cell_y: A pointer where the Y coordinate relative to the cell can be placed, or %NULL * - * Finds the path at the point (@x, @y), relative to widget coordinates. That - * is, @x and @y are relative to an events coordinates. @x and @y must come - * from an event on the @tree_view only where event->window == - * gtk_tree_view_get_bin (). It is primarily for things - * like popup menus. If @path is non-%NULL, then it will be filled with the - * #GtkTreePath at that point. This path should be freed with gtk_tree_path_free(). - * If @column is non-%NULL, then it will be filled with the column at that point. - * @cell_x and @cell_y return the coordinates relative to the cell background - * (i.e. the @background_area passed to gtk_cell_renderer_render()). This - * function is only meaningful if @tree_view is realized. + * Finds the path at the point (@x, @y), relative to bin_window coordinates + * (please see gtk_tree_view_get_bin_window ()). + * That is, @x and @y are relative to an events coordinates. @x and @y must + * come from an event on the @tree_view only where event->window == + * gtk_tree_view_get_bin_window (). It is primarily for + * things like popup menus. If @path is non-%NULL, then it will be filled + * with the #GtkTreePath at that point. This path should be freed with + * gtk_tree_path_free(). If @column is non-%NULL, then it will be filled + * with the column at that point. @cell_x and @cell_y return the coordinates + * relative to the cell background (i.e. the @background_area passed to + * gtk_cell_renderer_render()). This function is only meaningful if + * @tree_view is realized. + * + * For converting widget coordinates (eg. the ones you get from + * GtkWidget::query-tooltip), please see + * gtk_tree_view_convert_widget_to_bin_window_coords (). * * Return value: %TRUE if a row exists at that coordinate. **/ @@ -12619,7 +12630,7 @@ gtk_tree_view_get_path_at_pos (GtkTreeView *tree_view, * @column: a #GtkTreeViewColumn for the column, or %NULL to get only vertical coordinates * @rect: rectangle to fill with cell rect * - * Fills the bounding rectangle in tree window coordinates for the cell at the + * Fills the bounding rectangle in bin_window coordinates for the cell at the * row specified by @path and the column specified by @column. If @path is * %NULL, or points to a path not currently displayed, the @y and @height fields * of the rectangle will be filled with 0. If @column is %NULL, the @x and @width @@ -12704,16 +12715,15 @@ gtk_tree_view_get_cell_area (GtkTreeView *tree_view, * @column: a #GtkTreeViewColumn for the column, or %NULL to get only vertical coordiantes * @rect: rectangle to fill with cell background rect * - * Fills the bounding rectangle in tree window coordinates for the cell at the + * Fills the bounding rectangle in bin_window coordinates for the cell at the * row specified by @path and the column specified by @column. If @path is * %NULL, or points to a node not found in the tree, the @y and @height fields of * the rectangle will be filled with 0. If @column is %NULL, the @x and @width * fields will be filled with 0. The returned rectangle is equivalent to the * @background_area passed to gtk_cell_renderer_render(). These background - * areas tile to cover the entire tree window (except for the area used for - * header buttons). Contrast with the @cell_area, returned by - * gtk_tree_view_get_cell_area(), which returns only the cell itself, excluding - * surrounding borders and the tree expander area. + * areas tile to cover the entire bin window. Contrast with the @cell_area, + * returned by gtk_tree_view_get_cell_area(), which returns only the cell + * itself, excluding surrounding borders and the tree expander area. * **/ void @@ -12762,10 +12772,10 @@ gtk_tree_view_get_background_area (GtkTreeView *tree_view, * @visible_rect: rectangle to fill * * Fills @visible_rect with the currently-visible region of the - * buffer, in tree coordinates. Convert to widget coordinates with - * gtk_tree_view_tree_to_widget_coords(). Tree coordinates start at - * 0,0 for row 0 of the tree, and cover the entire scrollable area of - * the tree. + * buffer, in tree coordinates. Convert to bin_window coordinates with + * gtk_tree_view_convert_tree_to_bin_window_coords (). + * Tree coordinates start at 0,0 for row 0 of the tree, and cover the entire + * scrollable area of the tree. **/ void gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, @@ -12789,13 +12799,18 @@ gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, /** * gtk_tree_view_widget_to_tree_coords: * @tree_view: a #GtkTreeView - * @wx: widget X coordinate - * @wy: widget Y coordinate + * @wx: X coordinate relative to bin_window + * @wy: Y coordinate relative to bin_window * @tx: return location for tree X coordinate * @ty: return location for tree Y coordinate * - * Converts widget coordinates to coordinates for the - * tree window (the full scrollable area of the tree). + * Converts bin_window coordinates to coordinates for the + * tree (the full scrollable area of the tree). + * + * Deprecated: 2.12: Due to historial reasons the name of this function is + * incorrect. For converting coordinates relative to the widget to + * bin_window coordinates, please see + * gtk_tree_view_convert_widget_to_bin_window_coords (). * **/ void @@ -12813,31 +12828,21 @@ gtk_tree_view_widget_to_tree_coords (GtkTreeView *tree_view, *ty = wy + tree_view->priv->dy; } -static void -gtk_tree_view_tree_window_to_tree_coords (GtkTreeView *tree_view, - gint wx, - gint wy, - gint *tx, - gint *ty) -{ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - - if (tx) - *tx = wx; - if (ty) - *ty = wy + tree_view->priv->dy; -} - /** * gtk_tree_view_tree_to_widget_coords: * @tree_view: a #GtkTreeView * @tx: tree X coordinate * @ty: tree Y coordinate - * @wx: return location for widget X coordinate - * @wy: return location for widget Y coordinate + * @wx: return location for X coordinate relative to bin_window + * @wy: return location for Y coordinate relative to bin_window * * Converts tree coordinates (coordinates in full scrollable area of the tree) - * to widget coordinates. + * to bin_window coordinates. + * + * Deprecated: 2.12: Due to historial reasons the name of this function is + * incorrect. For converting bin_window coordinates to coordinates relative + * to bin_window, please see + * gtk_tree_view_convert_bin_window_to_widget_coords (). * **/ void @@ -12855,6 +12860,186 @@ gtk_tree_view_tree_to_widget_coords (GtkTreeView *tree_view, *wy = ty - tree_view->priv->dy; } + +/** + * gtk_tree_view_convert_widget_to_tree_coords: + * @tree_view: a #GtkTreeView + * @wx: X coordinate relative to the widget + * @wy: Y coordinate relative to the widget + * @bx: return location for tree X coordinate + * @by: return location for tree Y coordinate + * + * Converts widget coordinates to coordinates for the + * tree (the full scrollable area of the tree). + * + * Since: 2.12 + **/ +void +gtk_tree_view_convert_widget_to_tree_coords (GtkTreeView *tree_view, + gint wx, + gint wy, + gint *tx, + gint *ty) +{ + gint x, y; + + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + gtk_tree_view_convert_widget_to_bin_window_coords (tree_view, + wx, wy, + &x, &y); + gtk_tree_view_convert_bin_window_to_tree_coords (tree_view, + x, y, + tx, ty); +} + +/** + * gtk_tree_view_convert_tree_to_widget_coords: + * @tree_view: a #GtkTreeView + * @wx: X coordinate relative to the tree + * @wy: Y coordinate relative to the tree + * @bx: return location for widget X coordinate + * @by: return location for widget Y coordinate + * + * Converts tree coordinates (coordinates in full scrollable area of the tree) + * to widget coordinates. + * + * Since: 2.12 + **/ +void +gtk_tree_view_convert_tree_to_widget_coords (GtkTreeView *tree_view, + gint tx, + gint ty, + gint *wx, + gint *wy) +{ + gint x, y; + + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + gtk_tree_view_convert_tree_to_bin_window_coords (tree_view, + tx, ty, + &x, &y); + gtk_tree_view_convert_bin_window_to_widget_coords (tree_view, + x, y, + wx, wy); +} + +/** + * gtk_tree_view_convert_widget_to_bin_window_coords: + * @tree_view: a #GtkTreeView + * @wx: X coordinate relative to the widget + * @wy: Y coordinate relative to the widget + * @bx: return location for bin_window X coordinate + * @by: return location for bin_window Y coordinate + * + * Converts widget coordinates to coordinates for the bin_window + * (see gtk_tree_view_get_bin_window ()). + * + * Since: 2.12 + **/ +void +gtk_tree_view_convert_widget_to_bin_window_coords (GtkTreeView *tree_view, + gint wx, + gint wy, + gint *bx, + gint *by) +{ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + if (bx) + *bx = wx; + if (by) + *by = wy - TREE_VIEW_HEADER_HEIGHT (tree_view); +} + +/** + * gtk_tree_view_convert_bin_window_to_widget_coords: + * @tree_view: a #GtkTreeView + * @bx: bin_window X coordinate + * @by: bin_window Y coordinate + * @wx: return location for widget X coordinate + * @wy: return location for widget Y coordinate + * + * Converts bin_window coordinates (see + * gtk_tree_view_get_bin_window ()priv->hadjustment->value; + if (by) + *by = ty - tree_view->priv->dy; +} + +/** + * gtk_tree_view_convert_bin_window_to_tree_coords: + * @tree_view: a #GtkTreeView + * @wx: X coordinate relative to bin_window + * @wy: Y coordinate relative to bin_window + * @bx: return location for tree X coordinate + * @by: return location for tree Y coordinate + * + * Converts bin_window coordinates to coordinates for the + * tree (the full scrollable area of the tree). + * + * Since: 2.12 + **/ +void +gtk_tree_view_convert_bin_window_to_tree_coords (GtkTreeView *tree_view, + gint bx, + gint by, + gint *tx, + gint *ty) +{ + g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + + if (tx) + *tx = bx + tree_view->priv->hadjustment->value; + if (ty) + *ty = by + tree_view->priv->dy; +} + + + /** * gtk_tree_view_get_visible_range: * @tree_view: A #GtkTreeView @@ -13174,7 +13359,8 @@ gtk_tree_view_get_drag_dest_row (GtkTreeView *tree_view, * @path: Return location for the path of the highlighted row, or %NULL. * @pos: Return location for the drop position, or %NULL * - * Determines the destination row for a given position. + * Determines the destination row for a given position. @drag_x and + * @drag_y are expected to be in widget coordinates. * * Return value: whether there is a row at the given position. **/ @@ -13186,6 +13372,7 @@ gtk_tree_view_get_dest_row_at_pos (GtkTreeView *tree_view, GtkTreeViewDropPosition *pos) { gint cell_y; + gint bin_x, bin_y; gdouble offset_into_row; gdouble third; GdkRectangle cell; @@ -13212,10 +13399,12 @@ gtk_tree_view_get_dest_row_at_pos (GtkTreeView *tree_view, * in the bottom third, drop after that row; if in the middle, * and the row has children, drop into the row. */ + gtk_tree_view_convert_widget_to_bin_window_coords (tree_view, drag_x, drag_y, + &bin_x, &bin_y); if (!gtk_tree_view_get_path_at_pos (tree_view, - drag_x, - drag_y - TREE_VIEW_HEADER_HEIGHT (tree_view), + bin_x, + bin_y, &tmp_path, &column, NULL, diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index 529739d293..e461974bfb 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -257,6 +257,8 @@ void gtk_tree_view_get_background_area (GtkTreeView GdkRectangle *rect); void gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, GdkRectangle *visible_rect); + +#ifndef GTK_DISABLE_DEPRECATED void gtk_tree_view_widget_to_tree_coords (GtkTreeView *tree_view, gint wx, gint wy, @@ -267,6 +269,7 @@ void gtk_tree_view_tree_to_widget_coords (GtkTreeView gint ty, gint *wx, gint *wy); +#endif /* !GTK_DISABLE_DEPRECATED */ gboolean gtk_tree_view_get_visible_range (GtkTreeView *tree_view, GtkTreePath **start_path, GtkTreePath **end_path); @@ -322,6 +325,38 @@ void gtk_tree_view_set_search_position_func (GtkTreeVie gpointer data, GDestroyNotify destroy); +/* Convert between the different coordinate systems */ +void gtk_tree_view_convert_widget_to_tree_coords (GtkTreeView *tree_view, + gint wx, + gint wy, + gint *tx, + gint *ty); +void gtk_tree_view_convert_tree_to_widget_coords (GtkTreeView *tree_view, + gint tx, + gint ty, + gint *wx, + gint *wy); +void gtk_tree_view_convert_widget_to_bin_window_coords (GtkTreeView *tree_view, + gint wx, + gint wy, + gint *bx, + gint *by); +void gtk_tree_view_convert_bin_window_to_widget_coords (GtkTreeView *tree_view, + gint bx, + gint by, + gint *wx, + gint *wy); +void gtk_tree_view_convert_tree_to_bin_window_coords (GtkTreeView *tree_view, + gint tx, + gint ty, + gint *bx, + gint *by); +void gtk_tree_view_convert_bin_window_to_tree_coords (GtkTreeView *tree_view, + gint bx, + gint by, + gint *tx, + gint *ty); + /* This function should really never be used. It is just for use by ATK. */ typedef void (* GtkTreeDestroyCountFunc) (GtkTreeView *tree_view, diff --git a/tests/testtooltips.c b/tests/testtooltips.c index 7c3c98a62c..35652117c8 100644 --- a/tests/testtooltips.c +++ b/tests/testtooltips.c @@ -117,8 +117,14 @@ query_tooltip_tree_view_cb (GtkWidget *widget, } else { + gint bin_x, bin_y; + + gtk_tree_view_convert_widget_to_bin_window_coords (tree_view, x, y, + &bin_x, &bin_y); + /* Mouse mode */ - if (!gtk_tree_view_get_path_at_pos (tree_view, x, y, &path, NULL, NULL, NULL)) + if (!gtk_tree_view_get_path_at_pos (tree_view, bin_x, bin_y, + &path, NULL, NULL, NULL)) return FALSE; }