212c4a0ee8
Big rework of the actor management semantics: now ClutterActor objects behave like GtkObjects - that is they have an initial "floating" reference that gets "sunk" when they are added to a ClutterGroup. This makes a group responsible of de-allocating each actor inside it, so you just have to destroy the group to get every child actor destroyed. Also, now you can do: clutter_group_add (group, clutter_video_texture_new ()); without having to care about reference counting and explicit unreffing. * clutter/clutter-private.h: Add private flags setter and getter macros. * clutter/clutter-actor.h: * clutter/clutter-actor.c: Clean up; inherit from GInitiallyUnowned; add a "visible" property; add the "destroy", "show" and "hide" signals to ClutterActorClass. (clutter_actor_show), (clutter_actor_hide): Refactor a bit; emit the "show" and "hide" signals. (clutter_actor_set_property), (clutter_actor_get_property), (clutter_actor_class_init): Implement the "visible" property; add signals. (clutter_actor_finalize): Do not leak the actor's name, if it is set. (clutter_actor_dispose): Emit the "destroy" signal here. (clutter_actor_init): Sink the initial floating flag if needed. (clutter_actor_destroy): Add a function to explicitely destroy a ClutterActor. (clutter_actor_set_parent), (clutter_actor_get_parent), (clutter_actor_unparent): Make set_parent require a valid parent; add unparent; check on get_parent; ref_sink the actor when setting its parent and unref it when unsetting it. Probably we'll need a function that does reparenting as unparent+set_parent in a single shot. * clutter/clutter-group.h: * clutter/clutter-group.c (clutter_group_dispose), (clutter_group_finalize), (clutter_group_add), (clutter_group_remove): Make the group destroy its children when disposing it; clean up, and use the newly-available clutter_actor_unparent(). * clutter/clutter-stage.h: * clutter/clutter-stage.c (clutter_stage_init): ClutterStage is a top-level actor; clean up. * clutter/clutter-video-texture.h: * clutter/clutter-video-texture.c: Clean up. * examples/super-oh.c: * examples/test.c: * examples/video-player.c: * examples/test-text.c: * examples/video-cube.c: Remove the g_object_unref() call, as the ClutterStage object is destroyed on clutter_main_quit().
57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
#include <clutter/clutter.h>
|
|
|
|
void
|
|
frame_cb (ClutterTimeline *timeline,
|
|
gint frame_num,
|
|
gpointer data)
|
|
{
|
|
ClutterActor *label = (ClutterActor*)data;
|
|
|
|
clutter_actor_set_depth(label, -400 + (frame_num * 40));
|
|
clutter_actor_set_opacity (label, 255 - frame_num );
|
|
}
|
|
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
ClutterTimeline *timeline;
|
|
ClutterActor *label;
|
|
ClutterActor *stage;
|
|
gchar *text;
|
|
gsize size;
|
|
ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff };
|
|
ClutterColor label_color = { 0x11, 0xdd, 0x11, 0xaa };
|
|
|
|
clutter_init (&argc, &argv);
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
if (!g_file_get_contents ("test-text.c", &text, &size, NULL))
|
|
g_error("g_file_get_contents() of test-text.c failed");
|
|
|
|
clutter_actor_set_size (stage, 800, 600);
|
|
clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
|
|
|
|
label = clutter_label_new_with_text ("Mono 8", text);
|
|
clutter_label_set_color (CLUTTER_LABEL (label), &label_color);
|
|
|
|
clutter_group_add (CLUTTER_GROUP (stage), label);
|
|
clutter_group_show_all (CLUTTER_GROUP (stage));
|
|
|
|
timeline = clutter_timeline_new (400, 60); /* num frames, fps */
|
|
g_object_set(timeline, "loop", TRUE, 0); /* have it loop */
|
|
|
|
g_signal_connect(timeline, "new-frame", G_CALLBACK (frame_cb), label);
|
|
|
|
/* and start it */
|
|
clutter_timeline_start (timeline);
|
|
|
|
g_signal_connect (stage, "key-press-event",
|
|
G_CALLBACK (clutter_main_quit), NULL);
|
|
|
|
clutter_main();
|
|
|
|
return 0;
|
|
}
|