125bded814
Bug 1138 - No trackable "mapped" state * Add a VISIBLE flag tracking application programmer's expected showing-state for the actor, allowing us to always ensure we keep what the app wants while tracking internal implementation state separately. * Make MAPPED reflect whether the actor will be painted; add notification on a ClutterActor::mapped property. Keep MAPPED state updated as the actor is shown, ancestors are shown, actor is reparented, etc. * Require a stage and realized parents to realize; this means at realization time the correct window system and GL resources are known. But unparented actors can no longer be realized. * Allow children to be unrealized even if parent is realized. Otherwise in effect either all actors or no actors are realized, i.e. it becomes a stage-global flag. * Allow clutter_actor_realize() to "fail" if not inside a toplevel * Rework clutter_actor_unrealize() so internally we have a flavor that does not mess with visibility flag * Add _clutter_actor_rerealize() to encapsulate a somewhat tricky operation we were doing in a couple of places * Do not realize/unrealize children in ClutterGroup, ClutterActor already does it * Do not realize impl by hand in clutter_stage_show(), since showing impl already does that * Do not unrealize in various dispose() methods, since ClutterActor dispose implementation already does it and chaining up is mandatory * ClutterTexture uses COGL while unrealizable (before it's added to a stage). Previously this breakage was affecting ClutterActor because we had to allow realize outside a stage. Move the breakage to ClutterTexture, by making ClutterTexture just use COGL while not realized. * Unrealize before we set parent to NULL in clutter_actor_unparent(). This means unrealize() implementations can get to the stage. Because actors need the stage in order to detach from stage. * Update clutter-actor-invariants.txt to reflect latest changes * Remove explicit hide/unrealize from ClutterActor::dispose since unparent already forces those Instead just assert that unparent() occurred and did the right thing. * Check whether parent implements unrealize before chaining up Needed because ClutterGroup no longer has to implement unrealize. * Perform unrealize in the default handler for the signal. This allows non-containers that have children to work properly, and allows containers to override how it's done. * Add map/unmap virtual methods and set MAPPED flag on self and children in there. This allows subclasses to hook map/unmap. These are not signals, because notify::mapped is better for anything it's legitimate for a non-subclass to do. Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
225 lines
6.1 KiB
C
225 lines
6.1 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <clutter/clutter.h>
|
|
|
|
#include "test-conform-common.h"
|
|
|
|
void
|
|
test_initial_state (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor;
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
|
|
clutter_actor_destroy (actor);
|
|
}
|
|
|
|
void
|
|
test_shown_not_parented (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor;
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
clutter_actor_show (actor);
|
|
|
|
g_assert (!CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
g_assert (!CLUTTER_ACTOR_IS_MAPPED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
|
|
|
|
clutter_actor_destroy (actor);
|
|
}
|
|
|
|
void
|
|
test_realized (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor;
|
|
ClutterActor *stage;
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
|
|
clutter_actor_hide (actor); /* don't show, so won't map */
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
|
|
actor);
|
|
clutter_actor_realize (actor);
|
|
|
|
g_assert (CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
|
|
clutter_actor_destroy (actor);
|
|
}
|
|
|
|
void
|
|
test_mapped (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor;
|
|
ClutterActor *stage;
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
|
|
actor);
|
|
|
|
g_assert (CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_MAPPED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
|
|
|
|
clutter_actor_destroy (actor);
|
|
}
|
|
|
|
void
|
|
test_realize_not_recursive (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor, *group;
|
|
ClutterActor *stage;
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
group = clutter_group_new ();
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
clutter_actor_hide (group); /* don't show, so won't map */
|
|
clutter_actor_hide (actor); /* don't show, so won't map */
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
|
|
group);
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (group),
|
|
actor);
|
|
|
|
clutter_actor_realize (group);
|
|
|
|
g_assert (CLUTTER_ACTOR_IS_REALIZED (group));
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (group)));
|
|
|
|
/* realizing group did not realize the child */
|
|
g_assert (!CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
|
|
clutter_actor_destroy (group);
|
|
}
|
|
|
|
void
|
|
test_map_recursive (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor, *group;
|
|
ClutterActor *stage;
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
group = clutter_group_new ();
|
|
|
|
actor = clutter_rectangle_new ();
|
|
|
|
clutter_actor_hide (group); /* hide at first */
|
|
clutter_actor_show (actor); /* show at first */
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (group)));
|
|
g_assert ((CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
|
|
group);
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (group),
|
|
actor);
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_REALIZED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (group)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_MAPPED (actor)));
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (group)));
|
|
g_assert ((CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
|
|
/* show group, which should map and realize both
|
|
* group and child.
|
|
*/
|
|
clutter_actor_show (group);
|
|
g_assert (CLUTTER_ACTOR_IS_REALIZED (group));
|
|
g_assert (CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_MAPPED (group));
|
|
g_assert (CLUTTER_ACTOR_IS_MAPPED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (group));
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
|
|
|
|
clutter_actor_destroy (group);
|
|
}
|
|
|
|
void
|
|
test_show_on_set_parent (TestConformSimpleFixture *fixture,
|
|
gconstpointer data)
|
|
{
|
|
ClutterActor *actor, *group;
|
|
gboolean show_on_set_parent;
|
|
ClutterActor *stage;
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
group = clutter_group_new ();
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (group)));
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
|
|
group);
|
|
|
|
actor = clutter_rectangle_new ();
|
|
g_object_get (G_OBJECT (actor),
|
|
"show-on-set-parent", &show_on_set_parent,
|
|
NULL);
|
|
|
|
g_assert (!(CLUTTER_ACTOR_IS_VISIBLE (actor)));
|
|
g_assert (show_on_set_parent == TRUE);
|
|
|
|
clutter_group_add (group, actor);
|
|
g_object_get (G_OBJECT (actor),
|
|
"show-on-set-parent", &show_on_set_parent,
|
|
NULL);
|
|
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
|
|
g_assert (show_on_set_parent == TRUE);
|
|
|
|
g_object_ref (actor);
|
|
clutter_actor_unparent (actor);
|
|
g_object_get (G_OBJECT (actor),
|
|
"show-on-set-parent", &show_on_set_parent,
|
|
NULL);
|
|
|
|
g_assert (!CLUTTER_ACTOR_IS_REALIZED (actor));
|
|
g_assert (!CLUTTER_ACTOR_IS_MAPPED (actor));
|
|
g_assert (CLUTTER_ACTOR_IS_VISIBLE (actor));
|
|
g_assert (show_on_set_parent == TRUE);
|
|
|
|
clutter_actor_destroy (actor);
|
|
clutter_actor_destroy (group);
|
|
}
|