* src/hildon-pannable-area.c (hildon_pannable_area_add_with_viewport): Reviewed the...
authorAlejandro G. Castro <alex@igalia.com>
Tue, 28 Oct 2008 12:40:32 +0000 (12:40 +0000)
committerAlejandro G. Castro <alex@igalia.com>
Tue, 28 Oct 2008 12:40:32 +0000 (12:40 +0000)
Fixes: NB#90994 (HildonPannableArea does not connect "destroyed"
on child)

ChangeLog
src/hildon-pannable-area.c

index de9ff84..27cb9ce 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2008-10-28  Alejandro G. Castro         <alex@igalia.com>
 
+       * src/hildon-pannable-area.c
+       (hildon_pannable_area_add_with_viewport): Reviewed the complete
+       method, it had problems when adding a widget with viewport the
+       second time. Now checks if it already has a viewport and uses it.
+
+       Fixes: NB#90994 (HildonPannableArea does not connect "destroyed"
+       on child)
+
+2008-10-28  Alejandro G. Castro         <alex@igalia.com>
+
        * src/hildon-pannable-area.c,
        (hildon_pannable_area_scroll_to),
        (hildon_pannable_area_jump_to),
index 50ac784..0786c27 100644 (file)
@@ -2106,11 +2106,34 @@ void
 hildon_pannable_area_add_with_viewport (HildonPannableArea * area,
                                        GtkWidget * child)
 {
-  GtkWidget *viewport = gtk_viewport_new (NULL, NULL);
-  gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
-  gtk_container_add (GTK_CONTAINER (viewport), child);
+  GtkBin *bin;
+  GtkWidget *viewport;
+
+  g_return_if_fail (HILDON_IS_PANNABLE_AREA (area));
+  g_return_if_fail (GTK_IS_WIDGET (child));
+  g_return_if_fail (child->parent == NULL);
+
+  bin = GTK_BIN (area);
+
+  if (bin->child != NULL)
+    {
+      g_return_if_fail (GTK_IS_VIEWPORT (bin->child));
+      g_return_if_fail (GTK_BIN (bin->child)->child == NULL);
+
+      viewport = bin->child;
+    }
+  else
+    {
+      HildonPannableAreaPrivate *priv = area->priv;
+
+      viewport = gtk_viewport_new (priv->hadjust,
+                                   priv->vadjust);
+      gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
+      gtk_container_add (GTK_CONTAINER (area), viewport);
+    }
+
   gtk_widget_show (viewport);
-  gtk_container_add (GTK_CONTAINER (area), viewport);
+  gtk_container_add (GTK_CONTAINER (viewport), child);
 }
 
 /**