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