[gtk+] treeview: Partially convert to snapshot()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] treeview: Partially convert to snapshot()
- Date: Thu, 22 Dec 2016 02:37:46 +0000 (UTC)
commit f1825f5eff8dc9d804c7147e21450dfb9d5423de
Author: Benjamin Otte <otte redhat com>
Date: Thu Dec 22 02:29:22 2016 +0100
treeview: Partially convert to snapshot()
The big fat scary bin drawing function that actually draws the cell
renderers - that one is still missing.
gtk/gtktreeview.c | 135 ++++++++++++++++++++++++++++++++---------------------
1 files changed, 81 insertions(+), 54 deletions(-)
---
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index d1c4847..972b8d2 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -596,8 +596,8 @@ static void gtk_tree_view_measure (GtkWidget *widget,
int *natural_baseline);
static void gtk_tree_view_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
-static gboolean gtk_tree_view_draw (GtkWidget *widget,
- cairo_t *cr);
+static void gtk_tree_view_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot);
static gboolean gtk_tree_view_key_press (GtkWidget *widget,
GdkEventKey *event);
static gboolean gtk_tree_view_key_release (GtkWidget *widget,
@@ -978,7 +978,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
widget_class->measure = gtk_tree_view_measure;
widget_class->size_allocate = gtk_tree_view_size_allocate;
widget_class->motion_notify_event = gtk_tree_view_motion;
- widget_class->draw = gtk_tree_view_draw;
+ widget_class->snapshot = gtk_tree_view_snapshot;
widget_class->key_press_event = gtk_tree_view_key_press;
widget_class->key_release_event = gtk_tree_view_key_release;
widget_class->enter_notify_event = gtk_tree_view_enter_notify;
@@ -4647,22 +4647,21 @@ invalidate_empty_focus (GtkTreeView *tree_view)
* used when the tree is empty.
*/
static void
-draw_empty (GtkTreeView *tree_view,
- cairo_t *cr)
+snapshot_empty (GtkTreeView *tree_view,
+ GtkSnapshot *snapshot)
{
GtkWidget *widget = GTK_WIDGET (tree_view);
GtkStyleContext *context;
- gint width, height;
context = gtk_widget_get_style_context (widget);
- width = gdk_window_get_width (tree_view->priv->bin_window);
- height = gdk_window_get_height (tree_view->priv->bin_window);
-
- gtk_render_background (context, cr, 0, 0, width, height);
-
if (gtk_widget_has_visible_focus (widget))
- gtk_render_focus (context, cr, 0, 0, width, height);
+ {
+ gtk_snapshot_render_focus (snapshot, context,
+ 0, 0,
+ gdk_window_get_width (tree_view->priv->bin_window),
+ gdk_window_get_height (tree_view->priv->bin_window));
+ }
}
typedef enum {
@@ -4781,9 +4780,9 @@ gtk_tree_view_draw_grid_lines (GtkTreeView *tree_view,
* KEEP IN SYNC WITH gtk_tree_view_create_row_drag_icon()!
* FIXME: It’s not...
*/
-static gboolean
-gtk_tree_view_bin_draw (GtkWidget *widget,
- cairo_t *cr)
+static void
+gtk_tree_view_bin_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
{
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
GtkTreePath *path;
@@ -4812,24 +4811,20 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
gboolean draw_vgrid_lines, draw_hgrid_lines;
GtkStyleContext *context;
gboolean parity;
+ cairo_t *cr;
rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
context = gtk_widget_get_style_context (widget);
if (tree_view->priv->tree == NULL)
{
- draw_empty (tree_view, cr);
- return TRUE;
+ snapshot_empty (tree_view, snapshot);
+ return;
}
bin_window_width = gdk_window_get_width (tree_view->priv->bin_window);
bin_window_height = gdk_window_get_height (tree_view->priv->bin_window);
- cairo_rectangle (cr, 0, 0, bin_window_width, bin_window_height);
- cairo_clip (cr);
-
- if (!gdk_cairo_get_clip_rectangle (cr, &clip))
- return TRUE;
-
+ clip = (GdkRectangle) { 0, 0, bin_window_width, bin_window_height };
new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, clip.y);
y_offset = -_gtk_rbtree_find_offset (tree_view->priv->tree, new_y, &tree, &node);
@@ -4838,16 +4833,24 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
gtk_style_context_save (context);
gtk_style_context_add_class (context, GTK_STYLE_CLASS_CELL);
- gtk_render_background (context, cr,
- 0, gtk_tree_view_get_height (tree_view),
- bin_window_width,
- bin_window_height - gtk_tree_view_get_height (tree_view));
+ gtk_snapshot_render_background (snapshot, context,
+ 0, gtk_tree_view_get_height (tree_view),
+ bin_window_width,
+ bin_window_height - gtk_tree_view_get_height (tree_view));
gtk_style_context_restore (context);
}
if (node == NULL)
- return TRUE;
+ return;
+
+ cr = gtk_snapshot_append_cairo_node (snapshot,
+ &GRAPHENE_RECT_INIT (
+ 0, 0,
+ gdk_window_get_width (tree_view->priv->bin_window),
+ gdk_window_get_height (tree_view->priv->bin_window)
+ ),
+ "FallbackTreeViewContents");
/* find the path for the node */
path = _gtk_tree_path_new_from_rbtree (tree, node);
@@ -5304,7 +5307,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
depth++;
/* Sanity Check! */
- TREE_VIEW_INTERNAL_ASSERT (has_child, FALSE);
+ TREE_VIEW_INTERNAL_ASSERT_VOID (has_child);
}
else
{
@@ -5319,7 +5322,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
done = TRUE;
/* Sanity Check! */
- TREE_VIEW_INTERNAL_ASSERT (has_next, FALSE);
+ TREE_VIEW_INTERNAL_ASSERT_VOID (has_next);
}
else
{
@@ -5337,7 +5340,7 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
depth--;
/* Sanity check */
- TREE_VIEW_INTERNAL_ASSERT (has_parent, FALSE);
+ TREE_VIEW_INTERNAL_ASSERT_VOID (has_parent);
}
}
while (!done);
@@ -5353,32 +5356,43 @@ done:
if (drag_dest_path)
gtk_tree_path_free (drag_dest_path);
-
- return FALSE;
+
+ cairo_destroy (cr);
}
-static gboolean
-gtk_tree_view_draw (GtkWidget *widget,
- cairo_t *cr)
+static void
+gtk_tree_view_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
{
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
GtkWidget *button;
GtkStyleContext *context;
GList *list;
+ gint width, height;
context = gtk_widget_get_style_context (widget);
-
- gtk_render_background (context, cr,
- 0, 0,
- gtk_widget_get_allocated_width (widget),
- gtk_widget_get_allocated_height (widget));
-
- cairo_save (cr);
-
- gtk_cairo_transform_to_window (cr, widget, tree_view->priv->bin_window);
- gtk_tree_view_bin_draw (widget, cr);
-
- cairo_restore (cr);
+ width = gtk_widget_get_allocated_width (widget);
+ height = gtk_widget_get_allocated_height (widget);
+
+ gtk_snapshot_render_background (snapshot, context,
+ 0, 0,
+ width, height);
+
+ gtk_snapshot_push_clip (snapshot,
+ &GRAPHENE_RECT_INIT(
+ 0, gtk_tree_view_get_effective_header_height (tree_view),
+ width,
+ height - gtk_tree_view_get_effective_header_height (tree_view)
+ ),
+ "TreeViewContentClip");
+
+ gtk_snapshot_translate_2d (snapshot,
+ - (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
+ gtk_tree_view_get_effective_header_height (tree_view));
+ gtk_tree_view_bin_snapshot (widget, snapshot);
+ gtk_snapshot_translate_2d (snapshot,
+ (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
+ - gtk_tree_view_get_effective_header_height (tree_view));
/* We can't just chain up to Container::draw as it will try to send the
* event to the headers, so we handle propagating it to our children
@@ -5388,9 +5402,13 @@ gtk_tree_view_draw (GtkWidget *widget,
{
GtkTreeViewChild *child = list->data;
- gtk_container_propagate_draw (GTK_CONTAINER (tree_view), child->widget, cr);
+ gtk_container_snapshot_child (GTK_CONTAINER (tree_view), child->widget, snapshot);
}
+
+ gtk_snapshot_pop_and_append (snapshot);
+#if 0
+ Thyis clearly does not work. priv->drag_highlight_window is potentially a toplevel...
if (tree_view->priv->drag_highlight_window)
{
GdkRGBA color;
@@ -5416,6 +5434,15 @@ gtk_tree_view_draw (GtkWidget *widget,
}
cairo_restore (cr);
}
+#endif
+
+ gtk_snapshot_push_clip (snapshot,
+ &GRAPHENE_RECT_INIT(
+ 0, 0,
+ width,
+ gtk_tree_view_get_effective_header_height (tree_view)
+ ),
+ "TreeViewHeaderClip");
gtk_style_context_save (context);
gtk_style_context_remove_class (context, GTK_STYLE_CLASS_VIEW);
@@ -5430,21 +5457,21 @@ gtk_tree_view_draw (GtkWidget *widget,
if (gtk_tree_view_column_get_visible (column))
{
button = gtk_tree_view_column_get_button (column);
- gtk_container_propagate_draw (GTK_CONTAINER (tree_view),
- button, cr);
+ gtk_container_snapshot_child (GTK_CONTAINER (tree_view),
+ button, snapshot);
}
}
if (tree_view->priv->drag_window)
{
button = gtk_tree_view_column_get_button (tree_view->priv->drag_column);
- gtk_container_propagate_draw (GTK_CONTAINER (tree_view),
- button, cr);
+ gtk_container_snapshot_child (GTK_CONTAINER (tree_view),
+ button, snapshot);
}
gtk_style_context_restore (context);
- return FALSE;
+ gtk_snapshot_pop_and_append (snapshot);
}
enum
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]