[clutter: 17/17] stage: Clean up



commit b5ac9277636bdeabcd3f2b6b62e234b085a5f49f
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Mon Nov 14 11:46:02 2011 +0000

    stage: Clean up
    
    Improve the consistency of the code.

 clutter/clutter-stage-manager.c |   14 +++++-------
 clutter/clutter-stage.c         |   41 +++++++++++++++++++++-----------------
 2 files changed, 29 insertions(+), 26 deletions(-)
---
diff --git a/clutter/clutter-stage-manager.c b/clutter/clutter-stage-manager.c
index e5c3133..26e58cc 100644
--- a/clutter/clutter-stage-manager.c
+++ b/clutter/clutter-stage-manager.c
@@ -203,7 +203,7 @@ clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
 {
 }
 
-/*
+/*< private >
  * _clutter_stage_manager_set_default_stage:
  * @stage_manager: a #ClutterStageManager
  * @stage: a #ClutterStage
@@ -211,10 +211,6 @@ clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
  * Sets @stage as the default stage
  *
  * A no-op if there already is a default stage
- *
- * This is called by clutter_stage_get_default() and should be removed
- * along with #ClutterStageManager:default-stage when we stop having
- * the default stage
  */
 void
 _clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
@@ -224,6 +220,9 @@ _clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
     {
       default_stage = stage;
 
+      /* the default stage is immediately realized */
+      clutter_actor_realize (CLUTTER_ACTOR (stage));
+
       g_object_notify (G_OBJECT (stage_manager), "default-stage");
     }
 }
@@ -312,10 +311,9 @@ _clutter_stage_manager_remove_stage (ClutterStageManager *stage_manager,
 
   stage_manager->stages = g_slist_remove (stage_manager->stages, stage);
 
-  /* if it's the default stage, get the first available from the list */
+  /* if the default stage is being destroyed then we unset the pointer */
   if (default_stage == stage)
-    default_stage = stage_manager->stages ? stage_manager->stages->data
-                                          : NULL;
+    default_stage = NULL;
 
   g_signal_emit (stage_manager, manager_signals[STAGE_REMOVED], 0, stage);
 
diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c
index ea9f8a0..54a3466 100644
--- a/clutter/clutter-stage.c
+++ b/clutter/clutter-stage.c
@@ -1517,6 +1517,7 @@ clutter_stage_constructed (GObject *gobject)
 
   stage_manager = clutter_stage_manager_get_default ();
 
+  /* this will take care to sinking the floating reference */
   _clutter_stage_manager_add_stage (stage_manager, self);
 
   /* if this stage has been created on a backend that does not
@@ -1530,19 +1531,12 @@ clutter_stage_constructed (GObject *gobject)
         {
           g_error ("Unable to create another stage: the backend of "
                    "type '%s' does not support multiple stages. Use "
-                   "clutter_stage_get_default() instead to access the "
-                   "stage singleton.",
+                   "clutter_stage_manager_get_default_stage() instead "
+                   "to access the stage singleton.",
                    G_OBJECT_TYPE_NAME (clutter_get_default_backend ()));
         }
 
-      /* This will take care of automatically adding the stage to the
-       * stage manager and setting it as the default. Its floating
-       * reference will be claimed by the stage manager.
-       */
       _clutter_stage_manager_set_default_stage (stage_manager, self);
-
-      /* the default stage is realized by default */
-      clutter_actor_realize (CLUTTER_ACTOR (self));
     }
 
   G_OBJECT_CLASS (clutter_stage_parent_class)->constructed (gobject);
@@ -1698,6 +1692,10 @@ clutter_stage_dispose (GObject *object)
 
   clutter_actor_hide (CLUTTER_ACTOR (object));
 
+  /* remove_stage() will unref() the stage instance, so we need to
+   * add a reference here to keep it temporarily alive
+   */
+  g_object_ref (object);
   stage_manager = clutter_stage_manager_get_default ();
   _clutter_stage_manager_remove_stage (stage_manager, stage);
 
@@ -2088,10 +2086,10 @@ clutter_stage_notify_min_size (ClutterStage *self)
 static void
 clutter_stage_init (ClutterStage *self)
 {
+  cairo_rectangle_int_t geom = { 0, };
   ClutterStagePrivate *priv;
   ClutterStageWindow *impl;
   ClutterBackend *backend;
-  cairo_rectangle_int_t geom;
   GError *error;
 
   /* a stage is a top-level object */
@@ -2104,7 +2102,13 @@ clutter_stage_init (ClutterStage *self)
 
   error = NULL;
   impl = _clutter_backend_create_stage (backend, self, &error);
-  if (G_UNLIKELY (impl == NULL))
+
+  if (G_LIKELY (impl != NULL))
+    {
+      _clutter_stage_set_window (self, impl);
+      _clutter_stage_window_get_geometry (priv->impl, &geom);
+    }
+  else
     {
       if (error != NULL)
         {
@@ -2116,8 +2120,6 @@ clutter_stage_init (ClutterStage *self)
         g_critical ("Unable to create a new stage implementation.");
     }
 
-  _clutter_stage_set_window (self, impl);
-
   priv->event_queue = g_queue_new ();
 
   priv->is_fullscreen = FALSE;
@@ -2137,10 +2139,8 @@ clutter_stage_init (ClutterStage *self)
 
   priv->color = default_stage_color;
 
-  _clutter_stage_window_get_geometry (priv->impl, &geom);
-
   priv->perspective.fovy   = 60.0; /* 60 Degrees */
-  priv->perspective.aspect = (float)geom.width / (float)geom.height;
+  priv->perspective.aspect = (float) geom.width / (float) geom.height;
   priv->perspective.z_near = 0.1;
   priv->perspective.z_far  = 100.0;
 
@@ -3552,9 +3552,14 @@ _clutter_stage_get_window (ClutterStage *stage)
 ClutterStageWindow *
 _clutter_stage_get_default_window (void)
 {
-  ClutterActor *stage = clutter_stage_get_default ();
+  ClutterStageManager *manager = clutter_stage_manager_get_default ();
+  ClutterStage *stage;
+
+  stage = clutter_stage_manager_get_default_stage (manager);
+  if (stage == NULL)
+    return NULL;
 
-  return _clutter_stage_get_window (CLUTTER_STAGE (stage));
+  return _clutter_stage_get_window (stage);
 }
 
 /**



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