diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index be630f8be0..9fe2074a00 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -122,7 +122,9 @@ gboolean _gtk_tree_view_column_cell_event (GtkTreeViewColumn *tree_column, gboolean _gtk_tree_view_column_has_editable_cell(GtkTreeViewColumn *column); GtkCellRenderer *_gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn *column); GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column, - gint x); + GdkRectangle *cell_area, + gint x, + gint y); void _gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column, cairo_t *cr, diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index fd010fd74b..5833be63d2 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -3128,9 +3128,15 @@ gtk_tree_view_button_press (GtkWidget *widget, if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) tree_view->priv->shift_pressed = TRUE; - - /* This needs an x and a y ! */ - focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, event->x - background_area.x); + /* We update the focus cell here, this is also needed if the + * column does not contain an editable cell. In this case, + * GtkCellArea did not receive the event for processing (and + * could not update the focus cell). + */ + focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, + &cell_area, + event->x, + event->y); if (focus_cell) gtk_tree_view_column_focus_cell (column, focus_cell); diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index fe6e5f58cc..fd5eb1c6cf 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -1472,34 +1472,19 @@ _gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn *column) GtkCellRenderer * _gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column, - gint x) + GdkRectangle *cell_area, + gint x, + gint y) { - GList *list; - GList *cell; GtkCellRenderer *match = NULL; GtkTreeViewColumnPrivate *priv = column->priv; - list = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (column)); - for (cell = list; cell; cell = cell->next) - { - GdkRectangle zero_cell_area = { 0, }; - GdkRectangle allocation; - - gtk_cell_area_get_cell_allocation (priv->cell_area, - priv->cell_area_context, - priv->tree_view, - cell->data, - &zero_cell_area, - &allocation); - - if (allocation.x <= x && x <= allocation.x + allocation.width) - { - match = cell->data; - break; - } - } - - g_list_free (list); + match = gtk_cell_area_get_cell_at_position (priv->cell_area, + priv->cell_area_context, + priv->tree_view, + cell_area, + x, y, + NULL); return match; }