[gtk+] ruler: Change the way the ruler handles exposes
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] ruler: Change the way the ruler handles exposes
- Date: Sun, 26 Sep 2010 13:32:15 +0000 (UTC)
commit 892593eff40b09d0511286cb0222368f953197b1
Author: Benjamin Otte <otte redhat com>
Date: Thu Sep 2 14:57:16 2010 +0200
ruler: Change the way the ruler handles exposes
1) Don't directly draw in motion-notify, instead call
gtk_widget_queue_draw()
2) Don't draw ticks in expose events anymore, only when they were
changed
gtk/gtkruler.c | 36 ++++++++++++++++++++++++++----------
1 files changed, 26 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkruler.c b/gtk/gtkruler.c
index 3437327..036ed1a 100644
--- a/gtk/gtkruler.c
+++ b/gtk/gtkruler.c
@@ -304,6 +304,26 @@ gtk_ruler_new (GtkOrientation orientation)
NULL);
}
+/**
+ * gtk_ruler_invalidate_ticks:
+ * @ruler: the ruler to invalidate
+ *
+ * For performance reasons, #GtkRuler keeps a backbuffer containing the
+ * prerendered contents of the ticks. To cause a repaint this buffer,
+ * call this function instead of gtk_widget_queue_draw().
+ **/
+static void
+gtk_ruler_invalidate_ticks (GtkRuler *ruler)
+{
+ g_return_if_fail (GTK_IS_RULER (ruler));
+
+ if (ruler->priv->backing_store == NULL)
+ return;
+
+ gtk_ruler_draw_ticks (ruler);
+ gtk_widget_queue_draw (GTK_WIDGET (ruler));
+}
+
void
gtk_ruler_set_metric (GtkRuler *ruler,
GtkMetricType metric)
@@ -316,10 +336,9 @@ gtk_ruler_set_metric (GtkRuler *ruler,
priv->metric = (GtkRulerMetric *) &ruler_metrics[metric];
- if (gtk_widget_is_drawable (GTK_WIDGET (ruler)))
- gtk_widget_queue_draw (GTK_WIDGET (ruler));
-
g_object_notify (G_OBJECT (ruler), "metric");
+
+ gtk_ruler_invalidate_ticks (ruler);
}
/**
@@ -396,8 +415,7 @@ gtk_ruler_set_range (GtkRuler *ruler,
}
g_object_thaw_notify (G_OBJECT (ruler));
- if (gtk_widget_is_drawable (GTK_WIDGET (ruler)))
- gtk_widget_queue_draw (GTK_WIDGET (ruler));
+ gtk_ruler_invalidate_ticks (ruler);
}
/**
@@ -589,9 +607,7 @@ gtk_ruler_motion_notify (GtkWidget *widget,
g_object_notify (G_OBJECT (ruler), "position");
- /* Make sure the ruler has been allocated already */
- if (priv->backing_store != NULL)
- gtk_ruler_draw_pos (ruler);
+ gtk_widget_queue_draw (widget);
return FALSE;
}
@@ -606,8 +622,6 @@ gtk_ruler_expose (GtkWidget *widget,
GtkRulerPrivate *priv = ruler->priv;
cairo_t *cr;
- gtk_ruler_draw_ticks (ruler);
-
cr = gdk_cairo_create (gtk_widget_get_window (widget));
cairo_set_source_surface (cr, priv->backing_store, 0, 0);
gdk_cairo_region (cr, event->region);
@@ -641,6 +655,8 @@ gtk_ruler_make_pixmap (GtkRuler *ruler)
priv->xsrc = 0;
priv->ysrc = 0;
+
+ gtk_ruler_draw_ticks (ruler);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]