From 34a40de3c545db5f0c5448b07a657e005f12bfbd Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Mon, 8 Oct 2007 16:18:33 +0000 Subject: [PATCH] 2007-10-08 Matthew Allum * clutter/clutter-actor.c: * clutter/clutter-actor.h: * clutter/clutter-private.h: * clutter/clutter-main.c: Add a hash to global clutter context mapping all parented actor id's to actors. Add clutter_get_actor_by_id() call. Convert picking machinery to use above. (performance/simpler composite actor creation) * clutter/clutter-stage.c: (clutter_stage_fullscreen), (clutter_stage_unfullscreen), (clutter_stage_event): Only set the fullscreen property on stage state fullscreen event(#545) Experimental as could be painful to implement on non X backends. --- ChangeLog | 17 +++++++++++++++++ clutter/clutter-actor.c | 16 ++++++++++++++++ clutter/clutter-actor.h | 2 ++ clutter/clutter-main.c | 27 +++++++++++++++++++++++++-- clutter/clutter-private.h | 18 ++++++++---------- clutter/clutter-stage.c | 31 ++++++++++++++++++------------- 6 files changed, 86 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 195f2f76d..c01585474 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2007-10-08 Matthew Allum + + * clutter/clutter-actor.c: + * clutter/clutter-actor.h: + * clutter/clutter-private.h: + * clutter/clutter-main.c: + Add a hash to global clutter context mapping all parented actor + id's to actors. + Add clutter_get_actor_by_id() call. + Convert picking machinery to use above. + (performance/simpler composite actor creation) + + * clutter/clutter-stage.c: (clutter_stage_fullscreen), + (clutter_stage_unfullscreen), (clutter_stage_event): + Only set the fullscreen property on stage state fullscreen event(#545) + Experimental as could be painful to implement on non X backends. + 2007-10-08 Emmanuele Bassi * clutter/clutter-script.c (json_parse_end): diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 59e273581..960926022 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -2655,9 +2655,14 @@ void clutter_actor_set_parent (ClutterActor *self, ClutterActor *parent) { + ClutterMainContext *clutter_context; + + clutter_context = clutter_context_get_default (); + g_return_if_fail (CLUTTER_IS_ACTOR (self)); g_return_if_fail (CLUTTER_IS_ACTOR (parent)); g_return_if_fail (self != parent); + g_return_if_fail (clutter_context != NULL); if (self->priv->parent_actor != NULL) { @@ -2674,6 +2679,10 @@ clutter_actor_set_parent (ClutterActor *self, return; } + g_hash_table_insert (clutter_context->actor_hash, + (gpointer)clutter_actor_get_id(self), + (gpointer)self); + g_object_ref_sink (self); self->priv->parent_actor = parent; g_signal_emit (self, actor_signals[PARENT_SET], 0, NULL); @@ -2718,8 +2727,12 @@ void clutter_actor_unparent (ClutterActor *self) { ClutterActor *old_parent; + ClutterMainContext *clutter_context; + + clutter_context = clutter_context_get_default (); g_return_if_fail (CLUTTER_IS_ACTOR (self)); + g_return_if_fail (clutter_context != NULL); if (self->priv->parent_actor == NULL) return; @@ -2737,6 +2750,9 @@ clutter_actor_unparent (ClutterActor *self) self->priv->parent_actor = NULL; g_signal_emit (self, actor_signals[PARENT_SET], 0, old_parent); + g_hash_table_remove (clutter_context->actor_hash, + (gconstpointer)clutter_actor_get_id(self)); + g_object_unref (self); } diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h index 708b7668c..22c3eeb0d 100644 --- a/clutter/clutter-actor.h +++ b/clutter/clutter-actor.h @@ -373,6 +373,8 @@ clutter_actor_unset_reactive (ClutterActor *actor); gboolean clutter_actor_is_reactive (ClutterActor *actor); +ClutterActor* +clutter_get_actor_by_id (guint32 id); G_END_DECLS diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index a7d2a0814..3b35a74f5 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -232,10 +232,9 @@ _clutter_do_pick (ClutterStage *stage, /* Decode color back into an ID, taking into account fb depth */ id = pixel[2]>>(8-b) | pixel[1]<>(8-g) | pixel[0]<<(g+b)>>(8-r); - return clutter_container_find_child_by_id (CLUTTER_CONTAINER (stage), id); + return clutter_get_actor_by_id (id); } - /** * clutter_main_quit: * @@ -761,6 +760,8 @@ pre_parse_hook (GOptionContext *context, clutter_context->font_map = PANGO_FT2_FONT_MAP (pango_ft2_font_map_new ()); pango_ft2_font_map_set_resolution (clutter_context->font_map, 96.0, 96.0); + clutter_context->actor_hash = g_hash_table_new (NULL, NULL); + backend = clutter_context->backend; g_assert (CLUTTER_IS_BACKEND (backend)); @@ -1318,6 +1319,27 @@ clutter_do_event (ClutterEvent *event) } } +/** + * clutter_get_actor_by_id + * @id: a #ClutterActor ID. + * + * FIXME. + * + * Since: 0.6 + */ +ClutterActor* +clutter_get_actor_by_id (guint32 id) +{ + ClutterMainContext *context; + + context = clutter_context_get_default (); + + g_return_val_if_fail (context != NULL, NULL); + g_return_val_if_fail (context->actor_hash != NULL, NULL); + + return g_hash_table_lookup (context->actor_hash, (gconstpointer)id); +} + void clutter_base_init (void) { @@ -1336,3 +1358,4 @@ clutter_base_init (void) foo = clutter_actor_get_type (); } } + diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h index d44b87004..e3d9f2278 100644 --- a/clutter/clutter-private.h +++ b/clutter/clutter-private.h @@ -65,22 +65,20 @@ typedef struct _ClutterMainContext ClutterMainContext; struct _ClutterMainContext { - /* holds a pointer to the backend, which controls the stage */ - ClutterBackend *backend; - - /* the main event queue */ - GQueue *events_queue; - + ClutterBackend *backend; /* holds a pointer to the windowing + system backend */ + GQueue *events_queue; /* the main event queue */ PangoFT2FontMap *font_map; + guint update_idle; /* repaint idler id */ - guint update_idle; - - guint is_initialized : 1; + guint is_initialized : 1; GTimer *timer; /* Used for debugging scheduler */ ClutterPickMode pick_mode; /* Indicates pick render mode */ - guint motion_events_per_actor : 1; + guint motion_events_per_actor : 1;/* set for enter/leave events */ gint num_reactives; /* Num of reactive actors */ + + GHashTable *actor_hash; /* Hash of all actors mapped to id */ }; #define CLUTTER_CONTEXT() (clutter_context_get_default ()) diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 2195f207d..c5344e287 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -608,13 +608,12 @@ clutter_stage_fullscreen (ClutterStage *stage) priv = stage->priv; if (!priv->is_fullscreen) { - /* Only set if backend implements */ + /* Only set if backend implements. + * Also see clutter_stage_event() for setting priv->is_fullscreen + * on state change event. + */ if (CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen) - { - priv->is_fullscreen = TRUE; - CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen (stage, TRUE); - g_object_notify (G_OBJECT (stage), "fullscreen"); - } + CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen (stage, TRUE); } } @@ -640,11 +639,7 @@ clutter_stage_unfullscreen (ClutterStage *stage) { /* Only set if backend implements */ if (CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen) - { - priv->is_fullscreen = FALSE; - CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen (stage, FALSE); - g_object_notify (G_OBJECT (stage), "fullscreen"); - } + CLUTTER_STAGE_GET_CLASS (stage)->set_fullscreen (stage, FALSE); } } @@ -819,9 +814,13 @@ gboolean clutter_stage_event (ClutterStage *stage, ClutterEvent *event) { + ClutterStagePrivate *priv; + g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); g_return_val_if_fail (event != NULL, FALSE); + priv = stage->priv; + if (event->type == CLUTTER_DELETE) return TRUE; @@ -835,9 +834,15 @@ clutter_stage_event (ClutterStage *stage, if (event->stage_state.changed_mask & CLUTTER_STAGE_STATE_FULLSCREEN) { if (event->stage_state.new_state & CLUTTER_STAGE_STATE_FULLSCREEN) - g_signal_emit (stage, stage_signals[FULLSCREEN], 0); + { + priv->is_fullscreen = TRUE; + g_signal_emit (stage, stage_signals[FULLSCREEN], 0); + } else - g_signal_emit (stage, stage_signals[UNFULLSCREEN], 0); + { + priv->is_fullscreen = FALSE; + g_signal_emit (stage, stage_signals[UNFULLSCREEN], 0); + } } if (event->stage_state.changed_mask & CLUTTER_STAGE_STATE_ACTIVATED)