stage: Create the default stage on demand

Instead of creating the default stage during initialization we can
now safely create it whenever clutter_stage_get_default() is called.

To maintain the invariant, the default stage is immediately realized
by Clutter itself.
This commit is contained in:
Emmanuele Bassi 2009-12-03 21:07:45 +00:00
parent d2c091e62d
commit ede2cbfab0
2 changed files with 10 additions and 33 deletions

View File

@ -1492,7 +1492,6 @@ static ClutterInitError
clutter_init_real (GError **error) clutter_init_real (GError **error)
{ {
ClutterMainContext *ctx; ClutterMainContext *ctx;
ClutterActor *stage;
ClutterBackend *backend; ClutterBackend *backend;
/* Note, creates backend if not already existing, though parse args will /* Note, creates backend if not already existing, though parse args will
@ -1558,33 +1557,6 @@ clutter_init_real (GError **error)
/* Initiate event collection */ /* Initiate event collection */
_clutter_backend_init_events (ctx->backend); _clutter_backend_init_events (ctx->backend);
/* Create the default stage and realize it */
stage = clutter_stage_get_default ();
if (!stage)
{
if (error)
g_set_error (error, CLUTTER_INIT_ERROR,
CLUTTER_INIT_ERROR_INTERNAL,
"Unable to create the default stage");
else
g_critical ("Unable to create the default stage");
return CLUTTER_INIT_ERROR_INTERNAL;
}
clutter_actor_realize (stage);
if (!CLUTTER_ACTOR_IS_REALIZED (stage))
{
if (error)
g_set_error (error, CLUTTER_INIT_ERROR,
CLUTTER_INIT_ERROR_INTERNAL,
"Unable to realize the default stage");
else
g_critical ("Unable to realize the default stage");
return CLUTTER_INIT_ERROR_INTERNAL;
}
clutter_is_initialized = TRUE; clutter_is_initialized = TRUE;
ctx->is_initialized = TRUE; ctx->is_initialized = TRUE;

View File

@ -1215,12 +1215,17 @@ clutter_stage_get_default (void)
stage = clutter_stage_manager_get_default_stage (stage_manager); stage = clutter_stage_manager_get_default_stage (stage_manager);
if (G_UNLIKELY (stage == NULL)) if (G_UNLIKELY (stage == NULL))
{
/* This will take care of automatically adding the stage to the /* This will take care of automatically adding the stage to the
* stage manager and setting it as the default. Its floating * stage manager and setting it as the default. Its floating
* reference will be claimed by the stage manager. * reference will be claimed by the stage manager.
*/ */
stage = g_object_new (CLUTTER_TYPE_STAGE, NULL); stage = g_object_new (CLUTTER_TYPE_STAGE, NULL);
/* the default stage is realized by default */
clutter_actor_realize (CLUTTER_ACTOR (stage));
}
return CLUTTER_ACTOR (stage); return CLUTTER_ACTOR (stage);
} }