[libchamplain] Make it possible to create ChamplainView after ChamplainViewEmbed
- From: Pierre-Luc Beaudoin <plbeaudoin src gnome org>
- To: svn-commits-list gnome org
- Subject: [libchamplain] Make it possible to create ChamplainView after ChamplainViewEmbed
- Date: Fri, 12 Jun 2009 01:00:18 -0400 (EDT)
commit 3bb0f26a11bcbc8fd7184438c6e078c6898da3b2
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date: Thu May 21 18:21:14 2009 -0400
Make it possible to create ChamplainView after ChamplainViewEmbed
If not, the first tiles could be loaded while the stage isn't created yet,
resulting in COGL errors.
champlain-gtk/champlain-view-embed.c | 53 +++++++++++++++++++++++----------
champlain-gtk/champlain-view-embed.h | 3 +-
demos/launcher-gtk.c | 5 ++-
3 files changed, 42 insertions(+), 19 deletions(-)
---
diff --git a/champlain-gtk/champlain-view-embed.c b/champlain-gtk/champlain-view-embed.c
index c30c149..e729570 100644
--- a/champlain-gtk/champlain-view-embed.c
+++ b/champlain-gtk/champlain-view-embed.c
@@ -48,6 +48,9 @@ struct _ChamplainViewEmbedPrivate
GdkCursor *cursor_hand_open;
GdkCursor *cursor_hand_closed;
+
+ guint width;
+ guint height;
};
@@ -101,17 +104,10 @@ champlain_view_embed_set_property (GObject *object,
{
case PROP_VIEW:
{
- ClutterActor *stage;
- stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (priv->clutter_embed));
-
- if (priv->view != NULL)
- {
- g_object_unref (priv->view);
- clutter_container_remove_actor (CLUTTER_CONTAINER (stage), CLUTTER_ACTOR (priv->view));
- }
+ ChamplainView *view;
- priv->view = g_value_dup_object (value);
- clutter_container_add_actor (CLUTTER_CONTAINER (stage), CLUTTER_ACTOR (priv->view));
+ view = g_value_get_object (value);
+ champlain_view_embed_set_view (CHAMPLAIN_VIEW_EMBED (object), view);
break;
}
default:
@@ -152,7 +148,7 @@ champlain_view_embed_class_init (ChamplainViewEmbedClass *klass)
"Champlain view",
"The ChamplainView to embed into the Gtk+ widget",
CHAMPLAIN_TYPE_VIEW,
- CHAMPLAIN_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ CHAMPLAIN_PARAM_READWRITE));
}
static void
@@ -211,7 +207,11 @@ view_size_allocated_cb (GtkWidget *widget,
{
ChamplainViewEmbedPrivate *priv = view->priv;
- champlain_view_set_size(priv->view, allocation->width, allocation->height);
+ if (priv->view != NULL)
+ champlain_view_set_size (priv->view, allocation->width, allocation->height);
+
+ priv->width = allocation->width;
+ priv->height = allocation->height;
}
static gboolean
@@ -237,11 +237,9 @@ mouse_button_cb (GtkWidget *widget,
* Since: 0.2.1
*/
GtkWidget *
-champlain_view_embed_new (ChamplainView *view)
+champlain_view_embed_new ()
{
- g_return_val_if_fail (CHAMPLAIN_IS_VIEW (view), NULL);
-
- return g_object_new (CHAMPLAIN_TYPE_VIEW_EMBED, "champlain-view", view, NULL);
+ return g_object_new (CHAMPLAIN_TYPE_VIEW_EMBED, NULL);
}
ChamplainView *
@@ -252,3 +250,26 @@ champlain_view_embed_get_view (ChamplainViewEmbed* embed)
ChamplainViewEmbedPrivate *priv = embed->priv;
return priv->view;
}
+
+void
+champlain_view_embed_set_view (ChamplainViewEmbed* embed,
+ ChamplainView *view)
+{
+ g_return_if_fail (CHAMPLAIN_IS_VIEW_EMBED(embed));
+ g_return_if_fail (CHAMPLAIN_IS_VIEW (view));
+
+ ChamplainViewEmbedPrivate *priv = embed->priv;
+ ClutterActor *stage;
+
+ if (priv->view != NULL)
+ {
+ g_object_unref (priv->view);
+ clutter_container_remove_actor (CLUTTER_CONTAINER (stage), CLUTTER_ACTOR (priv->view));
+ }
+
+ priv->view = g_object_ref (view);
+ champlain_view_set_size (priv->view, priv->width, priv->height);
+
+ stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (priv->clutter_embed));
+ clutter_container_add_actor (CLUTTER_CONTAINER (stage), CLUTTER_ACTOR (priv->view));
+}
diff --git a/champlain-gtk/champlain-view-embed.h b/champlain-gtk/champlain-view-embed.h
index 249f8bd..5c3e94a 100644
--- a/champlain-gtk/champlain-view-embed.h
+++ b/champlain-gtk/champlain-view-embed.h
@@ -55,8 +55,9 @@ typedef struct _ChamplainViewEmbedClass ChamplainViewEmbedClass;
GType champlain_view_embed_get_type (void);
-GtkWidget *champlain_view_embed_new (ChamplainView* view);
+GtkWidget *champlain_view_embed_new ();
ChamplainView *champlain_view_embed_get_view (ChamplainViewEmbed* embed);
+void champlain_view_embed_set_view (ChamplainViewEmbed* embed, ChamplainView *view);
#endif
diff --git a/demos/launcher-gtk.c b/demos/launcher-gtk.c
index b0cc591..d34d848 100644
--- a/demos/launcher-gtk.c
+++ b/demos/launcher-gtk.c
@@ -207,8 +207,9 @@ main (int argc,
vbox = gtk_vbox_new(FALSE, 10);
- view = champlain_view_new ();
- widget = champlain_view_embed_new (CHAMPLAIN_VIEW (view));
+ widget = champlain_view_embed_new ();
+
+ view = champlain_view_embed_get_view (CHAMPLAIN_VIEW_EMBED (widget));
g_object_set (G_OBJECT (view), "scroll-mode", CHAMPLAIN_SCROLL_MODE_KINETIC,
"zoom-level", 5, NULL);
layer = create_marker_layer (CHAMPLAIN_VIEW (view));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]