[clutter-gtk] GtkClutterEmbed: Make use-layout-size property work properly



commit 01430d351a4094a843afeed66076fc630349dfe8
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Mon Sep 17 13:24:18 2012 +0900

    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

 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);
 }
 
 /**



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