diff options
author | Benjamin Otte <otte@redhat.com> | 2010-08-24 15:45:41 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-09-26 15:03:01 +0200 |
commit | f085bc67cd84c518eff3903745df6814ff5dd243 (patch) | |
tree | 440ecb3c0b095394a472374f3527c4607617cc43 /gtk | |
parent | b259dd9aba78ec982a4b4ba90d07031fda6d9939 (diff) | |
download | gtk+-f085bc67cd84c518eff3903745df6814ff5dd243.tar.gz |
treeview: Convert GtkTreeViewColumn rendering to Cairo
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtktreeprivate.h | 6 | ||||
-rw-r--r-- | gtk/gtktreeview.c | 41 | ||||
-rw-r--r-- | gtk/gtktreeviewcolumn.c | 77 |
3 files changed, 61 insertions, 63 deletions
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index 2c35956726..8b18e7fbad 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -439,10 +439,9 @@ gboolean _gtk_tree_selection_row_is_selectable (GtkTreeSelection *sele GtkTreePath *path); void _gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *background_area, const GdkRectangle *cell_area, - const GdkRectangle *expose_area, guint flags); void _gtk_tree_view_column_get_focus_area (GtkTreeViewColumn *tree_column, const GdkRectangle *background_area, @@ -453,10 +452,9 @@ gboolean _gtk_tree_view_column_cell_focus (GtkTreeViewColumn *tree_colu gboolean left, gboolean right); void _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *background_area, const GdkRectangle *cell_area, - const GdkRectangle *expose_area, guint flags); void _gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn *tree_column, gboolean install_handler); diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 6bf2dc9129..1d3ae4d3eb 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -4390,6 +4390,7 @@ gtk_tree_view_bin_expose (GtkWidget *widget, gint grid_line_width; gboolean got_pointer = FALSE; gboolean draw_vgrid_lines, draw_hgrid_lines; + cairo_t *cr; rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL); @@ -4410,6 +4411,10 @@ gtk_tree_view_bin_expose (GtkWidget *widget, if (event->area.height < 0) return TRUE; + cr = gdk_cairo_create (event->window); + gdk_cairo_region (cr, event->region); + cairo_clip (cr); + validate_visible_area (tree_view); style = gtk_widget_get_style (widget); @@ -4437,7 +4442,10 @@ gtk_tree_view_bin_expose (GtkWidget *widget, } if (node == NULL) - return TRUE; + { + cairo_destroy (cr); + return TRUE; + } /* find the path for the node */ path = _gtk_tree_view_find_path ((GtkTreeView *)widget, @@ -4731,10 +4739,9 @@ gtk_tree_view_bin_expose (GtkWidget *widget, cell_area.y + cell_area.height / 2); else _gtk_tree_view_column_cell_render (column, - event->window, + cr, &background_area, &cell_area, - &event->area, flags); if (TREE_VIEW_DRAW_EXPANDERS(tree_view) && (node->flags & GTK_RBNODE_IS_PARENT) == GTK_RBNODE_IS_PARENT) @@ -4766,10 +4773,9 @@ gtk_tree_view_bin_expose (GtkWidget *widget, cell_area.y + cell_area.height / 2); else _gtk_tree_view_column_cell_render (column, - event->window, + cr, &background_area, &cell_area, - &event->area, flags); } @@ -4869,10 +4875,9 @@ gtk_tree_view_bin_expose (GtkWidget *widget, (column == tree_view->priv->edited_column))) { _gtk_tree_view_column_cell_draw_focus (column, - event->window, + cr, &background_area, &cell_area, - &event->area, flags); } @@ -5059,6 +5064,8 @@ done: if (drag_dest_path) gtk_tree_path_free (drag_dest_path); + cairo_destroy (cr); + return FALSE; } @@ -13883,21 +13890,19 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView *tree_view, if (gtk_tree_view_column_cell_is_visible (column)) { if (is_separator) - gtk_paint_hline (style, - drawable, - GTK_STATE_NORMAL, - &cell_area, - widget, - NULL, - cell_area.x, - cell_area.x + cell_area.width, - cell_area.y + cell_area.height / 2); + gtk_cairo_paint_hline (style, + cr, + GTK_STATE_NORMAL, + widget, + NULL, + cell_area.x, + cell_area.x + cell_area.width, + cell_area.y + cell_area.height / 2); else _gtk_tree_view_column_cell_render (column, - drawable, + cr, &background_area, &cell_area, - &expose_area, 0); } cell_offset += column->width; diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 6104015fb3..3169f2a4f0 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -2670,12 +2670,11 @@ enum { static gboolean gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *background_area, const GdkRectangle *cell_area, guint flags, gint action, - const GdkRectangle *expose_area, /* RENDER */ GdkRectangle *focus_rectangle, /* FOCUS */ GtkCellEditable **editable_widget, /* EVENT */ GdkEvent *event, /* EVENT */ @@ -2684,7 +2683,6 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, GList *list; GdkRectangle real_cell_area; GdkRectangle real_background_area; - GdkRectangle real_expose_area = *cell_area; gint depth = 0; gint expand_cell_count = 0; gint full_requested_width = 0; @@ -2828,13 +2826,12 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, /* RENDER */ if (action == CELL_ACTION_RENDER) { - gtk_cell_renderer_render (info->cell, - window, - tree_column->tree_view, - &rtl_background_area, - &rtl_cell_area, - &real_expose_area, - flags); + gtk_cell_renderer_render_cairo (info->cell, + cr, + tree_column->tree_view, + &rtl_background_area, + &rtl_cell_area, + flags); } /* FOCUS */ else if (action == CELL_ACTION_FOCUS) @@ -2997,13 +2994,12 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, /* RENDER */ if (action == CELL_ACTION_RENDER) { - gtk_cell_renderer_render (info->cell, - window, - tree_column->tree_view, - &rtl_background_area, - &rtl_cell_area, - &real_expose_area, - flags); + gtk_cell_renderer_render_cairo (info->cell, + cr, + tree_column->tree_view, + &rtl_background_area, + &rtl_cell_area, + flags); } /* FOCUS */ else if (action == CELL_ACTION_FOCUS) @@ -3147,10 +3143,9 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, /** * gtk_tree_view_column_cell_render: * @tree_column: A #GtkTreeViewColumn. - * @window: a #GdkDrawable to draw to + * @cr: cairo context to draw to * @background_area: entire cell area (including tree expanders and maybe padding on the sides) * @cell_area: area normally rendered by a cell renderer - * @expose_area: area that actually needs updating * @flags: flags that affect rendering * * Renders the cell contained by #tree_column. This is used primarily by the @@ -3158,25 +3153,27 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, **/ void _gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *background_area, const GdkRectangle *cell_area, - const GdkRectangle *expose_area, guint flags) { g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (cr != NULL); g_return_if_fail (background_area != NULL); g_return_if_fail (cell_area != NULL); - g_return_if_fail (expose_area != NULL); + + cairo_save (cr); gtk_tree_view_column_cell_process_action (tree_column, - window, + cr, background_area, cell_area, flags, CELL_ACTION_RENDER, - expose_area, NULL, NULL, NULL, NULL); + + cairo_restore (cr); } gboolean @@ -3191,12 +3188,12 @@ _gtk_tree_view_column_cell_event (GtkTreeViewColumn *tree_column, g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE); return gtk_tree_view_column_cell_process_action (tree_column, - NULL, + NULL, background_area, cell_area, flags, CELL_ACTION_EVENT, - NULL, NULL, + NULL, editable_widget, event, path_string); @@ -3214,7 +3211,6 @@ _gtk_tree_view_column_get_focus_area (GtkTreeViewColumn *tree_column, cell_area, 0, CELL_ACTION_FOCUS, - NULL, focus_area, NULL, NULL, NULL); } @@ -3470,16 +3466,17 @@ _gtk_tree_view_column_cell_focus (GtkTreeViewColumn *tree_column, void _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column, - GdkWindow *window, + cairo_t *cr, const GdkRectangle *background_area, const GdkRectangle *cell_area, - const GdkRectangle *expose_area, guint flags) { gint focus_line_width; GtkStateType cell_state; g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (cr != NULL); + gtk_widget_style_get (GTK_WIDGET (tree_column->tree_view), "focus-line-width", &focus_line_width, NULL); if (tree_column->editable_widget) @@ -3503,28 +3500,26 @@ _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column, { GdkRectangle focus_rectangle; gtk_tree_view_column_cell_process_action (tree_column, - window, + cr, background_area, cell_area, flags, CELL_ACTION_FOCUS, - expose_area, &focus_rectangle, NULL, NULL, NULL); cell_state = flags & GTK_CELL_RENDERER_SELECTED ? GTK_STATE_SELECTED : (flags & GTK_CELL_RENDERER_PRELIT ? GTK_STATE_PRELIGHT : (flags & GTK_CELL_RENDERER_INSENSITIVE ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL)); - gtk_paint_focus (gtk_widget_get_style (tree_column->tree_view), - window, - cell_state, - cell_area, - tree_column->tree_view, - "treeview", - focus_rectangle.x, - focus_rectangle.y, - focus_rectangle.width, - focus_rectangle.height); + gtk_cairo_paint_focus (gtk_widget_get_style (tree_column->tree_view), + cr, + cell_state, + tree_column->tree_view, + "treeview", + focus_rectangle.x, + focus_rectangle.y, + focus_rectangle.width, + focus_rectangle.height); } } |