summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtktreeview.c155
1 files changed, 28 insertions, 127 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 3ba7a63594..d673356fe2 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -54,7 +54,6 @@
#include "gtkmain.h"
#include "gtksettingsprivate.h"
#include "gtkwidgetpath.h"
-#include "gtkpixelcacheprivate.h"
#include "a11y/gtktreeviewaccessibleprivate.h"
@@ -310,8 +309,6 @@ struct _GtkTreeViewPrivate
GdkWindow *bin_window;
GdkWindow *header_window;
- GtkPixelCache *pixel_cache;
-
/* CSS nodes */
GtkCssNode *header_node;
@@ -495,8 +492,6 @@ struct _GtkTreeViewPrivate
guint hover_expand : 1;
guint imcontext_changed : 1;
- guint in_scroll : 1;
-
guint rubber_banding_enable : 1;
guint in_grab : 1;
@@ -589,7 +584,6 @@ static void gtk_tree_view_destroy (GtkWidget *widget);
static void gtk_tree_view_realize (GtkWidget *widget);
static void gtk_tree_view_unrealize (GtkWidget *widget);
static void gtk_tree_view_map (GtkWidget *widget);
-static void gtk_tree_view_unmap (GtkWidget *widget);
static void gtk_tree_view_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural);
@@ -788,9 +782,6 @@ static void gtk_tree_view_stop_rubber_band (GtkTreeView
static void update_prelight (GtkTreeView *tree_view,
int x,
int y);
-static void gtk_tree_view_queue_draw_region (GtkWidget *widget,
- const cairo_region_t *region);
-
static inline gint gtk_tree_view_get_effective_header_height (GtkTreeView *tree_view);
static inline gint gtk_tree_view_get_cell_area_y_offset (GtkTreeView *tree_view,
@@ -981,7 +972,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
/* GtkWidget signals */
widget_class->destroy = gtk_tree_view_destroy;
widget_class->map = gtk_tree_view_map;
- widget_class->unmap = gtk_tree_view_unmap;
widget_class->realize = gtk_tree_view_realize;
widget_class->unrealize = gtk_tree_view_unrealize;
widget_class->get_preferred_width = gtk_tree_view_get_preferred_width;
@@ -1005,7 +995,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
widget_class->focus = gtk_tree_view_focus;
widget_class->grab_focus = gtk_tree_view_grab_focus;
widget_class->style_updated = gtk_tree_view_style_updated;
- widget_class->queue_draw_region = gtk_tree_view_queue_draw_region;
/* GtkContainer signals */
container_class->remove = gtk_tree_view_remove;
@@ -1792,8 +1781,6 @@ gtk_tree_view_init (GtkTreeView *tree_view)
priv->headers_visible = TRUE;
priv->activate_on_single_click = FALSE;
- priv->pixel_cache = _gtk_pixel_cache_new ();
-
/* We need some padding */
priv->dy = 0;
priv->cursor_offset = 0;
@@ -2275,10 +2262,6 @@ gtk_tree_view_destroy (GtkWidget *widget)
tree_view->priv->vadjustment = NULL;
}
- if (tree_view->priv->pixel_cache)
- _gtk_pixel_cache_free (tree_view->priv->pixel_cache);
- tree_view->priv->pixel_cache = NULL;
-
g_clear_object (&tree_view->priv->multipress_gesture);
g_clear_object (&tree_view->priv->drag_gesture);
g_clear_object (&tree_view->priv->column_multipress_gesture);
@@ -2338,8 +2321,6 @@ gtk_tree_view_map (GtkWidget *widget)
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
GList *tmp_list;
- _gtk_pixel_cache_map (tree_view->priv->pixel_cache);
-
gtk_widget_set_mapped (widget, TRUE);
tmp_list = tree_view->priv->children;
@@ -2362,57 +2343,6 @@ gtk_tree_view_map (GtkWidget *widget)
}
static void
-gtk_tree_view_unmap (GtkWidget *widget)
-{
- GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
-
- GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unmap (widget);
-
- _gtk_pixel_cache_unmap (tree_view->priv->pixel_cache);
-}
-
-static void
-gtk_tree_view_bin_window_invalidate_handler (GdkWindow *window,
- cairo_region_t *region)
-{
- gpointer widget;
- GtkTreeView *tree_view;
- int y;
-
- gdk_window_get_user_data (window, &widget);
- tree_view = GTK_TREE_VIEW (widget);
-
- /* Scrolling will invalidate everything in the bin window,
- but we already have it in the cache, so we can ignore that */
- if (tree_view->priv->in_scroll)
- return;
-
- y = gtk_adjustment_get_value (tree_view->priv->vadjustment);
- cairo_region_translate (region,
- 0, y);
- _gtk_pixel_cache_invalidate (tree_view->priv->pixel_cache, region);
- cairo_region_translate (region,
- 0, -y);
-}
-
-static void
-gtk_tree_view_queue_draw_region (GtkWidget *widget,
- const cairo_region_t *region)
-{
- GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
-
- /* There is no way we can know if a region targets the
- not-currently-visible but in pixel cache region, so we
- always just invalidate the whole thing whenever the
- tree view gets a queue draw. This doesn't normally happen
- in normal scrolling cases anyway. */
- _gtk_pixel_cache_invalidate (tree_view->priv->pixel_cache, NULL);
-
- GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->queue_draw_region (widget,
- region);
-}
-
-static void
gtk_tree_view_realize (GtkWidget *widget)
{
GtkAllocation allocation;
@@ -2462,8 +2392,6 @@ gtk_tree_view_realize (GtkWidget *widget)
tree_view->priv->bin_window = gdk_window_new (window,
&attributes, attributes_mask);
gtk_widget_register_window (widget, tree_view->priv->bin_window);
- gdk_window_set_invalidate_handler (tree_view->priv->bin_window,
- gtk_tree_view_bin_window_invalidate_handler);
gtk_widget_get_allocation (widget, &allocation);
@@ -5055,6 +4983,8 @@ gtk_tree_view_bin_draw (GtkWidget *widget,
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;
@@ -5591,35 +5521,6 @@ done:
return FALSE;
}
-static void
-draw_bin (cairo_t *cr,
- gpointer user_data)
-{
- GtkWidget *widget = GTK_WIDGET (user_data);
- GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
- GList *tmp_list;
-
- 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);
-
- /* 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
- * (eg. widgets being edited) ourselves.
- */
- tmp_list = tree_view->priv->children;
- while (tmp_list)
- {
- GtkTreeViewChild *child = tmp_list->data;
- tmp_list = tmp_list->next;
-
- gtk_container_propagate_draw (GTK_CONTAINER (tree_view), child->widget, cr);
- }
-}
-
static gboolean
gtk_tree_view_draw (GtkWidget *widget,
cairo_t *cr)
@@ -5632,22 +5533,27 @@ gtk_tree_view_draw (GtkWidget *widget,
if (gtk_cairo_should_draw_window (cr, tree_view->priv->bin_window))
{
- cairo_rectangle_int_t view_rect;
- cairo_rectangle_int_t canvas_rect;
+ GList *tmp_list;
+
+ 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);
+
- view_rect.x = 0;
- view_rect.y = gtk_tree_view_get_effective_header_height (tree_view);
- view_rect.width = gtk_widget_get_allocated_width (widget);
- view_rect.height = gtk_widget_get_allocated_height (widget) - view_rect.y;
+ /* We can't just chain up to Container::draw asit will try to send the
+ * event to the headers, so we handle propagating it to our children
+ * (e.g. widgets being edited) ourselves.
+ */
+ tmp_list = tree_view->priv->children;
+ while (tmp_list)
+ {
+ GtkTreeViewChild *child = tmp_list->data;
+ tmp_list = tmp_list->next;
- gdk_window_get_position (tree_view->priv->bin_window, &canvas_rect.x, &canvas_rect.y);
- canvas_rect.y = -gtk_adjustment_get_value (tree_view->priv->vadjustment);
- canvas_rect.width = gdk_window_get_width (tree_view->priv->bin_window);
- canvas_rect.height = gtk_tree_view_get_height (tree_view);
+ gtk_container_propagate_draw (GTK_CONTAINER (tree_view), child->widget, cr);
+ }
- _gtk_pixel_cache_draw (tree_view->priv->pixel_cache, cr, tree_view->priv->bin_window,
- &view_rect, &canvas_rect,
- draw_bin, widget);
}
else if (tree_view->priv->drag_highlight_window &&
gtk_cairo_should_draw_window (cr, tree_view->priv->drag_highlight_window))
@@ -6247,17 +6153,17 @@ gtk_tree_view_node_queue_redraw (GtkTreeView *tree_view,
GtkRBTree *tree,
GtkRBNode *node)
{
- GdkRectangle rect;
+ GtkAllocation allocation;
+ int y;
- rect.x = 0;
- rect.y =
- _gtk_rbtree_node_find_offset (tree, node)
+ y = _gtk_rbtree_node_find_offset (tree, node)
- gtk_adjustment_get_value (tree_view->priv->vadjustment);
- rect.width = gtk_widget_get_allocated_width (GTK_WIDGET (tree_view));
- rect.height = GTK_RBNODE_GET_HEIGHT (node);
- gdk_window_invalidate_rect (tree_view->priv->bin_window,
- &rect, TRUE);
+ gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
+ gtk_widget_queue_draw_area (GTK_WIDGET (tree_view),
+ 0, y,
+ allocation.width,
+ GTK_RBNODE_GET_HEIGHT (node));
}
static gboolean
@@ -11361,9 +11267,7 @@ gtk_tree_view_adjustment_changed (GtkAdjustment *adjustment,
- gtk_adjustment_get_value (tree_view->priv->hadjustment),
0);
dy = tree_view->priv->dy - (int) gtk_adjustment_get_value (tree_view->priv->vadjustment);
- tree_view->priv->in_scroll = TRUE;
gdk_window_scroll (tree_view->priv->bin_window, 0, dy);
- tree_view->priv->in_scroll = FALSE;
if (dy != 0)
{
@@ -11582,9 +11486,6 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
if (tree_view->priv->selection)
_gtk_tree_selection_emit_changed (tree_view->priv->selection);
- if (tree_view->priv->pixel_cache != NULL)
- _gtk_pixel_cache_set_always_cache (tree_view->priv->pixel_cache, (model != NULL));
-
if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
}