Enforce invariants on mapped, realized, visibility states
authorHavoc Pennington <hp@pobox.com>
Thu, 2 Apr 2009 13:16:43 +0000 (09:16 -0400)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Fri, 24 Apr 2009 14:27:19 +0000 (15:27 +0100)
commit125bded81455df73b37ed459f360ced0135db65a
tree9547f3f54f3e385b6d229d4a5098424f59a79c2b
parentb73ee6992c68559f04f8d3e42d337b1c39a57933
Enforce invariants on mapped, realized, visibility states

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>
17 files changed:
clutter/clutter-actor.c
clutter/clutter-actor.h
clutter/clutter-group.c
clutter/clutter-private.h
clutter/clutter-stage.c
clutter/clutter-texture.c
clutter/eglnative/clutter-stage-egl.c
clutter/eglx/clutter-stage-egl.c
clutter/fruity/clutter-fruity.c
clutter/fruity/clutter-stage-fruity.c
clutter/glx/clutter-stage-glx.c
clutter/sdl/clutter-stage-sdl.c
clutter/win32/clutter-stage-win32.c
clutter/x11/clutter-stage-x11.c
doc/clutter-actor-invariants.txt
tests/conform/test-actor-invariants.c
tests/conform/test-conform-main.c