From b5ac9277636bdeabcd3f2b6b62e234b085a5f49f Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 14 Nov 2011 11:46:02 +0000 Subject: [PATCH] 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 e5c3133f1..26e58ccd9 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 ea9f8a0f7..54a346667 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; - return _clutter_stage_get_window (CLUTTER_STAGE (stage)); + stage = clutter_stage_manager_get_default_stage (manager); + if (stage == NULL) + return NULL; + + return _clutter_stage_get_window (stage); } /**