diff options
author | Jiří Techet <techet@gmail.com> | 2013-05-07 21:51:22 +0200 |
---|---|---|
committer | Jiří Techet <techet@gmail.com> | 2013-05-07 21:51:22 +0200 |
commit | 6dc2c4338f3e386472af104f833c3c3e19f0cd8f (patch) | |
tree | 4383e3db0b831ce6bf7180ac30674dd3186d6f84 | |
parent | 7325b3d91cc8104dc49adf5dd4689a57236a4ccf (diff) | |
download | libchamplain-6dc2c4338f3e386472af104f833c3c3e19f0cd8f.tar.gz |
Redraw using cairo on idle
-rw-r--r-- | champlain/champlain-path-layer.c | 43 | ||||
-rw-r--r-- | 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); } |