diff --git a/clutter/clutter/clutter-animatable.c b/clutter/clutter/clutter-animatable.c index e8c9511106c839abc5a6a0c8f498d4aea15ce2ba..e14012c5d8680fa837193082ebdfd8202623c00d 100644 --- a/clutter/clutter/clutter-animatable.c +++ b/clutter/clutter/clutter-animatable.c @@ -27,35 +27,23 @@ * @short_description: Interface for animatable classes * * #ClutterAnimatable is an interface that allows a #GObject class - * to control how a #ClutterAnimation will animate a property. + * to control how an actor will animate a property. * * Each #ClutterAnimatable should implement the * #ClutterAnimatableInterface.interpolate_property() virtual function of the * interface to compute the animation state between two values of an interval * depending on a progress factor, expressed as a floating point value. * - * If a #ClutterAnimatable is animated by a #ClutterAnimation - * instance, the #ClutterAnimation will call - * clutter_animatable_interpolate_property() passing the name of the - * currently animated property; the values interval; and the progress factor. - * The #ClutterAnimatable implementation should return the computed value for - * the animated - * property. - * * #ClutterAnimatable is available since Clutter 1.0 */ #include "clutter-build-config.h" -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - #include "clutter-animatable.h" #include "clutter-interval.h" #include "clutter-debug.h" #include "clutter-private.h" -#include "deprecated/clutter-animation.h" - G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT); static void diff --git a/clutter/clutter/clutter-animatable.h b/clutter/clutter/clutter-animatable.h index 0b194514a0d3477c862eb4258bb924c5c352872d..d03e0589de2c32ddd1fcef3b7a15da82f485beb9 100644 --- a/clutter/clutter/clutter-animatable.h +++ b/clutter/clutter/clutter-animatable.h @@ -42,8 +42,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable, /** * ClutterAnimatableInterface: - * @animate_property: virtual function for custom interpolation of a - * property. This virtual function is deprecated * @find_property: virtual function for retrieving the #GParamSpec of * an animatable property * @get_initial_state: virtual function for retrieving the initial @@ -53,9 +51,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable, * @interpolate_value: virtual function for interpolating the progress * of a property * - * Base interface for #GObjects that can be animated by a - * a #ClutterAnimation. - * * Since: 1.0 */ struct _ClutterAnimatableInterface @@ -64,13 +59,6 @@ struct _ClutterAnimatableInterface GTypeInterface parent_iface; /*< public >*/ - gboolean (* animate_property) (ClutterAnimatable *animatable, - ClutterAnimation *animation, - const gchar *property_name, - const GValue *initial_value, - const GValue *final_value, - gdouble progress, - GValue *value); GParamSpec *(* find_property) (ClutterAnimatable *animatable, const gchar *property_name); void (* get_initial_state) (ClutterAnimatable *animatable, diff --git a/clutter/clutter/clutter-box-layout.c b/clutter/clutter/clutter-box-layout.c index a3197f43f34ed47ad6146212606b30f0875124a5..112200258ec6cd4809c1192a278ef14c0a186a91 100644 --- a/clutter/clutter/clutter-box-layout.c +++ b/clutter/clutter/clutter-box-layout.c @@ -54,7 +54,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-box-layout.h" @@ -78,7 +77,7 @@ struct _ClutterBoxLayoutPrivate guint spacing; - gulong easing_mode; + ClutterAnimationMode easing_mode; guint easing_duration; ClutterOrientation orientation; @@ -1267,7 +1266,7 @@ clutter_box_layout_set_property (GObject *gobject, break; case PROP_EASING_MODE: - clutter_box_layout_set_easing_mode (self, g_value_get_ulong (value)); + clutter_box_layout_set_easing_mode (self, g_value_get_enum (value)); break; case PROP_EASING_DURATION: @@ -1316,7 +1315,7 @@ clutter_box_layout_get_property (GObject *gobject, break; case PROP_EASING_MODE: - g_value_set_ulong (value, priv->easing_mode); + g_value_set_enum (value, priv->easing_mode); break; case PROP_EASING_DURATION: @@ -1449,11 +1448,6 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass) * The easing mode for the animations, in case * #ClutterBoxLayout:use-animations is set to %TRUE. * - * The easing mode has the same semantics of #ClutterAnimation:mode: it can - * either be a value from the #ClutterAnimationMode enumeration, like - * %CLUTTER_EASE_OUT_CUBIC, or a logical id as returned by - * clutter_alpha_register_func(). - * * The default value is %CLUTTER_EASE_OUT_CUBIC. * * Since: 1.2 @@ -1462,12 +1456,12 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass) * the children when allocating them. */ obj_props[PROP_EASING_MODE] = - g_param_spec_ulong ("easing-mode", - P_("Easing Mode"), - P_("The easing mode of the animations"), - 0, G_MAXULONG, - CLUTTER_EASE_OUT_CUBIC, - CLUTTER_PARAM_READWRITE); + g_param_spec_enum ("easing-mode", + P_("Easing Mode"), + P_("The easing mode of the animations"), + CLUTTER_TYPE_ANIMATION_MODE, + CLUTTER_EASE_OUT_CUBIC, + CLUTTER_PARAM_READWRITE); /** * ClutterBoxLayout:easing-duration: @@ -2244,8 +2238,7 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout) /** * clutter_box_layout_set_easing_mode: * @layout: a #ClutterBoxLayout - * @mode: an easing mode, either from #ClutterAnimationMode or a logical id - * from clutter_alpha_register_func() + * @mode: a #ClutterAnimationMode * * Sets the easing mode to be used by @layout when animating changes in layout * properties. @@ -2256,8 +2249,8 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout) * of the children when allocating them. */ void -clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, - gulong mode) +clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, + ClutterAnimationMode mode) { ClutterBoxLayoutPrivate *priv; @@ -2285,7 +2278,7 @@ clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, * * Deprecated: 1.12 */ -gulong +ClutterAnimationMode clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout) { g_return_val_if_fail (CLUTTER_IS_BOX_LAYOUT (layout), diff --git a/clutter/clutter/clutter-box-layout.h b/clutter/clutter/clutter-box-layout.h index fdced8f4139d7fe941dc75d21a03232b0d149d8b..999742dcd85a7903758ded3435b40f8761ffc902 100644 --- a/clutter/clutter/clutter-box-layout.h +++ b/clutter/clutter/clutter-box-layout.h @@ -153,10 +153,10 @@ void clutter_box_layout_set_use_animations (ClutterBoxLayou CLUTTER_DEPRECATED gboolean clutter_box_layout_get_use_animations (ClutterBoxLayout *layout); CLUTTER_DEPRECATED -void clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, - gulong mode); +void clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, + ClutterAnimationMode mode); CLUTTER_DEPRECATED -gulong clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout); +ClutterAnimationMode clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout); CLUTTER_DEPRECATED void clutter_box_layout_set_easing_duration (ClutterBoxLayout *layout, guint msecs); diff --git a/clutter/clutter/clutter-deprecated.h b/clutter/clutter/clutter-deprecated.h index e793c3f6bdba71498a01c7f7f30d0d0a3d11ac27..c2bb1cff264bb7bc1d05cee7c67a3e889e879c8e 100644 --- a/clutter/clutter/clutter-deprecated.h +++ b/clutter/clutter/clutter-deprecated.h @@ -4,14 +4,11 @@ #define __CLUTTER_DEPRECATED_H_INSIDE__ #include "deprecated/clutter-actor.h" -#include "deprecated/clutter-alpha.h" -#include "deprecated/clutter-animation.h" #include "deprecated/clutter-box.h" #include "deprecated/clutter-container.h" #include "deprecated/clutter-group.h" #include "deprecated/clutter-rectangle.h" #include "deprecated/clutter-stage.h" -#include "deprecated/clutter-state.h" #include "deprecated/clutter-timeline.h" #undef __CLUTTER_DEPRECATED_H_INSIDE__ diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index ed178762b05a0ee60ec009e50b8ed1a72ae63c80..2d4f41c427b4d67d0cf663b64e2074b46672f72c 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -190,7 +190,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/ * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for * registered global alpha functions * - * The animation modes used by #ClutterAlpha and #ClutterAnimation. This + * The animation modes used by #ClutterAnimatable. This * enumeration can be expanded in later versions of Clutter. * *
diff --git a/clutter/clutter/clutter-interval.c b/clutter/clutter/clutter-interval.c index 6f14287b402cf61242d9fc14264fc49455e44df9..97d2026aa818dcc4d3e323d114889cb0f459fe35 100644 --- a/clutter/clutter/clutter-interval.c +++ b/clutter/clutter/clutter-interval.c @@ -37,9 +37,6 @@ * any object taking a reference on a #ClutterInterval instance should * also take ownership of the interval by using g_object_ref_sink(). * - * #ClutterInterval is used by #ClutterAnimation to define the - * interval of values that an implicit animation should tween over. - * * #ClutterInterval can be subclassed to override the validation * and value computation. * diff --git a/clutter/clutter/clutter-layout-manager.c b/clutter/clutter/clutter-layout-manager.c index 13dbd6c0ba2c02e57be89360885572f033acf7b2..6fb49b7a5bb57bb2045bfb79a721ec13a47c021b 100644 --- a/clutter/clutter/clutter-layout-manager.c +++ b/clutter/clutter/clutter-layout-manager.c @@ -136,7 +136,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-debug.h" #include "clutter-layout-manager.h" @@ -164,7 +163,6 @@ G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager, G_TYPE_INITIALLY_UNOWNED) static GQuark quark_layout_meta = 0; -static GQuark quark_layout_alpha = 0; static guint manager_signals[LAST_SIGNAL] = { 0, }; @@ -301,96 +299,12 @@ layout_manager_real_get_child_meta_type (ClutterLayoutManager *manager) return G_TYPE_INVALID; } -/* XXX:2.0 - Remove */ -static ClutterAlpha * -layout_manager_real_begin_animation (ClutterLayoutManager *manager, - guint duration, - gulong mode) -{ - ClutterTimeline *timeline; - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha != NULL) - { - clutter_alpha_set_mode (alpha, mode); - - timeline = clutter_alpha_get_timeline (alpha); - clutter_timeline_set_duration (timeline, duration); - clutter_timeline_rewind (timeline); - - return alpha; - }; - - timeline = clutter_timeline_new (duration); - - alpha = clutter_alpha_new_full (timeline, mode); - - /* let the alpha take ownership of the timeline */ - g_object_unref (timeline); - - g_signal_connect_swapped (timeline, "new-frame", - G_CALLBACK (clutter_layout_manager_layout_changed), - manager); - - g_object_set_qdata_full (G_OBJECT (manager), - quark_layout_alpha, alpha, - (GDestroyNotify) g_object_unref); - - clutter_timeline_start (timeline); - - return alpha; -} - -/* XXX:2.0 - Remove */ -static gdouble -layout_manager_real_get_animation_progress (ClutterLayoutManager *manager) -{ - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha == NULL) - return 1.0; - - return clutter_alpha_get_alpha (alpha); -} - -/* XXX:2.0 - Remove */ -static void -layout_manager_real_end_animation (ClutterLayoutManager *manager) -{ - ClutterTimeline *timeline; - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha == NULL) - return; - - timeline = clutter_alpha_get_timeline (alpha); - g_assert (timeline != NULL); - - if (clutter_timeline_is_playing (timeline)) - clutter_timeline_stop (timeline); - - g_signal_handlers_disconnect_by_func (timeline, - G_CALLBACK (clutter_layout_manager_layout_changed), - manager); - - g_object_set_qdata (G_OBJECT (manager), quark_layout_alpha, NULL); - - clutter_layout_manager_layout_changed (manager); -} - static void clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) { quark_layout_meta = g_quark_from_static_string ("clutter-layout-manager-child-meta"); - /* XXX:2.0 - Remove */ - quark_layout_alpha = - g_quark_from_static_string ("clutter-layout-manager-alpha"); - klass->get_preferred_width = layout_manager_real_get_preferred_width; klass->get_preferred_height = layout_manager_real_get_preferred_height; klass->allocate = layout_manager_real_allocate; @@ -398,9 +312,6 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) klass->get_child_meta_type = layout_manager_real_get_child_meta_type; /* XXX:2.0 - Remove */ - klass->begin_animation = layout_manager_real_begin_animation; - klass->get_animation_progress = layout_manager_real_get_animation_progress; - klass->end_animation = layout_manager_real_end_animation; klass->set_container = layout_manager_real_set_container; /** diff --git a/clutter/clutter/clutter-layout-manager.h b/clutter/clutter/clutter-layout-manager.h index 00f7118031fe834e2d13e27b05486ced46e96d05..ec87e0ed7f7bf00e05f02531f21814bce14afd0e 100644 --- a/clutter/clutter/clutter-layout-manager.h +++ b/clutter/clutter/clutter-layout-manager.h @@ -126,15 +126,6 @@ struct _ClutterLayoutManagerClass ClutterContainer *container, ClutterActor *actor); - /* deprecated */ - ClutterAlpha * (* begin_animation) (ClutterLayoutManager *manager, - guint duration, - gulong mode); - /* deprecated */ - gdouble (* get_animation_progress) (ClutterLayoutManager *manager); - /* deprecated */ - void (* end_animation) (ClutterLayoutManager *manager); - void (* layout_changed) (ClutterLayoutManager *manager); /*< private >*/ diff --git a/clutter/clutter/clutter-script-parser.c b/clutter/clutter/clutter-script-parser.c index ea14b4166cfc1bdc535ddaea0358dd4c754808d3..bf3d51878391adecf56116ff9dc8169e3560c6c2 100644 --- a/clutter/clutter/clutter-script-parser.c +++ b/clutter/clutter/clutter-script-parser.c @@ -34,7 +34,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-actor.h" #include "clutter-debug.h" @@ -799,232 +798,6 @@ parse_signals (ClutterScript *script, return retval; } -static ClutterTimeline * -construct_timeline (ClutterScript *script, - JsonObject *object) -{ - ClutterTimeline *retval = NULL; - ObjectInfo *oinfo; - GList *members, *l; - - /* we fake an ObjectInfo so we can reuse clutter_script_construct_object() - * here; we do not save it inside the hash table, because if this had - * been a named object then we wouldn't have ended up here in the first - * place - */ - oinfo = g_slice_new0 (ObjectInfo); - oinfo->gtype = CLUTTER_TYPE_TIMELINE; - oinfo->id = g_strdup ("dummy"); - - members = json_object_get_members (object); - for (l = members; l != NULL; l = l->next) - { - const gchar *name = l->data; - JsonNode *node = json_object_get_member (object, name); - PropertyInfo *pinfo = g_slice_new0 (PropertyInfo); - - pinfo->name = g_strdelimit (g_strdup (name), G_STR_DELIMITERS, '-'); - pinfo->node = json_node_copy (node); - - oinfo->properties = g_list_prepend (oinfo->properties, pinfo); - } - - g_list_free (members); - - _clutter_script_construct_object (script, oinfo); - _clutter_script_apply_properties (script, oinfo); - retval = CLUTTER_TIMELINE (oinfo->object); - - /* we transfer ownership to the alpha function, so we ref before - * destroying the ObjectInfo to avoid the timeline going away - */ - g_object_ref (retval); - object_info_free (oinfo); - - return retval; -} - -/* define the names of the animation modes to match the ones - * that developers might be more accustomed to - */ -static const struct -{ - const gchar *name; - ClutterAnimationMode mode; -} animation_modes[] = { - { "linear", CLUTTER_LINEAR }, - { "easeInQuad", CLUTTER_EASE_IN_QUAD }, - { "easeOutQuad", CLUTTER_EASE_OUT_QUAD }, - { "easeInOutQuad", CLUTTER_EASE_IN_OUT_QUAD }, - { "easeInCubic", CLUTTER_EASE_IN_CUBIC }, - { "easeOutCubic", CLUTTER_EASE_OUT_CUBIC }, - { "easeInOutCubic", CLUTTER_EASE_IN_OUT_CUBIC }, - { "easeInQuart", CLUTTER_EASE_IN_QUART }, - { "easeOutQuart", CLUTTER_EASE_OUT_QUART }, - { "easeInOutQuart", CLUTTER_EASE_IN_OUT_QUART }, - { "easeInQuint", CLUTTER_EASE_IN_QUINT }, - { "easeOutQuint", CLUTTER_EASE_OUT_QUINT }, - { "easeInOutQuint", CLUTTER_EASE_IN_OUT_QUINT }, - { "easeInSine", CLUTTER_EASE_IN_SINE }, - { "easeOutSine", CLUTTER_EASE_OUT_SINE }, - { "easeInOutSine", CLUTTER_EASE_IN_OUT_SINE }, - { "easeInExpo", CLUTTER_EASE_IN_EXPO }, - { "easeOutExpo", CLUTTER_EASE_OUT_EXPO }, - { "easeInOutExpo", CLUTTER_EASE_IN_OUT_EXPO }, - { "easeInCirc", CLUTTER_EASE_IN_CIRC }, - { "easeOutCirc", CLUTTER_EASE_OUT_CIRC }, - { "easeInOutCirc", CLUTTER_EASE_IN_OUT_CIRC }, - { "easeInElastic", CLUTTER_EASE_IN_ELASTIC }, - { "easeOutElastic", CLUTTER_EASE_OUT_ELASTIC }, - { "easeInOutElastic", CLUTTER_EASE_IN_OUT_ELASTIC }, - { "easeInBack", CLUTTER_EASE_IN_BACK }, - { "easeOutBack", CLUTTER_EASE_OUT_BACK }, - { "easeInOutBack", CLUTTER_EASE_IN_OUT_BACK }, - { "easeInBounce", CLUTTER_EASE_IN_BOUNCE }, - { "easeOutBounce", CLUTTER_EASE_OUT_BOUNCE }, - { "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE }, -}; - -static const gint n_animation_modes = G_N_ELEMENTS (animation_modes); - -gulong -_clutter_script_resolve_animation_mode (JsonNode *node) -{ - gint i, res = CLUTTER_CUSTOM_MODE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE) - return CLUTTER_CUSTOM_MODE; - - if (json_node_get_value_type (node) == G_TYPE_INT64) - return json_node_get_int (node); - - if (json_node_get_value_type (node) == G_TYPE_STRING) - { - const gchar *name = json_node_get_string (node); - - /* XXX - we might be able to optimize by changing the ordering - * of the animation_modes array, e.g. - * - special casing linear - * - tokenizing ('ease', 'In', 'Sine') and matching on token - * - binary searching? - */ - for (i = 0; i < n_animation_modes; i++) - { - if (strcmp (animation_modes[i].name, name) == 0) - return animation_modes[i].mode; - } - - if (_clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE, - name, - &res)) - return res; - - g_warning ("Unable to find the animation mode '%s'", name); - } - - return CLUTTER_CUSTOM_MODE; -} - -static ClutterAlphaFunc -resolve_alpha_func (const gchar *name) -{ - static GModule *module = NULL; - ClutterAlphaFunc func; - - CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name); - - if (G_UNLIKELY (!module)) - module = g_module_open (NULL, 0); - - if (g_module_symbol (module, name, (gpointer) &func)) - { - CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table", - name); - return func; - } - - return NULL; -} - -GObject * -_clutter_script_parse_alpha (ClutterScript *script, - JsonNode *node) -{ - GObject *retval = NULL; - JsonObject *object; - ClutterTimeline *timeline = NULL; - ClutterAlphaFunc alpha_func = NULL; - ClutterAnimationMode mode = CLUTTER_CUSTOM_MODE; - JsonNode *val; - gboolean unref_timeline = FALSE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_OBJECT) - return NULL; - - object = json_node_get_object (node); - - val = json_object_get_member (object, "timeline"); - if (val) - { - if (JSON_NODE_TYPE (val) == JSON_NODE_VALUE && - json_node_get_string (val) != NULL) - { - const gchar *id_ = json_node_get_string (val); - - timeline = - CLUTTER_TIMELINE (clutter_script_get_object (script, id_)); - } - else if (JSON_NODE_TYPE (val) == JSON_NODE_OBJECT) - { - timeline = construct_timeline (script, json_node_get_object (val)); - unref_timeline = TRUE; - } - } - - val = json_object_get_member (object, "mode"); - if (val != NULL) - mode = _clutter_script_resolve_animation_mode (val); - - if (mode == CLUTTER_CUSTOM_MODE) - { - val = json_object_get_member (object, "function"); - if (val && json_node_get_string (val) != NULL) - { - alpha_func = resolve_alpha_func (json_node_get_string (val)); - if (!alpha_func) - { - g_warning ("Unable to find the function '%s' in the " - "Clutter alpha functions or the symbols table", - json_node_get_string (val)); - } - } - } - - CLUTTER_NOTE (SCRIPT, "Parsed alpha: %s timeline (%p) (mode:%d, func:%p)", - unref_timeline ? "implicit" : "explicit", - timeline ? timeline : 0x0, - mode != CLUTTER_CUSTOM_MODE ? mode : 0, - alpha_func ? alpha_func : 0x0); - - retval = g_object_new (CLUTTER_TYPE_ALPHA, NULL); - - if (mode != CLUTTER_CUSTOM_MODE) - clutter_alpha_set_mode (CLUTTER_ALPHA (retval), mode); - - if (alpha_func != NULL) - clutter_alpha_set_func (CLUTTER_ALPHA (retval), alpha_func, NULL, NULL); - - clutter_alpha_set_timeline (CLUTTER_ALPHA (retval), timeline); - - /* if we created an implicit timeline, the Alpha has full ownership - * of it now, since it won't be accessible from ClutterScript - */ - if (unref_timeline) - g_object_unref (timeline); - - return retval; -} - static void clutter_script_parser_object_end (JsonParser *json_parser, JsonObject *object) diff --git a/clutter/clutter/clutter-script-private.h b/clutter/clutter/clutter-script-private.h index 9c08d82d68869b0f81070177cb8ad7014fa354ca..52c240e2ad3f8fc3943e35797de10b225f70f4c6 100644 --- a/clutter/clutter/clutter-script-private.h +++ b/clutter/clutter/clutter-script-private.h @@ -110,8 +110,6 @@ gboolean _clutter_script_parse_node (ClutterScript *script, GType _clutter_script_get_type_from_symbol (const gchar *symbol); GType _clutter_script_get_type_from_class (const gchar *name); -gulong _clutter_script_resolve_animation_mode (JsonNode *node); - gboolean _clutter_script_enum_from_string (GType gtype, const gchar *string, gint *enum_value); @@ -128,8 +126,6 @@ gboolean _clutter_script_parse_rect (ClutterScript *script, gboolean _clutter_script_parse_color (ClutterScript *script, JsonNode *node, ClutterColor *color); -GObject *_clutter_script_parse_alpha (ClutterScript *script, - JsonNode *node); gboolean _clutter_script_parse_point (ClutterScript *script, JsonNode *node, graphene_point_t *point); diff --git a/clutter/clutter/clutter-script.c b/clutter/clutter/clutter-script.c index c3221c8f255989a4d65448e8a06b3f383e71390f..89dc166c9b3a2807773846bdd19adbd6637a0a2e 100644 --- a/clutter/clutter/clutter-script.c +++ b/clutter/clutter/clutter-script.c @@ -98,49 +98,6 @@ * respectively) and the "object" string member for calling * g_signal_connect_object() instead of g_signal_connect(). * - * Signals can also be directly attached to a specific state defined - * inside a #ClutterState instance, for instance: - * - * |[ - * ... - * "signals" : [ - * { - * "name" : "enter-event", - * "states" : "button-states", - * "target-state" : "hover" - * }, - * { - * "name" : "leave-event", - * "states" : "button-states", - * "target-state" : "base" - * }, - * { - * "name" : "button-press-event", - * "states" : "button-states", - * "target-state" : "active", - * }, - * { - * "name" : "key-press-event", - * "states" : "button-states", - * "target-state" : "key-focus", - * "warp" : true - * } - * ], - * ... - * ]| - * - * The "states" key defines the #ClutterState instance to be used to - * resolve the "target-state" key; it can be either a script id for a - * #ClutterState built by the same #ClutterScript instance, or to a - * #ClutterState built in code and associated to the #ClutterScript - * instance through the clutter_script_add_states() function. If no - * "states" key is present, then the default #ClutterState associated to - * the #ClutterScript instance will be used; the default #ClutterState - * can be set using clutter_script_add_states() using a %NULL name. The - * "warp" key can be used to warp to a specific state instead of - * animating to it. State changes on signal emission will not affect - * the signal emission chain. - * * Clutter reserves the following names, so classes defining properties * through the usual GObject registration process should avoid using these * names to avoid collisions: @@ -184,9 +141,7 @@ #include "clutter-private.h" #include "clutter-debug.h" -#include "deprecated/clutter-alpha.h" #include "deprecated/clutter-container.h" -#include "deprecated/clutter-state.h" enum { @@ -210,8 +165,6 @@ struct _ClutterScriptPrivate ClutterScriptParser *parser; - GHashTable *states; - gchar **search_paths; gchar *translation_domain; @@ -264,7 +217,6 @@ signal_info_free (gpointer data) g_free (sinfo->name); g_free (sinfo->handler); g_free (sinfo->object); - g_free (sinfo->state); g_free (sinfo->target); g_slice_free (SignalInfo, sinfo); @@ -319,7 +271,6 @@ clutter_script_finalize (GObject *gobject) g_hash_table_destroy (priv->objects); g_strfreev (priv->search_paths); g_free (priv->filename); - g_hash_table_destroy (priv->states); g_free (priv->translation_domain); G_OBJECT_CLASS (clutter_script_parent_class)->finalize (gobject); @@ -454,9 +405,6 @@ clutter_script_init (ClutterScript *script) priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, object_info_free); - priv->states = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - (GDestroyNotify) g_object_unref); } /** @@ -972,65 +920,12 @@ clutter_script_connect_signals (ClutterScript *script, g_free (cd); } -typedef struct { - ClutterState *state; - GObject *emitter; - gchar *target; - gulong signal_id; - gulong hook_id; - gboolean warp_to; -} HookData; - typedef struct { ClutterScript *script; ClutterScriptConnectFunc func; gpointer user_data; } SignalConnectData; -static void -hook_data_free (gpointer data) -{ - if (G_LIKELY (data != NULL)) - { - HookData *hook_data = data; - - g_free (hook_data->target); - g_slice_free (HookData, hook_data); - } -} - -static gboolean -clutter_script_state_change_hook (GSignalInvocationHint *ihint, - guint n_params, - const GValue *params, - gpointer user_data) -{ - HookData *hook_data = user_data; - GObject *emitter; - - emitter = g_value_get_object (¶ms[0]); - - if (emitter == hook_data->emitter) - { - if (hook_data->warp_to) - clutter_state_warp_to_state (hook_data->state, hook_data->target); - else - clutter_state_set_state (hook_data->state, hook_data->target); - } - - return TRUE; -} - -static void -clutter_script_remove_state_change_hook (gpointer user_data, - GObject *object_p) -{ - HookData *hook_data = user_data; - - g_signal_remove_emission_hook (hook_data->signal_id, - hook_data->hook_id); -} - static void connect_each_object (gpointer key, gpointer value, @@ -1070,64 +965,7 @@ connect_each_object (gpointer key, } else { - GObject *state_object = NULL; - const gchar *signal_name, *signal_detail; - gchar **components; - GQuark signal_quark; - guint signal_id; - HookData *hook_data; - - if (sinfo->state == NULL) - state_object = (GObject *) clutter_script_get_states (script, NULL); - else - { - state_object = clutter_script_get_object (script, sinfo->state); - if (state_object == NULL) - state_object = (GObject *) clutter_script_get_states (script, sinfo->state); - } - - if (state_object == NULL) - continue; - - components = g_strsplit (sinfo->name, "::", 2); - if (g_strv_length (components) == 2) - { - signal_name = components[0]; - signal_detail = components[1]; - } - else - { - signal_name = components[0]; - signal_detail = NULL; - } - - signal_id = g_signal_lookup (signal_name, G_OBJECT_TYPE (object)); - if (signal_id == 0) - { - g_strfreev (components); - continue; - } - - if (signal_detail != NULL) - signal_quark = g_quark_from_string (signal_detail); - else - signal_quark = 0; - - hook_data = g_slice_new (HookData); - hook_data->emitter = object; - hook_data->state = CLUTTER_STATE (state_object); - hook_data->target = g_strdup (sinfo->target); - hook_data->warp_to = sinfo->warp_to; - hook_data->signal_id = signal_id; - hook_data->hook_id = - g_signal_add_emission_hook (signal_id, signal_quark, - clutter_script_state_change_hook, - hook_data, - hook_data_free); - - g_object_weak_ref (hook_data->emitter, - clutter_script_remove_state_change_hook, - hook_data); + g_warn_if_reached (); } signal_info_free (sinfo); @@ -1352,72 +1190,6 @@ clutter_script_list_objects (ClutterScript *script) return retval; } -/** - * clutter_script_add_states: - * @script: a #ClutterScript - * @name: (allow-none): a name for the @state, or %NULL to - * set the default #ClutterState - * @state: a #ClutterState - * - * Associates a #ClutterState to the #ClutterScript instance using the given - * name. - * - * The #ClutterScript instance will use @state to resolve target states when - * connecting signal handlers. - * - * The #ClutterScript instance will take a reference on the #ClutterState - * passed to this function. - * - * Since: 1.8 - * - * Deprecated: 1.12 - */ -void -clutter_script_add_states (ClutterScript *script, - const gchar *name, - ClutterState *state) -{ - g_return_if_fail (CLUTTER_IS_SCRIPT (script)); - g_return_if_fail (CLUTTER_IS_STATE (state)); - - if (name == NULL || *name == '\0') - name = "__clutter_script_default_state"; - - g_hash_table_replace (script->priv->states, - g_strdup (name), - g_object_ref (state)); -} - -/** - * clutter_script_get_states: - * @script: a #ClutterScript - * @name: (allow-none): the name of the #ClutterState, or %NULL - * - * Retrieves the #ClutterState for the given @state_name. - * - * If @name is %NULL, this function will return the default - * #ClutterState instance. - * - * Return value: (transfer none): a pointer to the #ClutterState for the - * given name. The #ClutterState is owned by the #ClutterScript instance - * and it should not be unreferenced - * - * Since: 1.8 - * - * Deprecated: 1.12 - */ -ClutterState * -clutter_script_get_states (ClutterScript *script, - const gchar *name) -{ - g_return_val_if_fail (CLUTTER_IS_SCRIPT (script), NULL); - - if (name == NULL || *name == '\0') - name = "__clutter_script_default_state"; - - return g_hash_table_lookup (script->priv->states, name); -} - /** * clutter_script_set_translation_domain: * @script: a #ClutterScript diff --git a/clutter/clutter/clutter-script.h b/clutter/clutter/clutter-script.h index a2ad3721b2223132f9df926a33d2c782e5a9b79d..ca07a68103380228b48f40b0c5e188da15235b22 100644 --- a/clutter/clutter/clutter-script.h +++ b/clutter/clutter/clutter-script.h @@ -179,15 +179,6 @@ void clutter_script_unmerge_objects (ClutterScript CLUTTER_EXPORT void clutter_script_ensure_objects (ClutterScript *script); -CLUTTER_DEPRECATED -void clutter_script_add_states (ClutterScript *script, - const gchar *name, - ClutterState *state); - -CLUTTER_DEPRECATED -ClutterState * clutter_script_get_states (ClutterScript *script, - const gchar *name); - CLUTTER_EXPORT void clutter_script_connect_signals (ClutterScript *script, gpointer user_data); diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c index b6f7ac66653c8b8d8c2de09e0d76b2db6ad2b2bd..cd0e795ebc0698dca532a4b250acdca66fe33be8 100644 --- a/clutter/clutter/clutter-timeline.c +++ b/clutter/clutter/clutter-timeline.c @@ -24,7 +24,6 @@ /** * SECTION:clutter-timeline * @short_description: A class for time-based events - * @see_also: #ClutterAnimation, #ClutterAnimator, #ClutterState * * #ClutterTimeline is a base class for managing time-based event that cause * Clutter to redraw a stage, such as animations. @@ -71,7 +70,7 @@ * when reaching completion by using the #ClutterTimeline:auto-reverse property. * * Timelines are used in the Clutter animation framework by classes like - * #ClutterAnimation, #ClutterAnimator, and #ClutterState. + * #ClutterTransition. * * ## Defining Timelines in ClutterScript * diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index 05c51b6034ebe8f087e0d045947606d2b2332316..1b65573a3cbfe856d0674f13f9b9d78c4b9aef57 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -79,10 +79,6 @@ typedef struct _ClutterKnot ClutterKnot; typedef struct _ClutterMargin ClutterMargin; typedef struct _ClutterPerspective ClutterPerspective; -typedef struct _ClutterAlpha ClutterAlpha; -typedef struct _ClutterAnimation ClutterAnimation; -typedef struct _ClutterState ClutterState; - typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool; typedef struct _ClutterInputDevice ClutterInputDevice; typedef struct _ClutterVirtualInputDevice ClutterVirtualInputDevice; diff --git a/clutter/clutter/deprecated/clutter-alpha.c b/clutter/clutter/deprecated/clutter-alpha.c deleted file mode 100644 index 9560c2ead0d2cd5be4b62e89575630edf3ce2ee9..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-alpha.c +++ /dev/null @@ -1,819 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Matthew Allum - * Jorn Baayen - * Emmanuele Bassi - * Tomas Frydrych - * - * Copyright (C) 2006, 2007, 2008 OpenedHand - * Copyright (C) 2009, 2010 Intel Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/** - * SECTION:clutter-alpha - * @short_description: A class for calculating a value as a function of time - * - * #ClutterAlpha is a class for calculating an floating point value - * dependent only on the position of a #ClutterTimeline. - * - * For newly written code, it is recommended to use the - * #ClutterTimeline:progress-mode property of #ClutterTimeline, or the - * clutter_timeline_set_progress_func() function instead of #ClutterAlpha. - * The #ClutterAlpha class will be deprecated in the future, and will not - * be available any more in the next major version of Clutter. - * - * A #ClutterAlpha binds a #ClutterTimeline to a progress function which - * translates the time T into an adimensional factor alpha. - * - * You should provide a #ClutterTimeline and bind it to the #ClutterAlpha - * instance using clutter_alpha_set_timeline(). You should also set an - * "animation mode", by using the #ClutterAnimationMode values that - * Clutter provides. - * - * Instead of a #ClutterAnimationMode you may provide a function returning - * the alpha value depending on the progress of the timeline, using - * clutter_alpha_set_func() or clutter_alpha_set_closure(). The alpha - * function will be executed each time a new frame in the #ClutterTimeline - * is reached. - * - * Since the alpha function is controlled by the timeline instance, you can - * pause, stop or resume the #ClutterAlpha from calling the alpha function by - * using the appropriate functions of the #ClutterTimeline object. - * - * #ClutterAlpha is available since Clutter 0.2. - * - * #ClutterAlpha is deprecated since Clutter 1.12. #ClutterTimeline and - * the #ClutterTimeline:progress-mode property replace this whole class. - * - * ## ClutterAlpha custom properties for #ClutterScript - * - * #ClutterAlpha defines a custom `function` property for - * #ClutterScript which allows to reference a custom alpha function - * available in the source code. Setting the `function` property - * is equivalent to calling clutter_alpha_set_func() with the - * specified function name. No user data or #GDestroyNotify is - * available to be passed. - * - * The following JSON fragment defines a #ClutterAlpha - * using a #ClutterTimeline with id "sine-timeline" and an alpha - * function called `my_sine_alpha`. - * - * |[ - * { - * "id" : "sine-alpha", - * "timeline" : { - * "id" : "sine-timeline", - * "duration" : 500, - * "loop" : true - * }, - * "function" : "my_sine_alpha" - * } - * ]| - */ - -#include "clutter-build-config.h" - -#include - -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-alpha.h" -#include "clutter-debug.h" -#include "clutter-enum-types.h" -#include "clutter-easing.h" -#include "clutter-main.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -struct _ClutterAlphaPrivate -{ - ClutterTimeline *timeline; - guint timeline_new_frame_id; - - gdouble alpha; - - GClosure *closure; - - ClutterAlphaFunc func; - gpointer user_data; - GDestroyNotify notify; - - gulong mode; -}; - -enum -{ - PROP_0, - - PROP_TIMELINE, - PROP_ALPHA, - PROP_MODE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -static void clutter_scriptable_iface_init (ClutterScriptableIface *iface); - -G_DEFINE_TYPE_WITH_CODE (ClutterAlpha, - clutter_alpha, - G_TYPE_INITIALLY_UNOWNED, - G_ADD_PRIVATE (ClutterAlpha) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_iface_init)); - -static void -timeline_new_frame_cb (ClutterTimeline *timeline, - guint msecs, - ClutterAlpha *alpha) -{ - ClutterAlphaPrivate *priv = alpha->priv; - - /* Update alpha value and notify */ - priv->alpha = clutter_alpha_get_alpha (alpha); - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_ALPHA]); -} - -static void -clutter_alpha_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterAlpha *alpha = CLUTTER_ALPHA (object); - - switch (prop_id) - { - case PROP_TIMELINE: - clutter_alpha_set_timeline (alpha, g_value_get_object (value)); - break; - - case PROP_MODE: - clutter_alpha_set_mode (alpha, g_value_get_ulong (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -clutter_alpha_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv; - - switch (prop_id) - { - case PROP_TIMELINE: - g_value_set_object (value, priv->timeline); - break; - - case PROP_ALPHA: - g_value_set_double (value, priv->alpha); - break; - - case PROP_MODE: - g_value_set_ulong (value, priv->mode); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -clutter_alpha_finalize (GObject *object) -{ - ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv; - - if (priv->notify != NULL) - priv->notify (priv->user_data); - else if (priv->closure != NULL) - g_closure_unref (priv->closure); - - G_OBJECT_CLASS (clutter_alpha_parent_class)->finalize (object); -} - -static void -clutter_alpha_dispose (GObject *object) -{ - ClutterAlpha *self = CLUTTER_ALPHA(object); - - clutter_alpha_set_timeline (self, NULL); - - G_OBJECT_CLASS (clutter_alpha_parent_class)->dispose (object); -} - -static ClutterAlphaFunc -resolve_alpha_func (const gchar *name) -{ - static GModule *module = NULL; - ClutterAlphaFunc func; - - CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name); - - if (G_UNLIKELY (module == NULL)) - module = g_module_open (NULL, 0); - - if (g_module_symbol (module, name, (gpointer) &func)) - { - CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table", - name); - return func; - } - - return NULL; -} - -static void -clutter_alpha_set_custom_property (ClutterScriptable *scriptable, - ClutterScript *script, - const gchar *name, - const GValue *value) -{ - if (strncmp (name, "function", 8) == 0) - { - g_assert (G_VALUE_HOLDS (value, G_TYPE_POINTER)); - if (g_value_get_pointer (value) != NULL) - { - clutter_alpha_set_func (CLUTTER_ALPHA (scriptable), - g_value_get_pointer (value), - NULL, NULL); - } - } - else - g_object_set_property (G_OBJECT (scriptable), name, value); -} - -static gboolean -clutter_alpha_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - if (strncmp (name, "function", 8) == 0) - { - const gchar *func_name = json_node_get_string (node); - - g_value_init (value, G_TYPE_POINTER); - g_value_set_pointer (value, resolve_alpha_func (func_name)); - - return TRUE; - } - - /* we need to do this because we use gulong in place - * of ClutterAnimationMode for ClutterAlpha:mode - */ - if (strncmp (name, "mode", 4) == 0) - { - gulong mode; - - mode = _clutter_script_resolve_animation_mode (node); - - g_value_init (value, G_TYPE_ULONG); - g_value_set_ulong (value, mode); - - return TRUE; - } - - return FALSE; -} - -static void -clutter_scriptable_iface_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_alpha_parse_custom_node; - iface->set_custom_property = clutter_alpha_set_custom_property; -} - -static void -clutter_alpha_class_init (ClutterAlphaClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = clutter_alpha_set_property; - object_class->get_property = clutter_alpha_get_property; - object_class->finalize = clutter_alpha_finalize; - object_class->dispose = clutter_alpha_dispose; - - /** - * ClutterAlpha:timeline: - * - * A #ClutterTimeline instance used to drive the alpha function. - * - * Since: 0.2 - * - * Deprecated: 1.12 - */ - obj_props[PROP_TIMELINE] = - g_param_spec_object ("timeline", - P_("Timeline"), - P_("Timeline used by the alpha"), - CLUTTER_TYPE_TIMELINE, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAlpha:alpha: - * - * The alpha value as computed by the alpha function. The linear - * interval is 0.0 to 1.0, but the Alpha allows overshooting by - * one unit in each direction, so the valid interval is -1.0 to 2.0. - * - * Since: 0.2 - * Deprecated: 1.12: Use #ClutterTimeline::new-frame and - * clutter_timeline_get_progress() instead - */ - obj_props[PROP_ALPHA] = - g_param_spec_double ("alpha", - P_("Alpha value"), - P_("Alpha value as computed by the alpha"), - -1.0, 2.0, - 0.0, - CLUTTER_PARAM_READABLE); - - /** - * ClutterAlpha:mode: - * - * The progress function logical id - a value from the - * #ClutterAnimationMode enumeration. - * - * If %CLUTTER_CUSTOM_MODE is used then the function set using - * clutter_alpha_set_closure() or clutter_alpha_set_func() - * will be used. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterTimeline:progress-mode - */ - obj_props[PROP_MODE] = - g_param_spec_ulong ("mode", - P_("Mode"), - P_("Progress mode"), - 0, G_MAXULONG, - CLUTTER_CUSTOM_MODE, - G_PARAM_CONSTRUCT | CLUTTER_PARAM_READWRITE); - - g_object_class_install_properties (object_class, - PROP_LAST, - obj_props); -} - -static void -clutter_alpha_init (ClutterAlpha *self) -{ - self->priv = clutter_alpha_get_instance_private (self); - self->priv->mode = CLUTTER_CUSTOM_MODE; - self->priv->alpha = 0.0; -} - -/** - * clutter_alpha_get_alpha: - * @alpha: A #ClutterAlpha - * - * Query the current alpha value. - * - * Return Value: The current alpha value for the alpha - * - * Since: 0.2 - * - * Deprecated: 1.12: Use clutter_timeline_get_progress() - */ -gdouble -clutter_alpha_get_alpha (ClutterAlpha *alpha) -{ - ClutterAlphaPrivate *priv; - gdouble retval = 0; - - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), 0); - - priv = alpha->priv; - - if (G_LIKELY (priv->func)) - { - return priv->func (alpha, priv->user_data); - } - else if (priv->closure) - { - GValue params = G_VALUE_INIT; - GValue result_value = G_VALUE_INIT; - - g_object_ref (alpha); - - g_value_init (&result_value, G_TYPE_DOUBLE); - - g_value_init (¶ms, CLUTTER_TYPE_ALPHA); - g_value_set_object (¶ms, alpha); - - g_closure_invoke (priv->closure, &result_value, 1, ¶ms, NULL); - - retval = g_value_get_double (&result_value); - - g_value_unset (&result_value); - g_value_unset (¶ms); - - g_object_unref (alpha); - } - - return retval; -} - -/* - * clutter_alpha_set_closure_internal: - * @alpha: a #ClutterAlpha - * @closure: a #GClosure - * - * Sets the @closure for @alpha. This function does not - * set the #ClutterAlpha:mode property and does not emit - * the #GObject::notify signal for it. - */ -static inline void -clutter_alpha_set_closure_internal (ClutterAlpha *alpha, - GClosure *closure) -{ - ClutterAlphaPrivate *priv = alpha->priv; - - if (priv->notify != NULL) - priv->notify (priv->user_data); - else if (priv->closure != NULL) - g_closure_unref (priv->closure); - - priv->func = NULL; - priv->user_data = NULL; - priv->notify = NULL; - - if (closure == NULL) - return; - - /* need to take ownership of the closure before sinking it */ - priv->closure = g_closure_ref (closure); - g_closure_sink (closure); - - /* set the marshaller */ - if (G_CLOSURE_NEEDS_MARSHAL (closure)) - { - GClosureMarshal marshal = _clutter_marshal_DOUBLE__VOID; - - g_closure_set_marshal (priv->closure, marshal); - } -} - -/** - * clutter_alpha_set_closure: - * @alpha: A #ClutterAlpha - * @closure: A #GClosure - * - * Sets the #GClosure used to compute the alpha value at each - * frame of the #ClutterTimeline bound to @alpha. - * - * Since: 0.8 - * - * Deprecated: 1.12: Use clutter_timeline_set_progress_func() - */ -void -clutter_alpha_set_closure (ClutterAlpha *alpha, - GClosure *closure) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (closure != NULL); - - priv = alpha->priv; - - clutter_alpha_set_closure_internal (alpha, closure); - - priv->mode = CLUTTER_CUSTOM_MODE; - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} - -/** - * clutter_alpha_set_func: - * @alpha: A #ClutterAlpha - * @func: A #ClutterAlphaFunc - * @data: user data to be passed to the alpha function, or %NULL - * @destroy: notify function used when disposing the alpha function - * - * Sets the #ClutterAlphaFunc function used to compute - * the alpha value at each frame of the #ClutterTimeline - * bound to @alpha. - * - * This function will not register @func as a global alpha function. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use clutter_timeline_set_progress_func() - */ -void -clutter_alpha_set_func (ClutterAlpha *alpha, - ClutterAlphaFunc func, - gpointer data, - GDestroyNotify destroy) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (func != NULL); - - priv = alpha->priv; - - if (priv->notify != NULL) - { - priv->notify (priv->user_data); - } - else if (priv->closure != NULL) - { - g_closure_unref (priv->closure); - priv->closure = NULL; - } - - priv->func = func; - priv->user_data = data; - priv->notify = destroy; - - priv->mode = CLUTTER_CUSTOM_MODE; - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} - -/** - * clutter_alpha_set_timeline: - * @alpha: A #ClutterAlpha - * @timeline: A #ClutterTimeline - * - * Binds @alpha to @timeline. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline directly - */ -void -clutter_alpha_set_timeline (ClutterAlpha *alpha, - ClutterTimeline *timeline) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (timeline == NULL || CLUTTER_IS_TIMELINE (timeline)); - - priv = alpha->priv; - - if (priv->timeline == timeline) - return; - - if (priv->timeline) - { - g_signal_handlers_disconnect_by_func (priv->timeline, - timeline_new_frame_cb, - alpha); - - g_object_unref (priv->timeline); - priv->timeline = NULL; - } - - if (timeline) - { - priv->timeline = g_object_ref (timeline); - - g_signal_connect (priv->timeline, "new-frame", - G_CALLBACK (timeline_new_frame_cb), - alpha); - } - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_TIMELINE]); -} - -/** - * clutter_alpha_get_timeline: - * @alpha: A #ClutterAlpha - * - * Gets the #ClutterTimeline bound to @alpha. - * - * Return value: (transfer none): a #ClutterTimeline instance - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline directlry - */ -ClutterTimeline * -clutter_alpha_get_timeline (ClutterAlpha *alpha) -{ - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), NULL); - - return alpha->priv->timeline; -} - -/** - * clutter_alpha_new: - * - * Creates a new #ClutterAlpha instance. You must set a function - * to compute the alpha value using clutter_alpha_set_func() and - * bind a #ClutterTimeline object to the #ClutterAlpha instance - * using clutter_alpha_set_timeline(). - * - * Return value: the newly created empty #ClutterAlpha instance. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -ClutterAlpha * -clutter_alpha_new (void) -{ - return g_object_new (CLUTTER_TYPE_ALPHA, NULL); -} - -/** - * clutter_alpha_new_full: - * @timeline: #ClutterTimeline timeline - * @mode: animation mode - * - * Creates a new #ClutterAlpha instance and sets the timeline - * and animation mode. - * - * See also clutter_alpha_set_timeline() and clutter_alpha_set_mode(). - * - * Return Value: the newly created #ClutterAlpha - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -ClutterAlpha * -clutter_alpha_new_full (ClutterTimeline *timeline, - gulong mode) -{ - g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL); - g_return_val_if_fail (mode != CLUTTER_ANIMATION_LAST, NULL); - - return g_object_new (CLUTTER_TYPE_ALPHA, - "timeline", timeline, - "mode", mode, - NULL); -} - -/** - * clutter_alpha_get_mode: - * @alpha: a #ClutterAlpha - * - * Retrieves the #ClutterAnimationMode used by @alpha. - * - * Return value: the animation mode - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -gulong -clutter_alpha_get_mode (ClutterAlpha *alpha) -{ - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), CLUTTER_CUSTOM_MODE); - - return alpha->priv->mode; -} - -typedef struct _AlphaData { - guint closure_set : 1; - - ClutterAlphaFunc func; - gpointer data; - - GClosure *closure; -} AlphaData; - -static GPtrArray *clutter_alphas = NULL; - -static gdouble -clutter_alpha_easing_func (ClutterAlpha *alpha, - gpointer data G_GNUC_UNUSED) -{ - ClutterAlphaPrivate *priv = alpha->priv; - ClutterTimeline *timeline = priv->timeline; - gdouble t, d; - - if (G_UNLIKELY (priv->timeline == NULL)) - return 0.0; - - t = clutter_timeline_get_elapsed_time (timeline); - d = clutter_timeline_get_duration (timeline); - - return clutter_easing_for_mode (priv->mode, t, d); -} - -/** - * clutter_alpha_set_mode: - * @alpha: a #ClutterAlpha - * @mode: a #ClutterAnimationMode - * - * Sets the progress function of @alpha using the symbolic value - * of @mode, as taken by the #ClutterAnimationMode enumeration. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline and - * clutter_timeline_set_progress_mode() instead - */ -void -clutter_alpha_set_mode (ClutterAlpha *alpha, - gulong mode) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (mode != CLUTTER_ANIMATION_LAST); - - priv = alpha->priv; - - if (mode == CLUTTER_CUSTOM_MODE) - { - priv->mode = mode; - } - else if (mode < CLUTTER_ANIMATION_LAST) - { - if (priv->mode == mode) - return; - - /* sanity check to avoid getting an out of sync - * enum/function mapping - */ - g_assert (clutter_get_easing_func_for_mode (mode) != NULL); - - clutter_alpha_set_closure_internal (alpha, NULL); - - priv->mode = mode; - - CLUTTER_NOTE (ANIMATION, "New easing mode '%s'[%lu]\n", - clutter_get_easing_name_for_mode (priv->mode), - priv->mode); - - priv->func = clutter_alpha_easing_func; - priv->user_data = NULL; - priv->notify = NULL; - } - else if (mode > CLUTTER_ANIMATION_LAST) - { - AlphaData *alpha_data = NULL; - gulong real_index = 0; - - if (priv->mode == mode) - return; - - if (G_UNLIKELY (clutter_alphas == NULL)) - { - g_warning ("No alpha functions defined for ClutterAlpha to use. "); - return; - } - - real_index = mode - CLUTTER_ANIMATION_LAST - 1; - - alpha_data = g_ptr_array_index (clutter_alphas, real_index); - if (G_UNLIKELY (alpha_data == NULL)) - { - g_warning ("No alpha function registered for mode %lu.", - mode); - return; - } - - if (alpha_data->closure_set) - clutter_alpha_set_closure (alpha, alpha_data->closure); - else - { - clutter_alpha_set_closure_internal (alpha, NULL); - - priv->func = alpha_data->func; - priv->user_data = alpha_data->data; - priv->notify = NULL; - } - - priv->mode = mode; - } - else - g_assert_not_reached (); - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} diff --git a/clutter/clutter/deprecated/clutter-alpha.h b/clutter/clutter/deprecated/clutter-alpha.h deleted file mode 100644 index fc030a567c3623a1fcd094c91476bb27d4d1ccea..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-alpha.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Matthew Allum - * Jorn Baayen - * Emmanuele Bassi - * Tomas Frydrych - * - * Copyright (C) 2006, 2007, 2008 OpenedHand - * Copyright (C) 2009 Intel Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __CLUTTER_ALPHA_H__ -#define __CLUTTER_ALPHA_H__ - -#include -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_ALPHA (clutter_alpha_get_type ()) -#define CLUTTER_ALPHA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ALPHA, ClutterAlpha)) -#define CLUTTER_ALPHA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ALPHA, ClutterAlphaClass)) -#define CLUTTER_IS_ALPHA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ALPHA)) -#define CLUTTER_IS_ALPHA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ALPHA)) -#define CLUTTER_ALPHA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ALPHA, ClutterAlphaClass)) - -typedef struct _ClutterAlphaClass ClutterAlphaClass; -typedef struct _ClutterAlphaPrivate ClutterAlphaPrivate; - -/** - * ClutterAlphaFunc: - * @alpha: a #ClutterAlpha - * @user_data: user data passed to the function - * - * A function returning a value depending on the position of - * the #ClutterTimeline bound to @alpha. - * - * Return value: a floating point value - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimelineProgressFunc instead. - */ -typedef gdouble (*ClutterAlphaFunc) (ClutterAlpha *alpha, - gpointer user_data); - -/** - * ClutterAlpha: - * - * #ClutterAlpha combines a #ClutterTimeline and a function. - * The contents of the #ClutterAlpha structure are private and should - * only be accessed using the provided API. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -struct _ClutterAlpha -{ - /*< private >*/ - GInitiallyUnowned parent; - - ClutterAlphaPrivate *priv; -}; - -/** - * ClutterAlphaClass: - * - * Base class for #ClutterAlpha - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -struct _ClutterAlphaClass -{ - /*< private >*/ - GInitiallyUnownedClass parent_class; - - void (*_clutter_alpha_1) (void); - void (*_clutter_alpha_2) (void); - void (*_clutter_alpha_3) (void); - void (*_clutter_alpha_4) (void); - void (*_clutter_alpha_5) (void); -}; - -CLUTTER_DEPRECATED -GType clutter_alpha_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED -ClutterAlpha * clutter_alpha_new (void); -CLUTTER_DEPRECATED -ClutterAlpha * clutter_alpha_new_full (ClutterTimeline *timeline, - gulong mode); -CLUTTER_DEPRECATED -gdouble clutter_alpha_get_alpha (ClutterAlpha *alpha); -CLUTTER_DEPRECATED -void clutter_alpha_set_func (ClutterAlpha *alpha, - ClutterAlphaFunc func, - gpointer data, - GDestroyNotify destroy); -CLUTTER_DEPRECATED -void clutter_alpha_set_closure (ClutterAlpha *alpha, - GClosure *closure); -CLUTTER_DEPRECATED -void clutter_alpha_set_timeline (ClutterAlpha *alpha, - ClutterTimeline *timeline); -CLUTTER_DEPRECATED -ClutterTimeline *clutter_alpha_get_timeline (ClutterAlpha *alpha); -CLUTTER_DEPRECATED -void clutter_alpha_set_mode (ClutterAlpha *alpha, - gulong mode); -CLUTTER_DEPRECATED -gulong clutter_alpha_get_mode (ClutterAlpha *alpha); - -G_END_DECLS - -#endif /* __CLUTTER_ALPHA_H__ */ diff --git a/clutter/clutter/deprecated/clutter-animation.c b/clutter/clutter/deprecated/clutter-animation.c deleted file mode 100644 index 0b5ac51128f22ec2f43d2a58eed08c936b31644e..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-animation.c +++ /dev/null @@ -1,1799 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2008 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Author: - * Emmanuele Bassi - */ - -/** - * SECTION:clutter-animation - * @short_description: Simple implicit animations - * @See_Also: #ClutterAnimatable, #ClutterInterval, #ClutterAlpha, - * #ClutterTimeline - * - * #ClutterAnimation is an object providing simple, implicit animations - * for #GObjects. - * - * #ClutterAnimation instances will bind one or more #GObject properties - * belonging to a #GObject to a #ClutterInterval, and will then use a - * #ClutterAlpha to interpolate the property between the initial and final - * values of the interval. - * - * The duration of the animation is set using clutter_animation_set_duration(). - * The easing mode of the animation is set using clutter_animation_set_mode(). - * - * If you want to control the animation you should retrieve the - * #ClutterTimeline using clutter_animation_get_timeline() and then - * use #ClutterTimeline functions like clutter_timeline_start(), - * clutter_timeline_pause() or clutter_timeline_stop(). - * - * A #ClutterAnimation will emit the #ClutterAnimation::completed signal - * when the #ClutterTimeline used by the animation is completed; unlike - * #ClutterTimeline, though, the #ClutterAnimation::completed will not be - * emitted if #ClutterAnimation:loop is set to %TRUE - that is, a looping - * animation never completes. - * - * If the #GObject instance bound to a #ClutterAnimation implements the - * #ClutterAnimatable interface it is possible for that instance to - * control the way the initial and final states are interpolated. - * - * For convenience, it is possible to use the clutter_actor_animate() - * function call which will take care of setting up and tearing down - * a #ClutterAnimation instance and animate an actor between its current - * state and the specified final state. - * - * #ClutterAnimation is available since Clutter 1.0. - * - * #ClutterAnimation has been deprecated in Clutter 1.12. You should use - * the [implicit animation API][clutter-actor-animation] available inside - * #ClutterActor instead. If you require to define explicit transitions for - * one or more properties in order to reuse them, see #ClutterTransition - * instead. - * - * ## Defining ClutterAnimationMode inside ClutterScript - * - * When defining a #ClutterAnimation inside a ClutterScript - * file or string the #ClutterAnimation:mode can be defined either - * using the #ClutterAnimationMode enumeration values through their - * "nick" (the short string used inside #GEnumValue), their numeric - * id, or using the following strings: - * - * - easeInQuad, easeOutQuad, easeInOutQuad - * - easeInCubic, easeOutCubic, easeInOutCubic - * - easeInQuart, easeOutQuart, easeInOutQuart - * - easeInQuint, easeOutQuint, easeInOutQuint - * - easeInSine, easeOutSine, easeInOutSine - * - easeInExpo, easeOutExpo, easeInOutExpo - * - easeInCirc, easeOutCirc, easeInOutCirc - * - easeInElastic, easeOutElastic, easeInOutElastic - * - easeInBack, easeOutBack, easeInOutBack - * - easeInBounce, easeOutBounce, easeInOutBounce - */ - -#include "clutter-build-config.h" - -#include -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-alpha.h" -#include "clutter-animatable.h" -#include "clutter-animation.h" -#include "clutter-debug.h" -#include "clutter-enum-types.h" -#include "clutter-interval.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -#include "deprecated/clutter-animation.h" - -enum -{ - PROP_0, - - PROP_OBJECT, - PROP_MODE, - PROP_DURATION, - PROP_LOOP, - PROP_TIMELINE, - PROP_ALPHA, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -enum -{ - STARTED, - COMPLETED, - - LAST_SIGNAL -}; - -struct _ClutterAnimationPrivate -{ - GObject *object; - - GHashTable *properties; - - ClutterAlpha *alpha; - ClutterTimeline *timeline; - - guint timeline_started_id; - guint timeline_completed_id; - guint timeline_frame_id; -}; - -static guint animation_signals[LAST_SIGNAL] = { 0, }; - -static GQuark quark_object_animation = 0; - -static void clutter_scriptable_init (ClutterScriptableIface *iface); - -static void clutter_animation_set_alpha_internal (ClutterAnimation *animation, - ClutterAlpha *alpha); -static ClutterAlpha * clutter_animation_get_alpha_internal (ClutterAnimation *animation); -static ClutterTimeline * clutter_animation_get_timeline_internal (ClutterAnimation *animation); - -G_DEFINE_TYPE_WITH_CODE (ClutterAnimation, clutter_animation, G_TYPE_OBJECT, - G_ADD_PRIVATE (ClutterAnimation) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_init)); - -static ClutterAlpha * -clutter_animation_get_alpha_internal (ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (priv->alpha == NULL) - { - ClutterAlpha *alpha; - - alpha = clutter_alpha_new (); - clutter_alpha_set_mode (alpha, CLUTTER_LINEAR); - - priv->alpha = g_object_ref_sink (alpha); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_ALPHA]); - } - - return priv->alpha; -} - -static void -on_actor_destroy (ClutterActor *actor, - ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - GObject *obj = G_OBJECT (actor); - - if (obj == priv->object) - { - g_object_set_qdata (priv->object, quark_object_animation, NULL); - g_signal_handlers_disconnect_by_func (priv->object, - G_CALLBACK (on_actor_destroy), - animation); - g_object_unref (animation); - } -} - -static void -clutter_animation_real_completed (ClutterAnimation *self) -{ - ClutterAnimationPrivate *priv = self->priv; - ClutterAnimatable *animatable = NULL; - ClutterAnimation *animation; - ClutterTimeline *timeline; - ClutterTimelineDirection direction; - gpointer key, value; - GHashTableIter iter; - - timeline = clutter_animation_get_timeline (self); - direction = clutter_timeline_get_direction (timeline); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - animatable = CLUTTER_ANIMATABLE (priv->object); - - /* explicitly set the final state of the animation */ - CLUTTER_NOTE (ANIMATION, "Set final state on object [%p]", priv->object); - g_hash_table_iter_init (&iter, priv->properties); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - const gchar *p_name = key; - ClutterInterval *interval = value; - GValue *p_value; - - if (direction == CLUTTER_TIMELINE_FORWARD) - p_value = clutter_interval_peek_final_value (interval); - else - p_value = clutter_interval_peek_initial_value (interval); - - if (animatable != NULL) - clutter_animatable_set_final_state (animatable, p_name, p_value); - else - g_object_set_property (priv->object, p_name, p_value); - } - - /* at this point, if this animation was created by clutter_actor_animate() - * and friends, the animation will be attached to the object's data; since - * we want to allow developers to use g_signal_connect_after("completed") - * to concatenate a new animation, we need to remove the animation back - * pointer here, and unref() the animation. FIXME - we might want to - * provide a clutter_animation_attach()/clutter_animation_detach() pair - * to let the user reattach an animation - */ - animation = g_object_get_qdata (priv->object, quark_object_animation); - if (animation == self) - { - CLUTTER_NOTE (ANIMATION, "Unsetting animation for actor [%p]", - priv->object); - - g_object_set_qdata (priv->object, quark_object_animation, NULL); - g_signal_handlers_disconnect_by_func (priv->object, - G_CALLBACK (on_actor_destroy), - animation); - - CLUTTER_NOTE (ANIMATION, "Releasing the reference Animation [%p]", - animation); - g_object_unref (animation); - } -} - -static void -clutter_animation_finalize (GObject *gobject) -{ - ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv; - - CLUTTER_NOTE (ANIMATION, - "Destroying properties table for Animation [%p]", - gobject); - g_hash_table_destroy (priv->properties); - - G_OBJECT_CLASS (clutter_animation_parent_class)->finalize (gobject); -} - -static void -clutter_animation_dispose (GObject *gobject) -{ - ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv; - ClutterTimeline *timeline; - - if (priv->alpha != NULL) - timeline = clutter_alpha_get_timeline (priv->alpha); - else - timeline = priv->timeline; - - if (timeline != NULL && priv->timeline_started_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_started_id); - - if (timeline != NULL && priv->timeline_completed_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_completed_id); - - if (timeline != NULL && priv->timeline_frame_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_frame_id); - - priv->timeline_started_id = 0; - priv->timeline_completed_id = 0; - priv->timeline_frame_id = 0; - - if (priv->timeline != NULL) - { - g_object_unref (priv->timeline); - priv->timeline = NULL; - } - - if (priv->alpha != NULL) - { - g_object_unref (priv->alpha); - priv->alpha = NULL; - } - - if (priv->object != NULL) - { - g_object_unref (priv->object); - priv->object = NULL; - } - - G_OBJECT_CLASS (clutter_animation_parent_class)->dispose (gobject); -} - -static void -clutter_animation_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterAnimation *animation = CLUTTER_ANIMATION (gobject); - - switch (prop_id) - { - case PROP_OBJECT: - clutter_animation_set_object (animation, g_value_get_object (value)); - break; - - case PROP_MODE: - clutter_animation_set_mode (animation, g_value_get_ulong (value)); - break; - - case PROP_DURATION: - clutter_animation_set_duration (animation, g_value_get_uint (value)); - break; - - case PROP_LOOP: - clutter_animation_set_loop (animation, g_value_get_boolean (value)); - break; - - case PROP_TIMELINE: - clutter_animation_set_timeline (animation, g_value_get_object (value)); - break; - - case PROP_ALPHA: - clutter_animation_set_alpha_internal (animation, g_value_get_object (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static void -clutter_animation_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterAnimation *animation = CLUTTER_ANIMATION (gobject); - ClutterAnimationPrivate *priv = animation->priv; - - switch (prop_id) - { - case PROP_OBJECT: - g_value_set_object (value, priv->object); - break; - - case PROP_MODE: - g_value_set_ulong (value, clutter_animation_get_mode (animation)); - break; - - case PROP_DURATION: - g_value_set_uint (value, clutter_animation_get_duration (animation)); - break; - - case PROP_LOOP: - g_value_set_boolean (value, clutter_animation_get_loop (animation)); - break; - - case PROP_TIMELINE: - g_value_set_object (value, clutter_animation_get_timeline (animation)); - break; - - case PROP_ALPHA: - g_value_set_object (value, clutter_animation_get_alpha_internal (animation)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static gboolean -clutter_animation_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - if (strncmp (name, "mode", 4) == 0) - { - gulong mode; - - mode = _clutter_script_resolve_animation_mode (node); - - g_value_init (value, G_TYPE_ULONG); - g_value_set_ulong (value, mode); - - return TRUE; - } - - return FALSE; -} - -static void -clutter_scriptable_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_animation_parse_custom_node; -} - -static void -clutter_animation_class_init (ClutterAnimationClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - quark_object_animation = - g_quark_from_static_string ("clutter-actor-animation"); - - klass->completed = clutter_animation_real_completed; - - gobject_class->set_property = clutter_animation_set_property; - gobject_class->get_property = clutter_animation_get_property; - gobject_class->dispose = clutter_animation_dispose; - gobject_class->finalize = clutter_animation_finalize; - - /** - * ClutterAnimation:object: - * - * The #GObject to which the animation applies. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_OBJECT] = - g_param_spec_object ("object", - P_("Object"), - P_("Object to which the animation applies"), - G_TYPE_OBJECT, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:mode: - * - * The animation mode, either a value from #ClutterAnimationMode - * or a value returned by clutter_alpha_register_func(). The - * default value is %CLUTTER_LINEAR. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_MODE] = - g_param_spec_ulong ("mode", - P_("Mode"), - P_("The mode of the animation"), - 0, G_MAXULONG, - CLUTTER_LINEAR, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:duration: - * - * The duration of the animation, expressed in milliseconds. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_DURATION] = - g_param_spec_uint ("duration", - P_("Duration"), - P_("Duration of the animation, in milliseconds"), - 0, G_MAXUINT, - 0, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:loop: - * - * Whether the animation should loop. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_LOOP] = - g_param_spec_boolean ("loop", - P_("Loop"), - P_("Whether the animation should loop"), - FALSE, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:timeline: - * - * The #ClutterTimeline used by the animation. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_TIMELINE] = - g_param_spec_object ("timeline", - P_("Timeline"), - P_("The timeline used by the animation"), - CLUTTER_TYPE_TIMELINE, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:alpha: - * - * The #ClutterAlpha used by the animation. - * - * Since: 1.0 - * - * Deprecated: 1.10: Use the #ClutterAnimation:timeline property and - * the #ClutterTimeline:progress-mode property instead. - */ - obj_props[PROP_ALPHA] = - g_param_spec_object ("alpha", - P_("Alpha"), - P_("The alpha used by the animation"), - CLUTTER_TYPE_ALPHA, - CLUTTER_PARAM_READWRITE | G_PARAM_DEPRECATED); - - g_object_class_install_properties (gobject_class, - PROP_LAST, - obj_props); - - /** - * ClutterAnimation::started: - * @animation: the animation that emitted the signal - * - * The ::started signal is emitted once the animation has been - * started - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - animation_signals[STARTED] = - g_signal_new (I_("started"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterAnimationClass, started), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - /** - * ClutterAnimation::completed: - * @animation: the animation that emitted the signal - * - * The ::completed signal is emitted once the animation has - * been completed. - * - * The @animation instance is guaranteed to be valid for the entire - * duration of the signal emission chain. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - animation_signals[COMPLETED] = - g_signal_new (I_("completed"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterAnimationClass, completed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); -} - -static void -clutter_animation_init (ClutterAnimation *self) -{ - self->priv = clutter_animation_get_instance_private (self); - - self->priv->properties = - g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) g_object_unref); -} - -static inline void -clutter_animation_bind_property_internal (ClutterAnimation *animation, - const gchar *property_name, - GParamSpec *pspec, - ClutterInterval *interval) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (!clutter_interval_validate (interval, pspec)) - { - g_warning ("Cannot bind property '%s': the interval is out " - "of bounds", - property_name); - return; - } - - g_hash_table_insert (priv->properties, - g_strdup (property_name), - g_object_ref_sink (interval)); -} - -static inline void -clutter_animation_update_property_internal (ClutterAnimation *animation, - const gchar *property_name, - GParamSpec *pspec, - ClutterInterval *interval) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (!clutter_interval_validate (interval, pspec)) - { - g_warning ("Cannot bind property '%s': the interval is out " - "of bounds", - property_name); - return; - } - - g_hash_table_replace (priv->properties, - g_strdup (property_name), - g_object_ref_sink (interval)); -} - -/** - * clutter_animation_has_property: - * @animation: a #ClutterAnimation - * @property_name: name of the property - * - * Checks whether @animation is controlling @property_name. - * - * Return value: %TRUE if the property is animated by the - * #ClutterAnimation, %FALSE otherwise - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gboolean -clutter_animation_has_property (ClutterAnimation *animation, - const gchar *property_name) -{ - ClutterAnimationPrivate *priv; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE); - g_return_val_if_fail (property_name != NULL, FALSE); - - priv = animation->priv; - - return g_hash_table_lookup (priv->properties, property_name) != NULL; -} - -/** - * clutter_animation_get_interval: - * @animation: a #ClutterAnimation - * @property_name: name of the property - * - * Retrieves the #ClutterInterval associated to @property_name - * inside @animation. - * - * Return value: (transfer none): a #ClutterInterval or %NULL if no - * property with the same name was found. The returned interval is - * owned by the #ClutterAnimation and should not be unreferenced - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterInterval * -clutter_animation_get_interval (ClutterAnimation *animation, - const gchar *property_name) -{ - ClutterAnimationPrivate *priv; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), NULL); - g_return_val_if_fail (property_name != NULL, NULL); - - priv = animation->priv; - - return g_hash_table_lookup (priv->properties, property_name); -} - -static void -on_timeline_started (ClutterTimeline *timeline, - ClutterAnimation *animation) -{ - g_signal_emit (animation, animation_signals[STARTED], 0); -} - -static void -on_timeline_completed (ClutterTimeline *timeline, - ClutterAnimation *animation) -{ - CLUTTER_NOTE (ANIMATION, "Timeline [%p] complete", timeline); - - if (!clutter_animation_get_loop (animation)) - g_signal_emit (animation, animation_signals[COMPLETED], 0); -} - -static void -on_timeline_frame (ClutterTimeline *timeline, - gint elapsed, - ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv; - GList *properties, *p; - gdouble alpha_value; - gboolean is_animatable = FALSE; - ClutterAnimatable *animatable = NULL; - - /* make sure the animation survives the notification */ - g_object_ref (animation); - - priv = animation->priv; - - if (priv->alpha != NULL) - alpha_value = clutter_alpha_get_alpha (priv->alpha); - else - alpha_value = clutter_timeline_get_progress (priv->timeline); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - { - animatable = CLUTTER_ANIMATABLE (priv->object); - is_animatable = TRUE; - } - - g_object_freeze_notify (priv->object); - - properties = g_hash_table_get_keys (priv->properties); - for (p = properties; p != NULL; p = p->next) - { - const gchar *p_name = p->data; - ClutterInterval *interval; - GValue value = G_VALUE_INIT; - gboolean apply; - - interval = g_hash_table_lookup (priv->properties, p_name); - g_assert (CLUTTER_IS_INTERVAL (interval)); - - g_value_init (&value, clutter_interval_get_value_type (interval)); - - if (is_animatable) - { - apply = clutter_animatable_interpolate_value (animatable, p_name, - interval, - alpha_value, - &value); - } - else - { - apply = clutter_interval_compute_value (interval, - alpha_value, - &value); - } - - if (apply) - { - if (is_animatable) - clutter_animatable_set_final_state (animatable, p_name, &value); - else - g_object_set_property (priv->object, p_name, &value); - } - - g_value_unset (&value); - } - - g_list_free (properties); - - g_object_thaw_notify (priv->object); - - g_object_unref (animation); -} - -static ClutterTimeline * -clutter_animation_get_timeline_internal (ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - ClutterTimeline *timeline; - - if (priv->timeline != NULL) - return priv->timeline; - - if (priv->alpha != NULL) - { - timeline = clutter_alpha_get_timeline (priv->alpha); - if (timeline != NULL) - return timeline; - } - - timeline = g_object_new (CLUTTER_TYPE_TIMELINE, NULL); - - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - - if (priv->alpha != NULL) - { - clutter_alpha_set_timeline (priv->alpha, timeline); - - /* the alpha owns the timeline now */ - g_object_unref (timeline); - } - - priv->timeline = timeline; - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - - return priv->timeline; -} - -static void -clutter_animation_set_alpha_internal (ClutterAnimation *animation, - ClutterAlpha *alpha) -{ - ClutterAnimationPrivate *priv; - ClutterTimeline *timeline; - - priv = animation->priv; - - if (priv->alpha == alpha) - return; - - g_object_freeze_notify (G_OBJECT (animation)); - - if (priv->alpha != NULL) - timeline = clutter_alpha_get_timeline (priv->alpha); - else - timeline = NULL; - - /* disconnect the old timeline first */ - if (timeline != NULL && priv->timeline_started_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_started_id); - priv->timeline_started_id = 0; - } - - if (timeline != NULL && priv->timeline_completed_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_completed_id); - priv->timeline_completed_id = 0; - } - - /* then we need to disconnect the signal handler from the old alpha */ - if (timeline != NULL && priv->timeline_frame_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_frame_id); - priv->timeline_frame_id = 0; - } - - if (priv->alpha != NULL) - { - /* this will take care of any reference we hold on the timeline */ - g_object_unref (priv->alpha); - priv->alpha = NULL; - } - - if (alpha == NULL) - goto out; - - priv->alpha = g_object_ref_sink (alpha); - - /* if the alpha has a timeline then we use it, otherwise we create one */ - timeline = clutter_alpha_get_timeline (priv->alpha); - if (timeline != NULL) - { - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - } - else - { - /* FIXME - add a create_timeline_internal() because this does - * not look very good - */ - (void) clutter_animation_get_timeline_internal (animation); - } - -out: - /* emit all relevant notifications */ - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_MODE]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_ALPHA]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_new: - * - * Creates a new #ClutterAnimation instance. You should set the - * #GObject to be animated using clutter_animation_set_object(), - * set the duration with clutter_animation_set_duration() and the - * easing mode using clutter_animation_set_mode(). - * - * The clutter_actor_animate() and relative family of functions provide - * an easy way to animate a #ClutterActor and automatically manage the - * lifetime of a #ClutterAnimation instance, so you should consider using - * those functions instead of manually creating an animation. - * - * Return value: the newly created #ClutterAnimation. Use g_object_unref() - * to release the associated resources - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterAnimation * -clutter_animation_new (void) -{ - return g_object_new (CLUTTER_TYPE_ANIMATION, NULL); -} - -/** - * clutter_animation_set_object: - * @animation: a #ClutterAnimation - * @object: a #GObject - * - * Attaches @animation to @object. The #ClutterAnimation will take a - * reference on @object. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_object (ClutterAnimation *animation, - GObject *object) -{ - ClutterAnimationPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - - priv = animation->priv; - - if (priv->object != NULL) - { - g_object_set_qdata (priv->object, quark_object_animation, NULL); - - g_object_unref (priv->object); - priv->object = NULL; - } - - if (object != NULL) - priv->object = g_object_ref (object); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_OBJECT]); -} - -/** - * clutter_animation_set_mode: - * @animation: a #ClutterAnimation - * @mode: an animation mode logical id - * - * Sets the animation @mode of @animation. The animation @mode is - * a logical id, either coming from the #ClutterAnimationMode enumeration - * or the return value of clutter_alpha_register_func(). - * - * This function will also set #ClutterAnimation:alpha if needed. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_mode (ClutterAnimation *animation, - gulong mode) -{ - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - if (animation->priv->alpha != NULL || mode > CLUTTER_ANIMATION_LAST) - { - ClutterAlpha *alpha; - - if (animation->priv->alpha == NULL) - alpha = clutter_animation_get_alpha_internal (animation); - else - alpha = animation->priv->alpha; - - clutter_alpha_set_mode (alpha, mode); - } - else - { - ClutterTimeline *timeline; - - timeline = clutter_animation_get_timeline_internal (animation); - - clutter_timeline_set_progress_mode (timeline, mode); - } - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_MODE]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_mode: - * @animation: a #ClutterAnimation - * - * Retrieves the animation mode of @animation, as set by - * clutter_animation_set_mode(). - * - * Return value: the mode for the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gulong -clutter_animation_get_mode (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), CLUTTER_LINEAR); - - if (animation->priv->alpha != NULL) - return clutter_alpha_get_mode (animation->priv->alpha); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_progress_mode (timeline); -} - -/** - * clutter_animation_set_duration: - * @animation: a #ClutterAnimation - * @msecs: the duration in milliseconds - * - * Sets the duration of @animation in milliseconds. - * - * This function will set #ClutterAnimation:alpha and - * #ClutterAnimation:timeline if needed. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_duration (ClutterAnimation *animation, - guint msecs) -{ - ClutterTimeline *timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - timeline = clutter_animation_get_timeline_internal (animation); - clutter_timeline_set_duration (timeline, msecs); - clutter_timeline_rewind (timeline); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_set_loop: - * @animation: a #ClutterAnimation - * @loop: %TRUE if the animation should loop - * - * Sets whether @animation should loop over itself once finished. - * - * A looping #ClutterAnimation will not emit the #ClutterAnimation::completed - * signal when finished. - * - * This function will set #ClutterAnimation:alpha and - * #ClutterAnimation:timeline if needed. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_loop (ClutterAnimation *animation, - gboolean loop) -{ - ClutterTimeline *timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - timeline = clutter_animation_get_timeline_internal (animation); - clutter_timeline_set_repeat_count (timeline, loop ? -1 : 0); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_loop: - * @animation: a #ClutterAnimation - * - * Retrieves whether @animation is looping. - * - * Return value: %TRUE if the animation is looping - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gboolean -clutter_animation_get_loop (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_repeat_count (timeline) != 0; -} - -/** - * clutter_animation_get_duration: - * @animation: a #ClutterAnimation - * - * Retrieves the duration of @animation, in milliseconds. - * - * Return value: the duration of the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -guint -clutter_animation_get_duration (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), 0); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_duration (timeline); -} - -/** - * clutter_animation_set_timeline: - * @animation: a #ClutterAnimation - * @timeline: (allow-none): a #ClutterTimeline, or %NULL to unset the - * current #ClutterTimeline - * - * Sets the #ClutterTimeline used by @animation. - * - * This function will take a reference on the passed @timeline. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_timeline (ClutterAnimation *animation, - ClutterTimeline *timeline) -{ - ClutterAnimationPrivate *priv; - ClutterTimeline *cur_timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - g_return_if_fail (timeline == NULL || CLUTTER_IS_TIMELINE (timeline)); - - priv = animation->priv; - - if (priv->alpha != NULL) - cur_timeline = clutter_alpha_get_timeline (priv->alpha); - else - cur_timeline = priv->timeline; - - if (cur_timeline == timeline) - return; - - g_object_freeze_notify (G_OBJECT (animation)); - - if (cur_timeline != NULL && priv->timeline_started_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_started_id); - - if (cur_timeline != NULL && priv->timeline_completed_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_completed_id); - - if (cur_timeline != NULL && priv->timeline_frame_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_frame_id); - - priv->timeline_started_id = 0; - priv->timeline_completed_id = 0; - priv->timeline_frame_id = 0; - - /* Release previously set timeline if any */ - g_clear_object (&priv->timeline); - - if (priv->alpha != NULL) - clutter_alpha_set_timeline (priv->alpha, timeline); - else - { - /* Hold a reference to the timeline if it's not reffed by the priv->alpha */ - priv->timeline = timeline; - - if (priv->timeline) - g_object_ref (priv->timeline); - } - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - - if (timeline != NULL) - { - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - } - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_timeline: - * @animation: a #ClutterAnimation - * - * Retrieves the #ClutterTimeline used by @animation - * - * Return value: (transfer none): the timeline used by the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterTimeline * -clutter_animation_get_timeline (ClutterAnimation *animation) -{ - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), NULL); - - return clutter_animation_get_timeline_internal (animation); -} - -/* - * starts the timeline - */ -static void -clutter_animation_start (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - timeline = clutter_animation_get_timeline_internal (animation); - - if (G_LIKELY (timeline != NULL)) - clutter_timeline_start (timeline); - else - { - /* sanity check */ - g_warning (G_STRLOC ": no timeline found, unable to start the animation"); - } -} - -static void -clutter_animation_setup_property (ClutterAnimation *animation, - const gchar *property_name, - const GValue *value, - GParamSpec *pspec, - gboolean is_fixed) -{ - ClutterAnimationPrivate *priv = animation->priv; - GValue real_value = G_VALUE_INIT; - - if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) - { - g_warning ("Cannot bind property '%s': the property is " - "construct-only", - property_name); - return; - } - - if (!(pspec->flags & G_PARAM_WRITABLE)) - { - g_warning ("Cannot bind property '%s': the property is " - "not writable", - property_name); - return; - } - - /* initialize the real value that will be used to store the - * final state of the animation - */ - g_value_init (&real_value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - - /* if it's not the same type of the GParamSpec value, try to - * convert it using the GValue transformation API, otherwise - * just copy it - */ - if (!g_type_is_a (G_VALUE_TYPE (value), G_VALUE_TYPE (&real_value))) - { - /* are these two types compatible (can be directly copied)? */ - if (g_value_type_compatible (G_VALUE_TYPE (value), - G_VALUE_TYPE (&real_value))) - { - g_value_copy (value, &real_value); - goto done; - } - - /* are these two type transformable? */ - if (g_value_type_transformable (G_VALUE_TYPE (value), - G_VALUE_TYPE (&real_value))) - { - if (g_value_transform (value, &real_value)) - goto done; - } - - /* if not compatible and not transformable then we can't do much */ - g_warning ("%s: Unable to convert from %s to %s for " - "the property '%s' of object %s", - G_STRLOC, - g_type_name (G_VALUE_TYPE (value)), - g_type_name (G_VALUE_TYPE (&real_value)), - property_name, - G_OBJECT_TYPE_NAME (priv->object)); - g_value_unset (&real_value); - return; - } - else - g_value_copy (value, &real_value); - -done: - /* create an interval and bind it to the property, in case - * it's not a fixed property, otherwise just set it - */ - if (G_LIKELY (!is_fixed)) - { - ClutterInterval *interval; - GValue cur_value = G_VALUE_INIT; - - g_value_init (&cur_value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - clutter_animatable_get_initial_state (CLUTTER_ANIMATABLE (priv->object), - property_name, - &cur_value); - else - g_object_get_property (priv->object, property_name, &cur_value); - - interval = - clutter_interval_new_with_values (G_PARAM_SPEC_VALUE_TYPE (pspec), - &cur_value, - &real_value); - - if (!clutter_animation_has_property (animation, property_name)) - clutter_animation_bind_property_internal (animation, property_name, - pspec, - interval); - else - clutter_animation_update_property_internal (animation, property_name, - pspec, - interval); - - g_value_unset (&cur_value); - } - else - { - if (CLUTTER_IS_ANIMATABLE (priv->object)) - clutter_animatable_set_final_state (CLUTTER_ANIMATABLE (priv->object), - property_name, - &real_value); - else - g_object_set_property (priv->object, property_name, &real_value); - } - - g_value_unset (&real_value); -} - -static const struct -{ - const gchar *name; - GConnectFlags flags; -} signal_prefixes[] = - { - { "::", 0 }, - { "-swapped::", G_CONNECT_SWAPPED }, - { "-after::", G_CONNECT_AFTER }, - { "-swapped-after::", G_CONNECT_SWAPPED | G_CONNECT_AFTER } - }; - -static gboolean -clutter_animation_has_signal_prefix (const gchar *property_name, - GConnectFlags *flags, - int *offset) -{ - int i; - - if (!g_str_has_prefix (property_name, "signal")) - return FALSE; - - for (i = 0; i < G_N_ELEMENTS (signal_prefixes); i++) - if (g_str_has_prefix (property_name + 6, signal_prefixes[i].name)) - { - *offset = strlen (signal_prefixes[i].name) + 6; - *flags = signal_prefixes[i].flags; - return TRUE; - } - - return FALSE; -} - -static void -clutter_animation_setup_valist (ClutterAnimation *animation, - const gchar *first_property_name, - va_list var_args) -{ - ClutterAnimationPrivate *priv = animation->priv; - ClutterAnimatable *animatable = NULL; - GObjectClass *klass = NULL; - const gchar *property_name; - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - animatable = CLUTTER_ANIMATABLE (priv->object); - else - klass = G_OBJECT_GET_CLASS (priv->object); - - property_name = first_property_name; - while (property_name != NULL) - { - GParamSpec *pspec; - GValue final = G_VALUE_INIT; - gchar *error = NULL; - gboolean is_fixed = FALSE; - GConnectFlags flags; - int offset; - - if (clutter_animation_has_signal_prefix (property_name, - &flags, - &offset)) - { - const gchar *signal_name = property_name + offset; - GCallback callback = va_arg (var_args, GCallback); - gpointer userdata = va_arg (var_args, gpointer); - - g_signal_connect_data (animation, signal_name, - callback, userdata, - NULL, flags); - } - else - { - if (g_str_has_prefix (property_name, "fixed::")) - { - property_name += 7; /* strlen("fixed::") */ - is_fixed = TRUE; - } - - if (animatable != NULL) - pspec = clutter_animatable_find_property (animatable, - property_name); - else - pspec = g_object_class_find_property (klass, property_name); - - if (pspec == NULL) - { - g_warning ("Cannot bind property '%s': objects of type '%s' do " - "not have this property", - property_name, - g_type_name (G_OBJECT_TYPE (priv->object))); - break; - } - - G_VALUE_COLLECT_INIT (&final, G_PARAM_SPEC_VALUE_TYPE (pspec), - var_args, 0, - &error); - - if (error) - { - g_warning ("%s: %s", G_STRLOC, error); - g_free (error); - break; - } - - clutter_animation_setup_property (animation, property_name, - &final, - pspec, - is_fixed); - - - g_value_unset (&final); - } - - property_name = va_arg (var_args, gchar*); - } -} - -static ClutterAnimation * -animation_create_for_actor (ClutterActor *actor) -{ - ClutterAnimation *animation; - GObject *object = G_OBJECT (actor); - - animation = g_object_get_qdata (object, quark_object_animation); - if (animation == NULL) - { - animation = clutter_animation_new (); - clutter_animation_set_object (animation, object); - g_object_set_qdata (object, quark_object_animation, animation); - - /* use the ::destroy signal to get a notification - * that the actor went away mid-animation - */ - g_signal_connect (object, "destroy", - G_CALLBACK (on_actor_destroy), - animation); - - CLUTTER_NOTE (ANIMATION, - "Created new Animation [%p] for actor [%p]", - animation, - actor); - } - else - { - CLUTTER_NOTE (ANIMATION, - "Reusing Animation [%p] for actor [%p]", - animation, - actor); - } - - return animation; -} - -/** - * clutter_actor_animate_with_timeline: - * @actor: a #ClutterActor - * @mode: an animation mode logical id - * @timeline: a #ClutterTimeline - * @first_property_name: the name of a property - * @...: a %NULL terminated list of property names and - * property values - * - * Animates the given list of properties of @actor between the current - * value for each property and a new final value. The animation has a - * definite duration given by @timeline and a speed given by the @mode. - * - * See clutter_actor_animate() for further details. - * - * This function is useful if you want to use an existing timeline - * to animate @actor. - * - * Return value: (transfer none): a #ClutterAnimation object. The object is - * owned by the #ClutterActor and should not be unreferenced with - * g_object_unref() - * - * Since: 1.0 - * Deprecated: 1.12: Use the implicit transition for animatable properties - * in #ClutterActor instead. See clutter_actor_save_easing_state(), - * clutter_actor_set_easing_mode(), clutter_actor_set_easing_duration(), - * clutter_actor_set_easing_delay(), and clutter_actor_restore_easing_state(). - */ -ClutterAnimation * -clutter_actor_animate_with_timeline (ClutterActor *actor, - gulong mode, - ClutterTimeline *timeline, - const gchar *first_property_name, - ...) -{ - ClutterAnimation *animation; - va_list args; - - g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); - g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL); - g_return_val_if_fail (first_property_name != NULL, NULL); - - animation = animation_create_for_actor (actor); - clutter_animation_set_mode (animation, mode); - clutter_animation_set_timeline (animation, timeline); - - va_start (args, first_property_name); - clutter_animation_setup_valist (animation, first_property_name, args); - va_end (args); - - clutter_animation_start (animation); - - return animation; -} - -/** - * clutter_actor_animate: - * @actor: a #ClutterActor - * @mode: an animation mode logical id - * @duration: duration of the animation, in milliseconds - * @first_property_name: the name of a property - * @...: a %NULL terminated list of property names and - * property values - * - * Animates the given list of properties of @actor between the current - * value for each property and a new final value. The animation has a - * definite duration and a speed given by the @mode. - * - * For example, this: - * - * |[ - * clutter_actor_animate (rectangle, CLUTTER_LINEAR, 250, - * "width", 100.0, - * "height", 100.0, - * NULL); - * ]| - * - * will make width and height properties of the #ClutterActor "rectangle" - * grow linearly between the current value and 100 pixels, in 250 milliseconds. - * - * The animation @mode is a logical id, either from the #ClutterAnimationMode - * enumeration of from clutter_alpha_register_func(). - * - * All the properties specified will be animated between the current value - * and the final value. If a property should be set at the beginning of - * the animation but not updated during the animation, it should be prefixed - * by the "fixed::" string, for instance: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_SINE, 100, - * "rotation-angle-z", 360.0, - * "fixed::rotation-center-z", ¢er, - * NULL); - * ]| - * - * Will animate the "rotation-angle-z" property between the current value - * and 360 degrees, and set the "rotation-center-z" property to the fixed - * value of the #graphene_point3d_t "center". - * - * This function will implicitly create a #ClutterAnimation object which - * will be assigned to the @actor and will be returned to the developer - * to control the animation or to know when the animation has been - * completed. - * - * If a name argument starts with "signal::", "signal-after::", - * "signal-swapped::" or "signal-swapped-after::" the two following arguments - * are used as callback function and data for a signal handler installed on - * the #ClutterAnimation object for the specified signal name, for instance: - * - * |[ - * static void - * on_animation_completed (ClutterAnimation *animation, - * ClutterActor *actor) - * { - * clutter_actor_hide (actor); - * } - * - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 100, - * "opacity", 0, - * "signal::completed", on_animation_completed, actor, - * NULL); - * ]| - * - * or, to automatically destroy an actor at the end of the animation: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 100, - * "opacity", 0, - * "signal-swapped-after::completed", - * clutter_actor_destroy, - * actor, - * NULL); - * ]| - * - * The "signal::" modifier is the equivalent of using g_signal_connect(); - * the "signal-after::" modifier is the equivalent of using - * g_signal_connect_after() or g_signal_connect_data() with the - * %G_CONNECT_AFTER; the "signal-swapped::" modifier is the equivalent - * of using g_signal_connect_swapped() or g_signal_connect_data() with the - * %G_CONNECT_SWAPPED flah; finally, the "signal-swapped-after::" modifier - * is the equivalent of using g_signal_connect_data() with both the - * %G_CONNECT_AFTER and %G_CONNECT_SWAPPED flags. The clutter_actor_animate() - * function will not keep track of multiple connections to the same signal, - * so it is your responsability to avoid them when calling - * clutter_actor_animate() multiple times on the same actor. - * - * Calling this function on an actor that is already being animated - * will cause the current animation to change with the new final values, - * the new easing mode and the new duration - that is, this code: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_LINEAR, 250, - * "width", 100.0, - * "height", 100.0, - * NULL); - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 500, - * "x", 100.0, - * "y", 100.0, - * "width", 200.0, - * NULL); - * ]| - * - * is the equivalent of: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 500, - * "x", 100.0, - * "y", 100.0, - * "width", 200.0, - * "height", 100.0, - * NULL); - * ]| - * - * Unless the animation is looping, the #ClutterAnimation created by - * clutter_actor_animate() will become invalid as soon as it is - * complete. - * - * Since the created #ClutterAnimation instance attached to @actor - * is guaranteed to be valid throughout the #ClutterAnimation::completed - * signal emission chain, you will not be able to create a new animation - * using clutter_actor_animate() on the same @actor from within the - * #ClutterAnimation::completed signal handler unless you use - * g_signal_connect_after() to connect the callback function, for instance: - * - * |[ - * static void - * on_animation_completed (ClutterAnimation *animation, - * ClutterActor *actor) - * { - * clutter_actor_animate (actor, CLUTTER_EASE_OUT_CUBIC, 250, - * "x", 500.0, - * "y", 500.0, - * NULL); - * } - * - * ... - * animation = clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 250, - * "x", 100.0, - * "y", 100.0, - * NULL); - * g_signal_connect (animation, "completed", - * G_CALLBACK (on_animation_completed), - * actor); - * ... - * ]| - * - * Return value: (transfer none): a #ClutterAnimation object. The object is - * owned by the #ClutterActor and should not be unreferenced with - * g_object_unref() - * - * Since: 1.0 - * Deprecated: 1.12: Use the implicit transition for animatable properties - * in #ClutterActor instead. See clutter_actor_save_easing_state(), - * clutter_actor_set_easing_mode(), clutter_actor_set_easing_duration(), - * clutter_actor_set_easing_delay(), and clutter_actor_restore_easing_state(). - */ -ClutterAnimation * -clutter_actor_animate (ClutterActor *actor, - gulong mode, - guint duration, - const gchar *first_property_name, - ...) -{ - ClutterAnimation *animation; - va_list args; - - g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); - g_return_val_if_fail (mode != CLUTTER_CUSTOM_MODE, NULL); - g_return_val_if_fail (duration > 0, NULL); - g_return_val_if_fail (first_property_name != NULL, NULL); - - animation = animation_create_for_actor (actor); - clutter_animation_set_mode (animation, mode); - clutter_animation_set_duration (animation, duration); - - va_start (args, first_property_name); - clutter_animation_setup_valist (animation, first_property_name, args); - va_end (args); - - clutter_animation_start (animation); - - return animation; -} diff --git a/clutter/clutter/deprecated/clutter-animation.h b/clutter/clutter/deprecated/clutter-animation.h deleted file mode 100644 index 012cf44e70300d2dabc195fd5524ffe8eb416840..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-animation.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2008 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Author: - * Emmanuele Bassi - */ - -#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __CLUTTER_ANIMATION_H__ -#define __CLUTTER_ANIMATION_H__ - -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_ANIMATION (clutter_animation_get_type ()) -#define CLUTTER_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimation)) -#define CLUTTER_IS_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATION)) -#define CLUTTER_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass)) -#define CLUTTER_IS_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ANIMATION)) -#define CLUTTER_ANIMATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass)) - -typedef struct _ClutterAnimationPrivate ClutterAnimationPrivate; -typedef struct _ClutterAnimationClass ClutterAnimationClass; - -/** - * ClutterAnimation: - * - * The #ClutterAnimation structure contains only private data and should - * be accessed using the provided functions. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use the implicit animation on #ClutterActor - */ -struct _ClutterAnimation -{ - /*< private >*/ - GObject parent_instance; - - ClutterAnimationPrivate *priv; -}; - -/** - * ClutterAnimationClass: - * @started: class handler for the #ClutterAnimation::started signal - * @completed: class handler for the #ClutterAnimation::completed signal - * - * The #ClutterAnimationClass structure contains only private data and - * should be accessed using the provided functions. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use the implicit animation on #ClutterActor - */ -struct _ClutterAnimationClass -{ - /*< private >*/ - GObjectClass parent_class; - - /*< public >*/ - void (* started) (ClutterAnimation *animation); - void (* completed) (ClutterAnimation *animation); - - /*< private >*/ - /* padding for future expansion */ - void (*_clutter_reserved1) (void); - void (*_clutter_reserved2) (void); - void (*_clutter_reserved3) (void); - void (*_clutter_reserved4) (void); - void (*_clutter_reserved5) (void); - void (*_clutter_reserved6) (void); - void (*_clutter_reserved7) (void); - void (*_clutter_reserved8) (void); -}; - -CLUTTER_DEPRECATED -GType clutter_animation_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED_FOR(clutter_property_transition_new) -ClutterAnimation * clutter_animation_new (void); - -CLUTTER_DEPRECATED_FOR(clutter_transition_set_animatable) -void clutter_animation_set_object (ClutterAnimation *animation, - GObject *object); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_progress_mode) -void clutter_animation_set_mode (ClutterAnimation *animation, - gulong mode); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_progress_mode) -gulong clutter_animation_get_mode (ClutterAnimation *animation); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_duration) -void clutter_animation_set_duration (ClutterAnimation *animation, - guint msecs); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_duration) -guint clutter_animation_get_duration (ClutterAnimation *animation); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_repeat_count) -void clutter_animation_set_loop (ClutterAnimation *animation, - gboolean loop); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_repeat_count) -gboolean clutter_animation_get_loop (ClutterAnimation *animation); -CLUTTER_DEPRECATED -void clutter_animation_set_timeline (ClutterAnimation *animation, - ClutterTimeline *timeline); -CLUTTER_DEPRECATED -ClutterTimeline * clutter_animation_get_timeline (ClutterAnimation *animation); -CLUTTER_DEPRECATED -gboolean clutter_animation_has_property (ClutterAnimation *animation, - const gchar *property_name); -CLUTTER_DEPRECATED -ClutterInterval * clutter_animation_get_interval (ClutterAnimation *animation, - const gchar *property_name); - -/* - * ClutterActor API - */ - -CLUTTER_DEPRECATED -ClutterAnimation * clutter_actor_animate (ClutterActor *actor, - gulong mode, - guint duration, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; -CLUTTER_DEPRECATED -ClutterAnimation * clutter_actor_animate_with_timeline (ClutterActor *actor, - gulong mode, - ClutterTimeline *timeline, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; - -G_END_DECLS - -#endif /* __CLUTTER_ANIMATION_DEPRECATED_H__ */ diff --git a/clutter/clutter/deprecated/clutter-state.c b/clutter/clutter/deprecated/clutter-state.c deleted file mode 100644 index 98b0cbf146653926d1f5a38d251f4a6827def70e..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-state.c +++ /dev/null @@ -1,1760 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Øyvind Kolås - * - * Copyright (C) 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/** - * SECTION:clutter-state - * @short_description: State machine with animated transitions - * - * #ClutterState is an object controlling the tweening of properties on - * multiple actors between a set of named states. #ClutterStateKeys - * define how the properties are animated. If the source_state_name for a key - * is NULL it is used for transition to the target state unless a specific key - * exists for transitioning from the current state to the requested state. - * - * #ClutterState is available since Clutter 1.4. - * - * #ClutterState has been deprecated in Clutter 1.12. There is no direct - * replacement for this API, but it's highly suggested you use a combination - * of [implicit transitions][clutter-actor-animation] and explicit transitions - * using #ClutterTransition and its subclasses. - * - * ## Using ClutterState - * - * The following example defines a "base" and a "hover" state in a - * #ClutterState instance. - * - * |[ - * ClutterState *state = clutter_state_new (); - * ClutterColor color = { 0, }; - * - * // transition from any state to the "base" state - * clutter_color_from_string (&color, "rgb(255, 0, 0)"); - * clutter_state_set (state, NULL, "base", - * actor, "color", CLUTTER_LINEAR, &color, - * actor, "scale-x", CLUTTER_EASE_IN_BOUNCE, 1.0, - * actor, "scale-y", CLUTTER_EASE_IN_BOUNCE, 1.0, - * NULL); - * - * // transition from the "base" state to the "hover" state - * clutter_color_from_string (&color, "rgb(0, 0, 255)"); - * clutter_state_set (state, "base", "hover", - * actor, "color", CLUTTER_LINEAR, &color, - * actor, "scale-x", CLUTTER_EASE_OUT_BOUNCE, 1.7, - * actor, "scale-y", CLUTTER_EASE_OUT_BOUNCE, 1.7, - * NULL); - * - * // the default duration of any transition - * clutter_state_set_duration (state, NULL, NULL, 500); - * - * // set "base" as the initial state - * clutter_state_warp_to_state (state, "base"); - * ]| - * - * The actor then uses the #ClutterState to animate through the - * two states using callbacks for the #ClutterActor::enter-event and - * #ClutterActor::leave-event signals. - * - * |[ - * static gboolean - * on_enter (ClutterActor *actor, - * ClutterEvent *event, - * ClutterState *state) - * { - * clutter_state_set_state (state, "hover"); - * - * return CLUTTER_EVENT_STOP; - * } - * - * static gboolean - * on_leave (ClutterActor *actor, - * ClutterEvent *event, - * ClutterState *state) - * { - * clutter_state_set_state (state, "base"); - * - * return CLUTTER_EVENT_STOP; - * } - * - * ## ClutterState description for ClutterScript - * - * #ClutterState defines a custom `transitions` JSON object member which - * allows describing the states. - * - * The `transitions` property has the following syntax: - * - * |[ - * { - * "transitions" : [ - * { - * "source" : "source-state", - * "target" : "target-state", - * "duration" : milliseconds, - * "keys" : [ - * [ - * "object-id", - * "property-name", - * "easing-mode", - * "final-value", - * ], - * [ - * "object-id", - * "property-name", - * "easing-mode", - * "final-value", - * pre-delay, - * post-delay; - * ], - * ... - * ] - * }, - * { - * "source" : "source-state", - * "target" : "target-state", - * "duration" : milliseconds, - * }, - * ... - * ] - * } - * ]| - * - * Each element of the transitions array follows the same rules and order - * as clutter_state_set_key() function arguments. - * - * The source and target values control the source and target state of the - * transition. - * - * The pre-delay and post-delay values are optional. - * - * The example below is a translation into a #ClutterScript definition of - * the code in the #ClutterState example above. - * - * |[ - * { - * "id" : "button-state", - * "type" : "ClutterState", - * "duration" : 500, - * "transitions" : [ - * { - * "source" : "*", - * "target" : "base", - * "keys" : [ - * [ "button", "color", "linear", "rgb(255, 0, 0)" ], - * [ "button", "scale-x", "easeInBounce", 1.0 ], - * [ "button", "scale-y", "easeInBounce", 1.0 ] - * ] - * }, - * { - * "source" : "base", - * "target" : "hover", - * "keys" : [ - * [ "button", "color", "linear", "rgb(0, 0, 255)" ], - * [ "button", "scale-x", "easeOutBounce", 1.7 ], - * [ "button", "scale-y", "easeOutBounce", 1.7 ] - * ] - * } - * ] - * } - * ]| - */ - -#include "clutter-build-config.h" - -#include -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-state.h" - -#include "clutter-alpha.h" -#include "clutter-animatable.h" -#include "clutter-enum-types.h" -#include "clutter-interval.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -typedef struct State -{ - const gchar *name; /* interned string for this state name */ - GHashTable *durations; /* durations for transitions from various state - names */ - GList *keys; /* list of all keys pertaining to transitions - from other states to this one */ - ClutterState *clutter_state; /* the ClutterState object this state belongs to - */ -} State; - -struct _ClutterStatePrivate -{ - GHashTable *states; /* contains state objects */ - guint duration; /* global fallback duration */ - ClutterTimeline *timeline; /* The timeline used for doing the - progress */ - ClutterTimeline *slave_timeline; /* a slave timeline used to compute - alphas */ - const gchar *source_state_name; /* current source state */ - State *source_state; /* current source_state */ - const gchar *target_state_name; /* current target state */ - State *target_state; /* target state name */ -}; - -#define SLAVE_TIMELINE_LENGTH 10000 - -/* - * ClutterStateKey: - * - * An opaque data structure with accessor functions. - * - */ -typedef struct _ClutterStateKey -{ - GObject *object; /* an Gobject */ - const gchar *property_name;/* the name of a property */ - gulong mode; /* alpha to use */ - GValue value; /* target value */ - gdouble pre_delay; /* fraction of duration to delay before - starting */ - gdouble pre_pre_delay;/* fraction of duration to add to - pre_delay. This is used to set keys - during transitions. */ - gdouble post_delay; /* fraction of duration to be done in */ - - State *source_state; /* source state */ - State *target_state; /* target state */ - - ClutterAlpha *alpha; /* The alpha this key uses for interpolation */ - ClutterInterval *interval; /* The interval this key uses for - interpolation */ - - guint is_animatable : 1; - guint is_inert : 1; /* set if the key is being destroyed due to - weak reference */ - gint ref_count; /* reference count for boxed life time */ -} _ClutterStateKey; - -enum -{ - PROP_0, - PROP_DURATION, - PROP_STATE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -enum -{ - COMPLETED, - LAST_SIGNAL -}; - -static void clutter_scriptable_iface_init (ClutterScriptableIface *iface); - -static guint state_signals[LAST_SIGNAL] = {0, }; - -G_DEFINE_TYPE_WITH_CODE (ClutterState, clutter_state, G_TYPE_OBJECT, - G_ADD_PRIVATE (ClutterState) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_iface_init)) - -/** - * clutter_state_new: - * - * Creates a new #ClutterState - * - * Return value: the newly create #ClutterState instance - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterState * -clutter_state_new (void) -{ - return g_object_new (CLUTTER_TYPE_STATE, NULL); -} - -static gint -sort_props_func (gconstpointer a, - gconstpointer b) -{ - const ClutterStateKey *pa = a; - const ClutterStateKey *pb = b; - - if (pa->object == pb->object) - { - gint propnamediff = pa->property_name-pb->property_name; - if (propnamediff == 0) - return pb->source_state - pa->source_state; - - return propnamediff; - } - - return pa->object - pb->object; -} - -static State * clutter_state_fetch_state (ClutterState *state, - const gchar *state_name, - gboolean force_creation); -static void object_disappeared (gpointer data, - GObject *where_the_object_was); - -static ClutterStateKey * -clutter_state_key_new (State *state, - GObject *object, - const gchar *property_name, - GParamSpec *pspec, - guint mode) -{ - ClutterStatePrivate *priv = state->clutter_state->priv; - ClutterStateKey *state_key; - GValue value = G_VALUE_INIT; - - state_key = g_slice_new0 (ClutterStateKey); - - state_key->target_state = state; - state_key->object = object; - state_key->property_name = g_intern_string (property_name); - state_key->mode = mode; - state_key->is_animatable = CLUTTER_IS_ANIMATABLE (object); - - state_key->alpha = clutter_alpha_new (); - g_object_ref_sink (state_key->alpha); - clutter_alpha_set_mode (state_key->alpha, mode); - clutter_alpha_set_timeline (state_key->alpha, priv->slave_timeline); - - state_key->interval = - g_object_new (CLUTTER_TYPE_INTERVAL, - "value-type", G_PARAM_SPEC_VALUE_TYPE (pspec), - NULL); - g_object_ref_sink (state_key->interval); - - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - clutter_interval_set_initial_value (state_key->interval, &value); - clutter_interval_set_final_value (state_key->interval, &value); - g_value_unset (&value); - - g_object_weak_ref (object, object_disappeared, - state_key->target_state->clutter_state); - - return state_key; -} - -static void -clutter_state_key_free (gpointer clutter_state_key) -{ - ClutterStateKey *key = clutter_state_key; - - if (key == NULL) - return; - - key->ref_count -= 1; - - if (key->ref_count > 0) - return; - - if (!key->is_inert) - { - g_object_weak_unref (key->object, - object_disappeared, - key->target_state->clutter_state); - } - - g_value_unset (&key->value); - - g_object_unref (key->alpha); - g_object_unref (key->interval); - - g_slice_free (ClutterStateKey, key); -} - - -static inline void -clutter_state_remove_key_internal (ClutterState *this, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - gboolean is_inert) -{ - GList *s, *state_list; - State *source_state = NULL; - - source_state_name = g_intern_string (source_state_name); - target_state_name = g_intern_string (target_state_name); - property_name = g_intern_string (property_name); - - if (source_state_name) - source_state = clutter_state_fetch_state (this, source_state_name, FALSE); - -again_from_start: - - if (target_state_name != NULL) - state_list = g_list_append (NULL, (gpointer) target_state_name); - else - state_list = clutter_state_get_states (this); - - for (s = state_list; s != NULL; s = s->next) - { - State *target_state; - target_state = clutter_state_fetch_state (this, s->data, FALSE); - /* Go through each TargetState */ - if (target_state) - { - GList *k = target_state->keys; - - /* Note the safe while() loop, because we modify the list inline */ - while (k != NULL) - { - ClutterStateKey *key = k->data; - - k = k->next; - - /* Check if each key matches query */ - if ( (object == NULL || (object == key->object)) - && (source_state == NULL || (source_state == key->source_state)) - && (property_name == NULL || ((property_name == key->property_name)))) - { - /* Remove matching key */ - target_state->keys = g_list_remove (target_state->keys, key); - key->is_inert = is_inert; - clutter_state_key_free (key); - - /* no more keys with transitions to this target_state*/ - if (target_state->keys == NULL) - { - /* If this state is the current state, unset the state */ - if (target_state == this->priv->target_state) - clutter_state_set_state (this, NULL); - - /* remove any keys that exist that uses this state as a source */ - clutter_state_remove_key_internal (this, s->data, NULL, NULL, NULL, is_inert); - - g_hash_table_remove (this->priv->states, s->data); - goto again_from_start; /* we have just freed State *target_state, so - need to restart removal */ - } - } - } - } - } - - g_list_free (state_list); -} - -static void -object_disappeared (gpointer data, - GObject *where_the_object_was) -{ - clutter_state_remove_key_internal (data, NULL, NULL, - (gpointer) where_the_object_was, - NULL, - TRUE); -} - - -static void -state_free (gpointer data) -{ - State *state = data; - - for (; state->keys; - state->keys = g_list_remove (state->keys, state->keys->data)) - clutter_state_key_free (state->keys->data); - - g_hash_table_destroy (state->durations); - g_free (state); -} - -static State * -state_new (ClutterState *clutter_state, - const gchar *name) -{ - State *state; - - state = g_new0 (State, 1); - state->clutter_state = clutter_state; - state->name = name; - state->durations = g_hash_table_new (g_direct_hash, g_direct_equal); - - return state; -} - -static void -clutter_state_finalize (GObject *object) -{ - ClutterStatePrivate *priv = CLUTTER_STATE (object)->priv; - - g_hash_table_destroy (priv->states); - - g_object_unref (priv->timeline); - g_object_unref (priv->slave_timeline); - - G_OBJECT_CLASS (clutter_state_parent_class)->finalize (object); -} - -static void -clutter_state_completed (ClutterTimeline *timeline, - ClutterState *state) -{ - g_signal_emit (state, state_signals[COMPLETED], 0); -} - -static void -clutter_state_new_frame (ClutterTimeline *timeline, - gint msecs, - ClutterState *state) -{ - ClutterStatePrivate *priv = state->priv; - GList *k; - gdouble progress; - const gchar *curprop = NULL; - GObject *curobj = NULL; - gboolean found_specific = FALSE; - - progress = clutter_timeline_get_progress (timeline); - - for (k = priv->target_state->keys; k; k = k->next) - { - ClutterStateKey *key = k->data; - gdouble sub_progress; - - if ((curprop && !(curprop == key->property_name)) || - key->object != curobj) - { - curprop = key->property_name; - curobj = key->object; - found_specific = FALSE; - } - - if (!found_specific) - { - if (key->source_state != NULL && - key->source_state->name != NULL && - priv->source_state_name != NULL && - g_str_equal (priv->source_state_name, key->source_state->name)) - { - found_specific = TRUE; - } - - if (found_specific || key->source_state == NULL) - { - gdouble pre_delay = key->pre_delay + key->pre_pre_delay; - - sub_progress = (progress - pre_delay) - / (1.0 - (pre_delay + key->post_delay)); - - if (sub_progress >= 0.0) - { - if (sub_progress >= 1.0) - sub_progress = 1.0; - - clutter_timeline_advance (priv->slave_timeline, - sub_progress * SLAVE_TIMELINE_LENGTH); - sub_progress = clutter_alpha_get_alpha (key->alpha); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - GValue value = G_VALUE_INIT; - gboolean res; - - animatable = CLUTTER_ANIMATABLE (key->object); - - g_value_init (&value, clutter_state_key_get_property_type (key)); - - res = - clutter_animatable_interpolate_value (animatable, - key->property_name, - key->interval, - sub_progress, - &value); - - if (res) - clutter_animatable_set_final_state (animatable, - key->property_name, - &value); - - g_value_unset (&value); - } - else - { - const GValue *value; - - value = clutter_interval_compute (key->interval, sub_progress); - if (value != NULL) - g_object_set_property (key->object, key->property_name, value); - } - } - - /* XXX: should the target value of the default destination be - * used even when found a specific source_state key? - */ - } - } - } -} - - -static ClutterTimeline * -clutter_state_change (ClutterState *state, - const gchar *target_state_name, - gboolean animate) -{ - ClutterStatePrivate *priv; - State *new_state; - guint duration; - GList *k; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - priv = state->priv; - - /* If we've been asked to change state to NULL, reset the - * ClutterState to its initial state, but leave the keys - * alone. - */ - if (!target_state_name) - { - if (!priv->target_state) - return NULL; - - priv->source_state_name = priv->target_state_name = NULL; - priv->source_state = priv->target_state = NULL; - - clutter_timeline_stop (priv->timeline); - clutter_timeline_rewind (priv->timeline); - - return NULL; - } - - target_state_name = g_intern_string (target_state_name); - - if (target_state_name == priv->target_state_name) - { - /* Avoid transitioning if the desired state is already current, - * unless we're warping to it and the state transition is in - * progress (in that case, immediately warp to the state). - */ - if (!clutter_timeline_is_playing (priv->timeline) || animate) - return priv->timeline; - } - - priv->source_state_name = priv->target_state_name; - priv->target_state_name = target_state_name; - - g_object_notify_by_pspec (G_OBJECT (state), obj_props[PROP_STATE]); - - duration = clutter_state_get_duration (state, - priv->source_state_name, - priv->target_state_name); - clutter_timeline_set_duration (priv->timeline, duration); - - new_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (new_state == NULL) - { - g_warning ("State '%s' not found", target_state_name); - - return NULL; - } - - for (k = new_state->keys; k != NULL; k = k->next) - { - ClutterStateKey *key = k->data; - GValue initial = G_VALUE_INIT; - - /* Reset the pre-pre-delay - this is only used for setting keys - * during transitions. - */ - key->pre_pre_delay = 0; - - g_value_init (&initial, clutter_interval_get_value_type (key->interval)); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - - animatable = CLUTTER_ANIMATABLE (key->object); - clutter_animatable_get_initial_state (animatable, - key->property_name, - &initial); - } - else - g_object_get_property (key->object, key->property_name, &initial); - - if (clutter_alpha_get_mode (key->alpha) != key->mode) - clutter_alpha_set_mode (key->alpha, key->mode); - - clutter_interval_set_initial_value (key->interval, &initial); - clutter_interval_set_final_value (key->interval, &key->value); - - g_value_unset (&initial); - } - - if (!animate) - { - clutter_timeline_stop (priv->timeline); - clutter_timeline_advance (priv->timeline, duration); - - /* emit signals, to change properties, and indicate that the - * state change is complete */ - g_signal_emit_by_name (priv->timeline, "new-frame", - GINT_TO_POINTER (duration), - NULL); - g_signal_emit_by_name (priv->timeline, "completed", NULL); - } - else - { - clutter_timeline_stop (priv->timeline); - clutter_timeline_rewind (priv->timeline); - clutter_timeline_start (priv->timeline); - } - - return priv->timeline; -} - -/** - * clutter_state_set_state: - * @state: a #ClutterState - * @target_state_name: the state to transition to - * - * Change the current state of #ClutterState to @target_state_name. - * - * The state will animate during its transition, see - * #clutter_state_warp_to_state for animation-free state switching. - * - * Setting a %NULL state will stop the current animation and unset - * the current state, but keys will be left intact. - * - * Return value: (transfer none): the #ClutterTimeline that drives the - * state transition. The returned timeline is owned by the #ClutterState - * and it should not be unreferenced - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterTimeline * -clutter_state_set_state (ClutterState *state, - const gchar *target_state_name) -{ - return clutter_state_change (state, target_state_name, TRUE); -} - -/** - * clutter_state_warp_to_state: - * @state: a #ClutterState - * @target_state_name: the state to transition to - * - * Change to the specified target state immediately with no animation. - * - * See clutter_state_set_state(). - * - * Return value: (transfer none): the #ClutterTimeline that drives the - * state transition. The returned timeline is owned by the #ClutterState - * and it should not be unreferenced - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterTimeline * -clutter_state_warp_to_state (ClutterState *state, - const gchar *target_state_name) -{ - return clutter_state_change (state, target_state_name, FALSE); -} - -static GParamSpec * -get_property_from_object (GObject *gobject, - const gchar *property_name) -{ - GParamSpec *pspec; - - if (CLUTTER_IS_ANIMATABLE (gobject)) - { - ClutterAnimatable *animatable = CLUTTER_ANIMATABLE (gobject); - - pspec = clutter_animatable_find_property (animatable, property_name); - } - else - { - GObjectClass *klass = G_OBJECT_GET_CLASS (gobject); - - pspec = g_object_class_find_property (klass, property_name); - } - - if (pspec == NULL) - { - g_warning ("Cannot bind property '%s': objects of type '%s' " - "do not have this property", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (!(pspec->flags & G_PARAM_WRITABLE)) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is not writable", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (!(pspec->flags & G_PARAM_READABLE)) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is not readable", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is set as constructor-only", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - return pspec; -} - -/** - * clutter_state_set: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the name of the source state keys are being added for - * @target_state_name: the name of the target state keys are being added for - * @first_object: a #GObject - * @first_property_name: a property of @first_object to specify a key for - * @first_mode: the id of the alpha function to use - * @...: the value @first_property_name should have in @target_state_name, - * followed by object, property name, mode, value tuples, terminated - * by %NULL - * - * Adds multiple keys to a named state of a #ClutterState instance, specifying - * the easing mode and value a given property of an object should have at a - * given progress of the animation. - * - * The mode specified is the easing mode used when going to from the previous - * key to the specified key. - * - * For instance, the code below: - * - * |[ - * clutter_state_set (state, NULL, "hover", - * button, "opacity", CLUTTER_LINEAR, 255, - * button, "scale-x", CLUTTER_EASE_OUT_CUBIC, 1.2, - * button, "scale-y", CLUTTER_EASE_OUT_CUBIC, 1.2, - * NULL); - * ]| - * - * will create a transition from any state (a @source_state_name or NULL is - * treated as a wildcard) and a state named "hover"; the - * button object will have the #ClutterActor:opacity - * property animated to a value of 255 using %CLUTTER_LINEAR as the animation - * mode, and the #ClutterActor:scale-x and #ClutterActor:scale-y properties - * animated to a value of 1.2 using %CLUTTER_EASE_OUT_CUBIC as the animation - * mode. To change the state (and start the transition) you can use the - * clutter_state_set_state() function: - * - * |[ - * clutter_state_set_state (state, "hover"); - * ]| - * - * If a given object, state_name, property tuple already exist in the - * #ClutterState instance, then the mode and value will be replaced with - * the new specified values. - * - * If a property name is prefixed with "delayed::" two additional - * arguments per key are expected: a value relative to the full state time - * to pause before transitioning and a similar value to pause after - * transitioning, e.g.: - * - * |[ - * clutter_state_set (state, "hover", "toggled", - * button, "delayed::scale-x", CLUTTER_LINEAR, 1.0, 0.2, 0.2, - * button, "delayed::scale-y", CLUTTER_LINEAR, 1.0, 0.2, 0.2, - * NULL); - * ]| - * - * will pause for 20% of the duration of the transition before animating, - * and 20% of the duration after animating. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_set (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - gpointer first_object, - const gchar *first_property_name, - gulong first_mode, - ...) -{ - gpointer object; - const gchar *property_name; - gulong mode; - va_list args; - - g_return_if_fail (CLUTTER_IS_STATE (state)); - - object = first_object; - - property_name = first_property_name; - mode = first_mode; - - g_return_if_fail (G_IS_OBJECT (first_object)); - g_return_if_fail (first_property_name); - - va_start (args, first_mode); - - while (object != NULL) - { - GParamSpec *pspec; - GValue value = G_VALUE_INIT; - gchar *error = NULL; - gboolean is_delayed = FALSE; - - if (g_str_has_prefix (property_name, "delayed::")) - { - property_name = strstr (property_name, "::") + 2; - is_delayed = TRUE; - } - - pspec = get_property_from_object (object, property_name); - if (pspec == NULL) - break; - - G_VALUE_COLLECT_INIT (&value, G_PARAM_SPEC_VALUE_TYPE (pspec), - args, 0, - &error); - - if (error != NULL) - { - g_warning ("%s: %s", G_STRLOC, error); - g_free (error); - break; - } - - if (is_delayed) - { - gdouble pre_delay = va_arg (args, gdouble); - gdouble post_delay = va_arg (args, gdouble); - - clutter_state_set_key (state, - source_state_name, - target_state_name, - object, - property_name, - mode, - &value, - pre_delay, - post_delay); - } - else - { - clutter_state_set_key (state, - source_state_name, - target_state_name, - object, - property_name, - mode, - &value, - 0.0, - 0.0); - } - - g_value_unset (&value); - - object = va_arg (args, gpointer); - if (object != NULL) - { - property_name = va_arg (args, gchar*); - mode = va_arg (args, gulong); - } - } - - va_end (args); -} - -static void -clutter_state_set_key_internal (ClutterState *state, - ClutterStateKey *key) -{ - ClutterStatePrivate *priv = state->priv; - State *target_state = key->target_state; - GList *old_item = NULL; - - if ((old_item = g_list_find_custom (target_state->keys, - key, - sort_props_func))) - { - ClutterStateKey *old_key = old_item->data; - - target_state->keys = g_list_remove (target_state->keys, old_key); - clutter_state_key_free (old_key); - } - - target_state->keys = g_list_insert_sorted (target_state->keys, - key, - sort_props_func); - - /* If the current target state is modified, we have some work to do. - * - * If the animation is running, we add a key to the current animation - * with a delay of the current duration so that the new animation will - * animate into place. - * - * If the animation isn't running, but the state is set, we immediately - * warp to that state. - */ - if (key->target_state == priv->target_state) - { - if (!clutter_timeline_is_playing (priv->timeline)) - { - /* We can warp to the state by setting a NULL state, then setting - * the target state again. - */ - clutter_state_change (state, NULL, FALSE); - clutter_state_change (state, target_state->name, FALSE); - } - else - { - /* Set the ClutterInterval associated with the state */ - GValue initial = G_VALUE_INIT; - gdouble progress = clutter_timeline_get_progress (priv->timeline); - - g_value_init (&initial, - clutter_interval_get_value_type (key->interval)); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - - animatable = CLUTTER_ANIMATABLE (key->object); - clutter_animatable_get_initial_state (animatable, - key->property_name, - &initial); - } - else - g_object_get_property (key->object, key->property_name, &initial); - - if (clutter_alpha_get_mode (key->alpha) != key->mode) - clutter_alpha_set_mode (key->alpha, key->mode); - - clutter_interval_set_initial_value (key->interval, &initial); - clutter_interval_set_final_value (key->interval, &key->value); - - g_value_unset (&initial); - - /* Set the delay as if the interval had just begun */ - if (progress > key->pre_delay) - key->pre_pre_delay = MIN (progress - key->pre_delay, - 1.0 - key->post_delay); - } - } -} - -/* - * clutter_state_fetch_state: - * @state: a #ClutterState - * @state_name: the name of the state to be retrieved - * @create: %TRUE if the state should be instantiated if not found - * - * Retrieves the #State structure for @state_name inside the given - * #ClutterState instance - * - * If @state_name is %NULL and @create is %TRUE then NULL will - * be returned. - * - * Return value: a #State structure for the given name, or %NULL - */ -static State * -clutter_state_fetch_state (ClutterState *state, - const gchar *state_name, - gboolean create) -{ - ClutterStatePrivate *priv = state->priv; - State *retval; - - if (state_name == NULL) - { - return NULL; - } - else - state_name = g_intern_string (state_name); - - retval = g_hash_table_lookup (priv->states, state_name); - if (retval == NULL && create) - { - retval = state_new (state, state_name); - g_hash_table_insert (priv->states, (gpointer) state_name, retval); - } - - return retval; -} - -/** - * clutter_state_set_key: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the source transition to specify - * transition for, or %NULL to specify the default fallback when a - * more specific source state doesn't exist. - * @target_state_name: the name of the transition to set a key value for. - * @object: the #GObject to set a key for - * @property_name: the property to set a key for - * @mode: the id of the alpha function to use - * @value: the value for property_name of object in state_name - * @pre_delay: relative time of the transition to be idle in the beginning - * of the transition - * @post_delay: relative time of the transition to be idle in the end of - * the transition - * - * Sets one specific end key for a state name, @object, @property_name - * combination. - * - * Return value: (transfer none): the #ClutterState instance, allowing - * chaining of multiple calls - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterState * -clutter_state_set_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - guint mode, - const GValue *value, - gdouble pre_delay, - gdouble post_delay) -{ - GParamSpec *pspec; - ClutterStateKey *state_key; - State *source_state = NULL; - State *target_state; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - g_return_val_if_fail (G_IS_OBJECT (object), NULL); - g_return_val_if_fail (property_name, NULL); - g_return_val_if_fail (value, NULL); - - pspec = get_property_from_object (object, property_name); - if (pspec == NULL) - return state; - - source_state = clutter_state_fetch_state (state, source_state_name, TRUE); - target_state = clutter_state_fetch_state (state, target_state_name, TRUE); - - property_name = g_intern_string (property_name); - state_key = clutter_state_key_new (target_state, - object, property_name, pspec, - mode); - - state_key->source_state = source_state; - state_key->pre_delay = pre_delay; - state_key->post_delay = post_delay; - - g_value_init (&state_key->value, G_VALUE_TYPE (value)); - g_value_copy (value, &state_key->value); - - clutter_state_set_key_internal (state, state_key); - - return state; -} - -/** - * clutter_state_get_states: - * @state: a #ClutterState instance. - * - * Gets a list of all the state names managed by this #ClutterState. - * - * Return value: (transfer container) (element-type utf8): a newly allocated - * #GList of state names. The contents of the returned #GList are owned - * by the #ClutterState and should not be modified or freed. Use - * g_list_free() to free the resources allocated by the returned list when - * done using it - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -GList * -clutter_state_get_states (ClutterState *state) -{ - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - return g_hash_table_get_keys (state->priv->states); -} - -static void -clutter_state_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterState *state = CLUTTER_STATE (object); - - switch (prop_id) - { - case PROP_STATE: - clutter_state_set_state (state, g_value_get_string (value)); - break; - case PROP_DURATION: - state->priv->duration = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - -static void -clutter_state_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterState *state = CLUTTER_STATE (object); - switch (prop_id) - { - case PROP_STATE: - g_value_set_string (value, - clutter_state_get_state (state)); - break; - case PROP_DURATION: - g_value_set_uint (value, state->priv->duration); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - -static void -clutter_state_class_init (ClutterStateClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; - - gobject_class->finalize = clutter_state_finalize; - gobject_class->set_property = clutter_state_set_property; - gobject_class->get_property = clutter_state_get_property; - - /** - * ClutterState::completed: - * @state: the #ClutterState that emitted the signal - * - * The ::completed signal is emitted when a #ClutterState reaches - * the target state specified by clutter_state_set_state() or - * clutter_state_warp_to_state(). - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - state_signals[COMPLETED] = - g_signal_new (I_("completed"), - G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterStateClass, completed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - /** - * ClutterState:state: - * - * The currently set target state, setting it causes the - * state machine to transition to the new state, use - * clutter_state_warp_to_state() to change state without - * a transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - pspec = g_param_spec_string ("state", - P_("State"), - P_("Currently set state, (transition to this state might not be complete)"), - NULL, - CLUTTER_PARAM_READWRITE); - obj_props[PROP_STATE] = pspec; - g_object_class_install_property (gobject_class, PROP_STATE, pspec); - - /** - * ClutterState:duration: - * - * Default duration used if an duration has not been specified for a specific - * source/target state pair. The values is in milliseconds. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - pspec = g_param_spec_uint ("duration", - P_("Duration"), - P_("Default transition duration"), - 0, 86400000, 1000, - CLUTTER_PARAM_READWRITE); - obj_props[PROP_DURATION] = pspec; - g_object_class_install_property (gobject_class, PROP_DURATION, pspec); -} - -static void -clutter_state_init (ClutterState *self) -{ - ClutterStatePrivate *priv; - - priv = self->priv = clutter_state_get_instance_private (self); - - priv->states = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, - state_free); - - self->priv->source_state_name = NULL; - self->priv->target_state_name = NULL; - - self->priv->duration = 1000; - - priv->timeline = clutter_timeline_new (1000); - g_signal_connect (priv->timeline, "new-frame", - G_CALLBACK (clutter_state_new_frame), - self); - g_signal_connect (priv->timeline, "completed", - G_CALLBACK (clutter_state_completed), - self); - - priv->slave_timeline = clutter_timeline_new (SLAVE_TIMELINE_LENGTH); -} - - -static gpointer -clutter_state_key_copy (gpointer boxed) -{ - if (boxed != NULL) - { - ClutterStateKey *key = boxed; - - key->ref_count += 1; - } - - return boxed; -} - -G_DEFINE_BOXED_TYPE (ClutterStateKey, clutter_state_key, - clutter_state_key_copy, - clutter_state_key_free); - -/** - * clutter_state_key_get_property_type: - * @key: a #ClutterStateKey - * - * Retrieves the #GType of the property a key applies to - * - * Return value: the #GType of the property - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -GType -clutter_state_key_get_property_type (const ClutterStateKey *key) -{ - g_return_val_if_fail (key != NULL, G_TYPE_INVALID); - - return G_VALUE_TYPE (&key->value); -} - - -/** - * clutter_state_set_duration: - * @state: a #ClutterState - * @source_state_name: (allow-none): the name of the source state, or %NULL - * @target_state_name: (allow-none): the name of the target state, or %NULL - * @duration: the duration of the transition, in milliseconds - * - * Sets the duration of a transition. - * - * If both state names are %NULL the default duration for @state is set. - * - * If only @target_state_name is specified, the passed @duration becomes - * the default duration for transitions to the target state. - * - * If both states names are specified, the passed @duration only applies - * to the specified transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_set_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - guint duration) -{ - State *target_state; - - g_return_if_fail (CLUTTER_IS_STATE (state)); - - source_state_name = g_intern_string (source_state_name); - if (source_state_name == g_intern_static_string ("")) - source_state_name = NULL; - - target_state_name = g_intern_string (target_state_name); - if (target_state_name == g_intern_static_string ("")) - target_state_name = NULL; - - if (target_state_name == NULL) - { - state->priv->duration = duration; - return; - } - - target_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (target_state != NULL) - { - if (source_state_name != NULL) - g_hash_table_insert (target_state->durations, - (gpointer) source_state_name, - GINT_TO_POINTER (duration)); - else - g_hash_table_insert (target_state->durations, - NULL, - GINT_TO_POINTER (duration)); - } -} - -/** - * clutter_state_get_duration: - * @state: a #ClutterState - * @source_state_name: (allow-none): the name of the source state to - * get the duration of, or %NULL - * @target_state_name: (allow-none): the name of the source state to - * get the duration of, or %NULL - * - * Queries the duration used for transitions between a source and - * target state pair - * - * The semantics for the query are the same as the semantics used for - * setting the duration with clutter_state_set_duration() - * - * Return value: the duration, in milliseconds - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -guint -clutter_state_get_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name) -{ - State *target_state; - guint ret = 0; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), 0); - - source_state_name = g_intern_string (source_state_name); - if (source_state_name == g_intern_static_string ("")) - source_state_name = NULL; - - target_state_name = g_intern_string (target_state_name); - if (target_state_name == g_intern_static_string ("")) - target_state_name = NULL; - - if (target_state_name == NULL) - return state->priv->duration; - - target_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (target_state != NULL) - { - if (source_state_name) - { - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - source_state_name)); - if(!ret) - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - NULL)); - } - else - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - NULL)); - } - - if (!ret) - ret = state->priv->duration; - - return ret; -} - -/** - * clutter_state_get_state: - * @state: a #ClutterState - * - * Queries the currently set target state. - * - * During a transition this function will return the target of the transition. - * - * This function is useful when called from handlers of the - * #ClutterState::completed signal. - * - * Return value: a string containing the target state. The returned string - * is owned by the #ClutterState and should not be modified or freed - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -const gchar * -clutter_state_get_state (ClutterState *state) -{ - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - return state->priv->target_state_name; -} - -typedef struct _ParseClosure { - ClutterState *state; - ClutterScript *script; - - GValue *value; - - gboolean result; -} ParseClosure; - -static void -parse_state_transition (JsonArray *array, - guint index_, - JsonNode *element, - gpointer data) -{ - ParseClosure *clos = data; - JsonObject *object; - const gchar *source_name, *target_name; - State *source_state, *target_state; - JsonArray *keys; - GSList *valid_keys = NULL; - GList *array_keys, *k; - - if (JSON_NODE_TYPE (element) != JSON_NODE_OBJECT) - { - g_warning ("The 'transitions' member of a ClutterState description " - "should be an array of objects, but the element %d of the " - "array is of type '%s'. The element will be ignored.", - index_, - json_node_type_name (element)); - return; - } - - object = json_node_get_object (element); - - if (!json_object_has_member (object, "source") || - !json_object_has_member (object, "target") || - !(json_object_has_member (object, "keys"))) - { - g_warning ("The transition description at index %d is missing one " - "of the mandatory members: source, target and keys", index_); - return; - } - - source_name = json_object_get_string_member (object, "source"); - source_state = clutter_state_fetch_state (clos->state, source_name, TRUE); - - target_name = json_object_get_string_member (object, "target"); - target_state = clutter_state_fetch_state (clos->state, target_name, TRUE); - - if (json_object_has_member (object, "duration")) - { - guint duration = json_object_get_int_member (object, "duration"); - - clutter_state_set_duration (clos->state, - source_name, target_name, - duration); - } - - if (!json_object_has_member (object, "keys")) - return; - - keys = json_object_get_array_member (object, "keys"); - if (keys == NULL) - { - g_warning ("The transition description at index %d has an invalid " - "key member of type '%s' when an array was expected.", - index_, - json_node_type_name (json_object_get_member (object, "keys"))); - return; - } - - if (G_IS_VALUE (clos->value)) - valid_keys = g_slist_reverse (g_value_get_pointer (clos->value)); - else - g_value_init (clos->value, G_TYPE_POINTER); - - array_keys = json_array_get_elements (keys); - for (k = array_keys; k != NULL; k = k->next) - { - JsonNode *node = k->data; - JsonArray *key = json_node_get_array (node); - ClutterStateKey *state_key; - GObject *gobject; - GParamSpec *pspec; - const gchar *id_; - const gchar *property; - gulong mode; - gboolean res; - - id_ = json_array_get_string_element (key, 0); - gobject = clutter_script_get_object (clos->script, id_); - if (gobject == NULL) - { - g_warning ("No object with id '%s' has been defined.", id_); - continue; - } - - property = json_array_get_string_element (key, 1); - pspec = get_property_from_object (gobject, property); - if (pspec == NULL) - { - g_warning ("The object of type '%s' and name '%s' has no " - "property named '%s'.", - G_OBJECT_TYPE_NAME (gobject), - id_, - property); - continue; - } - - mode = _clutter_script_resolve_animation_mode (json_array_get_element (key, 2)); - - state_key = clutter_state_key_new (target_state, - gobject, property, pspec, - mode); - - res = _clutter_script_parse_node (clos->script, - &(state_key->value), - property, - json_array_get_element (key, 3), - pspec); - if (!res) - { - g_warning ("Unable to parse the key value for the " - "property '%s' of object '%s' at index %d", - property, - id_, - index_); - clutter_state_key_free (state_key); - continue; - } - - switch (json_array_get_length (key)) - { - case 5: - state_key->pre_delay = json_array_get_double_element (key, 4); - state_key->post_delay = 0.0; - break; - - case 6: - state_key->pre_delay = json_array_get_double_element (key, 4); - state_key->post_delay = json_array_get_double_element (key, 5); - break; - - default: - state_key->pre_delay = 0.0; - state_key->post_delay = 0.0; - break; - } - - state_key->source_state = source_state; - - valid_keys = g_slist_prepend (valid_keys, state_key); - } - - g_list_free (array_keys); - - g_value_set_pointer (clos->value, g_slist_reverse (valid_keys)); - - clos->result = TRUE; -} - -static gboolean -clutter_state_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - ParseClosure clos; - - if (strcmp (name, "transitions") != 0) - return FALSE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY) - return FALSE; - - clos.state = CLUTTER_STATE (scriptable); - clos.script = script; - clos.value = value; - clos.result = FALSE; - - json_array_foreach_element (json_node_get_array (node), - parse_state_transition, - &clos); - - return clos.result; -} - -static void -clutter_state_set_custom_property (ClutterScriptable *scriptable, - ClutterScript *script, - const gchar *name, - const GValue *value) -{ - if (strcmp (name, "transitions") == 0) - { - ClutterState *state = CLUTTER_STATE (scriptable); - GSList *keys = g_value_get_pointer (value); - GSList *k; - - for (k = keys; k != NULL; k = k->next) - clutter_state_set_key_internal (state, k->data); - - g_slist_free (keys); - } - else - g_object_set_property (G_OBJECT (scriptable), name, value); -} - -static void -clutter_scriptable_iface_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_state_parse_custom_node; - iface->set_custom_property = clutter_state_set_custom_property; -} diff --git a/clutter/clutter/deprecated/clutter-state.h b/clutter/clutter/deprecated/clutter-state.h deleted file mode 100644 index d452a9d960edfc5634ee955894e0142b1f6e8775..0000000000000000000000000000000000000000 --- a/clutter/clutter/deprecated/clutter-state.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Øyvind Kolås - * - * Copyright (C) 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#ifndef __CLUTTER_STATE_H__ -#define __CLUTTER_STATE_H__ - -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_STATE_KEY (clutter_state_key_get_type ()) -#define CLUTTER_TYPE_STATE (clutter_state_get_type ()) -#define CLUTTER_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STATE, ClutterState)) -#define CLUTTER_STATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STATE, ClutterStateClass)) -#define CLUTTER_IS_STATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STATE)) -#define CLUTTER_IS_STATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STATE)) -#define CLUTTER_STATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STATE, ClutterStateClass)) - -typedef struct _ClutterStatePrivate ClutterStatePrivate; -typedef struct _ClutterStateClass ClutterStateClass; - -/** - * ClutterStateKey: - * - * #ClutterStateKey is an opaque structure whose - * members cannot be accessed directly - * - * Since: 1.4 - */ -typedef struct _ClutterStateKey ClutterStateKey; - -/** - * ClutterState: - * - * The #ClutterState structure contains only - * private data and should be accessed using the provided API - * - * Since: 1.4 - */ -struct _ClutterState -{ - /*< private >*/ - GObject parent; - ClutterStatePrivate *priv; -}; - -/** - * ClutterStateClass: - * @completed: class handler for the #ClutterState::completed signal - * - * The #ClutterStateClass structure contains - * only private data - * - * Since: 1.4 - * - * Deprecated: 1.12 - */ -struct _ClutterStateClass -{ - /*< private >*/ - GObjectClass parent_class; - - /*< public >*/ - void (* completed) (ClutterState *state); - - /*< private >*/ - /* padding for future expansion */ - gpointer _padding_dummy[8]; -}; - -CLUTTER_DEPRECATED -GType clutter_state_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED -ClutterState *clutter_state_new (void); - - -CLUTTER_DEPRECATED -ClutterTimeline * clutter_state_set_state (ClutterState *state, - const gchar *target_state_name); -CLUTTER_DEPRECATED -ClutterTimeline * clutter_state_warp_to_state (ClutterState *state, - const gchar *target_state_name); -CLUTTER_DEPRECATED -ClutterState * clutter_state_set_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - guint mode, - const GValue *value, - gdouble pre_delay, - gdouble post_delay); -CLUTTER_DEPRECATED -void clutter_state_set_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - guint duration); -CLUTTER_DEPRECATED -guint clutter_state_get_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name); -CLUTTER_DEPRECATED -void clutter_state_set (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - gpointer first_object, - const gchar *first_property_name, - gulong first_mode, - ...) G_GNUC_NULL_TERMINATED; -CLUTTER_DEPRECATED -GList * clutter_state_get_states (ClutterState *state); -CLUTTER_DEPRECATED -const gchar * clutter_state_get_state (ClutterState *state); - -/* - * ClutterStateKey - */ - -CLUTTER_DEPRECATED -GType clutter_state_key_get_type (void) G_GNUC_CONST; -CLUTTER_DEPRECATED -GType clutter_state_key_get_property_type (const ClutterStateKey *key); - -G_END_DECLS - -#endif /* __CLUTTER_STATE_H__ */ diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index 1ae788338af1d8ab70c54f274721b84628907abb..f21d0e77c3a76be0a9609623831c465f5a600a67 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -219,24 +219,18 @@ clutter_nonintrospected_sources = [ clutter_deprecated_headers = [ 'deprecated/clutter-actor.h', - 'deprecated/clutter-alpha.h', - 'deprecated/clutter-animation.h', 'deprecated/clutter-box.h', 'deprecated/clutter-container.h', 'deprecated/clutter-group.h', 'deprecated/clutter-rectangle.h', 'deprecated/clutter-stage.h', - 'deprecated/clutter-state.h', 'deprecated/clutter-timeline.h', ] clutter_deprecated_sources = [ - 'deprecated/clutter-alpha.c', - 'deprecated/clutter-animation.c', 'deprecated/clutter-box.c', 'deprecated/clutter-group.c', 'deprecated/clutter-rectangle.c', - 'deprecated/clutter-state.c', ] clutter_backend_sources = [] diff --git a/src/tests/clutter/conform/script-parser.c b/src/tests/clutter/conform/script-parser.c index b51db38d6a3e2a3c879c9029e0ace37ddecbe370..7a7e6a8b6c3ee8a4af6ecb862828de78b4fec094 100644 --- a/src/tests/clutter/conform/script-parser.c +++ b/src/tests/clutter/conform/script-parser.c @@ -251,28 +251,6 @@ script_named_object (void) g_free (test_file); } -static void -script_animation (void) -{ - ClutterScript *script = clutter_script_new (); - GObject *animation = NULL; - GError *error = NULL; - gchar *test_file; - - test_file = g_test_build_filename (G_TEST_DIST, "scripts", "test-script-animation.json", NULL); - clutter_script_load_from_file (script, test_file, &error); - if (g_test_verbose () && error) - g_print ("Error: %s", error->message); - - g_assert_no_error (error); - - animation = clutter_script_get_object (script, "test"); - g_assert (CLUTTER_IS_ANIMATION (animation)); - - g_object_unref (script); - g_free (test_file); -} - static void script_layout_property (void) { @@ -383,7 +361,6 @@ CLUTTER_TEST_SUITE ( CLUTTER_TEST_UNIT ("/script/single-object", script_single) CLUTTER_TEST_UNIT ("/script/container-child", script_child) CLUTTER_TEST_UNIT ("/script/named-object", script_named_object) - CLUTTER_TEST_UNIT ("/script/animation", script_animation) CLUTTER_TEST_UNIT ("/script/object-property", script_object_property) CLUTTER_TEST_UNIT ("/script/layout-property", script_layout_property) CLUTTER_TEST_UNIT ("/script/actor-margin", script_margin) diff --git a/src/tests/clutter/conform/scripts/test-animator-1.json b/src/tests/clutter/conform/scripts/test-animator-1.json deleted file mode 100644 index 2d6aab9085d1622db7607e0ddad1bd71f748649d..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/scripts/test-animator-1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000 -} diff --git a/src/tests/clutter/conform/scripts/test-animator-2.json b/src/tests/clutter/conform/scripts/test-animator-2.json deleted file mode 100644 index 9059f57ed509b42a5388e9637df1d398211b11fb..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/scripts/test-animator-2.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "foo", - "x" : 0, - "y" : 0, - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000, - - "properties" : [ - { - "object" : "foo", - "name" : "x", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - } - ] - } -] diff --git a/src/tests/clutter/conform/scripts/test-animator-3.json b/src/tests/clutter/conform/scripts/test-animator-3.json deleted file mode 100644 index 26d779beee7be3370e59881cd5878e5a6e350c03..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/scripts/test-animator-3.json +++ /dev/null @@ -1,40 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "foo", - "x" : 0, - "y" : 0, - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000, - - "properties" : [ - { - "object" : "foo", - "name" : "x", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - }, - { - "object" : "foo", - "name" : "y", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - } - ] - } -] diff --git a/src/tests/clutter/conform/scripts/test-script-animation.json b/src/tests/clutter/conform/scripts/test-script-animation.json deleted file mode 100644 index d6ef90343f91dc7212ed311037d1e2bc64623dd2..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/scripts/test-script-animation.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type" : "ClutterAnimation", - "id" : "test", - "mode" : "easeInCubic", - "duration" : 500, - "object" : { - "type" : "ClutterRectangle", - "id" : "rect", - "opacity" : 128, - "width" : 100, - "height" : 16, - "color" : "white" - } -} diff --git a/src/tests/clutter/conform/scripts/test-state-1.json b/src/tests/clutter/conform/scripts/test-state-1.json deleted file mode 100644 index 78ab5de89d43bdc60f6435d023fa6d2ba36c550c..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/scripts/test-state-1.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "rect", - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterState", - "id" : "state", - - "transitions" : [ - { - "source" : "base", - "target" : "clicked", - "duration" : 250, - - "keys" : [ - [ "rect", "opacity", "linear", 128 ] - ] - }, - { - "source" : "clicked", - "target" : "base", - "duration" : 150, - - "keys" : [ - [ "rect", "opacity", "linear", 255 ] - ] - } - ] - } -] diff --git a/src/tests/clutter/conform/state.c b/src/tests/clutter/conform/state.c deleted file mode 100644 index 7e4720dc5fd12826757f9c7209da82eac8e67462..0000000000000000000000000000000000000000 --- a/src/tests/clutter/conform/state.c +++ /dev/null @@ -1,87 +0,0 @@ -#include - -#include "test-conform-common.h" - -void -state_base (TestConformSimpleFixture *fixture G_GNUC_UNUSED, - gconstpointer dummy G_GNUC_UNUSED) -{ - ClutterScript *script = clutter_script_new (); - GObject *state = NULL; - GError *error = NULL; - gchar *test_file; - GList *states, *keys; - ClutterStateKey *state_key; - guint duration; - - test_file = clutter_test_get_data_file ("test-state-1.json"); - clutter_script_load_from_file (script, test_file, &error); - if (g_test_verbose () && error) - g_print ("Error: %s\n", error->message); - - g_free (test_file); - -#if GLIB_CHECK_VERSION (2, 20, 0) - g_assert_no_error (error); -#else - g_assert (error == NULL); -#endif - - state = clutter_script_get_object (script, "state"); - g_assert (CLUTTER_IS_STATE (state)); - - states = clutter_state_get_states (CLUTTER_STATE (state)); - g_assert (states != NULL); - - g_assert (g_list_find (states, g_intern_static_string ("clicked"))); - g_list_free (states); - - duration = clutter_state_get_duration (CLUTTER_STATE (state), "base", "clicked"); - g_assert_cmpint (duration, ==, 250); - - duration = clutter_state_get_duration (CLUTTER_STATE (state), "clicked", "base"); - g_assert_cmpint (duration, ==, 150); - - keys = clutter_state_get_keys (CLUTTER_STATE (state), "base", "clicked", - clutter_script_get_object (script, "rect"), - "opacity"); - - g_assert (keys != NULL); - g_assert_cmpint (g_list_length (keys), ==, 1); - - state_key = keys->data; - g_assert (clutter_state_key_get_object (state_key) == clutter_script_get_object (script, "rect")); - g_assert (clutter_state_key_get_mode (state_key) == CLUTTER_LINEAR); - g_assert_cmpstr (clutter_state_key_get_property_name (state_key), ==, "opacity"); - - g_list_free (keys); - keys = clutter_state_get_keys (CLUTTER_STATE (state), NULL, NULL, NULL, NULL); - g_assert_cmpint (g_list_length (keys), ==, 2); - g_list_free (keys); - - - - clutter_state_set (CLUTTER_STATE (state), "base", "clicked", state, "state", CLUTTER_LINEAR, "foo", NULL); - - keys = clutter_state_get_keys (CLUTTER_STATE (state), "base", "clicked", - NULL, NULL); - - g_assert (keys != NULL); - g_assert_cmpint (g_list_length (keys), ==, 2); - g_list_free (keys); - - states = clutter_state_get_states (CLUTTER_STATE (state)); - g_assert_cmpint (g_list_length (states), ==, 2); - g_list_free (states); - - clutter_state_remove_key (CLUTTER_STATE (state), NULL, "clicked", NULL, NULL); - states = clutter_state_get_states (CLUTTER_STATE (state)); - - /* removing the "clicked" state, will also cause the "base" state to be removed - * since in the .json there is no default source state - */ - g_assert_cmpint (g_list_length (states), ==, 0); - g_list_free (states); - - g_object_unref (script); -} diff --git a/src/tests/clutter/interactive/light0.png b/src/tests/clutter/interactive/light0.png new file mode 100644 index 0000000000000000000000000000000000000000..52c64e81a1a922cc3370499100d415eac2fe2ec2 Binary files /dev/null and b/src/tests/clutter/interactive/light0.png differ diff --git a/src/tests/clutter/interactive/meson.build b/src/tests/clutter/interactive/meson.build index c2297072281cc38bb0c65269984d1d1a17c522cf..0e7180f1360cb0157a075c97da22b1cb8180f2ae 100644 --- a/src/tests/clutter/interactive/meson.build +++ b/src/tests/clutter/interactive/meson.build @@ -17,18 +17,14 @@ clutter_tests_interactive_link_args = [ clutter_tests_interactive_test_sources = [ 'test-events.c', 'test-actors.c', - 'test-shader-effects.c', 'test-script.c', 'test-grab.c', 'test-cogl-shader-glsl.c', - 'test-state.c', 'test-cogl-tex-tile.c', 'test-cogl-tex-convert.c', 'test-cogl-offscreen.c', 'test-cogl-tex-polygon.c', - 'test-cogl-multitexture.c', 'test-paint-wrapper.c', - 'test-layout.c', 'test-animation.c', 'test-easing.c', 'test-binding-pool.c', @@ -39,12 +35,9 @@ clutter_tests_interactive_test_sources = [ 'test-stage-sizing.c', 'test-swipe-action.c', 'test-cogl-point-sprites.c', - 'test-path-constraint.c', - 'test-state-script.c', 'test-devices.c', 'test-content.c', 'test-keyframe-transition.c', - 'test-bind-constraint.c', 'test-touch-events.c', 'test-rotate-zoom.c', 'test-image.c', diff --git a/src/tests/clutter/interactive/redhand_alpha.png b/src/tests/clutter/interactive/redhand_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..42a93c3a4405853d89acc80521bdb25313edb74b Binary files /dev/null and b/src/tests/clutter/interactive/redhand_alpha.png differ diff --git a/src/tests/clutter/interactive/test-easing.c b/src/tests/clutter/interactive/test-easing.c index c0d175a21816e0a2dd23dc7ff3a84a80a63ddca6..1ec88e8144d0a8b222eb4a28b4eae85c62d75f1b 100644 --- a/src/tests/clutter/interactive/test-easing.c +++ b/src/tests/clutter/interactive/test-easing.c @@ -53,8 +53,6 @@ static gboolean recenter = FALSE; static ClutterActor *main_stage = NULL; static ClutterActor *easing_mode_label = NULL; -static ClutterAnimation *last_animation = NULL; - int test_easing_main (int argc, char *argv[]); @@ -66,21 +64,23 @@ test_easing_describe (void); * repositions (through an animation) the bouncer at the center of the stage */ static void -recenter_bouncer (ClutterAnimation *animation, - ClutterActor *rectangle) +recenter_bouncer (ClutterActor *rectangle) { gfloat base_x, base_y; gint cur_mode; + + cur_mode = easing_modes[current_mode].mode; base_x = clutter_actor_get_width (main_stage) / 2; base_y = clutter_actor_get_height (main_stage) / 2; - cur_mode = easing_modes[current_mode].mode; + clutter_actor_set_easing_duration (rectangle, 250); + clutter_actor_set_easing_mode (rectangle, cur_mode); + clutter_actor_set_position (rectangle, base_x, base_y); - clutter_actor_animate (rectangle, cur_mode, 250, - "x", base_x, - "y", base_y, - NULL); + g_signal_connect_after (rectangle, "transition-completed", + G_CALLBACK (clutter_actor_restore_easing_state), + NULL); } static gboolean @@ -108,28 +108,22 @@ on_button_press (ClutterActor *actor, } else if (event->button == CLUTTER_BUTTON_PRIMARY) { - ClutterAnimation *animation; ClutterAnimationMode cur_mode; cur_mode = easing_modes[current_mode].mode; - /* tween the actor using the current easing mode */ - animation = - clutter_actor_animate (rectangle, cur_mode, duration * 1000, - "x", event->x, - "y", event->y, - NULL); + clutter_actor_save_easing_state (rectangle); + clutter_actor_set_easing_duration (rectangle, duration * 1000); + clutter_actor_set_easing_mode (rectangle, cur_mode); + clutter_actor_set_position (rectangle, event->x, event->y); /* if we were asked to, recenter the bouncer at the end of the * animation. we keep track of the animation to avoid connecting * the signal handler to the same Animation twice. */ - if (recenter && last_animation != animation) - g_signal_connect_after (animation, "completed", - G_CALLBACK (recenter_bouncer), - rectangle); - - last_animation = animation; + g_signal_connect_after (rectangle, "transition-completed", + G_CALLBACK (recenter_bouncer), + rectangle); } return TRUE; diff --git a/src/tests/clutter/interactive/test-script-signals.json b/src/tests/clutter/interactive/test-script-signals.json deleted file mode 100644 index 0d3f6bd258ed53cbbf0344d23ae5029aec49366e..0000000000000000000000000000000000000000 --- a/src/tests/clutter/interactive/test-script-signals.json +++ /dev/null @@ -1,68 +0,0 @@ -[ - { - "id" : "button", - "type" : "ClutterRectangle", - - "width" : "16 em", - "height" : "6 em", - - "color" : "rgb(255, 0, 0)", - "opacity" : 128, - - "scale-gravity" : "center", - - "reactive" : true, - - "signals" : [ - { - "name" : "button-press-event", - "handler" : "on_button_press" - }, - { "name" : "enter-event", "states" : "button-states", "target-state" : "hover" }, - { "name" : "leave-event", "states" : "button-states", "target-state" : "base" }, - { "name" : "button-press-event", "states" : "button-states", "target-state" : "active" }, - { "name" : "button-release-event", "states" : "button-states", "target-state" : "hover" } - ] - }, - - { - "id" : "button-states", - "type" : "ClutterState", - - "duration" : 250, - - "transitions" : [ - { - "source" : null, - "target" : "base", - - "keys" : [ - [ "button", "opacity", "linear", 128 ], - [ "button", "scale-x", "ease-in-cubic", 1.0 ], - [ "button", "scale-y", "ease-in-cubic", 1.0 ], - [ "button", "color", "linear", "rgb(255, 0, 0)" ] - ] - }, - { - "source" : null, - "target" : "hover", - - "keys" : [ - [ "button", "opacity", "linear", 255 ], - [ "button", "scale-x", "ease-out-bounce", 1.4 ], - [ "button", "scale-y", "ease-out-bounce", 1.4 ], - [ "button", "color", "linear", "rgb(0, 255, 0)" ] - ] - }, - { - "source" : null, - "target" : "active", - - "keys" : [ - [ "button", "opacity", "linear", 255 ], - [ "button", "color", "linear", "rgb(0, 0, 255)" ] - ] - } - ] - } -] diff --git a/src/tests/clutter/interactive/test-script.c b/src/tests/clutter/interactive/test-script.c index 999e5191bc0a74e0c85f0c46f93e52cc6097ed26..d0795dde2a5e86c435eea46b7f1f72ed6ac015df 100644 --- a/src/tests/clutter/interactive/test-script.c +++ b/src/tests/clutter/interactive/test-script.c @@ -40,13 +40,7 @@ static const gchar *test_behaviour = " \"type\" : \"ClutterTimeline\"," " \"duration\" : 5000," " \"loop\" : true" -" }," -" {" -" \"id\" : \"sine-alpha\"," -" \"type\" : \"ClutterAlpha\"," -" \"function\" : \"sine_alpha\"," -" \"timeline\" : \"main-timeline\"" -" }," +" }" "]"; static gboolean diff --git a/src/tests/clutter/interactive/test-state.c b/src/tests/clutter/interactive/test-state.c deleted file mode 100644 index 799ec980d0b296d23036aecd4e8bd95dd50f3509..0000000000000000000000000000000000000000 --- a/src/tests/clutter/interactive/test-state.c +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include -#include -#include -#include "test-utils.h" - -#define STAGE_WIDTH 1024 -#define STAGE_HEIGHT 768 - -#define ACTOR_WIDTH 128 -#define ACTOR_HEIGHT 128 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - -gint -test_state_main (gint argc, - gchar **argv); - -const char * -test_state_describe (void); - -static gboolean press_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "right"); - return TRUE; -} - -static gboolean release_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "active"); - return TRUE; -} - -static gboolean enter_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "hover"); - return TRUE; -} - -static gboolean leave_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "normal"); - return TRUE; -} - -static void completed (ClutterState *state, - gpointer data) -{ - g_print ("Completed transitioning to state: %s\n", - clutter_state_get_state (state)); - - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_actor_new (); - ClutterActor *rectangle = clutter_actor_new (); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_background_color (rectangle, color); - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - - clutter_actor_add_child (group, rectangle); - clutter_actor_add_child (group, hand); - - return group; -} - -G_MODULE_EXPORT gint -test_state_main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return 1; - - layout_state = clutter_state_new (); - - stage = clutter_stage_new (); - clutter_actor_set_background_color (stage, CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Machine"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - g_signal_connect (stage, "button-press-event", - G_CALLBACK (press_event), layout_state); - g_signal_connect (stage, "button-release-event", - G_CALLBACK (release_event), layout_state); - - for (i = 0; i < TOTAL; i++) - { - ClutterActor *actor; - ClutterState *a_state; - - int row = i/COLS; - int col = i%COLS; - - actor = new_rect (255 * (1.0 * col / COLS), 50, - 255 * (1.0 * row / ROWS), 255); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor); - clutter_actor_set_position (actor, 320.0, 240.0); - clutter_actor_set_reactive (actor, TRUE); - clutter_actor_add_effect_with_name (actor, "fade", - clutter_desaturate_effect_new (0.0)); - - - clutter_state_set (layout_state, NULL, "active", - actor, "delayed::x", CLUTTER_LINEAR, - ACTOR_WIDTH * 1.0 * ((TOTAL-1-i) % COLS), - ((row*1.0/ROWS))/2, (1.0-(row*1.0/ROWS))/2, - actor, "delayed::y", CLUTTER_LINEAR, - ACTOR_HEIGHT * 1.0 * ((TOTAL-1-i) / COLS), - ((row*1.0/ROWS))/2, 0.0, - actor, "rotation-angle-x", CLUTTER_LINEAR, 0.0, - actor, "rotation-angle-y", CLUTTER_LINEAR, 0.0, - NULL); - - clutter_state_set (layout_state, NULL, "right", - actor, "delayed::x", CLUTTER_LINEAR, STAGE_WIDTH * 1.0, - ((row*1.0/ROWS))/2, - (1.0-(row*1.0/ROWS))/2, - actor, "delayed::y", CLUTTER_LINEAR, STAGE_HEIGHT * 1.0, - ((row*1.0/ROWS))/2, - 0.0, - NULL); - - clutter_state_set (layout_state, NULL, "left", - actor, "rotation-angle-x", CLUTTER_LINEAR, 45.0, - actor, "rotation-angle-y", CLUTTER_LINEAR, 5.0, - actor, "x", CLUTTER_LINEAR, 0-64.0, - actor, "y", CLUTTER_LINEAR, 0-64.0, - NULL); - - a_state = clutter_state_new (); - g_object_set_data_full (G_OBJECT (actor), "hover-state-machine", - a_state, g_object_unref); - g_signal_connect (actor, "enter-event", - G_CALLBACK (enter_event), a_state); - g_signal_connect (actor, "leave-event", - G_CALLBACK (leave_event), a_state); - - clutter_state_set (a_state, NULL, "normal", - actor, "opacity", CLUTTER_LINEAR, 0x77, - actor, "rotation-angle-z", CLUTTER_LINEAR, 0.0, - actor, "@effects.fade.factor", CLUTTER_LINEAR, 0.0, - NULL); - clutter_state_set (a_state, NULL, "hover", - actor, "opacity", CLUTTER_LINEAR, 0xff, - actor, "rotation-angle-z", CLUTTER_LINEAR, 10.0, - actor, "@effects.fade.factor", CLUTTER_LINEAR, 1.0, - NULL); - clutter_actor_set_opacity (actor, 0x77); - - clutter_state_set_duration (a_state, NULL, NULL, 500); - } - - clutter_state_set_duration (layout_state, NULL, NULL, 1000); - clutter_state_set_duration (layout_state, "active", "left", 1400); - - g_signal_connect (layout_state, "completed", G_CALLBACK (completed), NULL); - - clutter_actor_show (stage); - - clutter_state_warp_to_state (layout_state, "left"); - clutter_state_set_state (layout_state, "active"); - - clutter_main (); - - g_object_unref (layout_state); - - return EXIT_SUCCESS; -} - -G_MODULE_EXPORT const char * -test_state_describe (void) -{ - return "Animating using the State class."; -} diff --git a/src/tests/clutter/performance/meson.build b/src/tests/clutter/performance/meson.build index ee092bb0496c66e03a70d2570085a86171bea6bf..a8eef886be911e9b4870243825f68ea1e426b769 100644 --- a/src/tests/clutter/performance/meson.build +++ b/src/tests/clutter/performance/meson.build @@ -11,11 +11,6 @@ clutter_tests_performance_c_args += clutter_debug_c_args clutter_tests_performance_tests = [ 'test-picking', 'test-text-perf', - 'test-state', - 'test-state-interactive', - 'test-state-hidden', - 'test-state-mini', - 'test-state-pick', ] foreach test : clutter_tests_performance_tests diff --git a/src/tests/clutter/performance/test-state-hidden.c b/src/tests/clutter/performance/test-state-hidden.c deleted file mode 100644 index 64911b4eb8fe367a55653f8e9b770648eb0c6a86..0000000000000000000000000000000000000000 --- a/src/tests/clutter/performance/test-state-hidden.c +++ /dev/null @@ -1,150 +0,0 @@ -#include -#include -#include -#include -#include "test-common.h" - -#define STAGE_WIDTH 160 -#define STAGE_HEIGHT 120 - -#define ACTOR_WIDTH 8 -#define ACTOR_HEIGHT 8 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - g_free (file); - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterActor *group; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - group = clutter_group_new (); - layout_state = clutter_state_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [hidden]"); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static gboolean press_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "right"); - return TRUE; -} - -static gboolean release_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "active"); - return TRUE; -} - -static gboolean enter_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "hover"); - return TRUE; -} - -static gboolean leave_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "normal"); - return TRUE; -} - -static void completed (ClutterState *state, - gpointer data) -{ - g_print ("Completed transitioning to state: %s\n", - clutter_state_get_state (state)); - - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [interactive]"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - - g_signal_connect (stage, "button-press-event", - G_CALLBACK (press_event), layout_state); - g_signal_connect (stage, "button-release-event", - G_CALLBACK (release_event), layout_state); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -#define STAGE_WIDTH 160 -#define STAGE_HEIGHT 120 - -#define ACTOR_WIDTH 8 -#define ACTOR_HEIGHT 8 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [mini]"); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -static gint times = 16; - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } - times --; - if (times <=0) - clutter_main_quit (); -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [pick]"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -static gint times = 16; - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } - times --; - if (times <=0) - clutter_main_quit (); -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i