From 5f1410f96828eb54b0c6ed4d9ec51882f8549e4a Mon Sep 17 00:00:00 2001 From: Niels De Graef Date: Sun, 18 Nov 2018 11:52:50 +0100 Subject: [PATCH] clutter: remove deprecated ClutterStage/ClutterAnimator Removing one without the other was quite the headache, so just remove both of them together instead. --- clutter/clutter/Makefile.am | 4 - clutter/clutter/clutter-deprecated.h | 2 - clutter/clutter/clutter-script.c | 231 -- clutter/clutter/clutter-script.h | 9 - clutter/clutter/clutter-timeline.c | 4 +- clutter/clutter/clutter-types.h | 2 - clutter/clutter/deprecated/clutter-animator.c | 2164 ---------------- clutter/clutter/deprecated/clutter-animator.h | 188 -- .../deprecated/clutter-behaviour-depth.c | 3 +- .../deprecated/clutter-behaviour-opacity.c | 3 +- .../deprecated/clutter-behaviour-rotate.c | 3 +- .../deprecated/clutter-behaviour-scale.c | 3 +- .../clutter/deprecated/clutter-behaviour.c | 3 +- clutter/clutter/deprecated/clutter-state.c | 2308 ----------------- clutter/clutter/deprecated/clutter-state.h | 187 -- clutter/clutter/meson.build | 4 - clutter/tests/conform/Makefile.am | 7 +- clutter/tests/conform/animator.c | 199 -- clutter/tests/conform/meson.build | 1 - .../conform/scripts/test-animator-1.json | 5 - .../conform/scripts/test-animator-2.json | 29 - .../conform/scripts/test-animator-3.json | 40 - .../tests/conform/scripts/test-state-1.json | 33 - clutter/tests/conform/state.c | 87 - clutter/tests/interactive/Makefile.am | 4 - clutter/tests/interactive/meson.build | 4 - clutter/tests/interactive/test-animator.c | 138 - .../interactive/test-script-signals.json | 68 - .../tests/interactive/test-state-animator.c | 144 - clutter/tests/interactive/test-state-script.c | 53 - clutter/tests/interactive/test-state.c | 206 -- clutter/tests/performance/Makefile.am | 7 +- clutter/tests/performance/meson.build | 5 - clutter/tests/performance/test-state-hidden.c | 150 -- .../performance/test-state-interactive.c | 194 -- clutter/tests/performance/test-state-mini.c | 153 -- clutter/tests/performance/test-state-pick.c | 159 -- clutter/tests/performance/test-state.c | 158 -- po/POTFILES.skip | 2 - 39 files changed, 9 insertions(+), 6955 deletions(-) delete mode 100644 clutter/clutter/deprecated/clutter-animator.c delete mode 100644 clutter/clutter/deprecated/clutter-animator.h delete mode 100644 clutter/clutter/deprecated/clutter-state.c delete mode 100644 clutter/clutter/deprecated/clutter-state.h delete mode 100644 clutter/tests/conform/animator.c delete mode 100644 clutter/tests/conform/scripts/test-animator-1.json delete mode 100644 clutter/tests/conform/scripts/test-animator-2.json delete mode 100644 clutter/tests/conform/scripts/test-animator-3.json delete mode 100644 clutter/tests/conform/scripts/test-state-1.json delete mode 100644 clutter/tests/conform/state.c delete mode 100644 clutter/tests/interactive/test-animator.c delete mode 100644 clutter/tests/interactive/test-script-signals.json delete mode 100644 clutter/tests/interactive/test-state-animator.c delete mode 100644 clutter/tests/interactive/test-state-script.c delete mode 100644 clutter/tests/interactive/test-state.c delete mode 100644 clutter/tests/performance/test-state-hidden.c delete mode 100644 clutter/tests/performance/test-state-interactive.c delete mode 100644 clutter/tests/performance/test-state-mini.c delete mode 100644 clutter/tests/performance/test-state-pick.c delete mode 100644 clutter/tests/performance/test-state.c diff --git a/clutter/clutter/Makefile.am b/clutter/clutter/Makefile.am index 6d96a4a1c..8d1f3767a 100644 --- a/clutter/clutter/Makefile.am +++ b/clutter/clutter/Makefile.am @@ -257,7 +257,6 @@ deprecated_h = \ deprecated/clutter-alpha.h \ deprecated/clutter-animatable.h \ deprecated/clutter-animation.h \ - deprecated/clutter-animator.h \ deprecated/clutter-backend.h \ deprecated/clutter-behaviour.h \ deprecated/clutter-behaviour-depth.h \ @@ -275,7 +274,6 @@ deprecated_h = \ deprecated/clutter-rectangle.h \ deprecated/clutter-stage-manager.h \ deprecated/clutter-stage.h \ - deprecated/clutter-state.h \ deprecated/clutter-texture.h \ deprecated/clutter-timeline.h \ deprecated/clutter-util.h \ @@ -286,7 +284,6 @@ deprecated_c = \ deprecated/clutter-actor-deprecated.c \ deprecated/clutter-alpha.c \ deprecated/clutter-animation.c \ - deprecated/clutter-animator.c \ deprecated/clutter-behaviour.c \ deprecated/clutter-behaviour-depth.c \ deprecated/clutter-behaviour-ellipse.c \ @@ -298,7 +295,6 @@ deprecated_c = \ deprecated/clutter-input-device-deprecated.c \ deprecated/clutter-layout-manager-deprecated.c \ deprecated/clutter-rectangle.c \ - deprecated/clutter-state.c \ deprecated/clutter-texture.c \ $(NULL) diff --git a/clutter/clutter/clutter-deprecated.h b/clutter/clutter/clutter-deprecated.h index 558617ff5..793439557 100644 --- a/clutter/clutter/clutter-deprecated.h +++ b/clutter/clutter/clutter-deprecated.h @@ -7,7 +7,6 @@ #include "deprecated/clutter-alpha.h" #include "deprecated/clutter-animatable.h" #include "deprecated/clutter-animation.h" -#include "deprecated/clutter-animator.h" #include "deprecated/clutter-backend.h" #include "deprecated/clutter-behaviour.h" #include "deprecated/clutter-behaviour-depth.h" @@ -25,7 +24,6 @@ #include "deprecated/clutter-rectangle.h" #include "deprecated/clutter-stage-manager.h" #include "deprecated/clutter-stage.h" -#include "deprecated/clutter-state.h" #include "deprecated/clutter-texture.h" #include "deprecated/clutter-timeline.h" #include "deprecated/clutter-util.h" diff --git a/clutter/clutter/clutter-script.c b/clutter/clutter/clutter-script.c index 7a58cd0fb..cff711939 100644 --- a/clutter/clutter/clutter-script.c +++ b/clutter/clutter/clutter-script.c @@ -157,49 +157,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: @@ -248,7 +205,6 @@ #include "deprecated/clutter-alpha.h" #include "deprecated/clutter-behaviour.h" #include "deprecated/clutter-container.h" -#include "deprecated/clutter-state.h" enum { @@ -274,8 +230,6 @@ struct _ClutterScriptPrivate ClutterScriptParser *parser; - GHashTable *states; - gchar **search_paths; gchar *translation_domain; @@ -328,7 +282,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); @@ -386,7 +339,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); @@ -521,9 +473,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); } /** @@ -1043,65 +992,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, @@ -1139,67 +1035,6 @@ connect_each_object (gpointer key, connect_data->user_data); } } - 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); - } signal_info_free (sinfo); } @@ -1423,72 +1258,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 5642e1034..b919d148f 100644 --- a/clutter/clutter/clutter-script.h +++ b/clutter/clutter/clutter-script.h @@ -178,15 +178,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 c2efdd117..7e8f06c2c 100644 --- a/clutter/clutter/clutter-timeline.c +++ b/clutter/clutter/clutter-timeline.c @@ -24,7 +24,7 @@ /** * SECTION:clutter-timeline * @short_description: A class for time-based events - * @see_also: #ClutterAnimation, #ClutterAnimator, #ClutterState + * @see_also: #ClutterAnimation * * #ClutterTimeline is a base class for managing time-based event that cause * Clutter to redraw a stage, such as animations. @@ -71,7 +71,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. + * #ClutterAnimation. * * ## Defining Timelines in ClutterScript * diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index 1d4d3f9a3..6e78171ed 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -90,8 +90,6 @@ typedef struct _ClutterVertex ClutterVertex; typedef struct _ClutterAlpha ClutterAlpha; typedef struct _ClutterAnimation ClutterAnimation; -typedef struct _ClutterAnimator ClutterAnimator; -typedef struct _ClutterState ClutterState; typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool; typedef struct _ClutterInputDevice ClutterInputDevice; diff --git a/clutter/clutter/deprecated/clutter-animator.c b/clutter/clutter/deprecated/clutter-animator.c deleted file mode 100644 index 11efea654..000000000 --- a/clutter/clutter/deprecated/clutter-animator.c +++ /dev/null @@ -1,2164 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2010 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: - * Øyvind Kolås - */ - -/** - * SECTION:clutter-animator - * @short_description: Multi-actor tweener - * @See_Also: #ClutterAnimatable, #ClutterInterval, #ClutterAlpha, - * #ClutterTimeline - * - * #ClutterAnimator is an object providing declarative animations for - * #GObject properties belonging to one or more #GObjects to - * #ClutterIntervals. - * - * #ClutterAnimator is used to build and describe complex animations - * in terms of "key frames". #ClutterAnimator is meant to be used - * through the #ClutterScript definition format, but it comes with a - * convenience C API. - * - * #ClutterAnimator is available since Clutter 1.2 - * - * #ClutterAnimator has been deprecated in Clutter 1.12. If you - * want to combine multiple transitions using key frames, use - * #ClutterKeyframeTransition and #ClutterTransitionGroup instead. - * - * ## Key Frames - * - * Every animation handled by a #ClutterAnimator can be - * described in terms of "key frames". For each #GObject property - * there can be multiple key frames, each one defined by the end - * value for the property to be computed starting from the current - * value to a specific point in time, using a given easing - * mode. - * - * The point in time is defined using a value representing - * the progress in the normalized interval of [ 0, 1 ]. This maps - * the value returned by clutter_timeline_get_duration(). - * - * ## ClutterAnimator description for ClutterScript - * - * #ClutterAnimator defines a custom "properties" key - * which allows describing the key frames for objects as - * an array of key frames. - * - * The `properties` array has the following syntax: - * - * |[ - * { - * "properties" : [ - * { - * "object" : object_id - * "name" : property_name - * "ease-in" : true_or_false - * "interpolation" : interpolation_value - * "keys" : [ - * [ progress, easing_mode, final_value ] - * ] - * ] - * } - * ]| - * - * The following JSON fragment defines a #ClutterAnimator - * with the duration of 1 second and operating on the x and y - * properties of a #ClutterActor named "rect-01", with two frames - * for each property. The first frame will linearly move the actor - * from its current position to the 100, 100 position in 20 percent - * of the duration of the animation; the second will using a cubic - * easing to move the actor to the 200, 200 coordinates. - * - * |[ - * { - * "type" : "ClutterAnimator", - * "duration" : 1000, - * "properties" : [ - * { - * "object" : "rect-01", - * "name" : "x", - * "ease-in" : true, - * "keys" : [ - * [ 0.2, "linear", 100.0 ], - * [ 1.0, "easeOutCubic", 200.0 ] - * ] - * }, - * { - * "object" : "rect-01", - * "name" : "y", - * "ease-in" : true, - * "keys" : [ - * [ 0.2, "linear", 100.0 ], - * [ 1.0, "easeOutCubic", 200.0 ] - * ] - * } - * ] - * } - * ]| - */ - -#include "clutter-build-config.h" - -#include -#include - -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-animator.h" - -#include "clutter-alpha.h" -#include "clutter-debug.h" -#include "clutter-enum-types.h" -#include "clutter-interval.h" -#include "clutter-private.h" -#include "clutter-script-private.h" -#include "clutter-scriptable.h" - -/* progress values varying by less than this are considered equal */ -#define PROGRESS_EPSILON 0.00001 - -struct _ClutterAnimatorPrivate -{ - ClutterTimeline *timeline; - ClutterTimeline *slave_timeline; - - GList *score; - - GHashTable *properties; -}; - -struct _ClutterAnimatorKey -{ - GObject *object; - const gchar *property_name; - guint mode; - - GValue value; - - /* normalized progress, between 0.0 and 1.0 */ - gdouble progress; - - /* back-pointer to the animator which owns the key */ - ClutterAnimator *animator; - - /* interpolation mode */ - ClutterInterpolation interpolation; - - /* ease from the current object state into the animation when it starts */ - guint ease_in : 1; - - /* This key is already being destroyed and shouldn't - * trigger additional weak unrefs - */ - guint is_inert : 1; - - gint ref_count; -}; - -enum -{ - PROP_0, - - PROP_DURATION, - PROP_TIMELINE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -static void clutter_scriptable_init (ClutterScriptableIface *iface); - -G_DEFINE_TYPE_WITH_CODE (ClutterAnimator, - clutter_animator, - G_TYPE_OBJECT, - G_ADD_PRIVATE (ClutterAnimator) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_init)); -/** - * clutter_animator_new: - * - * Creates a new #ClutterAnimator instance - * - * Return value: a new #ClutterAnimator. - * - * Since: 1.2 - * - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -ClutterAnimator * -clutter_animator_new (void) -{ - return g_object_new (CLUTTER_TYPE_ANIMATOR, NULL); -} - -/***/ - -typedef struct _PropObjectKey { - GObject *object; - const gchar *property_name; - guint mode; - gdouble progress; -} PropObjectKey; - -/* Iterator that walks the keys of a property*/ -typedef struct _PropertyIter { - PropObjectKey *key; - ClutterInterval *interval; - ClutterAlpha *alpha; - - GList *current; - - gdouble start; /* the progress of current */ - gdouble end; /* until which progress it is valid */ - ClutterInterpolation interpolation; - - guint ease_in : 1; -} PropertyIter; - -static PropObjectKey * -prop_actor_key_new (GObject *object, - const gchar *property_name) -{ - PropObjectKey *key = g_slice_new0 (PropObjectKey); - - key->object = object; - key->property_name = g_intern_string (property_name); - - return key; -} - -static void -prop_actor_key_free (gpointer key) -{ - if (key != NULL) - g_slice_free (PropObjectKey, key); -} - -static void -property_iter_free (gpointer key) -{ - if (key != NULL) - { - PropertyIter *property_iter = key; - - g_object_unref (property_iter->interval); - g_object_unref (property_iter->alpha); - - g_slice_free (PropertyIter, property_iter); - } -} - -static PropertyIter * -property_iter_new (ClutterAnimator *animator, - PropObjectKey *key, - GType type) -{ - ClutterAnimatorPrivate *priv = animator->priv; - PropertyIter *property_iter = g_slice_new (PropertyIter); - ClutterInterval *interval = g_object_new (CLUTTER_TYPE_INTERVAL, - "value-type", type, - NULL); - - /* we own this interval */ - g_object_ref_sink (interval); - - property_iter->interval = interval; - property_iter->key = key; - property_iter->alpha = clutter_alpha_new (); - clutter_alpha_set_timeline (property_iter->alpha, priv->slave_timeline); - - /* as well as the alpha */ - g_object_ref_sink (property_iter->alpha); - - return property_iter; -} - -static guint -prop_actor_hash (gconstpointer value) -{ - const PropObjectKey *info = value; - - return GPOINTER_TO_INT (info->property_name) - ^ GPOINTER_TO_INT (info->object); -} - -static gboolean -prop_actor_equal (gconstpointer a, gconstpointer b) -{ - const PropObjectKey *infoa = a; - const PropObjectKey *infob = b; - - /* property name strings are interned so we can just compare pointers */ - if (infoa->object == infob->object && - (infoa->property_name == infob->property_name)) - return TRUE; - - return FALSE; -} - -static gint -sort_actor_prop_progress_func (gconstpointer a, - gconstpointer b) -{ - const ClutterAnimatorKey *pa = a; - const ClutterAnimatorKey *pb = b; - - if (pa->object == pb->object) - { - gint pdiff = pb->property_name - pa->property_name; - - if (pdiff) - return pdiff; - - if (fabs (pa->progress - pb->progress) < PROGRESS_EPSILON) - return 0; - - if (pa->progress > pb->progress) - return 1; - - return -1; - } - - return pa->object - pb->object; -} - -static gint -sort_actor_prop_func (gconstpointer a, - gconstpointer b) -{ - const ClutterAnimatorKey *pa = a; - const ClutterAnimatorKey *pb = b; - - if (pa->object == pb->object) - return pa->property_name - pb->property_name; - - return pa->object - pb->object; -} - -static void -clutter_animator_remove_key_internal (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress, - gboolean is_inert); - -static void -object_disappeared (gpointer data, - GObject *where_the_object_was) -{ - clutter_animator_remove_key_internal (data, where_the_object_was, NULL, -1.0, - TRUE); -} - -static ClutterAnimatorKey * -clutter_animator_key_new (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress, - guint mode) -{ - ClutterAnimatorKey *animator_key; - - animator_key = g_slice_new (ClutterAnimatorKey); - - animator_key->ref_count = 1; - animator_key->animator = animator; - animator_key->object = object; - animator_key->mode = mode; - memset (&(animator_key->value), 0, sizeof (GValue)); - animator_key->progress = progress; - animator_key->property_name = g_intern_string (property_name); - animator_key->interpolation = CLUTTER_INTERPOLATION_LINEAR; - animator_key->ease_in = FALSE; - animator_key->is_inert = FALSE; - - /* keep a weak reference on the animator, so that we can release the - * back-pointer when needed - */ - g_object_weak_ref (object, object_disappeared, - animator_key->animator); - - return animator_key; -} - -static gpointer -clutter_animator_key_copy (gpointer boxed) -{ - ClutterAnimatorKey *key = boxed; - - if (key != NULL) - key->ref_count += 1; - - return key; -} - -static void -clutter_animator_key_free (gpointer boxed) -{ - ClutterAnimatorKey *key = boxed; - - 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->animator); - - g_slice_free (ClutterAnimatorKey, key); -} - -static void -clutter_animator_dispose (GObject *object) -{ - ClutterAnimator *animator = CLUTTER_ANIMATOR (object); - ClutterAnimatorPrivate *priv = animator->priv; - - clutter_animator_set_timeline (animator, NULL); - g_object_unref (priv->slave_timeline); - - G_OBJECT_CLASS (clutter_animator_parent_class)->dispose (object); -} - -static void -clutter_animator_finalize (GObject *object) -{ - ClutterAnimator *animator = CLUTTER_ANIMATOR (object); - ClutterAnimatorPrivate *priv = animator->priv; - - g_list_foreach (priv->score, (GFunc) clutter_animator_key_free, NULL); - g_list_free (priv->score); - priv->score = NULL; - - g_hash_table_destroy (priv->properties); - - G_OBJECT_CLASS (clutter_animator_parent_class)->finalize (object); -} - -/* XXX: this is copied and slightly modified from glib, - * there is only one way to do this. */ -static GList * -list_find_custom_reverse (GList *list, - gconstpointer data, - GCompareFunc func) -{ - while (list) - { - if (! func (list->data, data)) - return list; - - list = list->prev; - } - - return NULL; -} - -/* Ensures that the interval provided by the animator is correct - * for the requested progress value. - */ -static void -animation_animator_ensure_animator (ClutterAnimator *animator, - PropertyIter *property_iter, - PropObjectKey *key, - gdouble progress) -{ - - if (progress > property_iter->end) - { - while (progress > property_iter->end) - { - ClutterAnimatorKey *initial_key, *next_key; - GList *initial, *next; - - initial = g_list_find_custom (property_iter->current->next, - key, - sort_actor_prop_func); - - if (initial) - { - initial_key = initial->data; - - clutter_interval_set_initial_value (property_iter->interval, - &initial_key->value); - property_iter->current = initial; - property_iter->start = initial_key->progress; - - next = g_list_find_custom (initial->next, - key, - sort_actor_prop_func); - if (next) - { - next_key = next->data; - - property_iter->end = next_key->progress; - } - else - { - next_key = initial_key; - - property_iter->end = property_iter->start; - } - - clutter_interval_set_final_value (property_iter->interval, - &next_key->value); - - if ((clutter_alpha_get_mode (property_iter->alpha) != next_key->mode)) - clutter_alpha_set_mode (property_iter->alpha, next_key->mode); - } - else /* no relevant interval */ - { - ClutterAnimatorKey *current_key = property_iter->current->data; - clutter_interval_set_initial_value (property_iter->interval, - ¤t_key->value); - clutter_interval_set_final_value (property_iter->interval, - ¤t_key->value); - break; - } - } - } - else if (progress < property_iter->start) - { - while (progress < property_iter->start) - { - ClutterAnimatorKey *initial_key, *next_key; - GList *initial; - GList *old = property_iter->current; - - initial = list_find_custom_reverse (property_iter->current->prev, - key, - sort_actor_prop_func); - - if (initial) - { - initial_key = initial->data; - - clutter_interval_set_initial_value (property_iter->interval, - &initial_key->value); - property_iter->current = initial; - property_iter->end = property_iter->start; - property_iter->start = initial_key->progress; - - if (old) - { - next_key = old->data; - - property_iter->end = next_key->progress; - } - else - { - next_key = initial_key; - - property_iter->end = 1.0; - } - - clutter_interval_set_final_value (property_iter->interval, - &next_key->value); - if ((clutter_alpha_get_mode (property_iter->alpha) != next_key->mode)) - clutter_alpha_set_mode (property_iter->alpha, next_key->mode); - } - else - break; - } - } -} - -/* XXX - this might be useful as an internal function exposed somewhere */ -static gdouble -cubic_interpolation (const gdouble dx, - const gdouble prev, - const gdouble j, - const gdouble next, - const gdouble nextnext) -{ - return (((( - prev + 3 * j - 3 * next + nextnext ) * dx + - ( 2 * prev - 5 * j + 4 * next - nextnext ) ) * dx + - ( - prev + next ) ) * dx + (j + j) ) / 2.0; -} - -/* try to get a floating point key value from a key for a property, - * failing use the closest key in that direction or the starting point. - */ -static gfloat -list_try_get_rel (GList *list, - gint count) -{ - ClutterAnimatorKey *key; - GList *iter = list; - GList *best = list; - - if (count > 0) - { - while (count -- && iter != NULL) - { - iter = g_list_find_custom (iter->next, list->data, - sort_actor_prop_func); - if (iter != NULL) - best = iter; - } - } - else - { - while (count ++ < 0 && iter != NULL) - { - iter = list_find_custom_reverse (iter->prev, list->data, - sort_actor_prop_func); - if (iter != NULL) - best = iter; - } - } - - if (best != NULL && best->data != NULL) - { - key = best->data; - - return g_value_get_float (&(key->value)); - } - - return 0; -} - -static void -animation_animator_new_frame (ClutterTimeline *timeline, - gint msecs, - ClutterAnimator *animator) -{ - gdouble progress; - GHashTableIter iter; - gpointer key, value; - - progress = 1.0 * msecs / clutter_timeline_get_duration (timeline); - - /* for each property that is managed figure out the GValue to set, - * avoid creating new ClutterInterval's for each interval crossed - */ - g_hash_table_iter_init (&iter, animator->priv->properties); - - key = value = NULL; - while (g_hash_table_iter_next (&iter, &key, &value)) - { - PropObjectKey *prop_actor_key = key; - PropertyIter *property_iter = value; - ClutterAnimatorKey *start_key; - gdouble sub_progress; - - animation_animator_ensure_animator (animator, property_iter, - key, - progress); - start_key = property_iter->current->data; - - if (property_iter->end == property_iter->start) - sub_progress = 0.0; /* we're past the final value */ - else - sub_progress = (progress - property_iter->start) - / (property_iter->end - property_iter->start); - - /* only change values if we active (delayed start) */ - if (sub_progress >= 0.0 && sub_progress <= 1.0) - { - GValue tmp_value = G_VALUE_INIT; - GType int_type; - - g_value_init (&tmp_value, G_VALUE_TYPE (&start_key->value)); - - clutter_timeline_advance (animator->priv->slave_timeline, - sub_progress * 10000); - - sub_progress = clutter_alpha_get_alpha (property_iter->alpha); - int_type = clutter_interval_get_value_type (property_iter->interval); - - if (property_iter->interpolation == CLUTTER_INTERPOLATION_CUBIC && - int_type == G_TYPE_FLOAT) - { - gdouble prev, current, next, nextnext; - gdouble res; - - if ((property_iter->ease_in == FALSE || - (property_iter->ease_in && - list_find_custom_reverse (property_iter->current->prev, - property_iter->current->data, - sort_actor_prop_func)))) - { - current = g_value_get_float (&start_key->value); - prev = list_try_get_rel (property_iter->current, -1); - } - else - { - /* interpolated and easing in */ - clutter_interval_get_initial_value (property_iter->interval, - &tmp_value); - prev = current = g_value_get_float (&tmp_value); - } - - next = list_try_get_rel (property_iter->current, 1); - nextnext = list_try_get_rel (property_iter->current, 2); - res = cubic_interpolation (sub_progress, prev, current, next, - nextnext); - - g_value_set_float (&tmp_value, res); - } - else - clutter_interval_compute_value (property_iter->interval, - sub_progress, - &tmp_value); - - g_object_set_property (prop_actor_key->object, - prop_actor_key->property_name, - &tmp_value); - - g_value_unset (&tmp_value); - } - } -} - -static void -animation_animator_started (ClutterTimeline *timeline, - ClutterAnimator *animator) -{ - GList *k; - - /* Ensure that animators exist for all involved properties */ - for (k = animator->priv->score; k != NULL; k = k->next) - { - ClutterAnimatorKey *key = k->data; - PropertyIter *property_iter; - PropObjectKey *prop_actor_key; - - prop_actor_key = prop_actor_key_new (key->object, key->property_name); - property_iter = g_hash_table_lookup (animator->priv->properties, - prop_actor_key); - if (property_iter) - { - prop_actor_key_free (prop_actor_key); - } - else - { - GObjectClass *klass = G_OBJECT_GET_CLASS (key->object); - GParamSpec *pspec; - - pspec = g_object_class_find_property (klass, key->property_name); - - property_iter = property_iter_new (animator, prop_actor_key, - G_PARAM_SPEC_VALUE_TYPE (pspec)); - g_hash_table_insert (animator->priv->properties, - prop_actor_key, - property_iter); - } - } - - /* initialize animator with initial list pointers */ - { - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init (&iter, animator->priv->properties); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - PropertyIter *property_iter = value; - ClutterAnimatorKey *initial_key, *next_key; - GList *initial; - GList *next; - - initial = g_list_find_custom (animator->priv->score, - key, - sort_actor_prop_func); - g_assert (initial != NULL); - initial_key = initial->data; - clutter_interval_set_initial_value (property_iter->interval, - &initial_key->value); - - property_iter->current = initial; - property_iter->start = initial_key->progress; - property_iter->ease_in = initial_key->ease_in; - property_iter->interpolation = initial_key->interpolation; - - if (property_iter->ease_in) - { - GValue tmp_value = G_VALUE_INIT; - GType int_type; - - int_type = clutter_interval_get_value_type (property_iter->interval); - g_value_init (&tmp_value, int_type); - - g_object_get_property (initial_key->object, - initial_key->property_name, - &tmp_value); - - clutter_interval_set_initial_value (property_iter->interval, - &tmp_value); - - g_value_unset (&tmp_value); - } - - next = g_list_find_custom (initial->next, key, sort_actor_prop_func); - if (next) - { - next_key = next->data; - property_iter->end = next_key->progress; - } - else - { - next_key = initial_key; - property_iter->end = 1.0; - } - - clutter_interval_set_final_value (property_iter->interval, - &next_key->value); - if ((clutter_alpha_get_mode (property_iter->alpha) != next_key->mode)) - clutter_alpha_set_mode (property_iter->alpha, next_key->mode); - } - } -} - -/** - * clutter_animator_compute_value: - * @animator: a #ClutterAnimator - * @object: a #GObject - * @property_name: the name of the property on object to check - * @progress: a value between 0.0 and 1.0 - * @value: an initialized value to store the computed result - * - * Compute the value for a managed property at a given progress. - * - * If the property is an ease-in property, the current value of the property - * on the object will be used as the starting point for computation. - * - * Return value: %TRUE if the computation yields has a value, otherwise (when - * an error occurs or the progress is before any of the keys) %FALSE is - * returned and the #GValue is left untouched - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -gboolean -clutter_animator_compute_value (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress, - GValue *value) -{ - ClutterAnimatorPrivate *priv; - ClutterAnimatorKey key; - ClutterAnimatorKey *previous; - ClutterAnimatorKey *next = NULL; - GParamSpec *pspec; - GList *initial_l; - GList *previous_l; - GList *next_l; - gboolean ease_in; - ClutterInterpolation interpolation; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - g_return_val_if_fail (property_name, FALSE); - g_return_val_if_fail (value, FALSE); - - priv = animator->priv; - - ease_in = clutter_animator_property_get_ease_in (animator, object, - property_name); - interpolation = clutter_animator_property_get_interpolation (animator, - object, property_name); - - property_name = g_intern_string (property_name); - - pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), - property_name); - - key.object = object; - key.property_name = property_name; - - initial_l = g_list_find_custom (animator->priv->score, &key, - sort_actor_prop_func); - if (initial_l == NULL) - return FALSE; - - /* first find the interval we belong in, that is the first interval - * existing between keys - */ - - for (previous_l = initial_l, next_l = previous_l->next ; - previous_l->next ; - previous_l = previous_l->next, next_l = previous_l->next) - { - previous = previous_l->data; - if (next_l) - { - next = next_l->data; - if (next->object != object || - next->property_name != property_name) - { - next_l = NULL; - next = NULL; - } - } - else - next = NULL; - - if (progress < previous->progress) - { - /* we are before the defined values */ - - /* value has not been set */ - return FALSE; - } - - if (!next && previous->progress <= progress) - { - /* we only had one key for this object/property */ - /* and we are past it, that is our value */ - g_value_copy (&previous->value, value); - return TRUE; - } - - if (next && next->progress >= progress) - { - ClutterInterval *interval; - ClutterAlpha *alpha; - - gdouble sub_progress = (progress - previous->progress) - / (next->progress - previous->progress); - /* this should be our interval */ - interval = g_object_new (CLUTTER_TYPE_INTERVAL, - "value-type", pspec->value_type, - NULL); - - if (ease_in && previous_l == initial_l) - { - GValue tmp_value = {0, }; - g_value_init (&tmp_value, pspec->value_type); - g_object_get_property (object, property_name, &tmp_value); - clutter_interval_set_initial_value (interval, &tmp_value); - g_value_unset (&tmp_value); - } - else - clutter_interval_set_initial_value (interval, &previous->value); - - clutter_interval_set_final_value (interval, &next->value); - - alpha = clutter_alpha_new (); - clutter_alpha_set_timeline (alpha, priv->slave_timeline); - clutter_alpha_set_mode (alpha, next->mode); - - clutter_timeline_advance (priv->slave_timeline, - sub_progress * 10000); - sub_progress = clutter_alpha_get_alpha (alpha); - - if (interpolation == CLUTTER_INTERPOLATION_CUBIC && - pspec->value_type == G_TYPE_FLOAT) - { - gdouble prev, current, nextv, nextnext; - gdouble res; - - if ((ease_in == FALSE || - (ease_in && - list_find_custom_reverse (previous_l->prev, - previous_l->data, - sort_actor_prop_func)))) - { - current = g_value_get_float (&previous->value); - prev = list_try_get_rel (previous_l, -1); - } - else - { - /* interpolated and easing in */ - GValue tmp_value = {0, }; - g_value_init (&tmp_value, pspec->value_type); - clutter_interval_get_initial_value (interval, - &tmp_value); - prev = current = g_value_get_float (&tmp_value); - g_value_unset (&tmp_value); - } - - nextv = list_try_get_rel (previous_l, 1); - nextnext = list_try_get_rel (previous_l, 2); - res = cubic_interpolation (sub_progress, prev, current, nextv, - nextnext); - g_value_set_float (value, res); - } - else - clutter_interval_compute_value (interval, - sub_progress, - value); - - g_object_ref_sink (interval); - g_object_unref (interval); - g_object_ref_sink (alpha); - g_object_unref (alpha); - - return TRUE; - } - - } - - if (!next) - return FALSE; - - /* We're at, or past the end, use the last value */ - g_value_copy (&next->value, value); - - return TRUE; -} - - -/** - * clutter_animator_set_timeline: - * @animator: a #ClutterAnimator - * @timeline: a #ClutterTimeline - * - * Sets an external timeline that will be used for driving the animation - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_set_timeline (ClutterAnimator *animator, - ClutterTimeline *timeline) -{ - ClutterAnimatorPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - - priv = animator->priv; - - if (priv->timeline != NULL) - { - g_signal_handlers_disconnect_by_func (priv->timeline, - animation_animator_new_frame, - animator); - g_signal_handlers_disconnect_by_func (priv->timeline, - animation_animator_started, - animator); - g_object_unref (priv->timeline); - } - - priv->timeline = timeline; - if (timeline != NULL) - { - g_object_ref (priv->timeline); - - g_signal_connect (priv->timeline, "new-frame", - G_CALLBACK (animation_animator_new_frame), - animator); - g_signal_connect (priv->timeline, "started", - G_CALLBACK (animation_animator_started), - animator); - } -} - -/** - * clutter_animator_get_timeline: - * @animator: a #ClutterAnimator - * - * Get the timeline hooked up for driving the #ClutterAnimator - * - * Return value: (transfer none): the #ClutterTimeline that drives the animator - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -ClutterTimeline * -clutter_animator_get_timeline (ClutterAnimator *animator) -{ - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), NULL); - return animator->priv->timeline; -} - -/** - * clutter_animator_start: - * @animator: a #ClutterAnimator - * - * Start the ClutterAnimator, this is a thin wrapper that rewinds - * and starts the animators current timeline. - * - * Return value: (transfer none): the #ClutterTimeline that drives - * the animator. The returned timeline is owned by the #ClutterAnimator - * and it should not be unreferenced - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -ClutterTimeline * -clutter_animator_start (ClutterAnimator *animator) -{ - ClutterAnimatorPrivate *priv; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), NULL); - - priv = animator->priv; - - clutter_timeline_rewind (priv->timeline); - clutter_timeline_start (priv->timeline); - - return priv->timeline; -} - -/** - * clutter_animator_set_duration: - * @animator: a #ClutterAnimator - * @duration: milliseconds a run of the animator should last. - * - * Runs the timeline of the #ClutterAnimator with a duration in msecs - * as specified. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_set_duration (ClutterAnimator *animator, - guint duration) -{ - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - - clutter_timeline_set_duration (animator->priv->timeline, duration); -} - -/** - * clutter_animator_get_duration: - * @animator: a #ClutterAnimator - * - * Retrieves the current duration of an animator - * - * Return value: the duration of the animation, in milliseconds - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -guint -clutter_animator_get_duration (ClutterAnimator *animator) -{ - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), 0); - - return clutter_timeline_get_duration (animator->priv->timeline); -} - -/** - * clutter_animator_set: - * @animator: a #ClutterAnimator - * @first_object: a #GObject - * @first_property_name: the property to specify a key for - * @first_mode: the id of the alpha function to use - * @first_progress: at which stage of the animation this value applies; the - * range is a normalized floating point value between 0 and 1 - * @...: the value first_property_name should have for first_object - * at first_progress, followed by more (object, property_name, mode, - * progress, value) tuples, followed by %NULL - * - * Adds multiple keys to a #ClutterAnimator, specifying the value a given - * property should have at a given progress of the animation. The mode - * specified is the mode used when going to this key from the previous key of - * the @property_name - * - * If a given (object, property, progress) tuple already exist the mode and - * value will be replaced with the new values. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_set (ClutterAnimator *animator, - gpointer first_object, - const gchar *first_property_name, - guint first_mode, - gdouble first_progress, - ...) -{ - GObject *object; - const gchar *property_name; - guint mode; - gdouble progress; - va_list args; - - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - - object = first_object; - property_name = first_property_name; - - g_return_if_fail (object); - g_return_if_fail (property_name); - - mode = first_mode; - progress = first_progress; - - va_start (args, first_progress); - - while (object != NULL) - { - GParamSpec *pspec; - GObjectClass *klass; - GValue value = G_VALUE_INIT; - gchar *error = NULL; - - klass = G_OBJECT_GET_CLASS (object); - pspec = g_object_class_find_property (klass, property_name); - - if (!pspec) - { - g_warning ("Cannot bind property '%s': object of type '%s' " - "do not have this property", - property_name, G_OBJECT_TYPE_NAME (object)); - break; - } - - G_VALUE_COLLECT_INIT (&value, G_PARAM_SPEC_VALUE_TYPE (pspec), - args, 0, - &error); - - if (error) - { - g_warning ("%s: %s", G_STRLOC, error); - g_free (error); - break; - } - - clutter_animator_set_key (animator, - object, - property_name, - mode, - progress, - &value); - - object= va_arg (args, GObject *); - if (object) - { - property_name = va_arg (args, gchar*); - if (!property_name) - { - g_warning ("%s: expected a property name", G_STRLOC); - break; - } - mode = va_arg (args, guint); - progress = va_arg (args, gdouble); - } - } - - va_end (args); -} - -static inline void -clutter_animator_set_key_internal (ClutterAnimator *animator, - ClutterAnimatorKey *key) -{ - ClutterAnimatorPrivate *priv = animator->priv; - GList *old_item; - GList *initial_item; - ClutterAnimatorKey *initial_key = NULL; - - if ((initial_item = g_list_find_custom (animator->priv->score, key, - sort_actor_prop_func))) - initial_key = initial_item->data; - - /* The first key for a property specifies ease-in and interpolation, - * if we are replacing; or becoming a new first key we should - * inherit the old flags. - */ - if (initial_key && - initial_key->progress >= key->progress) - { - key->interpolation = initial_key->interpolation; - key->ease_in = initial_key->ease_in; - } - - old_item = g_list_find_custom (priv->score, key, - sort_actor_prop_progress_func); - - /* replace the key if we already have a similar one */ - if (old_item != NULL) - { - ClutterAnimatorKey *old_key = old_item->data; - - clutter_animator_key_free (old_key); - - priv->score = g_list_remove (priv->score, old_key); - } - - priv->score = g_list_insert_sorted (priv->score, key, - sort_actor_prop_progress_func); - - /* if the animator is already running reinitialize internal iterators */ - if (clutter_timeline_is_playing (priv->timeline)) - animation_animator_started (priv->timeline, animator); -} - -/** - * clutter_animator_set_key: - * @animator: a #ClutterAnimator - * @object: a #GObject - * @property_name: the property to specify a key for - * @mode: the id of the alpha function to use - * @progress: the normalized range at which stage of the animation this - * value applies - * @value: the value property_name should have at progress. - * - * Sets a single key in the #ClutterAnimator for the @property_name of - * @object at @progress. - * - * See also: clutter_animator_set() - * - * Return value: (transfer none): The animator instance - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -ClutterAnimator * -clutter_animator_set_key (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - guint mode, - gdouble progress, - const GValue *value) -{ - ClutterAnimatorKey *animator_key; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), 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); - - property_name = g_intern_string (property_name); - - animator_key = clutter_animator_key_new (animator, - object, property_name, - progress, - mode); - - g_value_init (&animator_key->value, G_VALUE_TYPE (value)); - g_value_copy (value, &animator_key->value); - - clutter_animator_set_key_internal (animator, animator_key); - - return animator; -} - -/** - * clutter_animator_get_keys: - * @animator: a #ClutterAnimator instance - * @object: (allow-none): a #GObject to search for, or %NULL for all objects - * @property_name: (allow-none): a specific property name to query for, - * or %NULL for all properties - * @progress: a specific progress to search for, or a negative value for all - * progresses - * - * Returns a list of pointers to opaque structures with accessor functions - * that describe the keys added to an animator. - * - * Return value: (transfer container) (element-type Clutter.AnimatorKey): a - * list of #ClutterAnimatorKeys; the contents of the list are owned - * by the #ClutterAnimator, but you should free the returned list when done, - * using g_list_free() - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -GList * -clutter_animator_get_keys (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress) -{ - GList *keys = NULL; - GList *k; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), NULL); - g_return_val_if_fail (object == NULL || G_IS_OBJECT (object), NULL); - - property_name = g_intern_string (property_name); - - for (k = animator->priv->score; k; k = k->next) - { - ClutterAnimatorKey *key = k->data; - - if ((object == NULL || (object == key->object)) && - (property_name == NULL || (property_name == key->property_name)) && - (progress < 0 || fabs (progress - key->progress) < PROGRESS_EPSILON)) - { - keys = g_list_prepend (keys, key); - } - } - - return g_list_reverse (keys); -} - -static void -clutter_animator_remove_key_internal (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress, - gboolean is_inert) -{ - ClutterAnimatorPrivate *priv; - GList *k; - - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - - property_name = g_intern_string (property_name); - - priv = animator->priv; - -again: - for (k = priv->score; k != NULL; k = k->next) - { - ClutterAnimatorKey *key = k->data; - - if ((object == NULL || (object == key->object)) && - (property_name == NULL || ((property_name == key->property_name))) && - (progress < 0 || fabs (progress - key->progress) < PROGRESS_EPSILON) - ) - { - ClutterAnimatorKey *prev_key = NULL; - key->is_inert = is_inert; - - - /* FIXME: non performant since we reiterate the list many times */ - - prev_key = k->prev ? k->prev->data : NULL; - - if (!prev_key || prev_key->object != key->object || - prev_key->property_name != key->property_name) - { /* We are removing the first key for a property ... */ - ClutterAnimatorKey *next_key = k->next ? k->next->data : NULL; - if (next_key && next_key->object == key->object && - next_key->property_name == key->property_name) - { - /* ... and there is a key of our own type following us, - * copy interpolation/ease_in flags to the new first key - */ - next_key->interpolation = key->interpolation; - next_key->ease_in = key->ease_in; - } - } - - clutter_animator_key_free (key); - priv->score = g_list_remove (priv->score, key); - goto again; - } - } - - /* clear off cached state for all properties, this is regenerated in a - * correct state by animation_animator_started - */ - g_hash_table_remove_all (priv->properties); - - /* if the animator is already running reinitialize internal iterators */ - if (priv->timeline != NULL && clutter_timeline_is_playing (priv->timeline)) - animation_animator_started (priv->timeline, animator); -} - -/** - * clutter_animator_remove_key: - * @animator: a #ClutterAnimator - * @object: (allow-none): a #GObject to search for, or %NULL for all - * @property_name: (allow-none): a specific property name to query for, - * or %NULL for all - * @progress: a specific progress to search for or a negative value - * for all - * - * Removes all keys matching the conditions specificed in the arguments. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_remove_key (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress) -{ - clutter_animator_remove_key_internal (animator, object, property_name, - progress, FALSE); -} - - - - -typedef struct _ParseClosure { - ClutterAnimator *animator; - ClutterScript *script; - - GValue *value; - - gboolean result; -} ParseClosure; - -static ClutterInterpolation -resolve_interpolation (JsonNode *node) -{ - if ((JSON_NODE_TYPE (node) != JSON_NODE_VALUE)) - return CLUTTER_INTERPOLATION_LINEAR; - - if (json_node_get_value_type (node) == G_TYPE_INT64) - { - return json_node_get_int (node); - } - else if (json_node_get_value_type (node) == G_TYPE_STRING) - { - const gchar *str = json_node_get_string (node); - gboolean res; - gint enum_value; - - res = _clutter_script_enum_from_string (CLUTTER_TYPE_INTERPOLATION, - str, - &enum_value); - if (res) - return enum_value; - } - - return CLUTTER_INTERPOLATION_LINEAR; -} - -static void -parse_animator_property (JsonArray *array, - guint index_, - JsonNode *element, - gpointer data) -{ - ParseClosure *clos = data; - JsonObject *object; - JsonArray *keys; - GObject *gobject; - const gchar *id_, *pname; - GObjectClass *klass; - GParamSpec *pspec; - GSList *valid_keys = NULL; - GList *array_keys, *k; - ClutterInterpolation interpolation = CLUTTER_INTERPOLATION_LINEAR; - gboolean ease_in = FALSE; - - if (JSON_NODE_TYPE (element) != JSON_NODE_OBJECT) - { - g_warning ("The 'properties' member of a ClutterAnimator 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, "object") || - !json_object_has_member (object, "name") || - !json_object_has_member (object, "keys")) - { - g_warning ("The property description at index %d is missing one of " - "the mandatory fields: object, name and keys", - index_); - return; - } - - id_ = json_object_get_string_member (object, "object"); - gobject = clutter_script_get_object (clos->script, id_); - if (gobject == NULL) - { - g_warning ("No object with id '%s' has been defined.", id_); - return; - } - - pname = json_object_get_string_member (object, "name"); - klass = G_OBJECT_GET_CLASS (gobject); - pspec = g_object_class_find_property (klass, pname); - if (pspec == NULL) - { - g_warning ("The object of type '%s' and name '%s' has no " - "property named '%s'", - G_OBJECT_TYPE_NAME (gobject), - id_, - pname); - return; - } - - if (json_object_has_member (object, "ease-in")) - ease_in = json_object_get_boolean_member (object, "ease-in"); - - if (json_object_has_member (object, "interpolation")) - { - JsonNode *node = json_object_get_member (object, "interpolation"); - - interpolation = resolve_interpolation (node); - } - - keys = json_object_get_array_member (object, "keys"); - if (keys == NULL) - { - g_warning ("The property description at index %d has an invalid " - "key field 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); - ClutterAnimatorKey *animator_key; - gdouble progress; - gulong mode; - gboolean res; - - progress = json_array_get_double_element (key, 0); - mode = _clutter_script_resolve_animation_mode (json_array_get_element (key, 1)); - - animator_key = clutter_animator_key_new (clos->animator, - gobject, - pname, - progress, - mode); - - res = _clutter_script_parse_node (clos->script, - &(animator_key->value), - pname, - json_array_get_element (key, 2), - pspec); - if (!res) - { - g_warning ("Unable to parse the key value for the " - "property '%s' (progress: %.2f) at index %d", - pname, - progress, - index_); - continue; - } - - animator_key->ease_in = ease_in; - animator_key->interpolation = interpolation; - - valid_keys = g_slist_prepend (valid_keys, animator_key); - } - - g_list_free (array_keys); - - g_value_set_pointer (clos->value, g_slist_reverse (valid_keys)); - - clos->result = TRUE; -} - -static gboolean -clutter_animator_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - ParseClosure parse_closure; - - if (strcmp (name, "properties") != 0) - return FALSE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY) - return FALSE; - - parse_closure.animator = CLUTTER_ANIMATOR (scriptable); - parse_closure.script = script; - parse_closure.value = value; - parse_closure.result = FALSE; - - json_array_foreach_element (json_node_get_array (node), - parse_animator_property, - &parse_closure); - - /* we return TRUE if we had at least one key parsed */ - - return parse_closure.result; -} - -static void -clutter_animator_set_custom_property (ClutterScriptable *scriptable, - ClutterScript *script, - const gchar *name, - const GValue *value) -{ - if (strcmp (name, "properties") == 0) - { - ClutterAnimator *animator = CLUTTER_ANIMATOR (scriptable); - GSList *keys = g_value_get_pointer (value); - GSList *k; - - for (k = keys; k != NULL; k = k->next) - clutter_animator_set_key_internal (animator, k->data); - - g_slist_free (keys); - } - else - g_object_set_property (G_OBJECT (scriptable), name, value); -} - -static void -clutter_scriptable_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_animator_parse_custom_node; - iface->set_custom_property = clutter_animator_set_custom_property; -} - -static void -clutter_animator_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterAnimator *self = CLUTTER_ANIMATOR (gobject); - - switch (prop_id) - { - case PROP_DURATION: - clutter_animator_set_duration (self, g_value_get_uint (value)); - break; - - case PROP_TIMELINE: - clutter_animator_set_timeline (self, g_value_get_object (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static void -clutter_animator_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterAnimatorPrivate *priv = CLUTTER_ANIMATOR (gobject)->priv; - - switch (prop_id) - { - case PROP_DURATION: - g_value_set_uint (value, clutter_timeline_get_duration (priv->timeline)); - break; - - case PROP_TIMELINE: - g_value_set_object (value, priv->timeline); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static void -clutter_animator_class_init (ClutterAnimatorClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = clutter_animator_set_property; - gobject_class->get_property = clutter_animator_get_property; - gobject_class->dispose = clutter_animator_dispose; - gobject_class->finalize = clutter_animator_finalize; - - /** - * ClutterAnimator:duration: - * - * The duration of the #ClutterTimeline used by the #ClutterAnimator - * to drive the animation - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ - obj_props[PROP_DURATION] = - g_param_spec_uint ("duration", - P_("Duration"), - P_("The duration of the animation"), - 0, G_MAXUINT, - 2000, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimator:timeline: - * - * The #ClutterTimeline used by the #ClutterAnimator to drive the - * animation - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ - obj_props[PROP_TIMELINE] = - g_param_spec_object ("timeline", - P_("Timeline"), - P_("The timeline of the animation"), - CLUTTER_TYPE_TIMELINE, - CLUTTER_PARAM_READWRITE); - - g_object_class_install_properties (gobject_class, - PROP_LAST, - obj_props); -} - -static void -clutter_animator_init (ClutterAnimator *animator) -{ - ClutterAnimatorPrivate *priv; - ClutterTimeline *timeline; - - animator->priv = priv = clutter_animator_get_instance_private (animator); - - priv->properties = g_hash_table_new_full (prop_actor_hash, - prop_actor_equal, - prop_actor_key_free, - property_iter_free); - - timeline = clutter_timeline_new (2000); - clutter_animator_set_timeline (animator, timeline); - g_object_unref (timeline); - - priv->slave_timeline = clutter_timeline_new (10000); -} - - -/** - * clutter_animator_property_get_ease_in: - * @animator: a #ClutterAnimatorKey - * @object: a #GObject - * @property_name: the name of a property on object - * - * Checks if a property value is to be eased into the animation. - * - * Return value: %TRUE if the property is eased in - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -gboolean -clutter_animator_property_get_ease_in (ClutterAnimator *animator, - GObject *object, - const gchar *property_name) -{ - ClutterAnimatorKey key, *initial_key; - GList *initial; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - g_return_val_if_fail (property_name, FALSE); - - key.object = object; - key.property_name = g_intern_string (property_name); - initial = g_list_find_custom (animator->priv->score, &key, - sort_actor_prop_func); - if (initial != NULL) - { - initial_key = initial->data; - - return initial_key->ease_in; - } - - return FALSE; -} - -/** - * clutter_animator_property_set_ease_in: - * @animator: a #ClutterAnimatorKey - * @object: a #GObject - * @property_name: the name of a property on object - * @ease_in: we are going to be easing in this property - * - * Sets whether a property value is to be eased into the animation. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_property_set_ease_in (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gboolean ease_in) -{ - ClutterAnimatorKey key, *initial_key; - GList *initial; - - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (property_name); - - key.object = object; - key.property_name = g_intern_string (property_name); - initial = g_list_find_custom (animator->priv->score, &key, - sort_actor_prop_func); - if (initial) - { - initial_key = initial->data; - initial_key->ease_in = ease_in; - } - else - g_warning ("The animator has no object of type '%s' with a " - "property named '%s'", - G_OBJECT_TYPE_NAME (object), - property_name); -} - - -/** - * clutter_animator_property_get_interpolation: - * @animator: a #ClutterAnimatorKey - * @object: a #GObject - * @property_name: the name of a property on object - * - * Get the interpolation used by animator for a property on a particular - * object. - * - * Returns: a ClutterInterpolation value. - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -ClutterInterpolation -clutter_animator_property_get_interpolation (ClutterAnimator *animator, - GObject *object, - const gchar *property_name) -{ - GList *initial; - ClutterAnimatorKey key, *initial_key; - - g_return_val_if_fail (CLUTTER_IS_ANIMATOR (animator), - CLUTTER_INTERPOLATION_LINEAR); - g_return_val_if_fail (G_IS_OBJECT (object), - CLUTTER_INTERPOLATION_LINEAR); - g_return_val_if_fail (property_name, - CLUTTER_INTERPOLATION_LINEAR); - - key.object = object; - key.property_name = g_intern_string (property_name); - initial = g_list_find_custom (animator->priv->score, &key, - sort_actor_prop_func); - if (initial) - { - initial_key = initial->data; - - return initial_key->interpolation; - } - - return CLUTTER_INTERPOLATION_LINEAR; -} - -/** - * clutter_animator_property_set_interpolation: - * @animator: a #ClutterAnimatorKey - * @object: a #GObject - * @property_name: the name of a property on object - * @interpolation: the #ClutterInterpolation to use - * - * Set the interpolation method to use, %CLUTTER_INTERPOLATION_LINEAR causes - * the values to linearly change between the values, and - * %CLUTTER_INTERPOLATION_CUBIC causes the values to smoothly change between - * the values. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -void -clutter_animator_property_set_interpolation (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - ClutterInterpolation interpolation) -{ - GList *initial; - ClutterAnimatorKey key, *initial_key; - - g_return_if_fail (CLUTTER_IS_ANIMATOR (animator)); - g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (property_name); - - key.object = object; - key.property_name = g_intern_string (property_name); - initial = g_list_find_custom (animator->priv->score, &key, - sort_actor_prop_func); - if (initial) - { - initial_key = initial->data; - initial_key->interpolation = interpolation; - } -} - -G_DEFINE_BOXED_TYPE (ClutterAnimatorKey, clutter_animator_key, - clutter_animator_key_copy, - clutter_animator_key_free); - -/** - * clutter_animator_key_get_object: - * @key: a #ClutterAnimatorKey - * - * Retrieves the object a key applies to. - * - * Return value: (transfer none): the object an animator_key exist for. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -GObject * -clutter_animator_key_get_object (const ClutterAnimatorKey *key) -{ - g_return_val_if_fail (key != NULL, NULL); - - return key->object; -} - -/** - * clutter_animator_key_get_property_name: - * @key: a #ClutterAnimatorKey - * - * Retrieves the name of the property a key applies to. - * - * Return value: the name of the property an animator_key exist for. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -const gchar * -clutter_animator_key_get_property_name (const ClutterAnimatorKey *key) -{ - g_return_val_if_fail (key != NULL, NULL); - - return key->property_name; -} - -/** - * clutter_animator_key_get_property_type: - * @key: a #ClutterAnimatorKey - * - * Retrieves the #GType of the property a key applies to - * - * You can use this type to initialize the #GValue to pass to - * clutter_animator_key_get_value() - * - * Return value: the #GType of the property - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -GType -clutter_animator_key_get_property_type (const ClutterAnimatorKey *key) -{ - g_return_val_if_fail (key != NULL, G_TYPE_INVALID); - - return G_VALUE_TYPE (&key->value); -} - -/** - * clutter_animator_key_get_mode: - * @key: a #ClutterAnimatorKey - * - * Retrieves the mode of a #ClutterAnimator key, for the first key of a - * property for an object this represents the whether the animation is - * open ended and or curved for the remainding keys for the property it - * represents the easing mode. - * - * Return value: the mode of a #ClutterAnimatorKey - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -gulong -clutter_animator_key_get_mode (const ClutterAnimatorKey *key) -{ - g_return_val_if_fail (key != NULL, 0); - - return key->mode; -} - -/** - * clutter_animator_key_get_progress: - * @key: a #ClutterAnimatorKey - * - * Retrieves the progress of an clutter_animator_key - * - * Return value: the progress defined for a #ClutterAnimator key. - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -gdouble -clutter_animator_key_get_progress (const ClutterAnimatorKey *key) -{ - g_return_val_if_fail (key != NULL, 0.0); - - return key->progress; -} - -/** - * clutter_animator_key_get_value: - * @key: a #ClutterAnimatorKey - * @value: a #GValue initialized with the correct type for the animator key - * - * Retrieves a copy of the value for a #ClutterAnimatorKey. - * - * The passed in #GValue needs to be already initialized for the value - * type of the key or to a type that allow transformation from the value - * type of the key. - * - * Use g_value_unset() when done. - * - * Return value: %TRUE if the passed #GValue was successfully set, and - * %FALSE otherwise - * - * Since: 1.2 - * Deprecated: 1.12: Use #ClutterKeyframeTransition instead - */ -gboolean -clutter_animator_key_get_value (const ClutterAnimatorKey *key, - GValue *value) -{ - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (value != NULL, FALSE); - g_return_val_if_fail (G_VALUE_TYPE (value) != G_TYPE_INVALID, FALSE); - - if (!g_type_is_a (G_VALUE_TYPE (&key->value), G_VALUE_TYPE (value))) - { - if (g_value_type_compatible (G_VALUE_TYPE (&key->value), - G_VALUE_TYPE (value))) - { - g_value_copy (&key->value, value); - return TRUE; - } - - if (g_value_type_transformable (G_VALUE_TYPE (&key->value), - G_VALUE_TYPE (value))) - { - if (g_value_transform (&key->value, value)) - return TRUE; - } - - g_warning ("%s: Unable to convert from %s to %s for the " - "property '%s' of object %s in the animator key", - G_STRLOC, - g_type_name (G_VALUE_TYPE (&key->value)), - g_type_name (G_VALUE_TYPE (value)), - key->property_name, - G_OBJECT_TYPE_NAME (key->object)); - - return FALSE; - } - else - g_value_copy (&key->value, value); - - return TRUE; -} diff --git a/clutter/clutter/deprecated/clutter-animator.h b/clutter/clutter/deprecated/clutter-animator.h deleted file mode 100644 index af738f4b3..000000000 --- a/clutter/clutter/deprecated/clutter-animator.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2010 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: - * Øyvind Kolås - */ - -#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __CLUTTER_ANIMATOR_H__ -#define __CLUTTER_ANIMATOR_H__ - -#include -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_ANIMATOR (clutter_animator_get_type ()) -#define CLUTTER_TYPE_ANIMATOR_KEY (clutter_animator_key_get_type ()) - -#define CLUTTER_ANIMATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATOR, ClutterAnimator)) -#define CLUTTER_ANIMATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ANIMATOR, ClutterAnimatorClass)) -#define CLUTTER_IS_ANIMATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATOR)) -#define CLUTTER_IS_ANIMATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ANIMATOR)) -#define CLUTTER_ANIMATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ANIMATOR, ClutterAnimatorClass)) - -/* ClutterAnimator is typedef in clutter-types.h */ - -typedef struct _ClutterAnimatorClass ClutterAnimatorClass; -typedef struct _ClutterAnimatorPrivate ClutterAnimatorPrivate; - -/** - * ClutterAnimatorKey: - * - * A key frame inside a #ClutterAnimator - * - * Since: 1.2 - * - * Deprecated: 1.12 - */ -typedef struct _ClutterAnimatorKey ClutterAnimatorKey; - -/** - * ClutterAnimator: - * - * The #ClutterAnimator structure contains only private data and - * should be accessed using the provided API - * - * Since: 1.2 - * - * Deprecated: 1.12 - */ -struct _ClutterAnimator -{ - /*< private >*/ - GObject parent_instance; - - ClutterAnimatorPrivate *priv; -}; - -/** - * ClutterAnimatorClass: - * - * The #ClutterAnimatorClass structure contains only private data - * - * Since: 1.2 - * - * Deprecated: 1.12 - */ -struct _ClutterAnimatorClass -{ - /*< private >*/ - GObjectClass parent_class; - - /* padding for future expansion */ - gpointer _padding_dummy[16]; -}; - -CLUTTER_DEPRECATED -GType clutter_animator_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED -ClutterAnimator * clutter_animator_new (void); -CLUTTER_DEPRECATED -ClutterAnimator * clutter_animator_set_key (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - guint mode, - gdouble progress, - const GValue *value); -CLUTTER_DEPRECATED -void clutter_animator_set (ClutterAnimator *animator, - gpointer first_object, - const gchar *first_property_name, - guint first_mode, - gdouble first_progress, - ...) G_GNUC_NULL_TERMINATED; -CLUTTER_DEPRECATED -GList * clutter_animator_get_keys (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress); - -CLUTTER_DEPRECATED -void clutter_animator_remove_key (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress); - -CLUTTER_DEPRECATED -ClutterTimeline * clutter_animator_start (ClutterAnimator *animator); - -CLUTTER_DEPRECATED -gboolean clutter_animator_compute_value (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gdouble progress, - GValue *value); - -CLUTTER_DEPRECATED -ClutterTimeline * clutter_animator_get_timeline (ClutterAnimator *animator); -CLUTTER_DEPRECATED -void clutter_animator_set_timeline (ClutterAnimator *animator, - ClutterTimeline *timeline); -CLUTTER_DEPRECATED -guint clutter_animator_get_duration (ClutterAnimator *animator); -CLUTTER_DEPRECATED -void clutter_animator_set_duration (ClutterAnimator *animator, - guint duration); - -CLUTTER_DEPRECATED -gboolean clutter_animator_property_get_ease_in (ClutterAnimator *animator, - GObject *object, - const gchar *property_name); -CLUTTER_DEPRECATED -void clutter_animator_property_set_ease_in (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - gboolean ease_in); - -CLUTTER_DEPRECATED -ClutterInterpolation clutter_animator_property_get_interpolation (ClutterAnimator *animator, - GObject *object, - const gchar *property_name); -CLUTTER_DEPRECATED -void clutter_animator_property_set_interpolation (ClutterAnimator *animator, - GObject *object, - const gchar *property_name, - ClutterInterpolation interpolation); - -CLUTTER_DEPRECATED -GType clutter_animator_key_get_type (void) G_GNUC_CONST; -CLUTTER_DEPRECATED -GObject * clutter_animator_key_get_object (const ClutterAnimatorKey *key); -CLUTTER_DEPRECATED -const gchar * clutter_animator_key_get_property_name (const ClutterAnimatorKey *key); -CLUTTER_DEPRECATED -GType clutter_animator_key_get_property_type (const ClutterAnimatorKey *key); -CLUTTER_DEPRECATED -gulong clutter_animator_key_get_mode (const ClutterAnimatorKey *key); -CLUTTER_DEPRECATED -gdouble clutter_animator_key_get_progress (const ClutterAnimatorKey *key); -CLUTTER_DEPRECATED -gboolean clutter_animator_key_get_value (const ClutterAnimatorKey *key, - GValue *value); - -G_END_DECLS - -#endif /* __CLUTTER_ANIMATOR_H__ */ diff --git a/clutter/clutter/deprecated/clutter-behaviour-depth.c b/clutter/clutter/deprecated/clutter-behaviour-depth.c index f5c8279da..c5861d005 100644 --- a/clutter/clutter/deprecated/clutter-behaviour-depth.c +++ b/clutter/clutter/deprecated/clutter-behaviour-depth.c @@ -48,8 +48,7 @@ * #ClutterBehaviourDepth is available since Clutter 0.4. * * Deprecated: 1.6: Use the #ClutterActor:depth property and - * clutter_actor_animate(), or #ClutterAnimator, or #ClutterState - * instead. + * clutter_actor_animate() instead. */ struct _ClutterBehaviourDepthPrivate diff --git a/clutter/clutter/deprecated/clutter-behaviour-opacity.c b/clutter/clutter/deprecated/clutter-behaviour-opacity.c index a5220a9ff..f771cfaa8 100644 --- a/clutter/clutter/deprecated/clutter-behaviour-opacity.c +++ b/clutter/clutter/deprecated/clutter-behaviour-opacity.c @@ -32,8 +32,7 @@ * Since: 0.2 * * Deprecated: 1.6: Use the #ClutterActor:opacity property and - * clutter_actor_animate(), or #ClutterAnimator, or #ClutterState - * instead. + * clutter_actor_animate(). */ #include "clutter-build-config.h" diff --git a/clutter/clutter/deprecated/clutter-behaviour-rotate.c b/clutter/clutter/deprecated/clutter-behaviour-rotate.c index 6982e6e3b..9714fbf99 100644 --- a/clutter/clutter/deprecated/clutter-behaviour-rotate.c +++ b/clutter/clutter/deprecated/clutter-behaviour-rotate.c @@ -31,8 +31,7 @@ * The #ClutterBehaviourRotate is available since version 0.4. * * Deprecated: 1.6: Use the #ClutterActor rotation properties and - * clutter_actor_animate(), or #ClutterAnimator, or #ClutterState - * instead. + * clutter_actor_animate() instead. */ #include "clutter-build-config.h" diff --git a/clutter/clutter/deprecated/clutter-behaviour-scale.c b/clutter/clutter/deprecated/clutter-behaviour-scale.c index 85202430c..23cd0b36c 100644 --- a/clutter/clutter/deprecated/clutter-behaviour-scale.c +++ b/clutter/clutter/deprecated/clutter-behaviour-scale.c @@ -31,8 +31,7 @@ * A #ClutterBehaviourScale interpolates actors size between two values. * * Deprecated: 1.6: Use the #ClutterActor:scale-x and #ClutterActor:scale-y - * properties, and clutter_actor_animate(), or #ClutterAnimator or - * #ClutterState instead. + * properties, and clutter_actor_animate() instead. */ #include "clutter-build-config.h" diff --git a/clutter/clutter/deprecated/clutter-behaviour.c b/clutter/clutter/deprecated/clutter-behaviour.c index 3fd61afb1..cfd6cd87d 100644 --- a/clutter/clutter/deprecated/clutter-behaviour.c +++ b/clutter/clutter/deprecated/clutter-behaviour.c @@ -25,8 +25,7 @@ * SECTION:clutter-behaviour * @Title: ClutterBehaviour * @short_description: Class for providing behaviours to actors - * @Deprecated: 1.6: Use clutter_actor_animate(), #ClutterAnimator or - * #ClutterState instead + * @Deprecated: 1.6: Use clutter_actor_animate() instead * * #ClutterBehaviour is the base class for implementing behaviours. A * behaviour is a controller object for #ClutterActors; you can diff --git a/clutter/clutter/deprecated/clutter-state.c b/clutter/clutter/deprecated/clutter-state.c deleted file mode 100644 index ef041f58f..000000000 --- a/clutter/clutter/deprecated/clutter-state.c +++ /dev/null @@ -1,2308 +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, - * "animator" : "animator-definition" - * }, - * ... - * ] - * } - * ]| - * - * 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 key and animator properties are mutually exclusive. - * - * 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-animator.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 StateAnimator { - const gchar *source_state_name; /* interned string identifying entry */ - ClutterAnimator *animator; /* pointer to animator itself */ -} StateAnimator; - -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 */ - GArray *animators; /* list of animators for transitioning from - * specific source states */ - 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 */ - ClutterAnimator *current_animator; /* !NULL if the current transition is - overriden by an animator */ -}; - -#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_array_free (state->animators, TRUE); - 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->animators = g_array_new (TRUE, TRUE, sizeof (StateAnimator)); - 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) -{ - ClutterStatePrivate *priv = state->priv; - - if (priv->current_animator) - { - clutter_animator_set_timeline (priv->current_animator, NULL); - priv->current_animator = NULL; - } - - 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; - - if (priv->current_animator) - return; - - 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; - ClutterAnimator *animator; - 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); - - if (priv->current_animator) - { - clutter_animator_set_timeline (priv->current_animator, NULL); - priv->current_animator = NULL; - } - - 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; - } - - if (priv->current_animator != NULL) - { - clutter_animator_set_timeline (priv->current_animator, NULL); - priv->current_animator = NULL; - } - - 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; - } - - animator = clutter_state_get_animator (state, - priv->source_state_name, - priv->target_state_name); - priv->target_state = new_state; - - if (animator == NULL && new_state->keys == NULL) - animator = clutter_state_get_animator (state, NULL, - priv->target_state_name); - - if (animator != NULL) - { - /* we've got an animator overriding the tweened animation */ - priv->current_animator = animator; - clutter_animator_set_timeline (animator, priv->timeline); - } - else - { - 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); -} - -/** - * clutter_state_get_keys: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the source transition name to query, - * or %NULL for all source states - * @target_state_name: (allow-none): the target transition name to query, - * or %NULL for all target states - * @object: (allow-none): the specific object instance to list keys for, - * or %NULL for all managed objects - * @property_name: (allow-none): the property name to search for, or %NULL - * for all properties. - * - * Returns a list of pointers to opaque structures with accessor functions - * that describe the keys added to an animator. - * - * Return value: (transfer container) (element-type Clutter.StateKey): a - * newly allocated #GList of #ClutterStateKeys. The contents of - * the returned list 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_keys (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name) -{ - GList *s, *state_list; - GList *targets = NULL; - State *source_state = NULL; - - g_return_val_if_fail (CLUTTER_IS_STATE (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 (target_state_name != NULL) - state_list = g_list_append (NULL, (gpointer) target_state_name); - else - state_list = clutter_state_get_states (state); - - if (source_state_name) - source_state = clutter_state_fetch_state (state, source_state_name, FALSE); - - for (s = state_list; s != NULL; s = s->next) - { - State *target_state; - - target_state = clutter_state_fetch_state (state, s->data, FALSE); - if (target_state != NULL) - { - GList *k; - - for (k = target_state->keys; k; k = k->next) - { - ClutterStateKey *key = k->data; - - if ((object == NULL || (object == key->object)) && - (source_state_name == NULL || - source_state == key->source_state) && - (property_name == NULL || - (property_name == key->property_name))) - { - targets = g_list_prepend (targets, key); - } - } - } - } - - g_list_free (state_list); - - return g_list_reverse (targets); -} - - -/** - * clutter_state_remove_key: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the source state name to query, - * or %NULL for all source states - * @target_state_name: (allow-none): the target state name to query, - * or %NULL for all target states - * @object: (allow-none): the specific object instance to list keys for, - * or %NULL for all managed objects - * @property_name: (allow-none): the property name to search for, - * or %NULL for all properties. - * - * Removes all keys matching the search criteria passed in arguments. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_remove_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name) -{ - g_return_if_fail (CLUTTER_IS_STATE (state)); - - clutter_state_remove_key_internal (state, - source_state_name, target_state_name, - object, property_name, - FALSE); -} - -/** - * clutter_state_get_timeline: - * @state: a #ClutterState - * - * Gets the timeline driving the #ClutterState - * - * Return value: (transfer none): the #ClutterTimeline that drives - * the state change animations. The returned timeline is owned - * by the #ClutterState and it should not be unreferenced directly - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterTimeline * -clutter_state_get_timeline (ClutterState *state) -{ - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - return state->priv->timeline; -} - - -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, - _clutter_marshal_VOID__VOID, - 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); -} - - -/** - * clutter_state_get_animator: - * @state: a #ClutterState instance. - * @source_state_name: the name of a source state - * @target_state_name: the name of a target state - * - * Retrieves the #ClutterAnimator that is being used for transitioning - * between the two states, if any has been set - * - * Return value: (transfer none): a #ClutterAnimator instance, or %NULL - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterAnimator * -clutter_state_get_animator (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name) -{ - State *target_state; - guint i; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - 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); - - target_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (target_state == NULL) - return NULL; - - for (i = 0; i < target_state->animators->len; i++) - { - const StateAnimator *animator; - - animator = &g_array_index (target_state->animators, StateAnimator, i); - if (animator->source_state_name == source_state_name) - return animator->animator; - } - - return NULL; -} - -/** - * clutter_state_set_animator: - * @state: a #ClutterState instance. - * @source_state_name: the name of a source state - * @target_state_name: the name of a target state - * @animator: (allow-none): a #ClutterAnimator instance, or %NULL to - * unset an existing #ClutterAnimator - * - * Specifies a #ClutterAnimator to be used when transitioning between - * the two named states. - * - * The @animator allows specifying a transition between the state that is - * more elaborate than the basic transitions allowed by the tweening of - * properties defined in the #ClutterState keys. - * - * If @animator is %NULL it will unset an existing animator. - * - * #ClutterState will take a reference on the passed @animator, if any - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_set_animator (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - ClutterAnimator *animator) -{ - State *target_state; - guint i; - - g_return_if_fail (CLUTTER_IS_STATE (state)); - - source_state_name = g_intern_string (source_state_name); - target_state_name = g_intern_string (target_state_name); - - target_state = clutter_state_fetch_state (state, target_state_name, TRUE); - if (target_state == NULL) - return; - - for (i = 0; target_state->animators->len; i++) - { - StateAnimator *a; - - a = &g_array_index (target_state->animators, StateAnimator, i); - if (a->source_state_name == source_state_name) - { - g_object_unref (a->animator); - - if (animator != NULL) - a->animator = g_object_ref (animator); - else - { - /* remove the matched animator if passed NULL */ - g_array_remove_index (target_state->animators, i); - } - - return; - } - } - - if (animator != NULL) - { - StateAnimator state_animator = { - source_state_name, - g_object_ref (animator) - }; - - g_array_append_val (target_state->animators, state_animator); - } -} - -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_pre_delay: - * @state_key: a #ClutterStateKey - * - * Retrieves the pause before transitioning starts as a fraction of - * the total transition time. - * - * Return value: the pre delay used before starting the transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -gdouble -clutter_state_key_get_pre_delay (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key != NULL, 0.0); - - return state_key->pre_delay; -} - -/** - * clutter_state_key_get_post_delay: - * @state_key: a #ClutterStateKey - * - * Retrieves the duration of the pause after transitioning is complete - * as a fraction of the total transition time. - * - * Return value: the post delay, used after doing the transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -gdouble -clutter_state_key_get_post_delay (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key != NULL, 0.0); - - return state_key->post_delay; -} - -/** - * clutter_state_key_get_mode: - * @state_key: a #ClutterStateKey - * - * Retrieves the easing mode used for @state_key. - * - * Return value: the mode of a #ClutterStateKey - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -gulong -clutter_state_key_get_mode (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key != NULL, 0); - - return state_key->mode; -} - -/** - * clutter_state_key_get_value: - * @state_key: a #ClutterStateKey - * @value: a #GValue initialized with the correct type for the @state_key - * - * Retrieves a copy of the value for a #ClutterStateKey. - * - * The #GValue needs to be already initialized for the value type - * of the property or to a type that allow transformation from the value - * type of the key. - * - * Use g_value_unset() when done. - * - * Return value: %TRUE if the value was successfully retrieved, - * and %FALSE otherwise - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -gboolean -clutter_state_key_get_value (const ClutterStateKey *state_key, - GValue *value) -{ - g_return_val_if_fail (state_key != NULL, FALSE); - g_return_val_if_fail (value != NULL, FALSE); - g_return_val_if_fail (G_VALUE_TYPE (value) != G_TYPE_INVALID, FALSE); - - if (!g_type_is_a (G_VALUE_TYPE (&state_key->value), G_VALUE_TYPE (value))) - { - if (g_value_type_compatible (G_VALUE_TYPE (&state_key->value), - G_VALUE_TYPE (value))) - { - g_value_copy (&state_key->value, value); - return TRUE; - } - - if (g_value_type_transformable (G_VALUE_TYPE (&state_key->value), - G_VALUE_TYPE (value))) - { - if (g_value_transform (&state_key->value, value)) - return TRUE; - } - - g_warning ("%s: Unable to convert from %s to %s for the " - "property '%s' of object %s in the state key", - G_STRLOC, - g_type_name (G_VALUE_TYPE (&state_key->value)), - g_type_name (G_VALUE_TYPE (value)), - state_key->property_name, - G_OBJECT_TYPE_NAME (state_key->object)); - - return FALSE; - } - else - g_value_copy (&state_key->value, value); - - return TRUE; -} - -/** - * clutter_state_key_get_object: - * @state_key: a #ClutterStateKey - * - * Retrieves the object instance this #ClutterStateKey applies to. - * - * Return value: (transfer none): the object this state key applies to. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -GObject * -clutter_state_key_get_object (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key, NULL); - - return state_key->object; -} - -/** - * clutter_state_key_get_property_name: - * @state_key: a #ClutterStateKey - * - * Retrieves the name of the property this #ClutterStateKey applies to - * - * Return value: the name of the property. The returned string is owned - * by the #ClutterStateKey and should never be modified or freed - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -const gchar * -clutter_state_key_get_property_name (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key, NULL); - - return state_key->property_name; -} - -/** - * clutter_state_key_get_source_state_name: - * @state_key: a #ClutterStateKey - * - * Retrieves the name of the source state of the @state_key - * - * Return value: the name of the source state for this key, or %NULL - * if this is the generic state key for the given property when - * transitioning to the target state. The returned string is owned - * by the #ClutterStateKey and should never be modified or freed - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -const gchar * -clutter_state_key_get_source_state_name (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key, NULL); - - if (state_key->source_state != NULL) - return state_key->source_state->name; - - return NULL; -} - -/** - * clutter_state_key_get_target_state_name: - * @state_key: a #ClutterStateKey - * - * Get the name of the source state this #ClutterStateKey contains, - * or NULL if this is the generic state key for the given property - * when transitioning to the target state. - * - * Return value: the name of the source state for this key, or NULL if - * the key is generic - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -const gchar * -clutter_state_key_get_target_state_name (const ClutterStateKey *state_key) -{ - g_return_val_if_fail (state_key, NULL); - - return state_key->target_state->name; -} - -/** - * clutter_state_key_get_property_type: - * @key: a #ClutterStateKey - * - * Retrieves the #GType of the property a key applies to - * - * You can use this type to initialize the #GValue to pass to - * clutter_state_key_get_value() - * - * 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") || - json_object_has_member (object, "animator"))) - { - g_warning ("The transition description at index %d is missing one " - "of the mandatory members: source, target and keys or " - "animator", 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, "animator")) - { - const gchar *id_ = json_object_get_string_member (object, "animator"); - GObject *animator; - - animator = clutter_script_get_object (clos->script, id_); - if (animator == NULL) - { - g_warning ("No object with id '%s' has been defined.", id_); - return; - } - - clutter_state_set_animator (clos->state, - source_name, - target_name, - CLUTTER_ANIMATOR (animator)); - } - - if (!json_object_has_member (object, "keys")) - return; - - keys = json_object_get_array_member (object, "keys"); - if (keys == NULL && !json_object_has_member (object, "animator")) - { - 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 46151b858..000000000 --- a/clutter/clutter/deprecated/clutter-state.h +++ /dev/null @@ -1,187 +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 -GList * clutter_state_get_keys (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name); -CLUTTER_DEPRECATED -void clutter_state_remove_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name); -CLUTTER_DEPRECATED -ClutterTimeline * clutter_state_get_timeline (ClutterState *state); -CLUTTER_DEPRECATED -void clutter_state_set_animator (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - ClutterAnimator *animator); -CLUTTER_DEPRECATED -ClutterAnimator * clutter_state_get_animator (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name); -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 -gdouble clutter_state_key_get_pre_delay (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -gdouble clutter_state_key_get_post_delay (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -gulong clutter_state_key_get_mode (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -gboolean clutter_state_key_get_value (const ClutterStateKey *state_key, - GValue *value); -CLUTTER_DEPRECATED -GType clutter_state_key_get_property_type (const ClutterStateKey *key); -CLUTTER_DEPRECATED -GObject * clutter_state_key_get_object (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -const gchar * clutter_state_key_get_property_name (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -const gchar * clutter_state_key_get_source_state_name (const ClutterStateKey *state_key); -CLUTTER_DEPRECATED -const gchar * clutter_state_key_get_target_state_name (const ClutterStateKey *state_key); - -G_END_DECLS - -#endif /* __CLUTTER_STATE_H__ */ diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index b16e7a231..4e2d28d07 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -217,7 +217,6 @@ clutter_deprecated_headers = [ 'deprecated/clutter-alpha.h', 'deprecated/clutter-animatable.h', 'deprecated/clutter-animation.h', - 'deprecated/clutter-animator.h', 'deprecated/clutter-backend.h', 'deprecated/clutter-behaviour.h', 'deprecated/clutter-behaviour-depth.h', @@ -235,7 +234,6 @@ clutter_deprecated_headers = [ 'deprecated/clutter-rectangle.h', 'deprecated/clutter-stage-manager.h', 'deprecated/clutter-stage.h', - 'deprecated/clutter-state.h', 'deprecated/clutter-texture.h', 'deprecated/clutter-timeline.h', 'deprecated/clutter-util.h', @@ -245,7 +243,6 @@ clutter_deprecated_sources = [ 'deprecated/clutter-actor-deprecated.c', 'deprecated/clutter-alpha.c', 'deprecated/clutter-animation.c', - 'deprecated/clutter-animator.c', 'deprecated/clutter-behaviour.c', 'deprecated/clutter-behaviour-depth.c', 'deprecated/clutter-behaviour-ellipse.c', @@ -257,7 +254,6 @@ clutter_deprecated_sources = [ 'deprecated/clutter-input-device-deprecated.c', 'deprecated/clutter-layout-manager-deprecated.c', 'deprecated/clutter-rectangle.c', - 'deprecated/clutter-state.c', 'deprecated/clutter-texture.c', ] diff --git a/clutter/tests/conform/Makefile.am b/clutter/tests/conform/Makefile.am index acd9d2d09..11d4835ad 100644 --- a/clutter/tests/conform/Makefile.am +++ b/clutter/tests/conform/Makefile.am @@ -49,7 +49,6 @@ general_tests = \ # Test for deprecated functionality deprecated_tests = \ - animator \ behaviours \ group \ rectangle \ @@ -61,9 +60,6 @@ test_programs = $(actor_tests) $(general_tests) $(classes_tests) $(deprecated_te dist_test_data = $(script_ui_files) script_ui_files = $(addprefix scripts/,$(script_tests)) script_tests = \ - test-animator-1.json \ - test-animator-2.json \ - test-animator-3.json \ test-script-animation.json \ test-script-child.json \ test-script-implicit-alpha.json \ @@ -74,8 +70,7 @@ script_tests = \ test-script-named-object.json \ test-script-object-property.json \ test-script-single.json \ - test-script-timeline-markers.json \ - test-state-1.json + test-script-timeline-markers.json TESTS_ENVIRONMENT += G_ENABLE_DIAGNOSTIC=0 CLUTTER_ENABLE_DIAGNOSTIC=0 CLUTTER_SCALE=1 diff --git a/clutter/tests/conform/animator.c b/clutter/tests/conform/animator.c deleted file mode 100644 index 971169903..000000000 --- a/clutter/tests/conform/animator.c +++ /dev/null @@ -1,199 +0,0 @@ -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS -#include - -static void -animator_multi_properties (void) -{ - ClutterScript *script = clutter_script_new (); - GObject *animator = NULL, *foo = NULL; - GError *error = NULL; - gchar *test_file; - GList *keys; - ClutterAnimatorKey *key; - GValue value = { 0, }; - - test_file = g_test_build_filename (G_TEST_DIST, - "scripts", - "test-animator-3.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); - - foo = clutter_script_get_object (script, "foo"); - g_assert (G_IS_OBJECT (foo)); - - animator = clutter_script_get_object (script, "animator"); - g_assert (CLUTTER_IS_ANIMATOR (animator)); - - /* get all the keys for foo:x */ - keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator), - foo, "x", - -1.0); - g_assert_cmpint (g_list_length (keys), ==, 3); - - key = g_list_nth_data (keys, 1); - g_assert (key != NULL); - - if (g_test_verbose ()) - { - g_print ("(foo, x).keys[1] = \n" - ".object = %s\n" - ".progress = %.2f\n" - ".name = '%s'\n" - ".type = '%s'\n", - clutter_get_script_id (clutter_animator_key_get_object (key)), - clutter_animator_key_get_progress (key), - clutter_animator_key_get_property_name (key), - g_type_name (clutter_animator_key_get_property_type (key))); - } - - g_assert (clutter_animator_key_get_object (key) != NULL); - g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.2); - g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "x"); - - g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT); - - g_value_init (&value, G_TYPE_FLOAT); - g_assert (clutter_animator_key_get_value (key, &value)); - g_assert_cmpfloat (g_value_get_float (&value), ==, 150.0); - g_value_unset (&value); - - g_list_free (keys); - - /* get all the keys for foo:y */ - keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator), - foo, "y", - -1.0); - g_assert_cmpint (g_list_length (keys), ==, 3); - - key = g_list_nth_data (keys, 2); - g_assert (key != NULL); - - if (g_test_verbose ()) - { - g_print ("(foo, y).keys[2] = \n" - ".object = %s\n" - ".progress = %.2f\n" - ".name = '%s'\n" - ".type = '%s'\n", - clutter_get_script_id (clutter_animator_key_get_object (key)), - clutter_animator_key_get_progress (key), - clutter_animator_key_get_property_name (key), - g_type_name (clutter_animator_key_get_property_type (key))); - } - - g_assert (clutter_animator_key_get_object (key) != NULL); - g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.8); - g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "y"); - - g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT); - - g_value_init (&value, G_TYPE_FLOAT); - g_assert (clutter_animator_key_get_value (key, &value)); - g_assert_cmpfloat (g_value_get_float (&value), ==, 200.0); - g_value_unset (&value); - - g_list_free (keys); - - g_object_unref (script); - g_free (test_file); -} - -static void -animator_properties (void) -{ - ClutterScript *script = clutter_script_new (); - GObject *animator = NULL; - GError *error = NULL; - gchar *test_file; - GList *keys; - ClutterAnimatorKey *key; - GValue value = { 0, }; - - test_file = g_test_build_filename (G_TEST_DIST, - "scripts", - "test-animator-2.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); - - animator = clutter_script_get_object (script, "animator"); - g_assert (CLUTTER_IS_ANIMATOR (animator)); - - /* get all the keys */ - keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator), - NULL, NULL, -1.0); - g_assert_cmpint (g_list_length (keys), ==, 3); - - key = g_list_nth_data (keys, 1); - g_assert (key != NULL); - - if (g_test_verbose ()) - { - g_print ("keys[1] = \n" - ".object = %s\n" - ".progress = %.2f\n" - ".name = '%s'\n" - ".type = '%s'\n", - clutter_get_script_id (clutter_animator_key_get_object (key)), - clutter_animator_key_get_progress (key), - clutter_animator_key_get_property_name (key), - g_type_name (clutter_animator_key_get_property_type (key))); - } - - g_assert (clutter_animator_key_get_object (key) != NULL); - g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.2); - g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "x"); - - g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT); - - g_value_init (&value, G_TYPE_FLOAT); - g_assert (clutter_animator_key_get_value (key, &value)); - g_assert_cmpfloat (g_value_get_float (&value), ==, 150.0); - g_value_unset (&value); - - g_list_free (keys); - g_object_unref (script); - g_free (test_file); -} - -static void -animator_base (void) -{ - ClutterScript *script = clutter_script_new (); - GObject *animator = NULL; - GError *error = NULL; - guint duration = 0; - gchar *test_file; - - test_file = g_test_build_filename (G_TEST_DIST, - "scripts", - "test-animator-1.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); - - animator = clutter_script_get_object (script, "animator"); - g_assert (CLUTTER_IS_ANIMATOR (animator)); - - duration = clutter_animator_get_duration (CLUTTER_ANIMATOR (animator)); - g_assert_cmpint (duration, ==, 1000); - - g_object_unref (script); - g_free (test_file); -} - -CLUTTER_TEST_SUITE ( - CLUTTER_TEST_UNIT ("/script/animator/base", animator_base) - CLUTTER_TEST_UNIT ("/script/animator/properties", animator_properties) - CLUTTER_TEST_UNIT ("/script/animator/multi-properties", animator_multi_properties) -) diff --git a/clutter/tests/conform/meson.build b/clutter/tests/conform/meson.build index 87b316318..474af146d 100644 --- a/clutter/tests/conform/meson.build +++ b/clutter/tests/conform/meson.build @@ -40,7 +40,6 @@ clutter_conform_tests_general_tests = [ ] clutter_conform_tests_deprecated_tests = [ - 'animator', 'behaviours', 'rectangle', 'texture', diff --git a/clutter/tests/conform/scripts/test-animator-1.json b/clutter/tests/conform/scripts/test-animator-1.json deleted file mode 100644 index 2d6aab908..000000000 --- a/clutter/tests/conform/scripts/test-animator-1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000 -} diff --git a/clutter/tests/conform/scripts/test-animator-2.json b/clutter/tests/conform/scripts/test-animator-2.json deleted file mode 100644 index 9059f57ed..000000000 --- a/clutter/tests/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/clutter/tests/conform/scripts/test-animator-3.json b/clutter/tests/conform/scripts/test-animator-3.json deleted file mode 100644 index 26d779bee..000000000 --- a/clutter/tests/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/clutter/tests/conform/scripts/test-state-1.json b/clutter/tests/conform/scripts/test-state-1.json deleted file mode 100644 index 78ab5de89..000000000 --- a/clutter/tests/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/clutter/tests/conform/state.c b/clutter/tests/conform/state.c deleted file mode 100644 index 7e4720dc5..000000000 --- a/clutter/tests/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/clutter/tests/interactive/Makefile.am b/clutter/tests/interactive/Makefile.am index 466e1ed52..9005e2891 100644 --- a/clutter/tests/interactive/Makefile.am +++ b/clutter/tests/interactive/Makefile.am @@ -9,9 +9,6 @@ UNIT_TESTS = \ test-script.c \ test-grab.c \ test-cogl-shader-glsl.c \ - test-animator.c \ - test-state.c \ - test-state-animator.c \ test-fbo.c \ test-multistage.c \ test-cogl-tex-tile.c \ @@ -37,7 +34,6 @@ UNIT_TESTS = \ 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 \ diff --git a/clutter/tests/interactive/meson.build b/clutter/tests/interactive/meson.build index 668e21f61..80838ffe3 100644 --- a/clutter/tests/interactive/meson.build +++ b/clutter/tests/interactive/meson.build @@ -27,9 +27,6 @@ clutter_tests_interactive_test_sources = [ 'test-script.c', 'test-grab.c', 'test-cogl-shader-glsl.c', - 'test-animator.c', - 'test-state.c', - 'test-state-animator.c', 'test-fbo.c', 'test-multistage.c', 'test-cogl-tex-tile.c', @@ -55,7 +52,6 @@ clutter_tests_interactive_test_sources = [ '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', diff --git a/clutter/tests/interactive/test-animator.c b/clutter/tests/interactive/test-animator.c deleted file mode 100644 index fc9f9f513..000000000 --- a/clutter/tests/interactive/test-animator.c +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include -#include - -static ClutterAnimator *animator; - -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 *rectangle; - - gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL); - rectangle = clutter_texture_new_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - - clutter_actor_set_size (rectangle, 128, 128); - clutter_color_free (color); - return rectangle; -} - -static gboolean nuke_one (gpointer actor) -{ - clutter_actor_destroy (actor); - return FALSE; -} - -#define COUNT 4 - -static void reverse_timeline (ClutterTimeline *timeline, - gpointer data) -{ - ClutterTimelineDirection direction = clutter_timeline_get_direction (timeline); - if (direction == CLUTTER_TIMELINE_FORWARD) - clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_BACKWARD); - else - clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_FORWARD); - clutter_timeline_start (timeline); -} - - -G_MODULE_EXPORT gint -test_animator_main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterActor *rects[COUNT]; - gint i; - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return 1; - - stage = clutter_stage_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "Animator"); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i = 0; i < COUNT; i++) - { - rects[i] = new_rect (255 * (i * 1.0 / COUNT), 50, 160, 255); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), rects[i]); - clutter_actor_set_anchor_point (rects[i], 64, 64); - clutter_actor_set_position (rects[i], 320.0, 240.0); - clutter_actor_set_opacity (rects[i], 0x70); - } - - clutter_threads_add_timeout (10000, nuke_one, rects[2]); - - animator = clutter_animator_new (); - - /* Note: when both animations are active for the same actor at the same - * time there is a race, such races should be handled by avoiding - * controlling the same properties from multiple animations. This is - * an intentional design flaw of this test for testing the corner case. - */ - - clutter_animator_set (animator, - rects[0], "x", 1, 0.0, 180.0, - rects[0], "x", CLUTTER_LINEAR, 0.25, 450.0, - rects[0], "x", CLUTTER_LINEAR, 0.5, 450.0, - rects[0], "x", CLUTTER_LINEAR, 0.75, 180.0, - rects[0], "x", CLUTTER_LINEAR, 1.0, 180.0, - - rects[0], "y", -1, 0.0, 100.0, - rects[0], "y", CLUTTER_LINEAR, 0.25, 100.0, - rects[0], "y", CLUTTER_LINEAR, 0.5, 380.0, - rects[0], "y", CLUTTER_LINEAR, 0.75, 380.0, - rects[0], "y", CLUTTER_LINEAR, 1.0, 100.0, - - rects[3], "x", 0, 0.0, 180.0, - rects[3], "x", CLUTTER_LINEAR, 0.25, 180.0, - rects[3], "x", CLUTTER_LINEAR, 0.5, 450.0, - rects[3], "x", CLUTTER_LINEAR, 0.75, 450.0, - rects[3], "x", CLUTTER_LINEAR, 1.0, 180.0, - - rects[3], "y", 0, 0.0, 100.0, - rects[3], "y", CLUTTER_LINEAR, 0.25, 380.0, - rects[3], "y", CLUTTER_LINEAR, 0.5, 380.0, - rects[3], "y", CLUTTER_LINEAR, 0.75, 100.0, - rects[3], "y", CLUTTER_LINEAR, 1.0, 100.0, - - - rects[2], "rotation-angle-y", 0, 0.0, 0.0, - rects[2], "rotation-angle-y", CLUTTER_LINEAR, 1.0, 360.0, - - rects[1], "scale-x", 0, 0.0, 1.0, - rects[1], "scale-x", CLUTTER_LINEAR, 1.0, 2.0, - rects[1], "scale-y", 0, 0.0, 1.0, - rects[1], "scale-y", CLUTTER_LINEAR, 1.0, 2.0, - NULL); - - - clutter_actor_set_scale (rects[0], 1.4, 1.4); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "x", - TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "y", - TRUE); - clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), - "x", CLUTTER_INTERPOLATION_CUBIC); - clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), - "y", CLUTTER_INTERPOLATION_CUBIC); - - clutter_stage_hide_cursor(CLUTTER_STAGE (stage)); - clutter_actor_show (stage); - clutter_animator_set_duration (animator, 5000); - - g_signal_connect (clutter_animator_start (animator), - "completed", G_CALLBACK (reverse_timeline), NULL); - clutter_main (); - - g_object_unref (animator); - - return EXIT_SUCCESS; -} diff --git a/clutter/tests/interactive/test-script-signals.json b/clutter/tests/interactive/test-script-signals.json deleted file mode 100644 index 0d3f6bd25..000000000 --- a/clutter/tests/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/clutter/tests/interactive/test-state-animator.c b/clutter/tests/interactive/test-state-animator.c deleted file mode 100644 index 42ae7d253..000000000 --- a/clutter/tests/interactive/test-state-animator.c +++ /dev/null @@ -1,144 +0,0 @@ -#include -#include -#include -#include - -static ClutterState *state; -static ClutterAnimator *animator; - -static gboolean press_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - clutter_grab_pointer (actor); - clutter_state_set_state (state, "end"); - return TRUE; -} - -static gboolean release_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - clutter_state_set_state (state, "start"); - clutter_ungrab_pointer (); - return TRUE; -} - - -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 *rectangle; - - gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL); - rectangle = clutter_texture_new_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - - clutter_actor_set_size (rectangle, 128, 128); - clutter_color_free (color); - return rectangle; -} - -G_MODULE_EXPORT gint -test_state_animator_main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterActor *rects[40]; - gint i; - - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return 1; - - stage = clutter_stage_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State and Animator"); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i = 0; i < 2; i++) - { - rects[i] = new_rect (255 * (i * 1.0 / 40), 50, 160, 255); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), rects[i]); - clutter_actor_set_anchor_point (rects[i], 64, 64); - clutter_actor_set_position (rects[i], 320.0, 240.0); - clutter_actor_set_opacity (rects[i], 0x70); - - clutter_actor_set_reactive (rects[i], TRUE); - g_signal_connect (rects[i], "button-press-event", G_CALLBACK (press_event), NULL); - g_signal_connect (rects[i], "button-release-event", G_CALLBACK (release_event), NULL); - } - - state = clutter_state_new (); - clutter_state_set (state, NULL, "start", - rects[0], "depth", CLUTTER_LINEAR, 0.0, - rects[0], "x", CLUTTER_LINEAR, 100.0, - rects[0], "y", CLUTTER_LINEAR, 300.0, - rects[1], "opacity", CLUTTER_LINEAR, 0x20, - rects[1], "scale-x", CLUTTER_LINEAR, 1.0, - rects[1], "scale-y", CLUTTER_LINEAR, 1.0, - NULL); - clutter_state_set (state, NULL, "end", - rects[0], "depth", CLUTTER_LINEAR, 200.0, - rects[0], "x", CLUTTER_LINEAR, 320.0, - rects[0], "y", CLUTTER_LINEAR, 240.0, - rects[1], "opacity", CLUTTER_LINEAR, 0xff, - rects[1], "scale-x", CLUTTER_LINEAR, 2.0, - rects[1], "scale-y", CLUTTER_LINEAR, 2.0, - NULL); - - animator = clutter_animator_new (); - clutter_animator_set (animator, - rects[0], "depth", -1, 0.0, 0.0, - rects[0], "depth", CLUTTER_LINEAR, 1.0, 275.0, - rects[0], "x", -1, 0.0, 0.0, - rects[0], "x", CLUTTER_LINEAR, 0.5, 200.0, - rects[0], "x", CLUTTER_LINEAR, 1.0, 320.0, - - rects[0], "y", -1, 0.0, 0.0, - rects[0], "y", CLUTTER_LINEAR, 0.3, 100.0, - rects[0], "y", CLUTTER_LINEAR, 1.0, 240.0, - - rects[1], "opacity", -1, 0.0, 0x20, - rects[1], "opacity", CLUTTER_LINEAR, 1.0, 0xff, - rects[1], "scale-x", -1, 0.0, 1.0, - rects[1], "scale-x", CLUTTER_LINEAR, 0.5, 2.0, - rects[1], "scale-x", CLUTTER_LINEAR, 1.0, 2.0, - rects[1], "scale-y", -1, 0.0, 1.0, - rects[1], "scale-y", CLUTTER_LINEAR, 0.5, 2.0, - rects[1], "scale-y", CLUTTER_LINEAR, 1.0, 2.0, - NULL); - - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "depth", TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "x", TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "y", TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "opacity", TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "scale-x", TRUE); - clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "scale-y", TRUE); - - clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), "x", - CLUTTER_INTERPOLATION_CUBIC); - clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), "y", - CLUTTER_INTERPOLATION_CUBIC); - - clutter_state_set_animator (state, "start", "end", animator); - g_object_unref (animator); - - clutter_actor_show (stage); - clutter_state_set_state (state, "start"); - - clutter_main (); - g_object_unref (state); - - return EXIT_SUCCESS; -} - -G_MODULE_EXPORT const char * -test_state_animator_describe (void) -{ - return "Animate using the State and Animator classes."; -} diff --git a/clutter/tests/interactive/test-state-script.c b/clutter/tests/interactive/test-state-script.c deleted file mode 100644 index 34b1b8789..000000000 --- a/clutter/tests/interactive/test-state-script.c +++ /dev/null @@ -1,53 +0,0 @@ -#include - -#include - -#include - -#define TEST_STATE_SCRIPT_FILE "test-script-signals.json" - -gboolean -on_button_press (ClutterActor *actor, - ClutterEvent *event, - gpointer dummy G_GNUC_UNUSED) -{ - g_print ("Button pressed!\n"); - - return FALSE; -} - -G_MODULE_EXPORT int -test_state_script_main (int argc, char *argv[]) -{ - ClutterActor *stage, *button; - ClutterScript *script; - GError *error = NULL; - - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return EXIT_FAILURE; - - script = clutter_script_new (); - clutter_script_load_from_file (script, TEST_STATE_SCRIPT_FILE, &error); - if (error != NULL) - g_error ("Unable to load '%s': %s\n", - TEST_STATE_SCRIPT_FILE, - error->message); - - stage = clutter_stage_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Script"); - clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - clutter_actor_show (stage); - - button = CLUTTER_ACTOR (clutter_script_get_object (script, "button")); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), button); - clutter_actor_add_constraint (button, clutter_align_constraint_new (stage, CLUTTER_ALIGN_BOTH, 0.5)); - - clutter_script_connect_signals (script, NULL); - - clutter_main (); - - g_object_unref (script); - - return EXIT_SUCCESS; -} diff --git a/clutter/tests/interactive/test-state.c b/clutter/tests/interactive/test-state.c deleted file mode 100644 index 063417386..000000000 --- a/clutter/tests/interactive/test-state.c +++ /dev/null @@ -1,206 +0,0 @@ -#include -#include -#include -#include - -#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) - - -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_texture_new_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/clutter/tests/performance/Makefile.am b/clutter/tests/performance/Makefile.am index 145b77902..b031a1b08 100644 --- a/clutter/tests/performance/Makefile.am +++ b/clutter/tests/performance/Makefile.am @@ -1,11 +1,6 @@ check_PROGRAMS = \ test-picking \ - test-text-perf \ - test-state \ - test-state-interactive \ - test-state-hidden \ - test-state-mini \ - test-state-pick + test-text-perf common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la diff --git a/clutter/tests/performance/meson.build b/clutter/tests/performance/meson.build index 5d7157580..0b9069d5d 100644 --- a/clutter/tests/performance/meson.build +++ b/clutter/tests/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/clutter/tests/performance/test-state-hidden.c b/clutter/tests/performance/test-state-hidden.c deleted file mode 100644 index 1d0c188ec..000000000 --- a/clutter/tests/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_actor_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_actor_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" - -#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_actor_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_texture_new_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" - -#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_actor_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_texture_new_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" - -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_actor_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_texture_new_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" - -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_actor_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_texture_new_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