diff options
author | Alexander Larsson <alexl@redhat.com> | 2013-05-02 11:08:10 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2013-05-02 19:03:12 +0200 |
commit | fe6aa38522d97024fe54f3562d4c87e6f8030180 (patch) | |
tree | 7ae125bb4623cf8bb8b963605e755c2b8548bf0a | |
parent | b2e7ebf6b9b893b35f9f0eb81abfd14999cd3c36 (diff) | |
download | gtk+-fe6aa38522d97024fe54f3562d4c87e6f8030180.tar.gz |
GtkWidget: Add a vfunc for queue_draw_region
Since widgets now cache drawn state we allow them to override
queue_draw_region to detect when some region of the widget
should be redrawn. For instance, if a widget draws the
background color in a pixel cache we will need to invalidate
that when the style context changes which queues a repaint.
-rw-r--r-- | gtk/gtkwidget.c | 14 | ||||
-rw-r--r-- | gtk/gtkwidget.h | 3 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 5a84fa540a..2d43ee906a 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -751,6 +751,8 @@ static void gtk_widget_real_get_width_for_height (GtkWidget gint *natural_width); static void gtk_widget_real_state_flags_changed (GtkWidget *widget, GtkStateFlags old_state); +static void gtk_widget_real_queue_draw_region (GtkWidget *widget, + const cairo_region_t *region); static const GtkWidgetAuxInfo* _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget); static GtkWidgetAuxInfo* gtk_widget_get_aux_info (GtkWidget *widget, gboolean create); @@ -1078,6 +1080,7 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->adjust_baseline_request = gtk_widget_real_adjust_baseline_request; klass->adjust_size_allocation = gtk_widget_real_adjust_size_allocation; klass->adjust_baseline_allocation = gtk_widget_real_adjust_baseline_allocation; + klass->queue_draw_region = gtk_widget_real_queue_draw_region; g_object_class_install_property (gobject_class, PROP_NAME, @@ -4961,6 +4964,15 @@ gtk_widget_unrealize (GtkWidget *widget) * Draw queueing. *****************************************/ +static void +gtk_widget_real_queue_draw_region (GtkWidget *widget, + const cairo_region_t *region) +{ + GtkWidgetPrivate *priv = widget->priv; + + gdk_window_invalidate_region (priv->window, region, TRUE); +} + /** * gtk_widget_queue_draw_region: * @widget: a #GtkWidget @@ -4998,7 +5010,7 @@ gtk_widget_queue_draw_region (GtkWidget *widget, if (!gtk_widget_get_mapped (w)) return; - gdk_window_invalidate_region (priv->window, region, TRUE); + WIDGET_CLASS (widget)->queue_draw_region (widget, region); } /** diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 58bcea6355..c3ebe1c7f7 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -444,13 +444,14 @@ struct _GtkWidgetClass gint *natural_baseline); void (* adjust_baseline_allocation) (GtkWidget *widget, gint *baseline); + void (*queue_draw_region) (GtkWidget *widget, + const cairo_region_t *region); /*< private >*/ GtkWidgetClassPrivate *priv; /* Padding for future expansion */ - void (*_gtk_reserved5) (void); void (*_gtk_reserved6) (void); void (*_gtk_reserved7) (void); }; |