4 * An OpenGL based 'interactive canvas' library.
6 * Copyright (C) 2008 OpenedHand
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 * Author: Emmanuele Bassi <ebassi@linux.intel.com>
25 * SECTION:clutter-stage-manager
26 * @short_description: Maintains the list of stages
28 * #ClutterStageManager is a singleton object, owned by Clutter, which
29 * maintains the list of currently active stages
31 * Every newly-created #ClutterStage will cause the emission of the
32 * #ClutterStageManager::stage-added signal; once a #ClutterStage has
33 * been destroyed, the #ClutterStageManager::stage-removed signal will
36 * #ClutterStageManager is available since Clutter 0.8
43 #include "clutter-stage-manager-private.h"
45 #include "clutter-marshal.h"
46 #include "clutter-debug.h"
47 #include "clutter-private.h"
48 #include "clutter-version.h"
50 #include "deprecated/clutter-stage-manager.h"
66 static guint manager_signals[LAST_SIGNAL] = { 0, };
67 static ClutterStage *default_stage = NULL;
69 G_DEFINE_TYPE (ClutterStageManager, clutter_stage_manager, G_TYPE_OBJECT);
72 clutter_stage_manager_get_property (GObject *gobject,
79 case PROP_DEFAULT_STAGE:
80 g_value_set_object (value, default_stage);
83 G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
89 clutter_stage_manager_dispose (GObject *gobject)
91 ClutterStageManager *stage_manager;
93 stage_manager = CLUTTER_STAGE_MANAGER (gobject);
95 g_slist_foreach (stage_manager->stages, (GFunc) clutter_actor_destroy, NULL);
96 g_slist_free (stage_manager->stages);
97 stage_manager->stages = NULL;
99 G_OBJECT_CLASS (clutter_stage_manager_parent_class)->dispose (gobject);
103 clutter_stage_manager_class_init (ClutterStageManagerClass *klass)
105 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
107 gobject_class->dispose = clutter_stage_manager_dispose;
108 gobject_class->get_property = clutter_stage_manager_get_property;
111 * ClutterStageManager:default-stage:
113 * The default stage used by Clutter.
117 g_object_class_install_property (gobject_class,
119 g_param_spec_object ("default-stage",
123 CLUTTER_PARAM_READABLE));
126 * ClutterStageManager::stage-added:
127 * @stage_manager: the object which received the signal
128 * @stage: the added stage
130 * The ::stage-added signal is emitted each time a new #ClutterStage
131 * has been added to the stage manager.
135 manager_signals[STAGE_ADDED] =
136 g_signal_new ("stage-added",
137 G_OBJECT_CLASS_TYPE (gobject_class),
139 G_STRUCT_OFFSET (ClutterStageManagerClass, stage_added),
141 _clutter_marshal_VOID__OBJECT,
145 * ClutterStageManager::stage-removed:
146 * @stage_manager: the object which received the signal
147 * @stage: the removed stage
149 * The ::stage-removed signal is emitted each time a #ClutterStage
150 * has been removed from the stage manager.
154 manager_signals[STAGE_REMOVED] =
155 g_signal_new ("stage-removed",
156 G_OBJECT_CLASS_TYPE (gobject_class),
158 G_STRUCT_OFFSET (ClutterStageManagerClass, stage_removed),
160 _clutter_marshal_VOID__OBJECT,
166 clutter_stage_manager_init (ClutterStageManager *stage_manager)
171 * clutter_stage_manager_get_default:
173 * Returns the default #ClutterStageManager.
175 * Return value: (transfer none): the default stage manager instance. The returned
176 * object is owned by Clutter and you should not reference or unreference it.
180 ClutterStageManager *
181 clutter_stage_manager_get_default (void)
183 ClutterMainContext *context = _clutter_context_get_default ();
185 if (G_UNLIKELY (context->stage_manager == NULL))
186 context->stage_manager = g_object_new (CLUTTER_TYPE_STAGE_MANAGER, NULL);
188 return context->stage_manager;
192 * clutter_stage_manager_set_default_stage:
193 * @stage_manager: a #ClutterStageManager
194 * @stage: a #ClutterStage
196 * Sets @stage as the default stage.
200 * Deprecated: 1.2: Calling this function has no effect
203 clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
209 * _clutter_stage_manager_set_default_stage:
210 * @stage_manager: a #ClutterStageManager
211 * @stage: a #ClutterStage
213 * Sets @stage as the default stage
215 * A no-op if there already is a default stage
218 _clutter_stage_manager_set_default_stage (ClutterStageManager *stage_manager,
221 if (G_UNLIKELY (default_stage == NULL))
223 default_stage = stage;
225 /* the default stage is immediately realized */
226 clutter_actor_realize (CLUTTER_ACTOR (stage));
228 g_object_notify (G_OBJECT (stage_manager), "default-stage");
233 * clutter_stage_manager_get_default_stage:
234 * @stage_manager: a #ClutterStageManager
236 * Returns the default #ClutterStage.
238 * Return value: (transfer none): the default stage. The returned object
239 * is owned by Clutter and you should never reference or unreference it
244 clutter_stage_manager_get_default_stage (ClutterStageManager *stage_manager)
246 return default_stage;
250 * clutter_stage_manager_list_stages:
251 * @stage_manager: a #ClutterStageManager
253 * Lists all currently used stages.
255 * Return value: (transfer container) (element-type Clutter.Stage): a newly
256 * allocated list of #ClutterStage objects. Use g_slist_free() to
257 * deallocate it when done.
262 clutter_stage_manager_list_stages (ClutterStageManager *stage_manager)
264 return g_slist_copy (stage_manager->stages);
268 * clutter_stage_manager_peek_stages:
269 * @stage_manager: a #ClutterStageManager
271 * Lists all currently used stages.
273 * Return value: (transfer none) (element-type Clutter.Stage): a pointer
274 * to the internal list of #ClutterStage objects. The returned list
275 * is owned by the #ClutterStageManager and should never be modified
281 clutter_stage_manager_peek_stages (ClutterStageManager *stage_manager)
283 return stage_manager->stages;
287 _clutter_stage_manager_add_stage (ClutterStageManager *stage_manager,
290 if (g_slist_find (stage_manager->stages, stage))
292 g_warning ("Trying to add a stage to the list of managed stages, "
293 "but it is already in it, aborting.");
297 g_object_ref_sink (stage);
299 stage_manager->stages = g_slist_append (stage_manager->stages, stage);
301 g_signal_emit (stage_manager, manager_signals[STAGE_ADDED], 0, stage);
305 _clutter_stage_manager_remove_stage (ClutterStageManager *stage_manager,
308 /* this might be called multiple times from a ::dispose, so it
309 * needs to just return without warning
311 if (!g_slist_find (stage_manager->stages, stage))
314 stage_manager->stages = g_slist_remove (stage_manager->stages, stage);
316 /* if the default stage is being destroyed then we unset the pointer */
317 if (default_stage == stage)
318 default_stage = NULL;
320 g_signal_emit (stage_manager, manager_signals[STAGE_REMOVED], 0, stage);
322 g_object_unref (stage);