[libchamplain] Redraw using cairo on idle



commit 6dc2c4338f3e386472af104f833c3c3e19f0cd8f
Author: Jiří Techet <techet gmail com>
Date:   Tue May 7 21:51:22 2013 +0200

    Redraw using cairo on idle

 champlain/champlain-path-layer.c |   43 ++++++++++++++++++++++++++-----------
 champlain/champlain-scale.c      |   34 ++++++++++++++++++++++++++---
 2 files changed, 60 insertions(+), 17 deletions(-)
---
diff --git a/champlain/champlain-path-layer.c b/champlain/champlain-path-layer.c
index c7f8333..409b7e6 100644
--- a/champlain/champlain-path-layer.c
+++ b/champlain/champlain-path-layer.c
@@ -86,6 +86,7 @@ struct _ChamplainPathLayerPrivate
   ClutterContent *canvas;
   ClutterActor *path_actor;
   GList *nodes;
+  gboolean redraw_scheduled;
 };
 
 
@@ -372,6 +373,7 @@ champlain_path_layer_init (ChamplainPathLayer *self)
   priv->nodes = NULL;
   priv->dash = NULL;
   priv->num_dashes = 0;
+  priv->redraw_scheduled = FALSE;
 
   priv->fill_color = clutter_color_copy (&DEFAULT_FILL_COLOR);
   priv->stroke_color = clutter_color_copy (&DEFAULT_STROKE_COLOR);
@@ -417,6 +419,21 @@ invalidate_canvas (ChamplainPathLayer *layer)
   clutter_canvas_set_size (CLUTTER_CANVAS (priv->canvas), width, height);
   clutter_actor_set_size (priv->path_actor, width, height);
   clutter_content_invalidate (priv->canvas);
+  priv->redraw_scheduled = FALSE;
+}
+
+
+static void
+schedule_redraw (ChamplainPathLayer *layer)
+{
+  if (!layer->priv->redraw_scheduled)
+    {
+      layer->priv->redraw_scheduled = TRUE;
+      g_idle_add_full (CLUTTER_PRIORITY_REDRAW,
+          (GSourceFunc) invalidate_canvas,
+          g_object_ref (layer),
+          (GDestroyNotify) g_object_unref);
+    }
 }
 
 
@@ -425,7 +442,7 @@ position_notify (ChamplainLocation *location,
     G_GNUC_UNUSED GParamSpec *pspec,
     ChamplainPathLayer *layer)
 {
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -446,7 +463,7 @@ add_node (ChamplainPathLayer *layer,
     priv->nodes = g_list_prepend (priv->nodes, location);
   else
     priv->nodes = g_list_insert (priv->nodes, location, position);
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -499,7 +516,7 @@ champlain_path_layer_remove_all (ChamplainPathLayer *layer)
 
   g_list_free (priv->nodes);
   priv->nodes = NULL;
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -547,7 +564,7 @@ champlain_path_layer_remove_node (ChamplainPathLayer *layer,
 
   priv->nodes = g_list_remove (priv->nodes, location);
   g_object_unref (location);
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -579,7 +596,7 @@ relocate_cb (G_GNUC_UNUSED GObject *gobject,
 {
   g_return_if_fail (CHAMPLAIN_IS_PATH_LAYER (layer));
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -656,7 +673,7 @@ redraw_path_cb (G_GNUC_UNUSED GObject *gobject,
     G_GNUC_UNUSED GParamSpec *arg1,
     ChamplainPathLayer *layer)
 {
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -694,7 +711,7 @@ set_view (ChamplainLayer *layer,
       g_signal_connect (view, "notify::zoom-level",
           G_CALLBACK (redraw_path_cb), layer);
 
-      invalidate_canvas (path_layer);
+      schedule_redraw (path_layer);
     }
 }
 
@@ -762,7 +779,7 @@ champlain_path_layer_set_fill_color (ChamplainPathLayer *layer,
   priv->fill_color = clutter_color_copy (color);
   g_object_notify (G_OBJECT (layer), "fill-color");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -812,7 +829,7 @@ champlain_path_layer_set_stroke_color (ChamplainPathLayer *layer,
   priv->stroke_color = clutter_color_copy (color);
   g_object_notify (G_OBJECT (layer), "stroke-color");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -853,7 +870,7 @@ champlain_path_layer_set_stroke (ChamplainPathLayer *layer,
   layer->priv->stroke = value;
   g_object_notify (G_OBJECT (layer), "stroke");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -894,7 +911,7 @@ champlain_path_layer_set_fill (ChamplainPathLayer *layer,
   layer->priv->fill = value;
   g_object_notify (G_OBJECT (layer), "fill");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -935,7 +952,7 @@ champlain_path_layer_set_stroke_width (ChamplainPathLayer *layer,
   layer->priv->stroke_width = value;
   g_object_notify (G_OBJECT (layer), "stroke-width");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
@@ -1019,7 +1036,7 @@ champlain_path_layer_set_closed (ChamplainPathLayer *layer,
   layer->priv->closed_path = value;
   g_object_notify (G_OBJECT (layer), "closed");
 
-  invalidate_canvas (layer);
+  schedule_redraw (layer);
 }
 
 
diff --git a/champlain/champlain-scale.c b/champlain/champlain-scale.c
index b72a337..b363ba3 100644
--- a/champlain/champlain-scale.c
+++ b/champlain/champlain-scale.c
@@ -63,6 +63,7 @@ struct _ChamplainScalePrivate
   ClutterContent *canvas;
 
   ChamplainView *view;
+  gboolean redraw_scheduled;
 };
 
 G_DEFINE_TYPE (ChamplainScale, champlain_scale, CLUTTER_TYPE_ACTOR);
@@ -337,6 +338,30 @@ redraw_scale (ClutterCanvas *canvas,
 
 
 static void
+invalidate_canvas (ChamplainScale *layer)
+{
+  ChamplainScalePrivate *priv = layer->priv;
+
+  clutter_content_invalidate (priv->canvas);
+  priv->redraw_scheduled = FALSE;
+}
+
+
+static void
+schedule_redraw (ChamplainScale *layer)
+{
+  if (!layer->priv->redraw_scheduled)
+    {
+      layer->priv->redraw_scheduled = TRUE;
+      g_idle_add_full (CLUTTER_PRIORITY_REDRAW,
+          (GSourceFunc) invalidate_canvas,
+          g_object_ref (layer),
+          (GDestroyNotify) g_object_unref);
+    }
+}
+
+
+static void
 create_scale (ChamplainScale *scale)
 {
   ClutterActor *text, *scale_actor;
@@ -372,7 +397,7 @@ create_scale (ChamplainScale *scale)
 
   clutter_actor_set_opacity (CLUTTER_ACTOR (scale), 200);
 
-  clutter_content_invalidate (priv->canvas);
+  schedule_redraw (scale);
 }
 
 
@@ -386,6 +411,7 @@ champlain_scale_init (ChamplainScale *scale)
   priv->scale_unit = CHAMPLAIN_UNIT_KM;
   priv->max_scale_width = 100;
   priv->view = NULL;
+  priv->redraw_scheduled = FALSE;
 
   create_scale (scale);
 }
@@ -445,7 +471,7 @@ champlain_scale_set_unit (ChamplainScale *scale,
 
   scale->priv->scale_unit = unit;
   g_object_notify (G_OBJECT (scale), "unit");
-  clutter_content_invalidate (scale->priv->canvas);
+  schedule_redraw (scale);
 }
 
 
@@ -492,7 +518,7 @@ redraw_scale_cb (G_GNUC_UNUSED GObject *gobject,
     G_GNUC_UNUSED GParamSpec *arg1,
     ChamplainScale *scale)
 {
-  clutter_content_invalidate (scale->priv->canvas);
+  schedule_redraw (scale);
 }
 
 
@@ -515,7 +541,7 @@ champlain_scale_connect_view (ChamplainScale *scale,
   scale->priv->view = g_object_ref (view);
   g_signal_connect (view, "notify::latitude",
       G_CALLBACK (redraw_scale_cb), scale);
-  clutter_content_invalidate (scale->priv->canvas);
+  schedule_redraw (scale);
 }
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]