diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2012-09-17 13:24:18 +0900 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2012-10-17 22:57:37 +0100 |
commit | 01430d351a4094a843afeed66076fc630349dfe8 (patch) | |
tree | c7b4c9cc3d67e6e824a5249e1e8d420e2a55f66a | |
parent | 62c75f493ad094bc87590a031c74e8fcd03eb3dc (diff) | |
download | clutter-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.c | 33 |
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); } /** |