[libchamplain] Finally fix our redrawing problem



commit 8e09b18011251173d7123e9138d3ddd4b56ccd79
Author: JiÅ?í Techet <techet gmail com>
Date:   Fri Feb 25 22:49:16 2011 +0100

    Finally fix our redrawing problem
    
    This one fixes our hard-to-find redrawing problem. What happened:
    in the paint method of the viewport the coordinates were transformed
    only for painting but clutter clips the images based on real coordinates
    of the actors. Therefore clutter eliminated all the actors because it
    thought they weren't displayed.
    
    Instead of using low level cogl operations, use standard clutter actor
    positioning to move the viewport - this fixes the problem completely.

 champlain/champlain-finger-scroll.c |    1 -
 champlain/champlain-view.c          |    2 +-
 champlain/champlain-viewport.c      |  122 +++++++++++++++++++++++++++++-----
 champlain/champlain-viewport.h      |    6 +-
 4 files changed, 109 insertions(+), 22 deletions(-)
---
diff --git a/champlain/champlain-finger-scroll.c b/champlain/champlain-finger-scroll.c
index 3dc3870..ce7c6ee 100644
--- a/champlain/champlain-finger-scroll.c
+++ b/champlain/champlain-finger-scroll.c
@@ -863,7 +863,6 @@ captured_event_cb (ClutterActor     *actor,
 static void
 champlain_finger_scroll_init (ChamplainFingerScroll *self)
 {
-  ClutterActor *scrollbar;
   ChamplainFingerScrollPrivate *priv = self->priv = FINGER_SCROLL_PRIVATE (self);
 
   priv->motion_buffer = g_array_sized_new (FALSE, TRUE,
diff --git a/champlain/champlain-view.c b/champlain/champlain-view.c
index a8b2c8b..e8b956a 100644
--- a/champlain/champlain-view.c
+++ b/champlain/champlain-view.c
@@ -1019,7 +1019,7 @@ champlain_view_init (ChamplainView *view)
 
   /* Setup viewport */
   priv->viewport = g_object_ref (champlain_viewport_new ());
-  clutter_container_add_actor (CLUTTER_CONTAINER (priv->viewport), priv->viewport_container);
+  champlain_viewport_set_child (CHAMPLAIN_VIEWPORT (priv->viewport), priv->viewport_container);
   
   g_object_set (G_OBJECT (priv->viewport), "sync-adjustments", FALSE, NULL);
 
diff --git a/champlain/champlain-viewport.c b/champlain/champlain-viewport.c
index ee0c10f..43abd0d 100644
--- a/champlain/champlain-viewport.c
+++ b/champlain/champlain-viewport.c
@@ -30,9 +30,9 @@
 #include "champlain-private.h"
 
 
-G_DEFINE_TYPE (ChamplainViewport, champlain_viewport, CLUTTER_TYPE_GROUP)
+G_DEFINE_TYPE (ChamplainViewport, champlain_viewport, CLUTTER_TYPE_ACTOR)
 
-#define VIEWPORT_PRIVATE(o) \
+#define GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHAMPLAIN_TYPE_VIEWPORT, \
   ChamplainViewportPrivate))
 
@@ -45,6 +45,8 @@ struct _ChamplainViewportPrivate
   ChamplainAdjustment *vadjustment;
 
   gboolean sync_adjustments;
+  ClutterActor *child;
+  ClutterActor *content_group;
 };
 
 enum
@@ -174,34 +176,86 @@ champlain_viewport_dispose (GObject *gobject)
   G_OBJECT_CLASS (champlain_viewport_parent_class)->dispose (gobject);
 }
 
+
 static void
-champlain_viewport_paint (ClutterActor *self)
+paint (ClutterActor *self)
 {
-  ChamplainViewportPrivate *priv = CHAMPLAIN_VIEWPORT (self)->priv;
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
+  
+  clutter_actor_paint (priv->content_group);
+}
+
+
+static void
+pick (ClutterActor *self, 
+    const ClutterColor *color)
+{
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
+
+  CLUTTER_ACTOR_CLASS (champlain_viewport_parent_class)->pick (self, color);
+
+  clutter_actor_paint (CLUTTER_ACTOR (priv->content_group));
+}
+
+
+static void
+get_preferred_width (ClutterActor *self,
+    gfloat for_height,
+    gfloat *min_width_p,
+    gfloat *natural_width_p)
+{
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
+
+  clutter_actor_get_preferred_width (CLUTTER_ACTOR (priv->content_group),
+      for_height,
+      min_width_p,
+      natural_width_p);
+}
+
+
+static void
+get_preferred_height (ClutterActor *self,
+    gfloat for_width,
+    gfloat *min_height_p,
+    gfloat *natural_height_p)
+{
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
 
-  cogl_push_matrix ();
+  clutter_actor_get_preferred_height (CLUTTER_ACTOR (priv->content_group),
+      for_width,
+      min_height_p,
+      natural_height_p);
+}
 
-  cogl_translate ((priv->x) * -1.0,
-                  (priv->y) * -1.0,
-                  0.0);
 
-  CLUTTER_ACTOR_CLASS (champlain_viewport_parent_class)->paint (self);
+static void
+map (ClutterActor *self)
+{
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
 
-  cogl_pop_matrix ();
+  CLUTTER_ACTOR_CLASS (champlain_viewport_parent_class)->map (self);
+
+  clutter_actor_map (CLUTTER_ACTOR (priv->content_group));
 }
 
+
 static void
-champlain_viewport_pick (ClutterActor       *self,
-                    const ClutterColor *color)
+unmap (ClutterActor *self)
 {
-  champlain_viewport_paint (self);
+  ChamplainViewportPrivate *priv = GET_PRIVATE (self);
+
+  CLUTTER_ACTOR_CLASS (champlain_viewport_parent_class)->unmap (self);
+
+  clutter_actor_unmap (CLUTTER_ACTOR (priv->content_group));
 }
 
+
 static void
-champlain_viewport_allocate (ClutterActor          *self,
+allocate (ClutterActor          *self,
                         const ClutterActorBox *box,
                         ClutterAllocationFlags flags)
 {
+  ClutterActorBox child_box;
   CoglFixed prev_value;
 
   ChamplainViewportPrivate *priv = CHAMPLAIN_VIEWPORT (self)->priv;
@@ -236,6 +290,13 @@ champlain_viewport_allocate (ClutterActor          *self,
           champlain_adjustment_set_value (priv->vadjustment, prev_value);
         }
     }
+
+  child_box.x1 = 0;
+  child_box.x2 = box->x2 - box->x1;
+  child_box.y1 = 0;
+  child_box.y2 = box->y2 - box->y1;
+
+  clutter_actor_allocate (CLUTTER_ACTOR (priv->content_group), &child_box, flags);
 }
 
 static void
@@ -250,9 +311,13 @@ champlain_viewport_class_init (ChamplainViewportClass *klass)
   gobject_class->set_property = champlain_viewport_set_property;
   gobject_class->dispose = champlain_viewport_dispose;
 
-  actor_class->paint = champlain_viewport_paint;
-  actor_class->pick = champlain_viewport_pick;
-  actor_class->allocate = champlain_viewport_allocate;
+  actor_class->get_preferred_width = get_preferred_width;
+  actor_class->get_preferred_height = get_preferred_height;
+  actor_class->allocate = allocate;
+  actor_class->paint = paint;
+  actor_class->pick = pick;
+  actor_class->map = map;
+  actor_class->unmap = unmap;
 
   g_object_class_install_property (gobject_class,
                                    PROP_X_ORIGIN,
@@ -478,10 +543,15 @@ clip_notify_cb (ClutterActor *actor,
 static void
 champlain_viewport_init (ChamplainViewport *self)
 {
-  self->priv = VIEWPORT_PRIVATE (self);
+  self->priv = GET_PRIVATE (self);
 
   self->priv->sync_adjustments = TRUE;
 
+  self->priv->child = NULL;
+  self->priv->content_group = clutter_group_new ();
+  clutter_actor_set_parent (CLUTTER_ACTOR (self->priv->content_group), CLUTTER_ACTOR (self));
+  clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+
   g_signal_connect (self, "notify::clip",
                     G_CALLBACK (clip_notify_cb), self);
 }
@@ -526,6 +596,9 @@ champlain_viewport_set_origin (ChamplainViewport *viewport,
     }
 
   g_object_thaw_notify (G_OBJECT (viewport));
+  
+  if (priv->child)
+    clutter_actor_set_position (priv->child, -x, -y);
 
   clutter_actor_queue_redraw (CLUTTER_ACTOR (viewport));
 }
@@ -547,3 +620,16 @@ champlain_viewport_get_origin (ChamplainViewport *viewport,
   if (y)
     *y = priv->y;
 }
+
+
+void 
+champlain_viewport_set_child (ChamplainViewport *viewport, ClutterActor *child)
+{
+  ChamplainViewportPrivate *priv = viewport->priv;
+  
+  if (priv->child)
+    clutter_container_remove_actor (CLUTTER_CONTAINER (priv->content_group), priv->child);
+    
+  priv->child = child;
+  clutter_container_add_actor (CLUTTER_CONTAINER (priv->content_group), child);  
+}
diff --git a/champlain/champlain-viewport.h b/champlain/champlain-viewport.h
index fa728bb..7b62f44 100644
--- a/champlain/champlain-viewport.h
+++ b/champlain/champlain-viewport.h
@@ -42,14 +42,14 @@ typedef struct _ChamplainViewportClass     ChamplainViewportClass;
 
 struct _ChamplainViewport
 {
-  ClutterGroup parent;
+  ClutterActor parent;
 
   ChamplainViewportPrivate *priv;
 };
 
 struct _ChamplainViewportClass
 {
-  ClutterGroupClass parent_class;
+  ClutterActorClass parent_class;
 };
 
 GType champlain_viewport_get_type (void) G_GNUC_CONST;
@@ -73,6 +73,8 @@ void champlain_viewport_set_adjustments (ChamplainViewport *viewport,
                             ChamplainAdjustment *hadjustment,
                             ChamplainAdjustment *vadjustment);
 
+void champlain_viewport_set_child (ChamplainViewport *viewport, ClutterActor *child);
+
 G_END_DECLS
 
 #endif /* __CHAMPLAIN_VIEWPORT_H__ */



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