summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2012-09-17 13:24:18 +0900
committerEmmanuele Bassi <ebassi@gnome.org>2012-10-17 22:57:37 +0100
commit01430d351a4094a843afeed66076fc630349dfe8 (patch)
treec7b4c9cc3d67e6e824a5249e1e8d420e2a55f66a
parent62c75f493ad094bc87590a031c74e8fcd03eb3dc (diff)
downloadclutter-gtk-01430d351a4094a843afeed66076fc630349dfe8.tar.gz
GtkClutterEmbed: Make use-layout-size property work properly
This patch makes the GtkClutterEmbed connect to the stage 'queue-relayout' signal and calls gtk_widget_queue_resize() if the 'use-layout-size' property is set. This is needed to ensure the GtkClutterEmbed constantly requests enough size for the stage whenever the stage's geometry is renegotiated. https://bugzilla.gnome.org/show_bug.cgi?id=684171
-rw-r--r--clutter-gtk/gtk-clutter-embed.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/clutter-gtk/gtk-clutter-embed.c b/clutter-gtk/gtk-clutter-embed.c
index c301e4f..065f20f 100644
--- a/clutter-gtk/gtk-clutter-embed.c
+++ b/clutter-gtk/gtk-clutter-embed.c
@@ -86,6 +86,7 @@ struct _GtkClutterEmbedPrivate
int n_active_children;
guint queue_redraw_id;
+ guint queue_relayout_id;
guint geometry_changed : 1;
guint use_layout_size : 1;
@@ -134,20 +135,33 @@ on_stage_queue_redraw (ClutterStage *stage,
}
static void
+on_stage_queue_relayout (ClutterStage *stage,
+ gpointer user_data)
+{
+ GtkWidget *embed = user_data;
+ GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (embed)->priv;
+
+ if (priv->use_layout_size)
+ gtk_widget_queue_resize (embed);
+}
+
+static void
gtk_clutter_embed_dispose (GObject *gobject)
{
GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (gobject)->priv;
- if (priv->queue_redraw_id)
+
+ if (priv->stage)
{
- if (priv->stage != NULL)
+ if (priv->queue_redraw_id)
g_signal_handler_disconnect (priv->stage, priv->queue_redraw_id);
+ if (priv->queue_relayout_id)
+ g_signal_handler_disconnect (priv->stage, priv->queue_relayout_id);
+
priv->queue_redraw_id = 0;
- }
+ priv->queue_relayout_id = 0;
- if (priv->stage)
- {
clutter_actor_destroy (priv->stage);
priv->stage = NULL;
}
@@ -960,6 +974,15 @@ gtk_clutter_embed_init (GtkClutterEmbed *embed)
g_signal_connect (priv->stage,
"queue-redraw", G_CALLBACK (on_stage_queue_redraw),
embed);
+
+ /* intercept the queue-relayout signal of the stage to know when
+ * Clutter-side needs to renegotiate it's size; this way we can
+ * also request a resize GTK-side
+ */
+ priv->queue_relayout_id =
+ g_signal_connect (priv->stage,
+ "queue-relayout", G_CALLBACK (on_stage_queue_relayout),
+ embed);
}
/**