[gtk+/wip/actor: 25/42] xxx: actor



commit 012046963a2449530306f0e34a506ce36ebff784
Author: Benjamin Otte <otte redhat com>
Date:   Sun Dec 16 16:44:51 2012 +0100

    xxx: actor

 gtk/actors/gtkactor.c |  123 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 119 insertions(+), 4 deletions(-)
---
diff --git a/gtk/actors/gtkactor.c b/gtk/actors/gtkactor.c
index 33de228..59dad98 100644
--- a/gtk/actors/gtkactor.c
+++ b/gtk/actors/gtkactor.c
@@ -35,6 +35,8 @@ struct _GtkActorPrivate {
 
   GtkLayoutManager *layout_manager;
 
+  GtkWidget *widget;
+
   cairo_matrix_t transform;
   gfloat width;
   gfloat height;
@@ -88,6 +90,7 @@ enum
   PROP_TEXT_DIRECTION,
 
   PROP_LAYOUT_MANAGER,
+  PROP_WIDGET,
 
   PROP_FIRST_CHILD,
   PROP_LAST_CHILD,
@@ -103,9 +106,16 @@ static void
 gtk_actor_dispose (GObject *object)
 {
   GtkActor *self = GTK_ACTOR (object);
+  GtkActorPrivate *priv = self->priv;
 
   _gtk_actor_set_layout_manager (self, NULL);
 
+  if (priv->widget)
+    {
+      g_object_remove_weak_pointer (G_OBJECT (priv->widget), (gpointer *) &priv->widget);
+      priv->widget = NULL;
+    }
+
   G_OBJECT_CLASS (_gtk_actor_parent_class)->dispose (object);
 }
 
@@ -127,7 +137,7 @@ gtk_actor_set_property (GObject      *object,
 			GParamSpec   *pspec)
 {
   GtkActor *actor = GTK_ACTOR (object);
-  //GtkActorPrivate *priv = actor->priv;
+  GtkActorPrivate *priv = actor->priv;
 
   switch (prop_id)
     {
@@ -143,6 +153,12 @@ gtk_actor_set_property (GObject      *object,
       _gtk_actor_set_layout_manager (actor, g_value_get_object (value));
       break;
 
+    case PROP_WIDGET:
+      priv->widget = g_value_get_object (value);
+      if (priv->widget)
+        g_object_add_weak_pointer (G_OBJECT (priv->widget), (gpointer *) &priv->widget);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -188,6 +204,10 @@ gtk_actor_get_property (GObject    *object,
       g_value_set_object (value, _gtk_actor_get_layout_manager (actor));
       break;
 
+    case PROP_WIDGET:
+      g_value_set_object (value, _gtk_actor_get_widget (actor));
+      break;
+
     case PROP_FIRST_CHILD:
       g_value_set_object (value, priv->first_child);
       break;
@@ -224,7 +244,16 @@ gtk_actor_real_queue_relayout (GtkActor *self)
 
   /* We need to go all the way up the hierarchy */
   if (priv->parent != NULL)
-    gtk_actor_queue_only_relayout (priv->parent);
+    {
+      gtk_actor_queue_only_relayout (priv->parent);
+    }
+  else
+    {
+      GtkWidget *widget = _gtk_actor_get_widget (self);
+
+      if (widget)
+        gtk_widget_queue_resize (widget);
+    }
 }
 
 static gboolean
@@ -501,6 +530,40 @@ _gtk_actor_class_init (GtkActorClass *klass)
                           GTK_PARAM_READABLE);
 
   /**
+   * GtkActor:width:
+   *
+   * The width allocated to the #GtkActor. See _gtk_actor_allocate() for
+   * details.
+   *
+   * Since: 1.0
+   */
+  obj_props[PROP_WIDTH] =
+    g_param_spec_float ("width",
+                        P_("Width"),
+                        P_("Width of the actor"),
+                        0.0f,
+                        G_MAXFLOAT,
+                        0.0f,
+                        GTK_PARAM_READABLE);
+
+  /**
+   * GtkActor:height:
+   *
+   * The height allocated to the #GtkActor. See _gtk_actor_allocate() for
+   * details.
+   *
+   * Since: 1.0
+   */
+  obj_props[PROP_HEIGHT] =
+    g_param_spec_float ("height",
+                        P_("Height"),
+                        P_("Height of the actor"),
+                        0.0f,
+                        G_MAXFLOAT,
+                        0.0f,
+                        GTK_PARAM_READABLE);
+
+  /**
    * GtkActor:text-direction:
    *
    * The direction of the text inside a #GtkActor.
@@ -531,6 +594,20 @@ _gtk_actor_class_init (GtkActorClass *klass)
                          GTK_PARAM_READWRITE);
 
   /**
+   * GtkActor:widget:
+   *
+   * The widget this actor belongs to or %NULL if none.
+   *
+   * Since: 1.10
+   */
+  obj_props[PROP_WIDGET] =
+    g_param_spec_object ("widget",
+                         P_("Widget"),
+                         P_("The widget this actor belongs to"),
+                         GTK_TYPE_WIDGET,
+                         GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+
+  /**
    * GtkActor:first-child:
    *
    * The actor's first child.
@@ -558,6 +635,8 @@ _gtk_actor_class_init (GtkActorClass *klass)
                          GTK_TYPE_ACTOR,
                          GTK_PARAM_READABLE);
 
+  g_object_class_install_properties (object_class, PROP_LAST, obj_props);
+
   g_type_class_add_private (klass, sizeof (GtkActorPrivate));
 }
 
@@ -2439,8 +2518,44 @@ _gtk_actor_position (GtkActor             *actor,
 GdkScreen *
 _gtk_actor_get_screen (GtkActor *self)
 {
-  g_warning ("FIXME: return a proper screen");
-  return gdk_screen_get_default ();
+  GtkWidget *widget;
+
+  g_return_val_if_fail (GTK_IS_ACTOR (self), gdk_screen_get_default ());
+
+  widget = _gtk_actor_get_widget (self);
+  if (widget == NULL)
+    return gdk_screen_get_default ();
+
+  return gtk_widget_get_screen (widget);
+}
+
+/**
+ * _gtk_actor_get_widget:
+ * @self: a #GtkActor
+ *
+ * Get the widget that owns the actor. If the actor isn't owned by a widget,
+ * %NULL is returned.
+ *
+ * Returns: the widget owning the actor or %NULL
+ *
+ * Since: 1.2
+ **/
+GtkWidget *
+_gtk_actor_get_widget (GtkActor *self)
+{
+  GtkActor *iter;
+
+  g_return_val_if_fail (GTK_IS_ACTOR (self), NULL);
+
+  for (iter = self;
+       iter != NULL;
+       iter = _gtk_actor_get_parent (iter))
+    {
+      if (iter->priv->widget)
+        return iter->priv->widget;
+    }
+
+  return NULL;
 }
 
 /**



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