From a55a286b1518712b5de7e4a3d2dcd2e252e30ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 13:30:24 +0200 Subject: [PATCH 1/8] clutter: Remove deprecated 'ClutterState' https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-deprecated.h | 1 - clutter/clutter/clutter-script.c | 229 +-- clutter/clutter/clutter-script.h | 9 - clutter/clutter/clutter-types.h | 1 - clutter/clutter/deprecated/clutter-state.c | 1760 ----------------- clutter/clutter/deprecated/clutter-state.h | 147 -- clutter/clutter/meson.build | 2 - .../clutter/conform/scripts/test-state-1.json | 33 - src/tests/clutter/conform/state.c | 87 - src/tests/clutter/interactive/meson.build | 2 - .../interactive/test-script-signals.json | 68 - src/tests/clutter/interactive/test-state.c | 213 -- src/tests/clutter/performance/meson.build | 5 - .../clutter/performance/test-state-hidden.c | 150 -- .../performance/test-state-interactive.c | 195 -- .../clutter/performance/test-state-mini.c | 154 -- .../clutter/performance/test-state-pick.c | 160 -- src/tests/clutter/performance/test-state.c | 159 -- 18 files changed, 1 insertion(+), 3374 deletions(-) delete mode 100644 clutter/clutter/deprecated/clutter-state.c delete mode 100644 clutter/clutter/deprecated/clutter-state.h delete mode 100644 src/tests/clutter/conform/scripts/test-state-1.json delete mode 100644 src/tests/clutter/conform/state.c delete mode 100644 src/tests/clutter/interactive/test-script-signals.json delete mode 100644 src/tests/clutter/interactive/test-state.c delete mode 100644 src/tests/clutter/performance/test-state-hidden.c delete mode 100644 src/tests/clutter/performance/test-state-interactive.c delete mode 100644 src/tests/clutter/performance/test-state-mini.c delete mode 100644 src/tests/clutter/performance/test-state-pick.c delete mode 100644 src/tests/clutter/performance/test-state.c diff --git a/clutter/clutter/clutter-deprecated.h b/clutter/clutter/clutter-deprecated.h index e793c3f6bdb..1eb2d4ac80f 100644 --- a/clutter/clutter/clutter-deprecated.h +++ b/clutter/clutter/clutter-deprecated.h @@ -11,7 +11,6 @@ #include "deprecated/clutter-group.h" #include "deprecated/clutter-rectangle.h" #include "deprecated/clutter-stage.h" -#include "deprecated/clutter-state.h" #include "deprecated/clutter-timeline.h" #undef __CLUTTER_DEPRECATED_H_INSIDE__ diff --git a/clutter/clutter/clutter-script.c b/clutter/clutter/clutter-script.c index c3221c8f255..9c79f26c1b9 100644 --- a/clutter/clutter/clutter-script.c +++ b/clutter/clutter/clutter-script.c @@ -98,49 +98,6 @@ * respectively) and the "object" string member for calling * g_signal_connect_object() instead of g_signal_connect(). * - * Signals can also be directly attached to a specific state defined - * inside a #ClutterState instance, for instance: - * - * |[ - * ... - * "signals" : [ - * { - * "name" : "enter-event", - * "states" : "button-states", - * "target-state" : "hover" - * }, - * { - * "name" : "leave-event", - * "states" : "button-states", - * "target-state" : "base" - * }, - * { - * "name" : "button-press-event", - * "states" : "button-states", - * "target-state" : "active", - * }, - * { - * "name" : "key-press-event", - * "states" : "button-states", - * "target-state" : "key-focus", - * "warp" : true - * } - * ], - * ... - * ]| - * - * The "states" key defines the #ClutterState instance to be used to - * resolve the "target-state" key; it can be either a script id for a - * #ClutterState built by the same #ClutterScript instance, or to a - * #ClutterState built in code and associated to the #ClutterScript - * instance through the clutter_script_add_states() function. If no - * "states" key is present, then the default #ClutterState associated to - * the #ClutterScript instance will be used; the default #ClutterState - * can be set using clutter_script_add_states() using a %NULL name. The - * "warp" key can be used to warp to a specific state instead of - * animating to it. State changes on signal emission will not affect - * the signal emission chain. - * * Clutter reserves the following names, so classes defining properties * through the usual GObject registration process should avoid using these * names to avoid collisions: @@ -186,7 +143,6 @@ #include "deprecated/clutter-alpha.h" #include "deprecated/clutter-container.h" -#include "deprecated/clutter-state.h" enum { @@ -210,8 +166,6 @@ struct _ClutterScriptPrivate ClutterScriptParser *parser; - GHashTable *states; - gchar **search_paths; gchar *translation_domain; @@ -264,7 +218,6 @@ signal_info_free (gpointer data) g_free (sinfo->name); g_free (sinfo->handler); g_free (sinfo->object); - g_free (sinfo->state); g_free (sinfo->target); g_slice_free (SignalInfo, sinfo); @@ -319,7 +272,6 @@ clutter_script_finalize (GObject *gobject) g_hash_table_destroy (priv->objects); g_strfreev (priv->search_paths); g_free (priv->filename); - g_hash_table_destroy (priv->states); g_free (priv->translation_domain); G_OBJECT_CLASS (clutter_script_parent_class)->finalize (gobject); @@ -454,9 +406,6 @@ clutter_script_init (ClutterScript *script) priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, object_info_free); - priv->states = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - (GDestroyNotify) g_object_unref); } /** @@ -972,65 +921,12 @@ clutter_script_connect_signals (ClutterScript *script, g_free (cd); } -typedef struct { - ClutterState *state; - GObject *emitter; - gchar *target; - gulong signal_id; - gulong hook_id; - gboolean warp_to; -} HookData; - typedef struct { ClutterScript *script; ClutterScriptConnectFunc func; gpointer user_data; } SignalConnectData; -static void -hook_data_free (gpointer data) -{ - if (G_LIKELY (data != NULL)) - { - HookData *hook_data = data; - - g_free (hook_data->target); - g_slice_free (HookData, hook_data); - } -} - -static gboolean -clutter_script_state_change_hook (GSignalInvocationHint *ihint, - guint n_params, - const GValue *params, - gpointer user_data) -{ - HookData *hook_data = user_data; - GObject *emitter; - - emitter = g_value_get_object (¶ms[0]); - - if (emitter == hook_data->emitter) - { - if (hook_data->warp_to) - clutter_state_warp_to_state (hook_data->state, hook_data->target); - else - clutter_state_set_state (hook_data->state, hook_data->target); - } - - return TRUE; -} - -static void -clutter_script_remove_state_change_hook (gpointer user_data, - GObject *object_p) -{ - HookData *hook_data = user_data; - - g_signal_remove_emission_hook (hook_data->signal_id, - hook_data->hook_id); -} - static void connect_each_object (gpointer key, gpointer value, @@ -1070,64 +966,7 @@ connect_each_object (gpointer key, } else { - GObject *state_object = NULL; - const gchar *signal_name, *signal_detail; - gchar **components; - GQuark signal_quark; - guint signal_id; - HookData *hook_data; - - if (sinfo->state == NULL) - state_object = (GObject *) clutter_script_get_states (script, NULL); - else - { - state_object = clutter_script_get_object (script, sinfo->state); - if (state_object == NULL) - state_object = (GObject *) clutter_script_get_states (script, sinfo->state); - } - - if (state_object == NULL) - continue; - - components = g_strsplit (sinfo->name, "::", 2); - if (g_strv_length (components) == 2) - { - signal_name = components[0]; - signal_detail = components[1]; - } - else - { - signal_name = components[0]; - signal_detail = NULL; - } - - signal_id = g_signal_lookup (signal_name, G_OBJECT_TYPE (object)); - if (signal_id == 0) - { - g_strfreev (components); - continue; - } - - if (signal_detail != NULL) - signal_quark = g_quark_from_string (signal_detail); - else - signal_quark = 0; - - hook_data = g_slice_new (HookData); - hook_data->emitter = object; - hook_data->state = CLUTTER_STATE (state_object); - hook_data->target = g_strdup (sinfo->target); - hook_data->warp_to = sinfo->warp_to; - hook_data->signal_id = signal_id; - hook_data->hook_id = - g_signal_add_emission_hook (signal_id, signal_quark, - clutter_script_state_change_hook, - hook_data, - hook_data_free); - - g_object_weak_ref (hook_data->emitter, - clutter_script_remove_state_change_hook, - hook_data); + g_warn_if_reached (); } signal_info_free (sinfo); @@ -1352,72 +1191,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 a2ad3721b22..ca07a681033 100644 --- a/clutter/clutter/clutter-script.h +++ b/clutter/clutter/clutter-script.h @@ -179,15 +179,6 @@ void clutter_script_unmerge_objects (ClutterScript CLUTTER_EXPORT void clutter_script_ensure_objects (ClutterScript *script); -CLUTTER_DEPRECATED -void clutter_script_add_states (ClutterScript *script, - const gchar *name, - ClutterState *state); - -CLUTTER_DEPRECATED -ClutterState * clutter_script_get_states (ClutterScript *script, - const gchar *name); - CLUTTER_EXPORT void clutter_script_connect_signals (ClutterScript *script, gpointer user_data); diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index 05c51b6034e..cf6a3ced2de 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -81,7 +81,6 @@ typedef struct _ClutterPerspective ClutterPerspective; typedef struct _ClutterAlpha ClutterAlpha; typedef struct _ClutterAnimation ClutterAnimation; -typedef struct _ClutterState ClutterState; typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool; typedef struct _ClutterInputDevice ClutterInputDevice; diff --git a/clutter/clutter/deprecated/clutter-state.c b/clutter/clutter/deprecated/clutter-state.c deleted file mode 100644 index 98b0cbf1466..00000000000 --- a/clutter/clutter/deprecated/clutter-state.c +++ /dev/null @@ -1,1760 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Øyvind Kolås - * - * Copyright (C) 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/** - * SECTION:clutter-state - * @short_description: State machine with animated transitions - * - * #ClutterState is an object controlling the tweening of properties on - * multiple actors between a set of named states. #ClutterStateKeys - * define how the properties are animated. If the source_state_name for a key - * is NULL it is used for transition to the target state unless a specific key - * exists for transitioning from the current state to the requested state. - * - * #ClutterState is available since Clutter 1.4. - * - * #ClutterState has been deprecated in Clutter 1.12. There is no direct - * replacement for this API, but it's highly suggested you use a combination - * of [implicit transitions][clutter-actor-animation] and explicit transitions - * using #ClutterTransition and its subclasses. - * - * ## Using ClutterState - * - * The following example defines a "base" and a "hover" state in a - * #ClutterState instance. - * - * |[ - * ClutterState *state = clutter_state_new (); - * ClutterColor color = { 0, }; - * - * // transition from any state to the "base" state - * clutter_color_from_string (&color, "rgb(255, 0, 0)"); - * clutter_state_set (state, NULL, "base", - * actor, "color", CLUTTER_LINEAR, &color, - * actor, "scale-x", CLUTTER_EASE_IN_BOUNCE, 1.0, - * actor, "scale-y", CLUTTER_EASE_IN_BOUNCE, 1.0, - * NULL); - * - * // transition from the "base" state to the "hover" state - * clutter_color_from_string (&color, "rgb(0, 0, 255)"); - * clutter_state_set (state, "base", "hover", - * actor, "color", CLUTTER_LINEAR, &color, - * actor, "scale-x", CLUTTER_EASE_OUT_BOUNCE, 1.7, - * actor, "scale-y", CLUTTER_EASE_OUT_BOUNCE, 1.7, - * NULL); - * - * // the default duration of any transition - * clutter_state_set_duration (state, NULL, NULL, 500); - * - * // set "base" as the initial state - * clutter_state_warp_to_state (state, "base"); - * ]| - * - * The actor then uses the #ClutterState to animate through the - * two states using callbacks for the #ClutterActor::enter-event and - * #ClutterActor::leave-event signals. - * - * |[ - * static gboolean - * on_enter (ClutterActor *actor, - * ClutterEvent *event, - * ClutterState *state) - * { - * clutter_state_set_state (state, "hover"); - * - * return CLUTTER_EVENT_STOP; - * } - * - * static gboolean - * on_leave (ClutterActor *actor, - * ClutterEvent *event, - * ClutterState *state) - * { - * clutter_state_set_state (state, "base"); - * - * return CLUTTER_EVENT_STOP; - * } - * - * ## ClutterState description for ClutterScript - * - * #ClutterState defines a custom `transitions` JSON object member which - * allows describing the states. - * - * The `transitions` property has the following syntax: - * - * |[ - * { - * "transitions" : [ - * { - * "source" : "source-state", - * "target" : "target-state", - * "duration" : milliseconds, - * "keys" : [ - * [ - * "object-id", - * "property-name", - * "easing-mode", - * "final-value", - * ], - * [ - * "object-id", - * "property-name", - * "easing-mode", - * "final-value", - * pre-delay, - * post-delay; - * ], - * ... - * ] - * }, - * { - * "source" : "source-state", - * "target" : "target-state", - * "duration" : milliseconds, - * }, - * ... - * ] - * } - * ]| - * - * Each element of the transitions array follows the same rules and order - * as clutter_state_set_key() function arguments. - * - * The source and target values control the source and target state of the - * transition. - * - * The pre-delay and post-delay values are optional. - * - * The example below is a translation into a #ClutterScript definition of - * the code in the #ClutterState example above. - * - * |[ - * { - * "id" : "button-state", - * "type" : "ClutterState", - * "duration" : 500, - * "transitions" : [ - * { - * "source" : "*", - * "target" : "base", - * "keys" : [ - * [ "button", "color", "linear", "rgb(255, 0, 0)" ], - * [ "button", "scale-x", "easeInBounce", 1.0 ], - * [ "button", "scale-y", "easeInBounce", 1.0 ] - * ] - * }, - * { - * "source" : "base", - * "target" : "hover", - * "keys" : [ - * [ "button", "color", "linear", "rgb(0, 0, 255)" ], - * [ "button", "scale-x", "easeOutBounce", 1.7 ], - * [ "button", "scale-y", "easeOutBounce", 1.7 ] - * ] - * } - * ] - * } - * ]| - */ - -#include "clutter-build-config.h" - -#include -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-state.h" - -#include "clutter-alpha.h" -#include "clutter-animatable.h" -#include "clutter-enum-types.h" -#include "clutter-interval.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -typedef struct State -{ - const gchar *name; /* interned string for this state name */ - GHashTable *durations; /* durations for transitions from various state - names */ - GList *keys; /* list of all keys pertaining to transitions - from other states to this one */ - ClutterState *clutter_state; /* the ClutterState object this state belongs to - */ -} State; - -struct _ClutterStatePrivate -{ - GHashTable *states; /* contains state objects */ - guint duration; /* global fallback duration */ - ClutterTimeline *timeline; /* The timeline used for doing the - progress */ - ClutterTimeline *slave_timeline; /* a slave timeline used to compute - alphas */ - const gchar *source_state_name; /* current source state */ - State *source_state; /* current source_state */ - const gchar *target_state_name; /* current target state */ - State *target_state; /* target state name */ -}; - -#define SLAVE_TIMELINE_LENGTH 10000 - -/* - * ClutterStateKey: - * - * An opaque data structure with accessor functions. - * - */ -typedef struct _ClutterStateKey -{ - GObject *object; /* an Gobject */ - const gchar *property_name;/* the name of a property */ - gulong mode; /* alpha to use */ - GValue value; /* target value */ - gdouble pre_delay; /* fraction of duration to delay before - starting */ - gdouble pre_pre_delay;/* fraction of duration to add to - pre_delay. This is used to set keys - during transitions. */ - gdouble post_delay; /* fraction of duration to be done in */ - - State *source_state; /* source state */ - State *target_state; /* target state */ - - ClutterAlpha *alpha; /* The alpha this key uses for interpolation */ - ClutterInterval *interval; /* The interval this key uses for - interpolation */ - - guint is_animatable : 1; - guint is_inert : 1; /* set if the key is being destroyed due to - weak reference */ - gint ref_count; /* reference count for boxed life time */ -} _ClutterStateKey; - -enum -{ - PROP_0, - PROP_DURATION, - PROP_STATE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -enum -{ - COMPLETED, - LAST_SIGNAL -}; - -static void clutter_scriptable_iface_init (ClutterScriptableIface *iface); - -static guint state_signals[LAST_SIGNAL] = {0, }; - -G_DEFINE_TYPE_WITH_CODE (ClutterState, clutter_state, G_TYPE_OBJECT, - G_ADD_PRIVATE (ClutterState) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_iface_init)) - -/** - * clutter_state_new: - * - * Creates a new #ClutterState - * - * Return value: the newly create #ClutterState instance - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterState * -clutter_state_new (void) -{ - return g_object_new (CLUTTER_TYPE_STATE, NULL); -} - -static gint -sort_props_func (gconstpointer a, - gconstpointer b) -{ - const ClutterStateKey *pa = a; - const ClutterStateKey *pb = b; - - if (pa->object == pb->object) - { - gint propnamediff = pa->property_name-pb->property_name; - if (propnamediff == 0) - return pb->source_state - pa->source_state; - - return propnamediff; - } - - return pa->object - pb->object; -} - -static State * clutter_state_fetch_state (ClutterState *state, - const gchar *state_name, - gboolean force_creation); -static void object_disappeared (gpointer data, - GObject *where_the_object_was); - -static ClutterStateKey * -clutter_state_key_new (State *state, - GObject *object, - const gchar *property_name, - GParamSpec *pspec, - guint mode) -{ - ClutterStatePrivate *priv = state->clutter_state->priv; - ClutterStateKey *state_key; - GValue value = G_VALUE_INIT; - - state_key = g_slice_new0 (ClutterStateKey); - - state_key->target_state = state; - state_key->object = object; - state_key->property_name = g_intern_string (property_name); - state_key->mode = mode; - state_key->is_animatable = CLUTTER_IS_ANIMATABLE (object); - - state_key->alpha = clutter_alpha_new (); - g_object_ref_sink (state_key->alpha); - clutter_alpha_set_mode (state_key->alpha, mode); - clutter_alpha_set_timeline (state_key->alpha, priv->slave_timeline); - - state_key->interval = - g_object_new (CLUTTER_TYPE_INTERVAL, - "value-type", G_PARAM_SPEC_VALUE_TYPE (pspec), - NULL); - g_object_ref_sink (state_key->interval); - - g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - clutter_interval_set_initial_value (state_key->interval, &value); - clutter_interval_set_final_value (state_key->interval, &value); - g_value_unset (&value); - - g_object_weak_ref (object, object_disappeared, - state_key->target_state->clutter_state); - - return state_key; -} - -static void -clutter_state_key_free (gpointer clutter_state_key) -{ - ClutterStateKey *key = clutter_state_key; - - if (key == NULL) - return; - - key->ref_count -= 1; - - if (key->ref_count > 0) - return; - - if (!key->is_inert) - { - g_object_weak_unref (key->object, - object_disappeared, - key->target_state->clutter_state); - } - - g_value_unset (&key->value); - - g_object_unref (key->alpha); - g_object_unref (key->interval); - - g_slice_free (ClutterStateKey, key); -} - - -static inline void -clutter_state_remove_key_internal (ClutterState *this, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - gboolean is_inert) -{ - GList *s, *state_list; - State *source_state = NULL; - - source_state_name = g_intern_string (source_state_name); - target_state_name = g_intern_string (target_state_name); - property_name = g_intern_string (property_name); - - if (source_state_name) - source_state = clutter_state_fetch_state (this, source_state_name, FALSE); - -again_from_start: - - if (target_state_name != NULL) - state_list = g_list_append (NULL, (gpointer) target_state_name); - else - state_list = clutter_state_get_states (this); - - for (s = state_list; s != NULL; s = s->next) - { - State *target_state; - target_state = clutter_state_fetch_state (this, s->data, FALSE); - /* Go through each TargetState */ - if (target_state) - { - GList *k = target_state->keys; - - /* Note the safe while() loop, because we modify the list inline */ - while (k != NULL) - { - ClutterStateKey *key = k->data; - - k = k->next; - - /* Check if each key matches query */ - if ( (object == NULL || (object == key->object)) - && (source_state == NULL || (source_state == key->source_state)) - && (property_name == NULL || ((property_name == key->property_name)))) - { - /* Remove matching key */ - target_state->keys = g_list_remove (target_state->keys, key); - key->is_inert = is_inert; - clutter_state_key_free (key); - - /* no more keys with transitions to this target_state*/ - if (target_state->keys == NULL) - { - /* If this state is the current state, unset the state */ - if (target_state == this->priv->target_state) - clutter_state_set_state (this, NULL); - - /* remove any keys that exist that uses this state as a source */ - clutter_state_remove_key_internal (this, s->data, NULL, NULL, NULL, is_inert); - - g_hash_table_remove (this->priv->states, s->data); - goto again_from_start; /* we have just freed State *target_state, so - need to restart removal */ - } - } - } - } - } - - g_list_free (state_list); -} - -static void -object_disappeared (gpointer data, - GObject *where_the_object_was) -{ - clutter_state_remove_key_internal (data, NULL, NULL, - (gpointer) where_the_object_was, - NULL, - TRUE); -} - - -static void -state_free (gpointer data) -{ - State *state = data; - - for (; state->keys; - state->keys = g_list_remove (state->keys, state->keys->data)) - clutter_state_key_free (state->keys->data); - - g_hash_table_destroy (state->durations); - g_free (state); -} - -static State * -state_new (ClutterState *clutter_state, - const gchar *name) -{ - State *state; - - state = g_new0 (State, 1); - state->clutter_state = clutter_state; - state->name = name; - state->durations = g_hash_table_new (g_direct_hash, g_direct_equal); - - return state; -} - -static void -clutter_state_finalize (GObject *object) -{ - ClutterStatePrivate *priv = CLUTTER_STATE (object)->priv; - - g_hash_table_destroy (priv->states); - - g_object_unref (priv->timeline); - g_object_unref (priv->slave_timeline); - - G_OBJECT_CLASS (clutter_state_parent_class)->finalize (object); -} - -static void -clutter_state_completed (ClutterTimeline *timeline, - ClutterState *state) -{ - g_signal_emit (state, state_signals[COMPLETED], 0); -} - -static void -clutter_state_new_frame (ClutterTimeline *timeline, - gint msecs, - ClutterState *state) -{ - ClutterStatePrivate *priv = state->priv; - GList *k; - gdouble progress; - const gchar *curprop = NULL; - GObject *curobj = NULL; - gboolean found_specific = FALSE; - - progress = clutter_timeline_get_progress (timeline); - - for (k = priv->target_state->keys; k; k = k->next) - { - ClutterStateKey *key = k->data; - gdouble sub_progress; - - if ((curprop && !(curprop == key->property_name)) || - key->object != curobj) - { - curprop = key->property_name; - curobj = key->object; - found_specific = FALSE; - } - - if (!found_specific) - { - if (key->source_state != NULL && - key->source_state->name != NULL && - priv->source_state_name != NULL && - g_str_equal (priv->source_state_name, key->source_state->name)) - { - found_specific = TRUE; - } - - if (found_specific || key->source_state == NULL) - { - gdouble pre_delay = key->pre_delay + key->pre_pre_delay; - - sub_progress = (progress - pre_delay) - / (1.0 - (pre_delay + key->post_delay)); - - if (sub_progress >= 0.0) - { - if (sub_progress >= 1.0) - sub_progress = 1.0; - - clutter_timeline_advance (priv->slave_timeline, - sub_progress * SLAVE_TIMELINE_LENGTH); - sub_progress = clutter_alpha_get_alpha (key->alpha); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - GValue value = G_VALUE_INIT; - gboolean res; - - animatable = CLUTTER_ANIMATABLE (key->object); - - g_value_init (&value, clutter_state_key_get_property_type (key)); - - res = - clutter_animatable_interpolate_value (animatable, - key->property_name, - key->interval, - sub_progress, - &value); - - if (res) - clutter_animatable_set_final_state (animatable, - key->property_name, - &value); - - g_value_unset (&value); - } - else - { - const GValue *value; - - value = clutter_interval_compute (key->interval, sub_progress); - if (value != NULL) - g_object_set_property (key->object, key->property_name, value); - } - } - - /* XXX: should the target value of the default destination be - * used even when found a specific source_state key? - */ - } - } - } -} - - -static ClutterTimeline * -clutter_state_change (ClutterState *state, - const gchar *target_state_name, - gboolean animate) -{ - ClutterStatePrivate *priv; - State *new_state; - guint duration; - GList *k; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - priv = state->priv; - - /* If we've been asked to change state to NULL, reset the - * ClutterState to its initial state, but leave the keys - * alone. - */ - if (!target_state_name) - { - if (!priv->target_state) - return NULL; - - priv->source_state_name = priv->target_state_name = NULL; - priv->source_state = priv->target_state = NULL; - - clutter_timeline_stop (priv->timeline); - clutter_timeline_rewind (priv->timeline); - - return NULL; - } - - target_state_name = g_intern_string (target_state_name); - - if (target_state_name == priv->target_state_name) - { - /* Avoid transitioning if the desired state is already current, - * unless we're warping to it and the state transition is in - * progress (in that case, immediately warp to the state). - */ - if (!clutter_timeline_is_playing (priv->timeline) || animate) - return priv->timeline; - } - - priv->source_state_name = priv->target_state_name; - priv->target_state_name = target_state_name; - - g_object_notify_by_pspec (G_OBJECT (state), obj_props[PROP_STATE]); - - duration = clutter_state_get_duration (state, - priv->source_state_name, - priv->target_state_name); - clutter_timeline_set_duration (priv->timeline, duration); - - new_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (new_state == NULL) - { - g_warning ("State '%s' not found", target_state_name); - - return NULL; - } - - for (k = new_state->keys; k != NULL; k = k->next) - { - ClutterStateKey *key = k->data; - GValue initial = G_VALUE_INIT; - - /* Reset the pre-pre-delay - this is only used for setting keys - * during transitions. - */ - key->pre_pre_delay = 0; - - g_value_init (&initial, clutter_interval_get_value_type (key->interval)); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - - animatable = CLUTTER_ANIMATABLE (key->object); - clutter_animatable_get_initial_state (animatable, - key->property_name, - &initial); - } - else - g_object_get_property (key->object, key->property_name, &initial); - - if (clutter_alpha_get_mode (key->alpha) != key->mode) - clutter_alpha_set_mode (key->alpha, key->mode); - - clutter_interval_set_initial_value (key->interval, &initial); - clutter_interval_set_final_value (key->interval, &key->value); - - g_value_unset (&initial); - } - - if (!animate) - { - clutter_timeline_stop (priv->timeline); - clutter_timeline_advance (priv->timeline, duration); - - /* emit signals, to change properties, and indicate that the - * state change is complete */ - g_signal_emit_by_name (priv->timeline, "new-frame", - GINT_TO_POINTER (duration), - NULL); - g_signal_emit_by_name (priv->timeline, "completed", NULL); - } - else - { - clutter_timeline_stop (priv->timeline); - clutter_timeline_rewind (priv->timeline); - clutter_timeline_start (priv->timeline); - } - - return priv->timeline; -} - -/** - * clutter_state_set_state: - * @state: a #ClutterState - * @target_state_name: the state to transition to - * - * Change the current state of #ClutterState to @target_state_name. - * - * The state will animate during its transition, see - * #clutter_state_warp_to_state for animation-free state switching. - * - * Setting a %NULL state will stop the current animation and unset - * the current state, but keys will be left intact. - * - * Return value: (transfer none): the #ClutterTimeline that drives the - * state transition. The returned timeline is owned by the #ClutterState - * and it should not be unreferenced - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterTimeline * -clutter_state_set_state (ClutterState *state, - const gchar *target_state_name) -{ - return clutter_state_change (state, target_state_name, TRUE); -} - -/** - * clutter_state_warp_to_state: - * @state: a #ClutterState - * @target_state_name: the state to transition to - * - * Change to the specified target state immediately with no animation. - * - * See clutter_state_set_state(). - * - * Return value: (transfer none): the #ClutterTimeline that drives the - * state transition. The returned timeline is owned by the #ClutterState - * and it should not be unreferenced - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterTimeline * -clutter_state_warp_to_state (ClutterState *state, - const gchar *target_state_name) -{ - return clutter_state_change (state, target_state_name, FALSE); -} - -static GParamSpec * -get_property_from_object (GObject *gobject, - const gchar *property_name) -{ - GParamSpec *pspec; - - if (CLUTTER_IS_ANIMATABLE (gobject)) - { - ClutterAnimatable *animatable = CLUTTER_ANIMATABLE (gobject); - - pspec = clutter_animatable_find_property (animatable, property_name); - } - else - { - GObjectClass *klass = G_OBJECT_GET_CLASS (gobject); - - pspec = g_object_class_find_property (klass, property_name); - } - - if (pspec == NULL) - { - g_warning ("Cannot bind property '%s': objects of type '%s' " - "do not have this property", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (!(pspec->flags & G_PARAM_WRITABLE)) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is not writable", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (!(pspec->flags & G_PARAM_READABLE)) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is not readable", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) - { - g_warning ("Cannot bind property '%s' of object of type '%s': " - "the property is set as constructor-only", - property_name, - G_OBJECT_TYPE_NAME (gobject)); - return NULL; - } - - return pspec; -} - -/** - * clutter_state_set: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the name of the source state keys are being added for - * @target_state_name: the name of the target state keys are being added for - * @first_object: a #GObject - * @first_property_name: a property of @first_object to specify a key for - * @first_mode: the id of the alpha function to use - * @...: the value @first_property_name should have in @target_state_name, - * followed by object, property name, mode, value tuples, terminated - * by %NULL - * - * Adds multiple keys to a named state of a #ClutterState instance, specifying - * the easing mode and value a given property of an object should have at a - * given progress of the animation. - * - * The mode specified is the easing mode used when going to from the previous - * key to the specified key. - * - * For instance, the code below: - * - * |[ - * clutter_state_set (state, NULL, "hover", - * button, "opacity", CLUTTER_LINEAR, 255, - * button, "scale-x", CLUTTER_EASE_OUT_CUBIC, 1.2, - * button, "scale-y", CLUTTER_EASE_OUT_CUBIC, 1.2, - * NULL); - * ]| - * - * will create a transition from any state (a @source_state_name or NULL is - * treated as a wildcard) and a state named "hover"; the - * button object will have the #ClutterActor:opacity - * property animated to a value of 255 using %CLUTTER_LINEAR as the animation - * mode, and the #ClutterActor:scale-x and #ClutterActor:scale-y properties - * animated to a value of 1.2 using %CLUTTER_EASE_OUT_CUBIC as the animation - * mode. To change the state (and start the transition) you can use the - * clutter_state_set_state() function: - * - * |[ - * clutter_state_set_state (state, "hover"); - * ]| - * - * If a given object, state_name, property tuple already exist in the - * #ClutterState instance, then the mode and value will be replaced with - * the new specified values. - * - * If a property name is prefixed with "delayed::" two additional - * arguments per key are expected: a value relative to the full state time - * to pause before transitioning and a similar value to pause after - * transitioning, e.g.: - * - * |[ - * clutter_state_set (state, "hover", "toggled", - * button, "delayed::scale-x", CLUTTER_LINEAR, 1.0, 0.2, 0.2, - * button, "delayed::scale-y", CLUTTER_LINEAR, 1.0, 0.2, 0.2, - * NULL); - * ]| - * - * will pause for 20% of the duration of the transition before animating, - * and 20% of the duration after animating. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_set (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - gpointer first_object, - const gchar *first_property_name, - gulong first_mode, - ...) -{ - gpointer object; - const gchar *property_name; - gulong mode; - va_list args; - - g_return_if_fail (CLUTTER_IS_STATE (state)); - - object = first_object; - - property_name = first_property_name; - mode = first_mode; - - g_return_if_fail (G_IS_OBJECT (first_object)); - g_return_if_fail (first_property_name); - - va_start (args, first_mode); - - while (object != NULL) - { - GParamSpec *pspec; - GValue value = G_VALUE_INIT; - gchar *error = NULL; - gboolean is_delayed = FALSE; - - if (g_str_has_prefix (property_name, "delayed::")) - { - property_name = strstr (property_name, "::") + 2; - is_delayed = TRUE; - } - - pspec = get_property_from_object (object, property_name); - if (pspec == NULL) - break; - - G_VALUE_COLLECT_INIT (&value, G_PARAM_SPEC_VALUE_TYPE (pspec), - args, 0, - &error); - - if (error != NULL) - { - g_warning ("%s: %s", G_STRLOC, error); - g_free (error); - break; - } - - if (is_delayed) - { - gdouble pre_delay = va_arg (args, gdouble); - gdouble post_delay = va_arg (args, gdouble); - - clutter_state_set_key (state, - source_state_name, - target_state_name, - object, - property_name, - mode, - &value, - pre_delay, - post_delay); - } - else - { - clutter_state_set_key (state, - source_state_name, - target_state_name, - object, - property_name, - mode, - &value, - 0.0, - 0.0); - } - - g_value_unset (&value); - - object = va_arg (args, gpointer); - if (object != NULL) - { - property_name = va_arg (args, gchar*); - mode = va_arg (args, gulong); - } - } - - va_end (args); -} - -static void -clutter_state_set_key_internal (ClutterState *state, - ClutterStateKey *key) -{ - ClutterStatePrivate *priv = state->priv; - State *target_state = key->target_state; - GList *old_item = NULL; - - if ((old_item = g_list_find_custom (target_state->keys, - key, - sort_props_func))) - { - ClutterStateKey *old_key = old_item->data; - - target_state->keys = g_list_remove (target_state->keys, old_key); - clutter_state_key_free (old_key); - } - - target_state->keys = g_list_insert_sorted (target_state->keys, - key, - sort_props_func); - - /* If the current target state is modified, we have some work to do. - * - * If the animation is running, we add a key to the current animation - * with a delay of the current duration so that the new animation will - * animate into place. - * - * If the animation isn't running, but the state is set, we immediately - * warp to that state. - */ - if (key->target_state == priv->target_state) - { - if (!clutter_timeline_is_playing (priv->timeline)) - { - /* We can warp to the state by setting a NULL state, then setting - * the target state again. - */ - clutter_state_change (state, NULL, FALSE); - clutter_state_change (state, target_state->name, FALSE); - } - else - { - /* Set the ClutterInterval associated with the state */ - GValue initial = G_VALUE_INIT; - gdouble progress = clutter_timeline_get_progress (priv->timeline); - - g_value_init (&initial, - clutter_interval_get_value_type (key->interval)); - - if (key->is_animatable) - { - ClutterAnimatable *animatable; - - animatable = CLUTTER_ANIMATABLE (key->object); - clutter_animatable_get_initial_state (animatable, - key->property_name, - &initial); - } - else - g_object_get_property (key->object, key->property_name, &initial); - - if (clutter_alpha_get_mode (key->alpha) != key->mode) - clutter_alpha_set_mode (key->alpha, key->mode); - - clutter_interval_set_initial_value (key->interval, &initial); - clutter_interval_set_final_value (key->interval, &key->value); - - g_value_unset (&initial); - - /* Set the delay as if the interval had just begun */ - if (progress > key->pre_delay) - key->pre_pre_delay = MIN (progress - key->pre_delay, - 1.0 - key->post_delay); - } - } -} - -/* - * clutter_state_fetch_state: - * @state: a #ClutterState - * @state_name: the name of the state to be retrieved - * @create: %TRUE if the state should be instantiated if not found - * - * Retrieves the #State structure for @state_name inside the given - * #ClutterState instance - * - * If @state_name is %NULL and @create is %TRUE then NULL will - * be returned. - * - * Return value: a #State structure for the given name, or %NULL - */ -static State * -clutter_state_fetch_state (ClutterState *state, - const gchar *state_name, - gboolean create) -{ - ClutterStatePrivate *priv = state->priv; - State *retval; - - if (state_name == NULL) - { - return NULL; - } - else - state_name = g_intern_string (state_name); - - retval = g_hash_table_lookup (priv->states, state_name); - if (retval == NULL && create) - { - retval = state_new (state, state_name); - g_hash_table_insert (priv->states, (gpointer) state_name, retval); - } - - return retval; -} - -/** - * clutter_state_set_key: - * @state: a #ClutterState instance. - * @source_state_name: (allow-none): the source transition to specify - * transition for, or %NULL to specify the default fallback when a - * more specific source state doesn't exist. - * @target_state_name: the name of the transition to set a key value for. - * @object: the #GObject to set a key for - * @property_name: the property to set a key for - * @mode: the id of the alpha function to use - * @value: the value for property_name of object in state_name - * @pre_delay: relative time of the transition to be idle in the beginning - * of the transition - * @post_delay: relative time of the transition to be idle in the end of - * the transition - * - * Sets one specific end key for a state name, @object, @property_name - * combination. - * - * Return value: (transfer none): the #ClutterState instance, allowing - * chaining of multiple calls - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -ClutterState * -clutter_state_set_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - guint mode, - const GValue *value, - gdouble pre_delay, - gdouble post_delay) -{ - GParamSpec *pspec; - ClutterStateKey *state_key; - State *source_state = NULL; - State *target_state; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - g_return_val_if_fail (G_IS_OBJECT (object), NULL); - g_return_val_if_fail (property_name, NULL); - g_return_val_if_fail (value, NULL); - - pspec = get_property_from_object (object, property_name); - if (pspec == NULL) - return state; - - source_state = clutter_state_fetch_state (state, source_state_name, TRUE); - target_state = clutter_state_fetch_state (state, target_state_name, TRUE); - - property_name = g_intern_string (property_name); - state_key = clutter_state_key_new (target_state, - object, property_name, pspec, - mode); - - state_key->source_state = source_state; - state_key->pre_delay = pre_delay; - state_key->post_delay = post_delay; - - g_value_init (&state_key->value, G_VALUE_TYPE (value)); - g_value_copy (value, &state_key->value); - - clutter_state_set_key_internal (state, state_key); - - return state; -} - -/** - * clutter_state_get_states: - * @state: a #ClutterState instance. - * - * Gets a list of all the state names managed by this #ClutterState. - * - * Return value: (transfer container) (element-type utf8): a newly allocated - * #GList of state names. The contents of the returned #GList are owned - * by the #ClutterState and should not be modified or freed. Use - * g_list_free() to free the resources allocated by the returned list when - * done using it - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -GList * -clutter_state_get_states (ClutterState *state) -{ - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - return g_hash_table_get_keys (state->priv->states); -} - -static void -clutter_state_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterState *state = CLUTTER_STATE (object); - - switch (prop_id) - { - case PROP_STATE: - clutter_state_set_state (state, g_value_get_string (value)); - break; - case PROP_DURATION: - state->priv->duration = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - -static void -clutter_state_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterState *state = CLUTTER_STATE (object); - switch (prop_id) - { - case PROP_STATE: - g_value_set_string (value, - clutter_state_get_state (state)); - break; - case PROP_DURATION: - g_value_set_uint (value, state->priv->duration); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - -static void -clutter_state_class_init (ClutterStateClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GParamSpec *pspec; - - gobject_class->finalize = clutter_state_finalize; - gobject_class->set_property = clutter_state_set_property; - gobject_class->get_property = clutter_state_get_property; - - /** - * ClutterState::completed: - * @state: the #ClutterState that emitted the signal - * - * The ::completed signal is emitted when a #ClutterState reaches - * the target state specified by clutter_state_set_state() or - * clutter_state_warp_to_state(). - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - state_signals[COMPLETED] = - g_signal_new (I_("completed"), - G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterStateClass, completed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - /** - * ClutterState:state: - * - * The currently set target state, setting it causes the - * state machine to transition to the new state, use - * clutter_state_warp_to_state() to change state without - * a transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - pspec = g_param_spec_string ("state", - P_("State"), - P_("Currently set state, (transition to this state might not be complete)"), - NULL, - CLUTTER_PARAM_READWRITE); - obj_props[PROP_STATE] = pspec; - g_object_class_install_property (gobject_class, PROP_STATE, pspec); - - /** - * ClutterState:duration: - * - * Default duration used if an duration has not been specified for a specific - * source/target state pair. The values is in milliseconds. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ - pspec = g_param_spec_uint ("duration", - P_("Duration"), - P_("Default transition duration"), - 0, 86400000, 1000, - CLUTTER_PARAM_READWRITE); - obj_props[PROP_DURATION] = pspec; - g_object_class_install_property (gobject_class, PROP_DURATION, pspec); -} - -static void -clutter_state_init (ClutterState *self) -{ - ClutterStatePrivate *priv; - - priv = self->priv = clutter_state_get_instance_private (self); - - priv->states = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, - state_free); - - self->priv->source_state_name = NULL; - self->priv->target_state_name = NULL; - - self->priv->duration = 1000; - - priv->timeline = clutter_timeline_new (1000); - g_signal_connect (priv->timeline, "new-frame", - G_CALLBACK (clutter_state_new_frame), - self); - g_signal_connect (priv->timeline, "completed", - G_CALLBACK (clutter_state_completed), - self); - - priv->slave_timeline = clutter_timeline_new (SLAVE_TIMELINE_LENGTH); -} - - -static gpointer -clutter_state_key_copy (gpointer boxed) -{ - if (boxed != NULL) - { - ClutterStateKey *key = boxed; - - key->ref_count += 1; - } - - return boxed; -} - -G_DEFINE_BOXED_TYPE (ClutterStateKey, clutter_state_key, - clutter_state_key_copy, - clutter_state_key_free); - -/** - * clutter_state_key_get_property_type: - * @key: a #ClutterStateKey - * - * Retrieves the #GType of the property a key applies to - * - * Return value: the #GType of the property - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -GType -clutter_state_key_get_property_type (const ClutterStateKey *key) -{ - g_return_val_if_fail (key != NULL, G_TYPE_INVALID); - - return G_VALUE_TYPE (&key->value); -} - - -/** - * clutter_state_set_duration: - * @state: a #ClutterState - * @source_state_name: (allow-none): the name of the source state, or %NULL - * @target_state_name: (allow-none): the name of the target state, or %NULL - * @duration: the duration of the transition, in milliseconds - * - * Sets the duration of a transition. - * - * If both state names are %NULL the default duration for @state is set. - * - * If only @target_state_name is specified, the passed @duration becomes - * the default duration for transitions to the target state. - * - * If both states names are specified, the passed @duration only applies - * to the specified transition. - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -void -clutter_state_set_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - guint duration) -{ - State *target_state; - - g_return_if_fail (CLUTTER_IS_STATE (state)); - - source_state_name = g_intern_string (source_state_name); - if (source_state_name == g_intern_static_string ("")) - source_state_name = NULL; - - target_state_name = g_intern_string (target_state_name); - if (target_state_name == g_intern_static_string ("")) - target_state_name = NULL; - - if (target_state_name == NULL) - { - state->priv->duration = duration; - return; - } - - target_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (target_state != NULL) - { - if (source_state_name != NULL) - g_hash_table_insert (target_state->durations, - (gpointer) source_state_name, - GINT_TO_POINTER (duration)); - else - g_hash_table_insert (target_state->durations, - NULL, - GINT_TO_POINTER (duration)); - } -} - -/** - * clutter_state_get_duration: - * @state: a #ClutterState - * @source_state_name: (allow-none): the name of the source state to - * get the duration of, or %NULL - * @target_state_name: (allow-none): the name of the source state to - * get the duration of, or %NULL - * - * Queries the duration used for transitions between a source and - * target state pair - * - * The semantics for the query are the same as the semantics used for - * setting the duration with clutter_state_set_duration() - * - * Return value: the duration, in milliseconds - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -guint -clutter_state_get_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name) -{ - State *target_state; - guint ret = 0; - - g_return_val_if_fail (CLUTTER_IS_STATE (state), 0); - - source_state_name = g_intern_string (source_state_name); - if (source_state_name == g_intern_static_string ("")) - source_state_name = NULL; - - target_state_name = g_intern_string (target_state_name); - if (target_state_name == g_intern_static_string ("")) - target_state_name = NULL; - - if (target_state_name == NULL) - return state->priv->duration; - - target_state = clutter_state_fetch_state (state, target_state_name, FALSE); - if (target_state != NULL) - { - if (source_state_name) - { - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - source_state_name)); - if(!ret) - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - NULL)); - } - else - ret = GPOINTER_TO_INT (g_hash_table_lookup (target_state->durations, - NULL)); - } - - if (!ret) - ret = state->priv->duration; - - return ret; -} - -/** - * clutter_state_get_state: - * @state: a #ClutterState - * - * Queries the currently set target state. - * - * During a transition this function will return the target of the transition. - * - * This function is useful when called from handlers of the - * #ClutterState::completed signal. - * - * Return value: a string containing the target state. The returned string - * is owned by the #ClutterState and should not be modified or freed - * - * Since: 1.4 - * Deprecated: 1.12: Use #ClutterKeyframeTransition and - * #ClutterTransitionGroup instead - */ -const gchar * -clutter_state_get_state (ClutterState *state) -{ - g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL); - - return state->priv->target_state_name; -} - -typedef struct _ParseClosure { - ClutterState *state; - ClutterScript *script; - - GValue *value; - - gboolean result; -} ParseClosure; - -static void -parse_state_transition (JsonArray *array, - guint index_, - JsonNode *element, - gpointer data) -{ - ParseClosure *clos = data; - JsonObject *object; - const gchar *source_name, *target_name; - State *source_state, *target_state; - JsonArray *keys; - GSList *valid_keys = NULL; - GList *array_keys, *k; - - if (JSON_NODE_TYPE (element) != JSON_NODE_OBJECT) - { - g_warning ("The 'transitions' member of a ClutterState description " - "should be an array of objects, but the element %d of the " - "array is of type '%s'. The element will be ignored.", - index_, - json_node_type_name (element)); - return; - } - - object = json_node_get_object (element); - - if (!json_object_has_member (object, "source") || - !json_object_has_member (object, "target") || - !(json_object_has_member (object, "keys"))) - { - g_warning ("The transition description at index %d is missing one " - "of the mandatory members: source, target and keys", index_); - return; - } - - source_name = json_object_get_string_member (object, "source"); - source_state = clutter_state_fetch_state (clos->state, source_name, TRUE); - - target_name = json_object_get_string_member (object, "target"); - target_state = clutter_state_fetch_state (clos->state, target_name, TRUE); - - if (json_object_has_member (object, "duration")) - { - guint duration = json_object_get_int_member (object, "duration"); - - clutter_state_set_duration (clos->state, - source_name, target_name, - duration); - } - - if (!json_object_has_member (object, "keys")) - return; - - keys = json_object_get_array_member (object, "keys"); - if (keys == NULL) - { - g_warning ("The transition description at index %d has an invalid " - "key member of type '%s' when an array was expected.", - index_, - json_node_type_name (json_object_get_member (object, "keys"))); - return; - } - - if (G_IS_VALUE (clos->value)) - valid_keys = g_slist_reverse (g_value_get_pointer (clos->value)); - else - g_value_init (clos->value, G_TYPE_POINTER); - - array_keys = json_array_get_elements (keys); - for (k = array_keys; k != NULL; k = k->next) - { - JsonNode *node = k->data; - JsonArray *key = json_node_get_array (node); - ClutterStateKey *state_key; - GObject *gobject; - GParamSpec *pspec; - const gchar *id_; - const gchar *property; - gulong mode; - gboolean res; - - id_ = json_array_get_string_element (key, 0); - gobject = clutter_script_get_object (clos->script, id_); - if (gobject == NULL) - { - g_warning ("No object with id '%s' has been defined.", id_); - continue; - } - - property = json_array_get_string_element (key, 1); - pspec = get_property_from_object (gobject, property); - if (pspec == NULL) - { - g_warning ("The object of type '%s' and name '%s' has no " - "property named '%s'.", - G_OBJECT_TYPE_NAME (gobject), - id_, - property); - continue; - } - - mode = _clutter_script_resolve_animation_mode (json_array_get_element (key, 2)); - - state_key = clutter_state_key_new (target_state, - gobject, property, pspec, - mode); - - res = _clutter_script_parse_node (clos->script, - &(state_key->value), - property, - json_array_get_element (key, 3), - pspec); - if (!res) - { - g_warning ("Unable to parse the key value for the " - "property '%s' of object '%s' at index %d", - property, - id_, - index_); - clutter_state_key_free (state_key); - continue; - } - - switch (json_array_get_length (key)) - { - case 5: - state_key->pre_delay = json_array_get_double_element (key, 4); - state_key->post_delay = 0.0; - break; - - case 6: - state_key->pre_delay = json_array_get_double_element (key, 4); - state_key->post_delay = json_array_get_double_element (key, 5); - break; - - default: - state_key->pre_delay = 0.0; - state_key->post_delay = 0.0; - break; - } - - state_key->source_state = source_state; - - valid_keys = g_slist_prepend (valid_keys, state_key); - } - - g_list_free (array_keys); - - g_value_set_pointer (clos->value, g_slist_reverse (valid_keys)); - - clos->result = TRUE; -} - -static gboolean -clutter_state_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - ParseClosure clos; - - if (strcmp (name, "transitions") != 0) - return FALSE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY) - return FALSE; - - clos.state = CLUTTER_STATE (scriptable); - clos.script = script; - clos.value = value; - clos.result = FALSE; - - json_array_foreach_element (json_node_get_array (node), - parse_state_transition, - &clos); - - return clos.result; -} - -static void -clutter_state_set_custom_property (ClutterScriptable *scriptable, - ClutterScript *script, - const gchar *name, - const GValue *value) -{ - if (strcmp (name, "transitions") == 0) - { - ClutterState *state = CLUTTER_STATE (scriptable); - GSList *keys = g_value_get_pointer (value); - GSList *k; - - for (k = keys; k != NULL; k = k->next) - clutter_state_set_key_internal (state, k->data); - - g_slist_free (keys); - } - else - g_object_set_property (G_OBJECT (scriptable), name, value); -} - -static void -clutter_scriptable_iface_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_state_parse_custom_node; - iface->set_custom_property = clutter_state_set_custom_property; -} diff --git a/clutter/clutter/deprecated/clutter-state.h b/clutter/clutter/deprecated/clutter-state.h deleted file mode 100644 index d452a9d960e..00000000000 --- a/clutter/clutter/deprecated/clutter-state.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Øyvind Kolås - * - * Copyright (C) 2009 Intel Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#ifndef __CLUTTER_STATE_H__ -#define __CLUTTER_STATE_H__ - -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_STATE_KEY (clutter_state_key_get_type ()) -#define CLUTTER_TYPE_STATE (clutter_state_get_type ()) -#define CLUTTER_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STATE, ClutterState)) -#define CLUTTER_STATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_STATE, ClutterStateClass)) -#define CLUTTER_IS_STATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STATE)) -#define CLUTTER_IS_STATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_STATE)) -#define CLUTTER_STATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_STATE, ClutterStateClass)) - -typedef struct _ClutterStatePrivate ClutterStatePrivate; -typedef struct _ClutterStateClass ClutterStateClass; - -/** - * ClutterStateKey: - * - * #ClutterStateKey is an opaque structure whose - * members cannot be accessed directly - * - * Since: 1.4 - */ -typedef struct _ClutterStateKey ClutterStateKey; - -/** - * ClutterState: - * - * The #ClutterState structure contains only - * private data and should be accessed using the provided API - * - * Since: 1.4 - */ -struct _ClutterState -{ - /*< private >*/ - GObject parent; - ClutterStatePrivate *priv; -}; - -/** - * ClutterStateClass: - * @completed: class handler for the #ClutterState::completed signal - * - * The #ClutterStateClass structure contains - * only private data - * - * Since: 1.4 - * - * Deprecated: 1.12 - */ -struct _ClutterStateClass -{ - /*< private >*/ - GObjectClass parent_class; - - /*< public >*/ - void (* completed) (ClutterState *state); - - /*< private >*/ - /* padding for future expansion */ - gpointer _padding_dummy[8]; -}; - -CLUTTER_DEPRECATED -GType clutter_state_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED -ClutterState *clutter_state_new (void); - - -CLUTTER_DEPRECATED -ClutterTimeline * clutter_state_set_state (ClutterState *state, - const gchar *target_state_name); -CLUTTER_DEPRECATED -ClutterTimeline * clutter_state_warp_to_state (ClutterState *state, - const gchar *target_state_name); -CLUTTER_DEPRECATED -ClutterState * clutter_state_set_key (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - GObject *object, - const gchar *property_name, - guint mode, - const GValue *value, - gdouble pre_delay, - gdouble post_delay); -CLUTTER_DEPRECATED -void clutter_state_set_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - guint duration); -CLUTTER_DEPRECATED -guint clutter_state_get_duration (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name); -CLUTTER_DEPRECATED -void clutter_state_set (ClutterState *state, - const gchar *source_state_name, - const gchar *target_state_name, - gpointer first_object, - const gchar *first_property_name, - gulong first_mode, - ...) G_GNUC_NULL_TERMINATED; -CLUTTER_DEPRECATED -GList * clutter_state_get_states (ClutterState *state); -CLUTTER_DEPRECATED -const gchar * clutter_state_get_state (ClutterState *state); - -/* - * ClutterStateKey - */ - -CLUTTER_DEPRECATED -GType clutter_state_key_get_type (void) G_GNUC_CONST; -CLUTTER_DEPRECATED -GType clutter_state_key_get_property_type (const ClutterStateKey *key); - -G_END_DECLS - -#endif /* __CLUTTER_STATE_H__ */ diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index 1ae788338af..c8e582eed25 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -226,7 +226,6 @@ clutter_deprecated_headers = [ 'deprecated/clutter-group.h', 'deprecated/clutter-rectangle.h', 'deprecated/clutter-stage.h', - 'deprecated/clutter-state.h', 'deprecated/clutter-timeline.h', ] @@ -236,7 +235,6 @@ clutter_deprecated_sources = [ 'deprecated/clutter-box.c', 'deprecated/clutter-group.c', 'deprecated/clutter-rectangle.c', - 'deprecated/clutter-state.c', ] clutter_backend_sources = [] diff --git a/src/tests/clutter/conform/scripts/test-state-1.json b/src/tests/clutter/conform/scripts/test-state-1.json deleted file mode 100644 index 78ab5de89d4..00000000000 --- a/src/tests/clutter/conform/scripts/test-state-1.json +++ /dev/null @@ -1,33 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "rect", - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterState", - "id" : "state", - - "transitions" : [ - { - "source" : "base", - "target" : "clicked", - "duration" : 250, - - "keys" : [ - [ "rect", "opacity", "linear", 128 ] - ] - }, - { - "source" : "clicked", - "target" : "base", - "duration" : 150, - - "keys" : [ - [ "rect", "opacity", "linear", 255 ] - ] - } - ] - } -] diff --git a/src/tests/clutter/conform/state.c b/src/tests/clutter/conform/state.c deleted file mode 100644 index 7e4720dc5fd..00000000000 --- a/src/tests/clutter/conform/state.c +++ /dev/null @@ -1,87 +0,0 @@ -#include - -#include "test-conform-common.h" - -void -state_base (TestConformSimpleFixture *fixture G_GNUC_UNUSED, - gconstpointer dummy G_GNUC_UNUSED) -{ - ClutterScript *script = clutter_script_new (); - GObject *state = NULL; - GError *error = NULL; - gchar *test_file; - GList *states, *keys; - ClutterStateKey *state_key; - guint duration; - - test_file = clutter_test_get_data_file ("test-state-1.json"); - clutter_script_load_from_file (script, test_file, &error); - if (g_test_verbose () && error) - g_print ("Error: %s\n", error->message); - - g_free (test_file); - -#if GLIB_CHECK_VERSION (2, 20, 0) - g_assert_no_error (error); -#else - g_assert (error == NULL); -#endif - - state = clutter_script_get_object (script, "state"); - g_assert (CLUTTER_IS_STATE (state)); - - states = clutter_state_get_states (CLUTTER_STATE (state)); - g_assert (states != NULL); - - g_assert (g_list_find (states, g_intern_static_string ("clicked"))); - g_list_free (states); - - duration = clutter_state_get_duration (CLUTTER_STATE (state), "base", "clicked"); - g_assert_cmpint (duration, ==, 250); - - duration = clutter_state_get_duration (CLUTTER_STATE (state), "clicked", "base"); - g_assert_cmpint (duration, ==, 150); - - keys = clutter_state_get_keys (CLUTTER_STATE (state), "base", "clicked", - clutter_script_get_object (script, "rect"), - "opacity"); - - g_assert (keys != NULL); - g_assert_cmpint (g_list_length (keys), ==, 1); - - state_key = keys->data; - g_assert (clutter_state_key_get_object (state_key) == clutter_script_get_object (script, "rect")); - g_assert (clutter_state_key_get_mode (state_key) == CLUTTER_LINEAR); - g_assert_cmpstr (clutter_state_key_get_property_name (state_key), ==, "opacity"); - - g_list_free (keys); - keys = clutter_state_get_keys (CLUTTER_STATE (state), NULL, NULL, NULL, NULL); - g_assert_cmpint (g_list_length (keys), ==, 2); - g_list_free (keys); - - - - clutter_state_set (CLUTTER_STATE (state), "base", "clicked", state, "state", CLUTTER_LINEAR, "foo", NULL); - - keys = clutter_state_get_keys (CLUTTER_STATE (state), "base", "clicked", - NULL, NULL); - - g_assert (keys != NULL); - g_assert_cmpint (g_list_length (keys), ==, 2); - g_list_free (keys); - - states = clutter_state_get_states (CLUTTER_STATE (state)); - g_assert_cmpint (g_list_length (states), ==, 2); - g_list_free (states); - - clutter_state_remove_key (CLUTTER_STATE (state), NULL, "clicked", NULL, NULL); - states = clutter_state_get_states (CLUTTER_STATE (state)); - - /* removing the "clicked" state, will also cause the "base" state to be removed - * since in the .json there is no default source state - */ - g_assert_cmpint (g_list_length (states), ==, 0); - g_list_free (states); - - g_object_unref (script); -} diff --git a/src/tests/clutter/interactive/meson.build b/src/tests/clutter/interactive/meson.build index c2297072281..59aead6351c 100644 --- a/src/tests/clutter/interactive/meson.build +++ b/src/tests/clutter/interactive/meson.build @@ -21,7 +21,6 @@ clutter_tests_interactive_test_sources = [ 'test-script.c', 'test-grab.c', 'test-cogl-shader-glsl.c', - 'test-state.c', 'test-cogl-tex-tile.c', 'test-cogl-tex-convert.c', 'test-cogl-offscreen.c', @@ -40,7 +39,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/src/tests/clutter/interactive/test-script-signals.json b/src/tests/clutter/interactive/test-script-signals.json deleted file mode 100644 index 0d3f6bd258e..00000000000 --- a/src/tests/clutter/interactive/test-script-signals.json +++ /dev/null @@ -1,68 +0,0 @@ -[ - { - "id" : "button", - "type" : "ClutterRectangle", - - "width" : "16 em", - "height" : "6 em", - - "color" : "rgb(255, 0, 0)", - "opacity" : 128, - - "scale-gravity" : "center", - - "reactive" : true, - - "signals" : [ - { - "name" : "button-press-event", - "handler" : "on_button_press" - }, - { "name" : "enter-event", "states" : "button-states", "target-state" : "hover" }, - { "name" : "leave-event", "states" : "button-states", "target-state" : "base" }, - { "name" : "button-press-event", "states" : "button-states", "target-state" : "active" }, - { "name" : "button-release-event", "states" : "button-states", "target-state" : "hover" } - ] - }, - - { - "id" : "button-states", - "type" : "ClutterState", - - "duration" : 250, - - "transitions" : [ - { - "source" : null, - "target" : "base", - - "keys" : [ - [ "button", "opacity", "linear", 128 ], - [ "button", "scale-x", "ease-in-cubic", 1.0 ], - [ "button", "scale-y", "ease-in-cubic", 1.0 ], - [ "button", "color", "linear", "rgb(255, 0, 0)" ] - ] - }, - { - "source" : null, - "target" : "hover", - - "keys" : [ - [ "button", "opacity", "linear", 255 ], - [ "button", "scale-x", "ease-out-bounce", 1.4 ], - [ "button", "scale-y", "ease-out-bounce", 1.4 ], - [ "button", "color", "linear", "rgb(0, 255, 0)" ] - ] - }, - { - "source" : null, - "target" : "active", - - "keys" : [ - [ "button", "opacity", "linear", 255 ], - [ "button", "color", "linear", "rgb(0, 0, 255)" ] - ] - } - ] - } -] diff --git a/src/tests/clutter/interactive/test-state.c b/src/tests/clutter/interactive/test-state.c deleted file mode 100644 index 799ec980d0b..00000000000 --- a/src/tests/clutter/interactive/test-state.c +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include -#include -#include -#include "test-utils.h" - -#define STAGE_WIDTH 1024 -#define STAGE_HEIGHT 768 - -#define ACTOR_WIDTH 128 -#define ACTOR_HEIGHT 128 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - -gint -test_state_main (gint argc, - gchar **argv); - -const char * -test_state_describe (void); - -static gboolean press_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "right"); - return TRUE; -} - -static gboolean release_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "active"); - return TRUE; -} - -static gboolean enter_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "hover"); - return TRUE; -} - -static gboolean leave_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "normal"); - return TRUE; -} - -static void completed (ClutterState *state, - gpointer data) -{ - g_print ("Completed transitioning to state: %s\n", - clutter_state_get_state (state)); - - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_actor_new (); - ClutterActor *rectangle = clutter_actor_new (); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_background_color (rectangle, color); - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - - clutter_actor_add_child (group, rectangle); - clutter_actor_add_child (group, hand); - - return group; -} - -G_MODULE_EXPORT gint -test_state_main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return 1; - - layout_state = clutter_state_new (); - - stage = clutter_stage_new (); - clutter_actor_set_background_color (stage, CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Machine"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - g_signal_connect (stage, "button-press-event", - G_CALLBACK (press_event), layout_state); - g_signal_connect (stage, "button-release-event", - G_CALLBACK (release_event), layout_state); - - for (i = 0; i < TOTAL; i++) - { - ClutterActor *actor; - ClutterState *a_state; - - int row = i/COLS; - int col = i%COLS; - - actor = new_rect (255 * (1.0 * col / COLS), 50, - 255 * (1.0 * row / ROWS), 255); - clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor); - clutter_actor_set_position (actor, 320.0, 240.0); - clutter_actor_set_reactive (actor, TRUE); - clutter_actor_add_effect_with_name (actor, "fade", - clutter_desaturate_effect_new (0.0)); - - - clutter_state_set (layout_state, NULL, "active", - actor, "delayed::x", CLUTTER_LINEAR, - ACTOR_WIDTH * 1.0 * ((TOTAL-1-i) % COLS), - ((row*1.0/ROWS))/2, (1.0-(row*1.0/ROWS))/2, - actor, "delayed::y", CLUTTER_LINEAR, - ACTOR_HEIGHT * 1.0 * ((TOTAL-1-i) / COLS), - ((row*1.0/ROWS))/2, 0.0, - actor, "rotation-angle-x", CLUTTER_LINEAR, 0.0, - actor, "rotation-angle-y", CLUTTER_LINEAR, 0.0, - NULL); - - clutter_state_set (layout_state, NULL, "right", - actor, "delayed::x", CLUTTER_LINEAR, STAGE_WIDTH * 1.0, - ((row*1.0/ROWS))/2, - (1.0-(row*1.0/ROWS))/2, - actor, "delayed::y", CLUTTER_LINEAR, STAGE_HEIGHT * 1.0, - ((row*1.0/ROWS))/2, - 0.0, - NULL); - - clutter_state_set (layout_state, NULL, "left", - actor, "rotation-angle-x", CLUTTER_LINEAR, 45.0, - actor, "rotation-angle-y", CLUTTER_LINEAR, 5.0, - actor, "x", CLUTTER_LINEAR, 0-64.0, - actor, "y", CLUTTER_LINEAR, 0-64.0, - NULL); - - a_state = clutter_state_new (); - g_object_set_data_full (G_OBJECT (actor), "hover-state-machine", - a_state, g_object_unref); - g_signal_connect (actor, "enter-event", - G_CALLBACK (enter_event), a_state); - g_signal_connect (actor, "leave-event", - G_CALLBACK (leave_event), a_state); - - clutter_state_set (a_state, NULL, "normal", - actor, "opacity", CLUTTER_LINEAR, 0x77, - actor, "rotation-angle-z", CLUTTER_LINEAR, 0.0, - actor, "@effects.fade.factor", CLUTTER_LINEAR, 0.0, - NULL); - clutter_state_set (a_state, NULL, "hover", - actor, "opacity", CLUTTER_LINEAR, 0xff, - actor, "rotation-angle-z", CLUTTER_LINEAR, 10.0, - actor, "@effects.fade.factor", CLUTTER_LINEAR, 1.0, - NULL); - clutter_actor_set_opacity (actor, 0x77); - - clutter_state_set_duration (a_state, NULL, NULL, 500); - } - - clutter_state_set_duration (layout_state, NULL, NULL, 1000); - clutter_state_set_duration (layout_state, "active", "left", 1400); - - g_signal_connect (layout_state, "completed", G_CALLBACK (completed), NULL); - - clutter_actor_show (stage); - - clutter_state_warp_to_state (layout_state, "left"); - clutter_state_set_state (layout_state, "active"); - - clutter_main (); - - g_object_unref (layout_state); - - return EXIT_SUCCESS; -} - -G_MODULE_EXPORT const char * -test_state_describe (void) -{ - return "Animating using the State class."; -} diff --git a/src/tests/clutter/performance/meson.build b/src/tests/clutter/performance/meson.build index ee092bb0496..a8eef886be9 100644 --- a/src/tests/clutter/performance/meson.build +++ b/src/tests/clutter/performance/meson.build @@ -11,11 +11,6 @@ clutter_tests_performance_c_args += clutter_debug_c_args clutter_tests_performance_tests = [ 'test-picking', 'test-text-perf', - 'test-state', - 'test-state-interactive', - 'test-state-hidden', - 'test-state-mini', - 'test-state-pick', ] foreach test : clutter_tests_performance_tests diff --git a/src/tests/clutter/performance/test-state-hidden.c b/src/tests/clutter/performance/test-state-hidden.c deleted file mode 100644 index 64911b4eb8f..00000000000 --- a/src/tests/clutter/performance/test-state-hidden.c +++ /dev/null @@ -1,150 +0,0 @@ -#include -#include -#include -#include -#include "test-common.h" - -#define STAGE_WIDTH 160 -#define STAGE_HEIGHT 120 - -#define ACTOR_WIDTH 8 -#define ACTOR_HEIGHT 8 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - g_free (file); - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterActor *group; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - group = clutter_group_new (); - layout_state = clutter_state_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [hidden]"); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static gboolean press_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "right"); - return TRUE; -} - -static gboolean release_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "active"); - return TRUE; -} - -static gboolean enter_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "hover"); - return TRUE; -} - -static gboolean leave_event (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) -{ - ClutterState *state = CLUTTER_STATE (user_data); - clutter_state_set_state (state, "normal"); - return TRUE; -} - -static void completed (ClutterState *state, - gpointer data) -{ - g_print ("Completed transitioning to state: %s\n", - clutter_state_get_state (state)); - - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [interactive]"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - - g_signal_connect (stage, "button-press-event", - G_CALLBACK (press_event), layout_state); - g_signal_connect (stage, "button-release-event", - G_CALLBACK (release_event), layout_state); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -#define STAGE_WIDTH 160 -#define STAGE_HEIGHT 120 - -#define ACTOR_WIDTH 8 -#define ACTOR_HEIGHT 8 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [mini]"); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -static gint times = 16; - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } - times --; - if (times <=0) - clutter_main_quit (); -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance [pick]"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i -#include -#include -#include -#include "test-common.h" -#include "test-utils.h" - -static gint times = 16; - -#define STAGE_WIDTH 800 -#define STAGE_HEIGHT 600 - -#define ACTOR_WIDTH 64 -#define ACTOR_HEIGHT 64 - -#define COLS (STAGE_WIDTH/ACTOR_WIDTH) -#define ROWS (STAGE_HEIGHT/ACTOR_HEIGHT) -#define TOTAL (ROWS*COLS) - - -static void completed (ClutterState *state, - gpointer data) -{ - if (g_str_equal (clutter_state_get_state (state), "right")) - { - /* skip straight to left state when reaching right */ - clutter_state_warp_to_state (state, "left"); - } - else if (g_str_equal (clutter_state_get_state (state), "active")) - clutter_state_set_state (state, "right"); - else - { - clutter_state_set_state (state, "active"); - } - times --; - if (times <=0) - clutter_main_quit (); -} - -static ClutterActor *new_rect (gint r, - gint g, - gint b, - gint a) -{ - GError *error = NULL; - ClutterColor *color = clutter_color_new (r, g, b, a); - ClutterActor *group = clutter_group_new (); - ClutterActor *rectangle = clutter_rectangle_new_with_color (color); - ClutterActor *hand = NULL; - - gchar *file = g_build_filename (TESTS_DATA_DIR, "redhand.png", NULL); - - hand = clutter_test_utils_create_texture_from_file (file, &error); - if (rectangle == NULL) - g_error ("image load failed: %s", error->message); - g_free (file); - clutter_actor_set_size (hand, ACTOR_WIDTH,ACTOR_HEIGHT); - - clutter_actor_set_size (rectangle, ACTOR_WIDTH,ACTOR_HEIGHT); - clutter_color_free (color); - clutter_container_add (CLUTTER_CONTAINER (group), rectangle, hand, NULL); - return group; -} - -gint -main (gint argc, - gchar **argv) -{ - ClutterActor *stage; - ClutterState *layout_state; - gint i; - - clutter_perf_fps_init (); - if (CLUTTER_INIT_SUCCESS != clutter_init (&argc, &argv)) - g_error ("Failed to initialize Clutter"); - - stage = clutter_stage_new (); - layout_state = clutter_state_new (); - clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black); - clutter_stage_set_title (CLUTTER_STAGE (stage), "State Performance"); - clutter_actor_set_size (stage, STAGE_WIDTH, STAGE_HEIGHT); - g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); - - for (i=0; i Date: Thu, 9 Apr 2020 15:13:18 +0200 Subject: [PATCH 2/8] clutter/layout-manager: Remove unused animation API One less unused animation API to care about. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-layout-manager.c | 88 ------------------------ clutter/clutter/clutter-layout-manager.h | 9 --- 2 files changed, 97 deletions(-) diff --git a/clutter/clutter/clutter-layout-manager.c b/clutter/clutter/clutter-layout-manager.c index 13dbd6c0ba2..e1798cad495 100644 --- a/clutter/clutter/clutter-layout-manager.c +++ b/clutter/clutter/clutter-layout-manager.c @@ -164,7 +164,6 @@ G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager, G_TYPE_INITIALLY_UNOWNED) static GQuark quark_layout_meta = 0; -static GQuark quark_layout_alpha = 0; static guint manager_signals[LAST_SIGNAL] = { 0, }; @@ -301,96 +300,12 @@ layout_manager_real_get_child_meta_type (ClutterLayoutManager *manager) return G_TYPE_INVALID; } -/* XXX:2.0 - Remove */ -static ClutterAlpha * -layout_manager_real_begin_animation (ClutterLayoutManager *manager, - guint duration, - gulong mode) -{ - ClutterTimeline *timeline; - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha != NULL) - { - clutter_alpha_set_mode (alpha, mode); - - timeline = clutter_alpha_get_timeline (alpha); - clutter_timeline_set_duration (timeline, duration); - clutter_timeline_rewind (timeline); - - return alpha; - }; - - timeline = clutter_timeline_new (duration); - - alpha = clutter_alpha_new_full (timeline, mode); - - /* let the alpha take ownership of the timeline */ - g_object_unref (timeline); - - g_signal_connect_swapped (timeline, "new-frame", - G_CALLBACK (clutter_layout_manager_layout_changed), - manager); - - g_object_set_qdata_full (G_OBJECT (manager), - quark_layout_alpha, alpha, - (GDestroyNotify) g_object_unref); - - clutter_timeline_start (timeline); - - return alpha; -} - -/* XXX:2.0 - Remove */ -static gdouble -layout_manager_real_get_animation_progress (ClutterLayoutManager *manager) -{ - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha == NULL) - return 1.0; - - return clutter_alpha_get_alpha (alpha); -} - -/* XXX:2.0 - Remove */ -static void -layout_manager_real_end_animation (ClutterLayoutManager *manager) -{ - ClutterTimeline *timeline; - ClutterAlpha *alpha; - - alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha); - if (alpha == NULL) - return; - - timeline = clutter_alpha_get_timeline (alpha); - g_assert (timeline != NULL); - - if (clutter_timeline_is_playing (timeline)) - clutter_timeline_stop (timeline); - - g_signal_handlers_disconnect_by_func (timeline, - G_CALLBACK (clutter_layout_manager_layout_changed), - manager); - - g_object_set_qdata (G_OBJECT (manager), quark_layout_alpha, NULL); - - clutter_layout_manager_layout_changed (manager); -} - static void clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) { quark_layout_meta = g_quark_from_static_string ("clutter-layout-manager-child-meta"); - /* XXX:2.0 - Remove */ - quark_layout_alpha = - g_quark_from_static_string ("clutter-layout-manager-alpha"); - klass->get_preferred_width = layout_manager_real_get_preferred_width; klass->get_preferred_height = layout_manager_real_get_preferred_height; klass->allocate = layout_manager_real_allocate; @@ -398,9 +313,6 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) klass->get_child_meta_type = layout_manager_real_get_child_meta_type; /* XXX:2.0 - Remove */ - klass->begin_animation = layout_manager_real_begin_animation; - klass->get_animation_progress = layout_manager_real_get_animation_progress; - klass->end_animation = layout_manager_real_end_animation; klass->set_container = layout_manager_real_set_container; /** diff --git a/clutter/clutter/clutter-layout-manager.h b/clutter/clutter/clutter-layout-manager.h index 00f7118031f..ec87e0ed7f7 100644 --- a/clutter/clutter/clutter-layout-manager.h +++ b/clutter/clutter/clutter-layout-manager.h @@ -126,15 +126,6 @@ struct _ClutterLayoutManagerClass ClutterContainer *container, ClutterActor *actor); - /* deprecated */ - ClutterAlpha * (* begin_animation) (ClutterLayoutManager *manager, - guint duration, - gulong mode); - /* deprecated */ - gdouble (* get_animation_progress) (ClutterLayoutManager *manager); - /* deprecated */ - void (* end_animation) (ClutterLayoutManager *manager); - void (* layout_changed) (ClutterLayoutManager *manager); /*< private >*/ -- GitLab From 73cb96ddb98d692fc6226ad4d8d6f22bb7b63c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 15:41:17 +0200 Subject: [PATCH 3/8] clutter: Remove 'ClutterAlpha' It was some kind of deprecated interpolation mechanism used in ClutterAnimation. We're not using it, and have non-deprecated replacement functionality, so lets drop it. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-box-layout.c | 1 - clutter/clutter/clutter-deprecated.h | 1 - clutter/clutter/clutter-enums.h | 2 +- clutter/clutter/clutter-layout-manager.c | 1 - clutter/clutter/clutter-script-parser.c | 146 ---- clutter/clutter/clutter-script-private.h | 2 - clutter/clutter/clutter-script.c | 1 - clutter/clutter/clutter-types.h | 1 - clutter/clutter/deprecated/clutter-alpha.c | 819 ------------------ clutter/clutter/deprecated/clutter-alpha.h | 138 --- .../clutter/deprecated/clutter-animation.c | 237 +---- clutter/clutter/meson.build | 2 - src/tests/clutter/interactive/test-script.c | 8 +- 13 files changed, 20 insertions(+), 1339 deletions(-) delete mode 100644 clutter/clutter/deprecated/clutter-alpha.c delete mode 100644 clutter/clutter/deprecated/clutter-alpha.h diff --git a/clutter/clutter/clutter-box-layout.c b/clutter/clutter/clutter-box-layout.c index a3197f43f34..c3dbe8e9e63 100644 --- a/clutter/clutter/clutter-box-layout.c +++ b/clutter/clutter/clutter-box-layout.c @@ -54,7 +54,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-box-layout.h" diff --git a/clutter/clutter/clutter-deprecated.h b/clutter/clutter/clutter-deprecated.h index 1eb2d4ac80f..4b6147324a3 100644 --- a/clutter/clutter/clutter-deprecated.h +++ b/clutter/clutter/clutter-deprecated.h @@ -4,7 +4,6 @@ #define __CLUTTER_DEPRECATED_H_INSIDE__ #include "deprecated/clutter-actor.h" -#include "deprecated/clutter-alpha.h" #include "deprecated/clutter-animation.h" #include "deprecated/clutter-box.h" #include "deprecated/clutter-container.h" diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index ed178762b05..f7e8bc4c229 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -190,7 +190,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/ * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for * registered global alpha functions * - * The animation modes used by #ClutterAlpha and #ClutterAnimation. This + * The animation modes used by #ClutterAnimation. This * enumeration can be expanded in later versions of Clutter. * *
diff --git a/clutter/clutter/clutter-layout-manager.c b/clutter/clutter/clutter-layout-manager.c index e1798cad495..6fb49b7a5bb 100644 --- a/clutter/clutter/clutter-layout-manager.c +++ b/clutter/clutter/clutter-layout-manager.c @@ -136,7 +136,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-debug.h" #include "clutter-layout-manager.h" diff --git a/clutter/clutter/clutter-script-parser.c b/clutter/clutter/clutter-script-parser.c index ea14b4166cf..c642893099f 100644 --- a/clutter/clutter/clutter-script-parser.c +++ b/clutter/clutter/clutter-script-parser.c @@ -34,7 +34,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS #include "deprecated/clutter-container.h" -#include "deprecated/clutter-alpha.h" #include "clutter-actor.h" #include "clutter-debug.h" @@ -799,51 +798,6 @@ parse_signals (ClutterScript *script, return retval; } -static ClutterTimeline * -construct_timeline (ClutterScript *script, - JsonObject *object) -{ - ClutterTimeline *retval = NULL; - ObjectInfo *oinfo; - GList *members, *l; - - /* we fake an ObjectInfo so we can reuse clutter_script_construct_object() - * here; we do not save it inside the hash table, because if this had - * been a named object then we wouldn't have ended up here in the first - * place - */ - oinfo = g_slice_new0 (ObjectInfo); - oinfo->gtype = CLUTTER_TYPE_TIMELINE; - oinfo->id = g_strdup ("dummy"); - - members = json_object_get_members (object); - for (l = members; l != NULL; l = l->next) - { - const gchar *name = l->data; - JsonNode *node = json_object_get_member (object, name); - PropertyInfo *pinfo = g_slice_new0 (PropertyInfo); - - pinfo->name = g_strdelimit (g_strdup (name), G_STR_DELIMITERS, '-'); - pinfo->node = json_node_copy (node); - - oinfo->properties = g_list_prepend (oinfo->properties, pinfo); - } - - g_list_free (members); - - _clutter_script_construct_object (script, oinfo); - _clutter_script_apply_properties (script, oinfo); - retval = CLUTTER_TIMELINE (oinfo->object); - - /* we transfer ownership to the alpha function, so we ref before - * destroying the ObjectInfo to avoid the timeline going away - */ - g_object_ref (retval); - object_info_free (oinfo); - - return retval; -} - /* define the names of the animation modes to match the ones * that developers might be more accustomed to */ @@ -925,106 +879,6 @@ _clutter_script_resolve_animation_mode (JsonNode *node) return CLUTTER_CUSTOM_MODE; } -static ClutterAlphaFunc -resolve_alpha_func (const gchar *name) -{ - static GModule *module = NULL; - ClutterAlphaFunc func; - - CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name); - - if (G_UNLIKELY (!module)) - module = g_module_open (NULL, 0); - - if (g_module_symbol (module, name, (gpointer) &func)) - { - CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table", - name); - return func; - } - - return NULL; -} - -GObject * -_clutter_script_parse_alpha (ClutterScript *script, - JsonNode *node) -{ - GObject *retval = NULL; - JsonObject *object; - ClutterTimeline *timeline = NULL; - ClutterAlphaFunc alpha_func = NULL; - ClutterAnimationMode mode = CLUTTER_CUSTOM_MODE; - JsonNode *val; - gboolean unref_timeline = FALSE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_OBJECT) - return NULL; - - object = json_node_get_object (node); - - val = json_object_get_member (object, "timeline"); - if (val) - { - if (JSON_NODE_TYPE (val) == JSON_NODE_VALUE && - json_node_get_string (val) != NULL) - { - const gchar *id_ = json_node_get_string (val); - - timeline = - CLUTTER_TIMELINE (clutter_script_get_object (script, id_)); - } - else if (JSON_NODE_TYPE (val) == JSON_NODE_OBJECT) - { - timeline = construct_timeline (script, json_node_get_object (val)); - unref_timeline = TRUE; - } - } - - val = json_object_get_member (object, "mode"); - if (val != NULL) - mode = _clutter_script_resolve_animation_mode (val); - - if (mode == CLUTTER_CUSTOM_MODE) - { - val = json_object_get_member (object, "function"); - if (val && json_node_get_string (val) != NULL) - { - alpha_func = resolve_alpha_func (json_node_get_string (val)); - if (!alpha_func) - { - g_warning ("Unable to find the function '%s' in the " - "Clutter alpha functions or the symbols table", - json_node_get_string (val)); - } - } - } - - CLUTTER_NOTE (SCRIPT, "Parsed alpha: %s timeline (%p) (mode:%d, func:%p)", - unref_timeline ? "implicit" : "explicit", - timeline ? timeline : 0x0, - mode != CLUTTER_CUSTOM_MODE ? mode : 0, - alpha_func ? alpha_func : 0x0); - - retval = g_object_new (CLUTTER_TYPE_ALPHA, NULL); - - if (mode != CLUTTER_CUSTOM_MODE) - clutter_alpha_set_mode (CLUTTER_ALPHA (retval), mode); - - if (alpha_func != NULL) - clutter_alpha_set_func (CLUTTER_ALPHA (retval), alpha_func, NULL, NULL); - - clutter_alpha_set_timeline (CLUTTER_ALPHA (retval), timeline); - - /* if we created an implicit timeline, the Alpha has full ownership - * of it now, since it won't be accessible from ClutterScript - */ - if (unref_timeline) - g_object_unref (timeline); - - return retval; -} - static void clutter_script_parser_object_end (JsonParser *json_parser, JsonObject *object) diff --git a/clutter/clutter/clutter-script-private.h b/clutter/clutter/clutter-script-private.h index 9c08d82d688..b17c0458109 100644 --- a/clutter/clutter/clutter-script-private.h +++ b/clutter/clutter/clutter-script-private.h @@ -128,8 +128,6 @@ gboolean _clutter_script_parse_rect (ClutterScript *script, gboolean _clutter_script_parse_color (ClutterScript *script, JsonNode *node, ClutterColor *color); -GObject *_clutter_script_parse_alpha (ClutterScript *script, - JsonNode *node); gboolean _clutter_script_parse_point (ClutterScript *script, JsonNode *node, graphene_point_t *point); diff --git a/clutter/clutter/clutter-script.c b/clutter/clutter/clutter-script.c index 9c79f26c1b9..89dc166c9b3 100644 --- a/clutter/clutter/clutter-script.c +++ b/clutter/clutter/clutter-script.c @@ -141,7 +141,6 @@ #include "clutter-private.h" #include "clutter-debug.h" -#include "deprecated/clutter-alpha.h" #include "deprecated/clutter-container.h" enum diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index cf6a3ced2de..35cf5580b75 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -79,7 +79,6 @@ typedef struct _ClutterKnot ClutterKnot; typedef struct _ClutterMargin ClutterMargin; typedef struct _ClutterPerspective ClutterPerspective; -typedef struct _ClutterAlpha ClutterAlpha; typedef struct _ClutterAnimation ClutterAnimation; typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool; diff --git a/clutter/clutter/deprecated/clutter-alpha.c b/clutter/clutter/deprecated/clutter-alpha.c deleted file mode 100644 index 9560c2ead0d..00000000000 --- a/clutter/clutter/deprecated/clutter-alpha.c +++ /dev/null @@ -1,819 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Matthew Allum - * Jorn Baayen - * Emmanuele Bassi - * Tomas Frydrych - * - * Copyright (C) 2006, 2007, 2008 OpenedHand - * Copyright (C) 2009, 2010 Intel Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -/** - * SECTION:clutter-alpha - * @short_description: A class for calculating a value as a function of time - * - * #ClutterAlpha is a class for calculating an floating point value - * dependent only on the position of a #ClutterTimeline. - * - * For newly written code, it is recommended to use the - * #ClutterTimeline:progress-mode property of #ClutterTimeline, or the - * clutter_timeline_set_progress_func() function instead of #ClutterAlpha. - * The #ClutterAlpha class will be deprecated in the future, and will not - * be available any more in the next major version of Clutter. - * - * A #ClutterAlpha binds a #ClutterTimeline to a progress function which - * translates the time T into an adimensional factor alpha. - * - * You should provide a #ClutterTimeline and bind it to the #ClutterAlpha - * instance using clutter_alpha_set_timeline(). You should also set an - * "animation mode", by using the #ClutterAnimationMode values that - * Clutter provides. - * - * Instead of a #ClutterAnimationMode you may provide a function returning - * the alpha value depending on the progress of the timeline, using - * clutter_alpha_set_func() or clutter_alpha_set_closure(). The alpha - * function will be executed each time a new frame in the #ClutterTimeline - * is reached. - * - * Since the alpha function is controlled by the timeline instance, you can - * pause, stop or resume the #ClutterAlpha from calling the alpha function by - * using the appropriate functions of the #ClutterTimeline object. - * - * #ClutterAlpha is available since Clutter 0.2. - * - * #ClutterAlpha is deprecated since Clutter 1.12. #ClutterTimeline and - * the #ClutterTimeline:progress-mode property replace this whole class. - * - * ## ClutterAlpha custom properties for #ClutterScript - * - * #ClutterAlpha defines a custom `function` property for - * #ClutterScript which allows to reference a custom alpha function - * available in the source code. Setting the `function` property - * is equivalent to calling clutter_alpha_set_func() with the - * specified function name. No user data or #GDestroyNotify is - * available to be passed. - * - * The following JSON fragment defines a #ClutterAlpha - * using a #ClutterTimeline with id "sine-timeline" and an alpha - * function called `my_sine_alpha`. - * - * |[ - * { - * "id" : "sine-alpha", - * "timeline" : { - * "id" : "sine-timeline", - * "duration" : 500, - * "loop" : true - * }, - * "function" : "my_sine_alpha" - * } - * ]| - */ - -#include "clutter-build-config.h" - -#include - -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-alpha.h" -#include "clutter-debug.h" -#include "clutter-enum-types.h" -#include "clutter-easing.h" -#include "clutter-main.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -struct _ClutterAlphaPrivate -{ - ClutterTimeline *timeline; - guint timeline_new_frame_id; - - gdouble alpha; - - GClosure *closure; - - ClutterAlphaFunc func; - gpointer user_data; - GDestroyNotify notify; - - gulong mode; -}; - -enum -{ - PROP_0, - - PROP_TIMELINE, - PROP_ALPHA, - PROP_MODE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -static void clutter_scriptable_iface_init (ClutterScriptableIface *iface); - -G_DEFINE_TYPE_WITH_CODE (ClutterAlpha, - clutter_alpha, - G_TYPE_INITIALLY_UNOWNED, - G_ADD_PRIVATE (ClutterAlpha) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_iface_init)); - -static void -timeline_new_frame_cb (ClutterTimeline *timeline, - guint msecs, - ClutterAlpha *alpha) -{ - ClutterAlphaPrivate *priv = alpha->priv; - - /* Update alpha value and notify */ - priv->alpha = clutter_alpha_get_alpha (alpha); - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_ALPHA]); -} - -static void -clutter_alpha_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterAlpha *alpha = CLUTTER_ALPHA (object); - - switch (prop_id) - { - case PROP_TIMELINE: - clutter_alpha_set_timeline (alpha, g_value_get_object (value)); - break; - - case PROP_MODE: - clutter_alpha_set_mode (alpha, g_value_get_ulong (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -clutter_alpha_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv; - - switch (prop_id) - { - case PROP_TIMELINE: - g_value_set_object (value, priv->timeline); - break; - - case PROP_ALPHA: - g_value_set_double (value, priv->alpha); - break; - - case PROP_MODE: - g_value_set_ulong (value, priv->mode); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -clutter_alpha_finalize (GObject *object) -{ - ClutterAlphaPrivate *priv = CLUTTER_ALPHA (object)->priv; - - if (priv->notify != NULL) - priv->notify (priv->user_data); - else if (priv->closure != NULL) - g_closure_unref (priv->closure); - - G_OBJECT_CLASS (clutter_alpha_parent_class)->finalize (object); -} - -static void -clutter_alpha_dispose (GObject *object) -{ - ClutterAlpha *self = CLUTTER_ALPHA(object); - - clutter_alpha_set_timeline (self, NULL); - - G_OBJECT_CLASS (clutter_alpha_parent_class)->dispose (object); -} - -static ClutterAlphaFunc -resolve_alpha_func (const gchar *name) -{ - static GModule *module = NULL; - ClutterAlphaFunc func; - - CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name); - - if (G_UNLIKELY (module == NULL)) - module = g_module_open (NULL, 0); - - if (g_module_symbol (module, name, (gpointer) &func)) - { - CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table", - name); - return func; - } - - return NULL; -} - -static void -clutter_alpha_set_custom_property (ClutterScriptable *scriptable, - ClutterScript *script, - const gchar *name, - const GValue *value) -{ - if (strncmp (name, "function", 8) == 0) - { - g_assert (G_VALUE_HOLDS (value, G_TYPE_POINTER)); - if (g_value_get_pointer (value) != NULL) - { - clutter_alpha_set_func (CLUTTER_ALPHA (scriptable), - g_value_get_pointer (value), - NULL, NULL); - } - } - else - g_object_set_property (G_OBJECT (scriptable), name, value); -} - -static gboolean -clutter_alpha_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - if (strncmp (name, "function", 8) == 0) - { - const gchar *func_name = json_node_get_string (node); - - g_value_init (value, G_TYPE_POINTER); - g_value_set_pointer (value, resolve_alpha_func (func_name)); - - return TRUE; - } - - /* we need to do this because we use gulong in place - * of ClutterAnimationMode for ClutterAlpha:mode - */ - if (strncmp (name, "mode", 4) == 0) - { - gulong mode; - - mode = _clutter_script_resolve_animation_mode (node); - - g_value_init (value, G_TYPE_ULONG); - g_value_set_ulong (value, mode); - - return TRUE; - } - - return FALSE; -} - -static void -clutter_scriptable_iface_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_alpha_parse_custom_node; - iface->set_custom_property = clutter_alpha_set_custom_property; -} - -static void -clutter_alpha_class_init (ClutterAlphaClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = clutter_alpha_set_property; - object_class->get_property = clutter_alpha_get_property; - object_class->finalize = clutter_alpha_finalize; - object_class->dispose = clutter_alpha_dispose; - - /** - * ClutterAlpha:timeline: - * - * A #ClutterTimeline instance used to drive the alpha function. - * - * Since: 0.2 - * - * Deprecated: 1.12 - */ - obj_props[PROP_TIMELINE] = - g_param_spec_object ("timeline", - P_("Timeline"), - P_("Timeline used by the alpha"), - CLUTTER_TYPE_TIMELINE, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAlpha:alpha: - * - * The alpha value as computed by the alpha function. The linear - * interval is 0.0 to 1.0, but the Alpha allows overshooting by - * one unit in each direction, so the valid interval is -1.0 to 2.0. - * - * Since: 0.2 - * Deprecated: 1.12: Use #ClutterTimeline::new-frame and - * clutter_timeline_get_progress() instead - */ - obj_props[PROP_ALPHA] = - g_param_spec_double ("alpha", - P_("Alpha value"), - P_("Alpha value as computed by the alpha"), - -1.0, 2.0, - 0.0, - CLUTTER_PARAM_READABLE); - - /** - * ClutterAlpha:mode: - * - * The progress function logical id - a value from the - * #ClutterAnimationMode enumeration. - * - * If %CLUTTER_CUSTOM_MODE is used then the function set using - * clutter_alpha_set_closure() or clutter_alpha_set_func() - * will be used. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterTimeline:progress-mode - */ - obj_props[PROP_MODE] = - g_param_spec_ulong ("mode", - P_("Mode"), - P_("Progress mode"), - 0, G_MAXULONG, - CLUTTER_CUSTOM_MODE, - G_PARAM_CONSTRUCT | CLUTTER_PARAM_READWRITE); - - g_object_class_install_properties (object_class, - PROP_LAST, - obj_props); -} - -static void -clutter_alpha_init (ClutterAlpha *self) -{ - self->priv = clutter_alpha_get_instance_private (self); - self->priv->mode = CLUTTER_CUSTOM_MODE; - self->priv->alpha = 0.0; -} - -/** - * clutter_alpha_get_alpha: - * @alpha: A #ClutterAlpha - * - * Query the current alpha value. - * - * Return Value: The current alpha value for the alpha - * - * Since: 0.2 - * - * Deprecated: 1.12: Use clutter_timeline_get_progress() - */ -gdouble -clutter_alpha_get_alpha (ClutterAlpha *alpha) -{ - ClutterAlphaPrivate *priv; - gdouble retval = 0; - - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), 0); - - priv = alpha->priv; - - if (G_LIKELY (priv->func)) - { - return priv->func (alpha, priv->user_data); - } - else if (priv->closure) - { - GValue params = G_VALUE_INIT; - GValue result_value = G_VALUE_INIT; - - g_object_ref (alpha); - - g_value_init (&result_value, G_TYPE_DOUBLE); - - g_value_init (¶ms, CLUTTER_TYPE_ALPHA); - g_value_set_object (¶ms, alpha); - - g_closure_invoke (priv->closure, &result_value, 1, ¶ms, NULL); - - retval = g_value_get_double (&result_value); - - g_value_unset (&result_value); - g_value_unset (¶ms); - - g_object_unref (alpha); - } - - return retval; -} - -/* - * clutter_alpha_set_closure_internal: - * @alpha: a #ClutterAlpha - * @closure: a #GClosure - * - * Sets the @closure for @alpha. This function does not - * set the #ClutterAlpha:mode property and does not emit - * the #GObject::notify signal for it. - */ -static inline void -clutter_alpha_set_closure_internal (ClutterAlpha *alpha, - GClosure *closure) -{ - ClutterAlphaPrivate *priv = alpha->priv; - - if (priv->notify != NULL) - priv->notify (priv->user_data); - else if (priv->closure != NULL) - g_closure_unref (priv->closure); - - priv->func = NULL; - priv->user_data = NULL; - priv->notify = NULL; - - if (closure == NULL) - return; - - /* need to take ownership of the closure before sinking it */ - priv->closure = g_closure_ref (closure); - g_closure_sink (closure); - - /* set the marshaller */ - if (G_CLOSURE_NEEDS_MARSHAL (closure)) - { - GClosureMarshal marshal = _clutter_marshal_DOUBLE__VOID; - - g_closure_set_marshal (priv->closure, marshal); - } -} - -/** - * clutter_alpha_set_closure: - * @alpha: A #ClutterAlpha - * @closure: A #GClosure - * - * Sets the #GClosure used to compute the alpha value at each - * frame of the #ClutterTimeline bound to @alpha. - * - * Since: 0.8 - * - * Deprecated: 1.12: Use clutter_timeline_set_progress_func() - */ -void -clutter_alpha_set_closure (ClutterAlpha *alpha, - GClosure *closure) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (closure != NULL); - - priv = alpha->priv; - - clutter_alpha_set_closure_internal (alpha, closure); - - priv->mode = CLUTTER_CUSTOM_MODE; - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} - -/** - * clutter_alpha_set_func: - * @alpha: A #ClutterAlpha - * @func: A #ClutterAlphaFunc - * @data: user data to be passed to the alpha function, or %NULL - * @destroy: notify function used when disposing the alpha function - * - * Sets the #ClutterAlphaFunc function used to compute - * the alpha value at each frame of the #ClutterTimeline - * bound to @alpha. - * - * This function will not register @func as a global alpha function. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use clutter_timeline_set_progress_func() - */ -void -clutter_alpha_set_func (ClutterAlpha *alpha, - ClutterAlphaFunc func, - gpointer data, - GDestroyNotify destroy) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (func != NULL); - - priv = alpha->priv; - - if (priv->notify != NULL) - { - priv->notify (priv->user_data); - } - else if (priv->closure != NULL) - { - g_closure_unref (priv->closure); - priv->closure = NULL; - } - - priv->func = func; - priv->user_data = data; - priv->notify = destroy; - - priv->mode = CLUTTER_CUSTOM_MODE; - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} - -/** - * clutter_alpha_set_timeline: - * @alpha: A #ClutterAlpha - * @timeline: A #ClutterTimeline - * - * Binds @alpha to @timeline. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline directly - */ -void -clutter_alpha_set_timeline (ClutterAlpha *alpha, - ClutterTimeline *timeline) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (timeline == NULL || CLUTTER_IS_TIMELINE (timeline)); - - priv = alpha->priv; - - if (priv->timeline == timeline) - return; - - if (priv->timeline) - { - g_signal_handlers_disconnect_by_func (priv->timeline, - timeline_new_frame_cb, - alpha); - - g_object_unref (priv->timeline); - priv->timeline = NULL; - } - - if (timeline) - { - priv->timeline = g_object_ref (timeline); - - g_signal_connect (priv->timeline, "new-frame", - G_CALLBACK (timeline_new_frame_cb), - alpha); - } - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_TIMELINE]); -} - -/** - * clutter_alpha_get_timeline: - * @alpha: A #ClutterAlpha - * - * Gets the #ClutterTimeline bound to @alpha. - * - * Return value: (transfer none): a #ClutterTimeline instance - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline directlry - */ -ClutterTimeline * -clutter_alpha_get_timeline (ClutterAlpha *alpha) -{ - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), NULL); - - return alpha->priv->timeline; -} - -/** - * clutter_alpha_new: - * - * Creates a new #ClutterAlpha instance. You must set a function - * to compute the alpha value using clutter_alpha_set_func() and - * bind a #ClutterTimeline object to the #ClutterAlpha instance - * using clutter_alpha_set_timeline(). - * - * Return value: the newly created empty #ClutterAlpha instance. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -ClutterAlpha * -clutter_alpha_new (void) -{ - return g_object_new (CLUTTER_TYPE_ALPHA, NULL); -} - -/** - * clutter_alpha_new_full: - * @timeline: #ClutterTimeline timeline - * @mode: animation mode - * - * Creates a new #ClutterAlpha instance and sets the timeline - * and animation mode. - * - * See also clutter_alpha_set_timeline() and clutter_alpha_set_mode(). - * - * Return Value: the newly created #ClutterAlpha - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -ClutterAlpha * -clutter_alpha_new_full (ClutterTimeline *timeline, - gulong mode) -{ - g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL); - g_return_val_if_fail (mode != CLUTTER_ANIMATION_LAST, NULL); - - return g_object_new (CLUTTER_TYPE_ALPHA, - "timeline", timeline, - "mode", mode, - NULL); -} - -/** - * clutter_alpha_get_mode: - * @alpha: a #ClutterAlpha - * - * Retrieves the #ClutterAnimationMode used by @alpha. - * - * Return value: the animation mode - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -gulong -clutter_alpha_get_mode (ClutterAlpha *alpha) -{ - g_return_val_if_fail (CLUTTER_IS_ALPHA (alpha), CLUTTER_CUSTOM_MODE); - - return alpha->priv->mode; -} - -typedef struct _AlphaData { - guint closure_set : 1; - - ClutterAlphaFunc func; - gpointer data; - - GClosure *closure; -} AlphaData; - -static GPtrArray *clutter_alphas = NULL; - -static gdouble -clutter_alpha_easing_func (ClutterAlpha *alpha, - gpointer data G_GNUC_UNUSED) -{ - ClutterAlphaPrivate *priv = alpha->priv; - ClutterTimeline *timeline = priv->timeline; - gdouble t, d; - - if (G_UNLIKELY (priv->timeline == NULL)) - return 0.0; - - t = clutter_timeline_get_elapsed_time (timeline); - d = clutter_timeline_get_duration (timeline); - - return clutter_easing_for_mode (priv->mode, t, d); -} - -/** - * clutter_alpha_set_mode: - * @alpha: a #ClutterAlpha - * @mode: a #ClutterAnimationMode - * - * Sets the progress function of @alpha using the symbolic value - * of @mode, as taken by the #ClutterAnimationMode enumeration. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use #ClutterTimeline and - * clutter_timeline_set_progress_mode() instead - */ -void -clutter_alpha_set_mode (ClutterAlpha *alpha, - gulong mode) -{ - ClutterAlphaPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ALPHA (alpha)); - g_return_if_fail (mode != CLUTTER_ANIMATION_LAST); - - priv = alpha->priv; - - if (mode == CLUTTER_CUSTOM_MODE) - { - priv->mode = mode; - } - else if (mode < CLUTTER_ANIMATION_LAST) - { - if (priv->mode == mode) - return; - - /* sanity check to avoid getting an out of sync - * enum/function mapping - */ - g_assert (clutter_get_easing_func_for_mode (mode) != NULL); - - clutter_alpha_set_closure_internal (alpha, NULL); - - priv->mode = mode; - - CLUTTER_NOTE (ANIMATION, "New easing mode '%s'[%lu]\n", - clutter_get_easing_name_for_mode (priv->mode), - priv->mode); - - priv->func = clutter_alpha_easing_func; - priv->user_data = NULL; - priv->notify = NULL; - } - else if (mode > CLUTTER_ANIMATION_LAST) - { - AlphaData *alpha_data = NULL; - gulong real_index = 0; - - if (priv->mode == mode) - return; - - if (G_UNLIKELY (clutter_alphas == NULL)) - { - g_warning ("No alpha functions defined for ClutterAlpha to use. "); - return; - } - - real_index = mode - CLUTTER_ANIMATION_LAST - 1; - - alpha_data = g_ptr_array_index (clutter_alphas, real_index); - if (G_UNLIKELY (alpha_data == NULL)) - { - g_warning ("No alpha function registered for mode %lu.", - mode); - return; - } - - if (alpha_data->closure_set) - clutter_alpha_set_closure (alpha, alpha_data->closure); - else - { - clutter_alpha_set_closure_internal (alpha, NULL); - - priv->func = alpha_data->func; - priv->user_data = alpha_data->data; - priv->notify = NULL; - } - - priv->mode = mode; - } - else - g_assert_not_reached (); - - g_object_notify_by_pspec (G_OBJECT (alpha), obj_props[PROP_MODE]); -} diff --git a/clutter/clutter/deprecated/clutter-alpha.h b/clutter/clutter/deprecated/clutter-alpha.h deleted file mode 100644 index fc030a567c3..00000000000 --- a/clutter/clutter/deprecated/clutter-alpha.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Authored By Matthew Allum - * Jorn Baayen - * Emmanuele Bassi - * Tomas Frydrych - * - * Copyright (C) 2006, 2007, 2008 OpenedHand - * Copyright (C) 2009 Intel Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ - -#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __CLUTTER_ALPHA_H__ -#define __CLUTTER_ALPHA_H__ - -#include -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_ALPHA (clutter_alpha_get_type ()) -#define CLUTTER_ALPHA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ALPHA, ClutterAlpha)) -#define CLUTTER_ALPHA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ALPHA, ClutterAlphaClass)) -#define CLUTTER_IS_ALPHA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ALPHA)) -#define CLUTTER_IS_ALPHA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ALPHA)) -#define CLUTTER_ALPHA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ALPHA, ClutterAlphaClass)) - -typedef struct _ClutterAlphaClass ClutterAlphaClass; -typedef struct _ClutterAlphaPrivate ClutterAlphaPrivate; - -/** - * ClutterAlphaFunc: - * @alpha: a #ClutterAlpha - * @user_data: user data passed to the function - * - * A function returning a value depending on the position of - * the #ClutterTimeline bound to @alpha. - * - * Return value: a floating point value - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimelineProgressFunc instead. - */ -typedef gdouble (*ClutterAlphaFunc) (ClutterAlpha *alpha, - gpointer user_data); - -/** - * ClutterAlpha: - * - * #ClutterAlpha combines a #ClutterTimeline and a function. - * The contents of the #ClutterAlpha structure are private and should - * only be accessed using the provided API. - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -struct _ClutterAlpha -{ - /*< private >*/ - GInitiallyUnowned parent; - - ClutterAlphaPrivate *priv; -}; - -/** - * ClutterAlphaClass: - * - * Base class for #ClutterAlpha - * - * Since: 0.2 - * - * Deprecated: 1.12: Use #ClutterTimeline instead - */ -struct _ClutterAlphaClass -{ - /*< private >*/ - GInitiallyUnownedClass parent_class; - - void (*_clutter_alpha_1) (void); - void (*_clutter_alpha_2) (void); - void (*_clutter_alpha_3) (void); - void (*_clutter_alpha_4) (void); - void (*_clutter_alpha_5) (void); -}; - -CLUTTER_DEPRECATED -GType clutter_alpha_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED -ClutterAlpha * clutter_alpha_new (void); -CLUTTER_DEPRECATED -ClutterAlpha * clutter_alpha_new_full (ClutterTimeline *timeline, - gulong mode); -CLUTTER_DEPRECATED -gdouble clutter_alpha_get_alpha (ClutterAlpha *alpha); -CLUTTER_DEPRECATED -void clutter_alpha_set_func (ClutterAlpha *alpha, - ClutterAlphaFunc func, - gpointer data, - GDestroyNotify destroy); -CLUTTER_DEPRECATED -void clutter_alpha_set_closure (ClutterAlpha *alpha, - GClosure *closure); -CLUTTER_DEPRECATED -void clutter_alpha_set_timeline (ClutterAlpha *alpha, - ClutterTimeline *timeline); -CLUTTER_DEPRECATED -ClutterTimeline *clutter_alpha_get_timeline (ClutterAlpha *alpha); -CLUTTER_DEPRECATED -void clutter_alpha_set_mode (ClutterAlpha *alpha, - gulong mode); -CLUTTER_DEPRECATED -gulong clutter_alpha_get_mode (ClutterAlpha *alpha); - -G_END_DECLS - -#endif /* __CLUTTER_ALPHA_H__ */ diff --git a/clutter/clutter/deprecated/clutter-animation.c b/clutter/clutter/deprecated/clutter-animation.c index 0b5ac51128f..8bf9e73b318 100644 --- a/clutter/clutter/deprecated/clutter-animation.c +++ b/clutter/clutter/deprecated/clutter-animation.c @@ -25,16 +25,14 @@ /** * SECTION:clutter-animation * @short_description: Simple implicit animations - * @See_Also: #ClutterAnimatable, #ClutterInterval, #ClutterAlpha, - * #ClutterTimeline + * @See_Also: #ClutterAnimatable, #ClutterInterval, #ClutterTimeline * * #ClutterAnimation is an object providing simple, implicit animations * for #GObjects. * * #ClutterAnimation instances will bind one or more #GObject properties - * belonging to a #GObject to a #ClutterInterval, and will then use a - * #ClutterAlpha to interpolate the property between the initial and final - * values of the interval. + * belonging to a #GObject to a #ClutterInterval, and will then interpolate the + * property between the initial and final values of the interval. * * The duration of the animation is set using clutter_animation_set_duration(). * The easing mode of the animation is set using clutter_animation_set_mode(). @@ -94,7 +92,6 @@ #define CLUTTER_DISABLE_DEPRECATION_WARNINGS -#include "clutter-alpha.h" #include "clutter-animatable.h" #include "clutter-animation.h" #include "clutter-debug.h" @@ -116,7 +113,6 @@ enum PROP_DURATION, PROP_LOOP, PROP_TIMELINE, - PROP_ALPHA, PROP_LAST }; @@ -137,7 +133,6 @@ struct _ClutterAnimationPrivate GHashTable *properties; - ClutterAlpha *alpha; ClutterTimeline *timeline; guint timeline_started_id; @@ -151,9 +146,6 @@ static GQuark quark_object_animation = 0; static void clutter_scriptable_init (ClutterScriptableIface *iface); -static void clutter_animation_set_alpha_internal (ClutterAnimation *animation, - ClutterAlpha *alpha); -static ClutterAlpha * clutter_animation_get_alpha_internal (ClutterAnimation *animation); static ClutterTimeline * clutter_animation_get_timeline_internal (ClutterAnimation *animation); G_DEFINE_TYPE_WITH_CODE (ClutterAnimation, clutter_animation, G_TYPE_OBJECT, @@ -161,26 +153,6 @@ G_DEFINE_TYPE_WITH_CODE (ClutterAnimation, clutter_animation, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, clutter_scriptable_init)); -static ClutterAlpha * -clutter_animation_get_alpha_internal (ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (priv->alpha == NULL) - { - ClutterAlpha *alpha; - - alpha = clutter_alpha_new (); - clutter_alpha_set_mode (alpha, CLUTTER_LINEAR); - - priv->alpha = g_object_ref_sink (alpha); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_ALPHA]); - } - - return priv->alpha; -} - static void on_actor_destroy (ClutterActor *actor, ClutterAnimation *animation) @@ -279,10 +251,7 @@ clutter_animation_dispose (GObject *gobject) ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv; ClutterTimeline *timeline; - if (priv->alpha != NULL) - timeline = clutter_alpha_get_timeline (priv->alpha); - else - timeline = priv->timeline; + timeline = priv->timeline; if (timeline != NULL && priv->timeline_started_id != 0) g_signal_handler_disconnect (timeline, priv->timeline_started_id); @@ -303,12 +272,6 @@ clutter_animation_dispose (GObject *gobject) priv->timeline = NULL; } - if (priv->alpha != NULL) - { - g_object_unref (priv->alpha); - priv->alpha = NULL; - } - if (priv->object != NULL) { g_object_unref (priv->object); @@ -348,10 +311,6 @@ clutter_animation_set_property (GObject *gobject, clutter_animation_set_timeline (animation, g_value_get_object (value)); break; - case PROP_ALPHA: - clutter_animation_set_alpha_internal (animation, g_value_get_object (value)); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -389,10 +348,6 @@ clutter_animation_get_property (GObject *gobject, g_value_set_object (value, clutter_animation_get_timeline (animation)); break; - case PROP_ALPHA: - g_value_set_object (value, clutter_animation_get_alpha_internal (animation)); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -460,9 +415,7 @@ clutter_animation_class_init (ClutterAnimationClass *klass) /** * ClutterAnimation:mode: * - * The animation mode, either a value from #ClutterAnimationMode - * or a value returned by clutter_alpha_register_func(). The - * default value is %CLUTTER_LINEAR. + * A #ClutterAnimationMode. default value is %CLUTTER_LINEAR. * * Since: 1.0 * Deprecated: 1.12: Use #ClutterPropertyTransition instead @@ -521,23 +474,6 @@ clutter_animation_class_init (ClutterAnimationClass *klass) CLUTTER_TYPE_TIMELINE, CLUTTER_PARAM_READWRITE); - /** - * ClutterAnimation:alpha: - * - * The #ClutterAlpha used by the animation. - * - * Since: 1.0 - * - * Deprecated: 1.10: Use the #ClutterAnimation:timeline property and - * the #ClutterTimeline:progress-mode property instead. - */ - obj_props[PROP_ALPHA] = - g_param_spec_object ("alpha", - P_("Alpha"), - P_("The alpha used by the animation"), - CLUTTER_TYPE_ALPHA, - CLUTTER_PARAM_READWRITE | G_PARAM_DEPRECATED); - g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); @@ -724,10 +660,7 @@ on_timeline_frame (ClutterTimeline *timeline, priv = animation->priv; - if (priv->alpha != NULL) - alpha_value = clutter_alpha_get_alpha (priv->alpha); - else - alpha_value = clutter_timeline_get_progress (priv->timeline); + alpha_value = clutter_timeline_get_progress (priv->timeline); if (CLUTTER_IS_ANIMATABLE (priv->object)) { @@ -791,13 +724,6 @@ clutter_animation_get_timeline_internal (ClutterAnimation *animation) if (priv->timeline != NULL) return priv->timeline; - if (priv->alpha != NULL) - { - timeline = clutter_alpha_get_timeline (priv->alpha); - if (timeline != NULL) - return timeline; - } - timeline = g_object_new (CLUTTER_TYPE_TIMELINE, NULL); priv->timeline_started_id = @@ -815,14 +741,6 @@ clutter_animation_get_timeline_internal (ClutterAnimation *animation) G_CALLBACK (on_timeline_frame), animation); - if (priv->alpha != NULL) - { - clutter_alpha_set_timeline (priv->alpha, timeline); - - /* the alpha owns the timeline now */ - g_object_unref (timeline); - } - priv->timeline = timeline; g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); @@ -830,93 +748,6 @@ clutter_animation_get_timeline_internal (ClutterAnimation *animation) return priv->timeline; } -static void -clutter_animation_set_alpha_internal (ClutterAnimation *animation, - ClutterAlpha *alpha) -{ - ClutterAnimationPrivate *priv; - ClutterTimeline *timeline; - - priv = animation->priv; - - if (priv->alpha == alpha) - return; - - g_object_freeze_notify (G_OBJECT (animation)); - - if (priv->alpha != NULL) - timeline = clutter_alpha_get_timeline (priv->alpha); - else - timeline = NULL; - - /* disconnect the old timeline first */ - if (timeline != NULL && priv->timeline_started_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_started_id); - priv->timeline_started_id = 0; - } - - if (timeline != NULL && priv->timeline_completed_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_completed_id); - priv->timeline_completed_id = 0; - } - - /* then we need to disconnect the signal handler from the old alpha */ - if (timeline != NULL && priv->timeline_frame_id != 0) - { - g_signal_handler_disconnect (timeline, priv->timeline_frame_id); - priv->timeline_frame_id = 0; - } - - if (priv->alpha != NULL) - { - /* this will take care of any reference we hold on the timeline */ - g_object_unref (priv->alpha); - priv->alpha = NULL; - } - - if (alpha == NULL) - goto out; - - priv->alpha = g_object_ref_sink (alpha); - - /* if the alpha has a timeline then we use it, otherwise we create one */ - timeline = clutter_alpha_get_timeline (priv->alpha); - if (timeline != NULL) - { - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - } - else - { - /* FIXME - add a create_timeline_internal() because this does - * not look very good - */ - (void) clutter_animation_get_timeline_internal (animation); - } - -out: - /* emit all relevant notifications */ - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_MODE]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_ALPHA]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - /** * clutter_animation_new: * @@ -984,10 +815,7 @@ clutter_animation_set_object (ClutterAnimation *animation, * @mode: an animation mode logical id * * Sets the animation @mode of @animation. The animation @mode is - * a logical id, either coming from the #ClutterAnimationMode enumeration - * or the return value of clutter_alpha_register_func(). - * - * This function will also set #ClutterAnimation:alpha if needed. + * a logical id, coming from the #ClutterAnimationMode enumeration. * * Since: 1.0 * Deprecated: 1.12: Use #ClutterPropertyTransition instead @@ -996,29 +824,15 @@ void clutter_animation_set_mode (ClutterAnimation *animation, gulong mode) { + ClutterTimeline *timeline; + g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); g_object_freeze_notify (G_OBJECT (animation)); - if (animation->priv->alpha != NULL || mode > CLUTTER_ANIMATION_LAST) - { - ClutterAlpha *alpha; - - if (animation->priv->alpha == NULL) - alpha = clutter_animation_get_alpha_internal (animation); - else - alpha = animation->priv->alpha; - - clutter_alpha_set_mode (alpha, mode); - } - else - { - ClutterTimeline *timeline; - - timeline = clutter_animation_get_timeline_internal (animation); + timeline = clutter_animation_get_timeline_internal (animation); - clutter_timeline_set_progress_mode (timeline, mode); - } + clutter_timeline_set_progress_mode (timeline, mode); g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_MODE]); @@ -1044,9 +858,6 @@ clutter_animation_get_mode (ClutterAnimation *animation) g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), CLUTTER_LINEAR); - if (animation->priv->alpha != NULL) - return clutter_alpha_get_mode (animation->priv->alpha); - timeline = clutter_animation_get_timeline_internal (animation); return clutter_timeline_get_progress_mode (timeline); @@ -1059,8 +870,7 @@ clutter_animation_get_mode (ClutterAnimation *animation) * * Sets the duration of @animation in milliseconds. * - * This function will set #ClutterAnimation:alpha and - * #ClutterAnimation:timeline if needed. + * This function will set #ClutterAnimation:timeline if needed. * * Since: 1.0 * Deprecated: 1.12: Use #ClutterPropertyTransition instead @@ -1094,8 +904,7 @@ clutter_animation_set_duration (ClutterAnimation *animation, * A looping #ClutterAnimation will not emit the #ClutterAnimation::completed * signal when finished. * - * This function will set #ClutterAnimation:alpha and - * #ClutterAnimation:timeline if needed. + * This function will set #ClutterAnimation:timeline if needed. * * Since: 1.0 * Deprecated: 1.12: Use #ClutterPropertyTransition instead @@ -1189,10 +998,7 @@ clutter_animation_set_timeline (ClutterAnimation *animation, priv = animation->priv; - if (priv->alpha != NULL) - cur_timeline = clutter_alpha_get_timeline (priv->alpha); - else - cur_timeline = priv->timeline; + cur_timeline = priv->timeline; if (cur_timeline == timeline) return; @@ -1215,16 +1021,10 @@ clutter_animation_set_timeline (ClutterAnimation *animation, /* Release previously set timeline if any */ g_clear_object (&priv->timeline); - if (priv->alpha != NULL) - clutter_alpha_set_timeline (priv->alpha, timeline); - else - { - /* Hold a reference to the timeline if it's not reffed by the priv->alpha */ - priv->timeline = timeline; + priv->timeline = timeline; - if (priv->timeline) - g_object_ref (priv->timeline); - } + if (priv->timeline) + g_object_ref (priv->timeline); g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); @@ -1634,8 +1434,7 @@ clutter_actor_animate_with_timeline (ClutterActor *actor, * will make width and height properties of the #ClutterActor "rectangle" * grow linearly between the current value and 100 pixels, in 250 milliseconds. * - * The animation @mode is a logical id, either from the #ClutterAnimationMode - * enumeration of from clutter_alpha_register_func(). + * The animation @mode is a logical id, from the #ClutterAnimationMode. * * All the properties specified will be animated between the current value * and the final value. If a property should be set at the beginning of diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index c8e582eed25..22c5e4ee4a5 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -219,7 +219,6 @@ clutter_nonintrospected_sources = [ clutter_deprecated_headers = [ 'deprecated/clutter-actor.h', - 'deprecated/clutter-alpha.h', 'deprecated/clutter-animation.h', 'deprecated/clutter-box.h', 'deprecated/clutter-container.h', @@ -230,7 +229,6 @@ clutter_deprecated_headers = [ ] clutter_deprecated_sources = [ - 'deprecated/clutter-alpha.c', 'deprecated/clutter-animation.c', 'deprecated/clutter-box.c', 'deprecated/clutter-group.c', diff --git a/src/tests/clutter/interactive/test-script.c b/src/tests/clutter/interactive/test-script.c index 999e5191bc0..d0795dde2a5 100644 --- a/src/tests/clutter/interactive/test-script.c +++ b/src/tests/clutter/interactive/test-script.c @@ -40,13 +40,7 @@ static const gchar *test_behaviour = " \"type\" : \"ClutterTimeline\"," " \"duration\" : 5000," " \"loop\" : true" -" }," -" {" -" \"id\" : \"sine-alpha\"," -" \"type\" : \"ClutterAlpha\"," -" \"function\" : \"sine_alpha\"," -" \"timeline\" : \"main-timeline\"" -" }," +" }" "]"; static gboolean -- GitLab From e3c0fcf7d53a96e507efb0023070bee6b1fbddc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 16:15:09 +0200 Subject: [PATCH 4/8] tests/clutter: Add back redhand_alpha.png and light0.png They were removed long long ago, but are still used, so add them back to get the relevant tests usable again. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- src/tests/clutter/interactive/light0.png | Bin 0 -> 1559 bytes src/tests/clutter/interactive/redhand_alpha.png | Bin 0 -> 2360 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/tests/clutter/interactive/light0.png create mode 100644 src/tests/clutter/interactive/redhand_alpha.png diff --git a/src/tests/clutter/interactive/light0.png b/src/tests/clutter/interactive/light0.png new file mode 100644 index 0000000000000000000000000000000000000000..52c64e81a1a922cc3370499100d415eac2fe2ec2 GIT binary patch literal 1559 zcmY+Ec~sI_6vshxNmR1j7u-!7EFCvAR6r0d6?bt-b19eHEd?VNT+lpjIqqp$N~1NB znoBVfWrUNZHihNbWR?v!>13#7hA=;CI;VN(zIV_4eD8br-hW=Hw-;VPPE!s90x7t= zVSNEV3T&RNBybv!6W#!>!`s6jhjLJHL8@XMRdG&gcxN>?w7MrwgMioccGL86*YZ1{ z738HuBl+8q~edMpy27-gOmy*K5EMQW^N zMuJUdA|flvo|NoBPT7Al-6`h;CO->Tkc}^*9H8ZRmgW)4sJ`We{uRZ6HDzJ-6_E{9 zQB7x#w$#R-t4}=Nn0)D6R_BH6D;+sKT}5KCIJ8#Y9t4sycgLdrN#Mm>UC)@Yl6+3xsbX-bB{RVCZMXZQC{W7!|lTiN#MgPF=372{C;{ z;|)QdH^vCBF$WiQxPJ~CLeUQLBLwMBRwNmigha_KnT=)hHFA`9-27+(1y{$CP~jY1 zhX$FH{P7X|fk&{C#a65p|A4V!?;zB#m-%_ z{v+}L)8eZK=-hjSsNlvzm2O+hP+%g&1zABFveAS7s8cw5!vd1Z=0{daS|${BEuB5M zlmEhC%6eE52GvCqB3>UlGal0ZGRmQpt7@XXOm29qvTE#F9kj-P^=ZIYwI@jn7Mr%N z^`|!|qL_wesf_bhHZNAZx$k8+u|O-c$kx_7m_3nQl4WN&F0Q5=S4P`DfdO+=J|R+3 zrm3TrI^kkI_4IA*^t;%YX$;)0A@%$kiwOxvu0q?*v6mTUrELxU!J42M*SR#{HAy1MGF|oD7E-XRt`7lg+yVFs#n?*4=f-bO>G7ynkzn4G>(FDW zuvM+=CZn1DJcyZI;CsB~YI+Unsb35-Ey=L8UUS}SJ_1UkPX~p*85}sN--4*ul9oj- z=C3DQR3e8bU%p|_YVqQ_^x=P++HU@FK}ni~6z1Q5fYL|X(jHZwb0%=<-Qfos>4C}W z>~xp;IVe^wxATLmf;J&nw6XSTslR)`QF2{64{QR>)pHXxv_Jyu{Lm%V{eAG0W=MqeDPZJ*-Iiz#d*)!6X;@VmiCFrMV1--8B6i}3MFjy8SBS`cM9eN z_Y(DBq9Y4x%sU>~nd_aS-1;Xyl-4%Jr5WXvw|(SwsI>pDwND&S=Qt})1jHZe!%i)< zo0*ML$YQ1Vl9_1r1?Ys;q}3(b%tXy7QrOlY!%+OBPhKDTPzV*=T1E;9MXQLKk(Kvh zQ!^luGcvb7g=+)?q2;%2GAl}p;&&?eA%(xpemn(OO26>&#fO6-c~Ws#K#*CY6r2*R za&@^pfGuGir~!Z@00`&-0Oz(H0K{u`eLyflwF^`LR2-o4w$kqa>NlXWmA(a(fDD_h z2fqg@-zwa{Z4+n-c|zpC!=eNF4wnZ!pxOl5K&FU1IPohO$JhkgLwLkBxOX(K4+WG3 zfa4c{iVo;q)^+?E_yel<_o@c~KmY({aD+?(_fcD2@_WBbSr*}ghqK;&{=aFNg7WP2 SQ_U*3zD9SP7q%O7nEEf@=F&R= literal 0 HcmV?d00001 diff --git a/src/tests/clutter/interactive/redhand_alpha.png b/src/tests/clutter/interactive/redhand_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..42a93c3a4405853d89acc80521bdb25313edb74b GIT binary patch literal 2360 zcmV-83CH${P)7Pc1`wip<;85y=38n+u8w;UX}9UZtIAGjbOxgsLDBO}8=K)NL*!$Cp$?d`)t zLjC*u#6v^6CMLTkCjS2Z`Rwe(MMcC$M*jZ(yC)~bM@Rqv|HVj1`0DDrC@98BNybY{ zyD2HgOia8gD){N?$4^hlP*A)pE67q(6_XXbEG)e+FupM{zA`euGc&(5G`}@9zcx0& zH#fjIIKewR!8|;|Jw3ucKEgjg!$CpBLqo(wM8ri!#70KNM@Pj-NXAJ?$x~CwR8+}T zRmxUY%2-&+Sy{_kTFYBo%UoQ{U0uvxUd>-$&0t{7VPVZ;V$Ne@&ShoKW@gW4XU}M8 z&uMAUX=%`EYS3$I(QItdZEewRZqaXV(r|FnadFaea?^Bl({**!c6QWvchq=z)p>c< zdV1A+d)9n>)_r}}ety<}f7gG1*MWi9f`ZtCgV=ejkkdWMwk=&A!-IJ5ul$70-mEM(=-jEqpspP7vbtw@yu9kZzU#lg>%hS4!NKgp!tBGt?Zw6I#>VZ( z$L`3;?#apS%F6D`%kRw0@6FBd&d%`9&+yRD@X^un($ewN)biEU^48Y!*Vpsd*z?)h z^xNC?+}!lt-Syty_21w1;NbP);r8O<_T%ICGp>{QUm?{r~>{|NsAyf;RsE z001m>QchC<00000000000000002m@ACowucL_|tVS7T#laC&@#h>4=AuFTKW;O_Z2 z`gF7a00tOIL_t(|0qx!UQ&rU)$8i_v*Kb*=X{lL{rj=c$%(T)jb_q=b3nMG@f?;6- zUKGJgf}~l3fk{}Jm6>H^W=V==DtSqdsaa}yG3E28^b79coU@m#hrQ3<&zV`TpVzFJ z_dL&nnR9+PZLCDGEX%UUVQ?nl*LaO^7@YC@8t=%J!4dND8t+KU;0XDBjn@nfgEPKf zdGc&q>o?t9qDynJtJ$x z=)CtMr1yQvgp7;{r9Y5fzg5$pA2GV1`bZ)|mcg-*+%;t3lC-VlZZRBX`uV&EJIS zaQB)oAuFI!N)G6d;~i)eGOqCyG6ouVIY$mbr`9<$5*j_6BfFrpja8xvftGXRbLcGQ zTvG#`%78*Dpp$2C%`s|H0-d77hIH2c$97CIxMm+UDS}QxVne!9lTzqp8(g!On#_St ze&`_+IU$Am4Yd=o6R{Jq6R{Jq6Vb2}u@kYY#R##hWgokph@D6PA$B5mB6cEnB93d4 zd?I@CC!%L3VkcrJlI#=7g%{sQ3E6%JyqVfX!fGAKhIf_WhrA76blo2AYVGL@zm$X+ z(r-C@bo+tORx1tux+&<8;N=Mmu_5_3#IBYNv8!c6>}uH%`$p_)*%13i>}uH%yIRQ; zVpq$C*wt!G`jCINE_*%g(LwzOKap8jv;RVpuGXp588@nC+TEXDe}Wwp-DY^N^go=wRSa&ow8LHo*NSgqras}`lc z*(g5bWK@Sv$`a|Tb#9n4(sq^bkXg!5huxxA>#MfP)Q~fRLrxD+=H?1sts=#6#a^)! zIew+$7%MiUP_g{)fY8-Cd!6Db5E`;pG2MAy=4w5wxHgIm`S)tYHBIDd{ixU;5gAgh z*xH_zxLUc2ZD!x*QA%hiPxy03aQt_>n81kIr z`&!~^%~pJoAVd1V%m<3C!^I#&(qZPHVtX1vzL6Xl8lbq!0u3pFp{a@~Wlx|XAHh() zVtNdLhHQhO#)lP8h4)WUSS2u3qgZY`Ej8r)AjMINfI~*Z)VdT#$9-pl4p|Ii>B?Bj zdYH@eC8Q3I9}8>Ft!8>x)kUA%;|dt$uvRxTSh<(Vsw|A^PXeaN@%W1Dq90>F`uh-37E#zHcEp zXqAhHx2$+;?#u=6uHAV8jxa+S5GZ|!qqQX&fws-o0v zjCfwIaS&p5#M?-y2c($gZ6rq^M}w!4`~o@ZJe6#Q91$-ev=L(55F5fPSr0L)y_M8L zjMxxn$rebl-dhMYK#0lFA^eiww?c%ju_5dd%7qBJ5JpM0><~uDzFwk37$r1Mb_kd?2uC+=hl4b_EkX!B;}66^ zTD31AU?s!}VWiONOa!Q0*TE>!+ccvGg7Gc!LKr1ZOxepwv`XT4uu>ccH&-v2{py&^ zXNLQ2RL;^JMEVdG5~odTNe^L=-oYTfgF$)+gY*st=^YH>I~c@wFv!nfke|UIKZ7YL eBP`3ZEbBk%iTT(2=KcQw0000 Date: Thu, 9 Apr 2020 17:46:38 +0200 Subject: [PATCH 5/8] clutter/box-layout: Make 'easing-mode' be an enum In the past, it was a odd mix of possible different types, all coalesced into an unsigned integer. Now, hovewer, it's always a ClutterAnimationType, so lets change the name of getter, setter and property to what it really is. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-box-layout.c | 32 +++++++++++----------------- clutter/clutter/clutter-box-layout.h | 6 +++--- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/clutter/clutter/clutter-box-layout.c b/clutter/clutter/clutter-box-layout.c index c3dbe8e9e63..112200258ec 100644 --- a/clutter/clutter/clutter-box-layout.c +++ b/clutter/clutter/clutter-box-layout.c @@ -77,7 +77,7 @@ struct _ClutterBoxLayoutPrivate guint spacing; - gulong easing_mode; + ClutterAnimationMode easing_mode; guint easing_duration; ClutterOrientation orientation; @@ -1266,7 +1266,7 @@ clutter_box_layout_set_property (GObject *gobject, break; case PROP_EASING_MODE: - clutter_box_layout_set_easing_mode (self, g_value_get_ulong (value)); + clutter_box_layout_set_easing_mode (self, g_value_get_enum (value)); break; case PROP_EASING_DURATION: @@ -1315,7 +1315,7 @@ clutter_box_layout_get_property (GObject *gobject, break; case PROP_EASING_MODE: - g_value_set_ulong (value, priv->easing_mode); + g_value_set_enum (value, priv->easing_mode); break; case PROP_EASING_DURATION: @@ -1448,11 +1448,6 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass) * The easing mode for the animations, in case * #ClutterBoxLayout:use-animations is set to %TRUE. * - * The easing mode has the same semantics of #ClutterAnimation:mode: it can - * either be a value from the #ClutterAnimationMode enumeration, like - * %CLUTTER_EASE_OUT_CUBIC, or a logical id as returned by - * clutter_alpha_register_func(). - * * The default value is %CLUTTER_EASE_OUT_CUBIC. * * Since: 1.2 @@ -1461,12 +1456,12 @@ clutter_box_layout_class_init (ClutterBoxLayoutClass *klass) * the children when allocating them. */ obj_props[PROP_EASING_MODE] = - g_param_spec_ulong ("easing-mode", - P_("Easing Mode"), - P_("The easing mode of the animations"), - 0, G_MAXULONG, - CLUTTER_EASE_OUT_CUBIC, - CLUTTER_PARAM_READWRITE); + g_param_spec_enum ("easing-mode", + P_("Easing Mode"), + P_("The easing mode of the animations"), + CLUTTER_TYPE_ANIMATION_MODE, + CLUTTER_EASE_OUT_CUBIC, + CLUTTER_PARAM_READWRITE); /** * ClutterBoxLayout:easing-duration: @@ -2243,8 +2238,7 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout) /** * clutter_box_layout_set_easing_mode: * @layout: a #ClutterBoxLayout - * @mode: an easing mode, either from #ClutterAnimationMode or a logical id - * from clutter_alpha_register_func() + * @mode: a #ClutterAnimationMode * * Sets the easing mode to be used by @layout when animating changes in layout * properties. @@ -2255,8 +2249,8 @@ clutter_box_layout_get_use_animations (ClutterBoxLayout *layout) * of the children when allocating them. */ void -clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, - gulong mode) +clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, + ClutterAnimationMode mode) { ClutterBoxLayoutPrivate *priv; @@ -2284,7 +2278,7 @@ clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, * * Deprecated: 1.12 */ -gulong +ClutterAnimationMode clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout) { g_return_val_if_fail (CLUTTER_IS_BOX_LAYOUT (layout), diff --git a/clutter/clutter/clutter-box-layout.h b/clutter/clutter/clutter-box-layout.h index fdced8f4139..999742dcd85 100644 --- a/clutter/clutter/clutter-box-layout.h +++ b/clutter/clutter/clutter-box-layout.h @@ -153,10 +153,10 @@ void clutter_box_layout_set_use_animations (ClutterBoxLayou CLUTTER_DEPRECATED gboolean clutter_box_layout_get_use_animations (ClutterBoxLayout *layout); CLUTTER_DEPRECATED -void clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, - gulong mode); +void clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout, + ClutterAnimationMode mode); CLUTTER_DEPRECATED -gulong clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout); +ClutterAnimationMode clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout); CLUTTER_DEPRECATED void clutter_box_layout_set_easing_duration (ClutterBoxLayout *layout, guint msecs); -- GitLab From da5be1fdeadb1c93afd2cf81b3031b0beb5b4188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 17:49:29 +0200 Subject: [PATCH 6/8] clutter/animatable: Remove left-over vfunc https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-animatable.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/clutter/clutter/clutter-animatable.h b/clutter/clutter/clutter-animatable.h index 0b194514a0d..92006d0ca4a 100644 --- a/clutter/clutter/clutter-animatable.h +++ b/clutter/clutter/clutter-animatable.h @@ -42,8 +42,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable, /** * ClutterAnimatableInterface: - * @animate_property: virtual function for custom interpolation of a - * property. This virtual function is deprecated * @find_property: virtual function for retrieving the #GParamSpec of * an animatable property * @get_initial_state: virtual function for retrieving the initial @@ -64,13 +62,6 @@ struct _ClutterAnimatableInterface GTypeInterface parent_iface; /*< public >*/ - gboolean (* animate_property) (ClutterAnimatable *animatable, - ClutterAnimation *animation, - const gchar *property_name, - const GValue *initial_value, - const GValue *final_value, - gdouble progress, - GValue *value); GParamSpec *(* find_property) (ClutterAnimatable *animatable, const gchar *property_name); void (* get_initial_state) (ClutterAnimatable *animatable, -- GitLab From b46bc98d44aeca66a5c173d769cf687f57caeb95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 17:52:46 +0200 Subject: [PATCH 7/8] tests/clutter/conform: Remove left-over ClutterAnimator scripts ClutterAnimator is long gone; remove some leftover test scripts. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- .../conform/scripts/test-animator-1.json | 5 --- .../conform/scripts/test-animator-2.json | 29 -------------- .../conform/scripts/test-animator-3.json | 40 ------------------- 3 files changed, 74 deletions(-) delete mode 100644 src/tests/clutter/conform/scripts/test-animator-1.json delete mode 100644 src/tests/clutter/conform/scripts/test-animator-2.json delete mode 100644 src/tests/clutter/conform/scripts/test-animator-3.json diff --git a/src/tests/clutter/conform/scripts/test-animator-1.json b/src/tests/clutter/conform/scripts/test-animator-1.json deleted file mode 100644 index 2d6aab9085d..00000000000 --- a/src/tests/clutter/conform/scripts/test-animator-1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000 -} diff --git a/src/tests/clutter/conform/scripts/test-animator-2.json b/src/tests/clutter/conform/scripts/test-animator-2.json deleted file mode 100644 index 9059f57ed50..00000000000 --- a/src/tests/clutter/conform/scripts/test-animator-2.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "foo", - "x" : 0, - "y" : 0, - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000, - - "properties" : [ - { - "object" : "foo", - "name" : "x", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - } - ] - } -] diff --git a/src/tests/clutter/conform/scripts/test-animator-3.json b/src/tests/clutter/conform/scripts/test-animator-3.json deleted file mode 100644 index 26d779beee7..00000000000 --- a/src/tests/clutter/conform/scripts/test-animator-3.json +++ /dev/null @@ -1,40 +0,0 @@ -[ - { - "type" : "ClutterRectangle", - "id" : "foo", - "x" : 0, - "y" : 0, - "width" : 100, - "height" : 100 - }, - { - "type" : "ClutterAnimator", - "id" : "animator", - "duration" : 1000, - - "properties" : [ - { - "object" : "foo", - "name" : "x", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - }, - { - "object" : "foo", - "name" : "y", - "ease-in" : true, - "interpolation" : "linear", - "keys" : [ - [ 0.0, "easeInCubic", 100.0 ], - [ 0.2, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 200.0 ] - ] - } - ] - } -] -- GitLab From 322b51cded630fb36f1759ebb608fe4985bd228b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 9 Apr 2020 17:54:45 +0200 Subject: [PATCH 8/8] clutter: Remove ClutterAnimation This removes ClutterAnimation and related tests. ClutterAnimation has been deprecated for a long time, and replacements exist and are used by e.g. GNOME Shell since a while back. This also disables a few relatively unrelated interactive tests, as they rely on ClutterAnimation to implement some animations they use to illustrate what they actually test. As interactive tests currently are more or less untestable due to any interaction with them crashing, as well as they in practice means rewriting the tests using non-deprecated animation APIs, they are not ported right now. To actually port the interactive tests, it needs to be possible to fist interact with them. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1192 --- clutter/clutter/clutter-animatable.c | 14 +- clutter/clutter/clutter-animatable.h | 3 - clutter/clutter/clutter-deprecated.h | 1 - clutter/clutter/clutter-enums.h | 2 +- clutter/clutter/clutter-interval.c | 3 - clutter/clutter/clutter-script-parser.c | 81 - clutter/clutter/clutter-script-private.h | 2 - clutter/clutter/clutter-timeline.c | 3 +- clutter/clutter/clutter-types.h | 2 - .../clutter/deprecated/clutter-animation.c | 1598 ----------------- .../clutter/deprecated/clutter-animation.h | 152 -- clutter/clutter/meson.build | 2 - src/tests/clutter/conform/script-parser.c | 23 - .../scripts/test-script-animation.json | 14 - src/tests/clutter/interactive/meson.build | 5 - src/tests/clutter/interactive/test-easing.c | 38 +- 16 files changed, 19 insertions(+), 1924 deletions(-) delete mode 100644 clutter/clutter/deprecated/clutter-animation.c delete mode 100644 clutter/clutter/deprecated/clutter-animation.h delete mode 100644 src/tests/clutter/conform/scripts/test-script-animation.json diff --git a/clutter/clutter/clutter-animatable.c b/clutter/clutter/clutter-animatable.c index e8c9511106c..e14012c5d86 100644 --- a/clutter/clutter/clutter-animatable.c +++ b/clutter/clutter/clutter-animatable.c @@ -27,35 +27,23 @@ * @short_description: Interface for animatable classes * * #ClutterAnimatable is an interface that allows a #GObject class - * to control how a #ClutterAnimation will animate a property. + * to control how an actor will animate a property. * * Each #ClutterAnimatable should implement the * #ClutterAnimatableInterface.interpolate_property() virtual function of the * interface to compute the animation state between two values of an interval * depending on a progress factor, expressed as a floating point value. * - * If a #ClutterAnimatable is animated by a #ClutterAnimation - * instance, the #ClutterAnimation will call - * clutter_animatable_interpolate_property() passing the name of the - * currently animated property; the values interval; and the progress factor. - * The #ClutterAnimatable implementation should return the computed value for - * the animated - * property. - * * #ClutterAnimatable is available since Clutter 1.0 */ #include "clutter-build-config.h" -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - #include "clutter-animatable.h" #include "clutter-interval.h" #include "clutter-debug.h" #include "clutter-private.h" -#include "deprecated/clutter-animation.h" - G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT); static void diff --git a/clutter/clutter/clutter-animatable.h b/clutter/clutter/clutter-animatable.h index 92006d0ca4a..d03e0589de2 100644 --- a/clutter/clutter/clutter-animatable.h +++ b/clutter/clutter/clutter-animatable.h @@ -51,9 +51,6 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable, * @interpolate_value: virtual function for interpolating the progress * of a property * - * Base interface for #GObjects that can be animated by a - * a #ClutterAnimation. - * * Since: 1.0 */ struct _ClutterAnimatableInterface diff --git a/clutter/clutter/clutter-deprecated.h b/clutter/clutter/clutter-deprecated.h index 4b6147324a3..c2bb1cff264 100644 --- a/clutter/clutter/clutter-deprecated.h +++ b/clutter/clutter/clutter-deprecated.h @@ -4,7 +4,6 @@ #define __CLUTTER_DEPRECATED_H_INSIDE__ #include "deprecated/clutter-actor.h" -#include "deprecated/clutter-animation.h" #include "deprecated/clutter-box.h" #include "deprecated/clutter-container.h" #include "deprecated/clutter-group.h" diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index f7e8bc4c229..2d4f41c427b 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -190,7 +190,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/ * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for * registered global alpha functions * - * The animation modes used by #ClutterAnimation. This + * The animation modes used by #ClutterAnimatable. This * enumeration can be expanded in later versions of Clutter. * *
diff --git a/clutter/clutter/clutter-interval.c b/clutter/clutter/clutter-interval.c index 6f14287b402..97d2026aa81 100644 --- a/clutter/clutter/clutter-interval.c +++ b/clutter/clutter/clutter-interval.c @@ -37,9 +37,6 @@ * any object taking a reference on a #ClutterInterval instance should * also take ownership of the interval by using g_object_ref_sink(). * - * #ClutterInterval is used by #ClutterAnimation to define the - * interval of values that an implicit animation should tween over. - * * #ClutterInterval can be subclassed to override the validation * and value computation. * diff --git a/clutter/clutter/clutter-script-parser.c b/clutter/clutter/clutter-script-parser.c index c642893099f..bf3d5187839 100644 --- a/clutter/clutter/clutter-script-parser.c +++ b/clutter/clutter/clutter-script-parser.c @@ -798,87 +798,6 @@ parse_signals (ClutterScript *script, return retval; } -/* define the names of the animation modes to match the ones - * that developers might be more accustomed to - */ -static const struct -{ - const gchar *name; - ClutterAnimationMode mode; -} animation_modes[] = { - { "linear", CLUTTER_LINEAR }, - { "easeInQuad", CLUTTER_EASE_IN_QUAD }, - { "easeOutQuad", CLUTTER_EASE_OUT_QUAD }, - { "easeInOutQuad", CLUTTER_EASE_IN_OUT_QUAD }, - { "easeInCubic", CLUTTER_EASE_IN_CUBIC }, - { "easeOutCubic", CLUTTER_EASE_OUT_CUBIC }, - { "easeInOutCubic", CLUTTER_EASE_IN_OUT_CUBIC }, - { "easeInQuart", CLUTTER_EASE_IN_QUART }, - { "easeOutQuart", CLUTTER_EASE_OUT_QUART }, - { "easeInOutQuart", CLUTTER_EASE_IN_OUT_QUART }, - { "easeInQuint", CLUTTER_EASE_IN_QUINT }, - { "easeOutQuint", CLUTTER_EASE_OUT_QUINT }, - { "easeInOutQuint", CLUTTER_EASE_IN_OUT_QUINT }, - { "easeInSine", CLUTTER_EASE_IN_SINE }, - { "easeOutSine", CLUTTER_EASE_OUT_SINE }, - { "easeInOutSine", CLUTTER_EASE_IN_OUT_SINE }, - { "easeInExpo", CLUTTER_EASE_IN_EXPO }, - { "easeOutExpo", CLUTTER_EASE_OUT_EXPO }, - { "easeInOutExpo", CLUTTER_EASE_IN_OUT_EXPO }, - { "easeInCirc", CLUTTER_EASE_IN_CIRC }, - { "easeOutCirc", CLUTTER_EASE_OUT_CIRC }, - { "easeInOutCirc", CLUTTER_EASE_IN_OUT_CIRC }, - { "easeInElastic", CLUTTER_EASE_IN_ELASTIC }, - { "easeOutElastic", CLUTTER_EASE_OUT_ELASTIC }, - { "easeInOutElastic", CLUTTER_EASE_IN_OUT_ELASTIC }, - { "easeInBack", CLUTTER_EASE_IN_BACK }, - { "easeOutBack", CLUTTER_EASE_OUT_BACK }, - { "easeInOutBack", CLUTTER_EASE_IN_OUT_BACK }, - { "easeInBounce", CLUTTER_EASE_IN_BOUNCE }, - { "easeOutBounce", CLUTTER_EASE_OUT_BOUNCE }, - { "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE }, -}; - -static const gint n_animation_modes = G_N_ELEMENTS (animation_modes); - -gulong -_clutter_script_resolve_animation_mode (JsonNode *node) -{ - gint i, res = CLUTTER_CUSTOM_MODE; - - if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE) - return CLUTTER_CUSTOM_MODE; - - if (json_node_get_value_type (node) == G_TYPE_INT64) - return json_node_get_int (node); - - if (json_node_get_value_type (node) == G_TYPE_STRING) - { - const gchar *name = json_node_get_string (node); - - /* XXX - we might be able to optimize by changing the ordering - * of the animation_modes array, e.g. - * - special casing linear - * - tokenizing ('ease', 'In', 'Sine') and matching on token - * - binary searching? - */ - for (i = 0; i < n_animation_modes; i++) - { - if (strcmp (animation_modes[i].name, name) == 0) - return animation_modes[i].mode; - } - - if (_clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE, - name, - &res)) - return res; - - g_warning ("Unable to find the animation mode '%s'", name); - } - - return CLUTTER_CUSTOM_MODE; -} - static void clutter_script_parser_object_end (JsonParser *json_parser, JsonObject *object) diff --git a/clutter/clutter/clutter-script-private.h b/clutter/clutter/clutter-script-private.h index b17c0458109..52c240e2ad3 100644 --- a/clutter/clutter/clutter-script-private.h +++ b/clutter/clutter/clutter-script-private.h @@ -110,8 +110,6 @@ gboolean _clutter_script_parse_node (ClutterScript *script, GType _clutter_script_get_type_from_symbol (const gchar *symbol); GType _clutter_script_get_type_from_class (const gchar *name); -gulong _clutter_script_resolve_animation_mode (JsonNode *node); - gboolean _clutter_script_enum_from_string (GType gtype, const gchar *string, gint *enum_value); diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c index b6f7ac66653..cd0e795ebc0 100644 --- a/clutter/clutter/clutter-timeline.c +++ b/clutter/clutter/clutter-timeline.c @@ -24,7 +24,6 @@ /** * SECTION:clutter-timeline * @short_description: A class for time-based events - * @see_also: #ClutterAnimation, #ClutterAnimator, #ClutterState * * #ClutterTimeline is a base class for managing time-based event that cause * Clutter to redraw a stage, such as animations. @@ -71,7 +70,7 @@ * when reaching completion by using the #ClutterTimeline:auto-reverse property. * * Timelines are used in the Clutter animation framework by classes like - * #ClutterAnimation, #ClutterAnimator, and #ClutterState. + * #ClutterTransition. * * ## Defining Timelines in ClutterScript * diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index 35cf5580b75..1b65573a3cb 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -79,8 +79,6 @@ typedef struct _ClutterKnot ClutterKnot; typedef struct _ClutterMargin ClutterMargin; typedef struct _ClutterPerspective ClutterPerspective; -typedef struct _ClutterAnimation ClutterAnimation; - typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool; typedef struct _ClutterInputDevice ClutterInputDevice; typedef struct _ClutterVirtualInputDevice ClutterVirtualInputDevice; diff --git a/clutter/clutter/deprecated/clutter-animation.c b/clutter/clutter/deprecated/clutter-animation.c deleted file mode 100644 index 8bf9e73b318..00000000000 --- a/clutter/clutter/deprecated/clutter-animation.c +++ /dev/null @@ -1,1598 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2008 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Author: - * Emmanuele Bassi - */ - -/** - * SECTION:clutter-animation - * @short_description: Simple implicit animations - * @See_Also: #ClutterAnimatable, #ClutterInterval, #ClutterTimeline - * - * #ClutterAnimation is an object providing simple, implicit animations - * for #GObjects. - * - * #ClutterAnimation instances will bind one or more #GObject properties - * belonging to a #GObject to a #ClutterInterval, and will then interpolate the - * property between the initial and final values of the interval. - * - * The duration of the animation is set using clutter_animation_set_duration(). - * The easing mode of the animation is set using clutter_animation_set_mode(). - * - * If you want to control the animation you should retrieve the - * #ClutterTimeline using clutter_animation_get_timeline() and then - * use #ClutterTimeline functions like clutter_timeline_start(), - * clutter_timeline_pause() or clutter_timeline_stop(). - * - * A #ClutterAnimation will emit the #ClutterAnimation::completed signal - * when the #ClutterTimeline used by the animation is completed; unlike - * #ClutterTimeline, though, the #ClutterAnimation::completed will not be - * emitted if #ClutterAnimation:loop is set to %TRUE - that is, a looping - * animation never completes. - * - * If the #GObject instance bound to a #ClutterAnimation implements the - * #ClutterAnimatable interface it is possible for that instance to - * control the way the initial and final states are interpolated. - * - * For convenience, it is possible to use the clutter_actor_animate() - * function call which will take care of setting up and tearing down - * a #ClutterAnimation instance and animate an actor between its current - * state and the specified final state. - * - * #ClutterAnimation is available since Clutter 1.0. - * - * #ClutterAnimation has been deprecated in Clutter 1.12. You should use - * the [implicit animation API][clutter-actor-animation] available inside - * #ClutterActor instead. If you require to define explicit transitions for - * one or more properties in order to reuse them, see #ClutterTransition - * instead. - * - * ## Defining ClutterAnimationMode inside ClutterScript - * - * When defining a #ClutterAnimation inside a ClutterScript - * file or string the #ClutterAnimation:mode can be defined either - * using the #ClutterAnimationMode enumeration values through their - * "nick" (the short string used inside #GEnumValue), their numeric - * id, or using the following strings: - * - * - easeInQuad, easeOutQuad, easeInOutQuad - * - easeInCubic, easeOutCubic, easeInOutCubic - * - easeInQuart, easeOutQuart, easeInOutQuart - * - easeInQuint, easeOutQuint, easeInOutQuint - * - easeInSine, easeOutSine, easeInOutSine - * - easeInExpo, easeOutExpo, easeInOutExpo - * - easeInCirc, easeOutCirc, easeInOutCirc - * - easeInElastic, easeOutElastic, easeInOutElastic - * - easeInBack, easeOutBack, easeInOutBack - * - easeInBounce, easeOutBounce, easeInOutBounce - */ - -#include "clutter-build-config.h" - -#include -#include - -#define CLUTTER_DISABLE_DEPRECATION_WARNINGS - -#include "clutter-animatable.h" -#include "clutter-animation.h" -#include "clutter-debug.h" -#include "clutter-enum-types.h" -#include "clutter-interval.h" -#include "clutter-marshal.h" -#include "clutter-private.h" -#include "clutter-scriptable.h" -#include "clutter-script-private.h" - -#include "deprecated/clutter-animation.h" - -enum -{ - PROP_0, - - PROP_OBJECT, - PROP_MODE, - PROP_DURATION, - PROP_LOOP, - PROP_TIMELINE, - - PROP_LAST -}; - -static GParamSpec *obj_props[PROP_LAST]; - -enum -{ - STARTED, - COMPLETED, - - LAST_SIGNAL -}; - -struct _ClutterAnimationPrivate -{ - GObject *object; - - GHashTable *properties; - - ClutterTimeline *timeline; - - guint timeline_started_id; - guint timeline_completed_id; - guint timeline_frame_id; -}; - -static guint animation_signals[LAST_SIGNAL] = { 0, }; - -static GQuark quark_object_animation = 0; - -static void clutter_scriptable_init (ClutterScriptableIface *iface); - -static ClutterTimeline * clutter_animation_get_timeline_internal (ClutterAnimation *animation); - -G_DEFINE_TYPE_WITH_CODE (ClutterAnimation, clutter_animation, G_TYPE_OBJECT, - G_ADD_PRIVATE (ClutterAnimation) - G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE, - clutter_scriptable_init)); - -static void -on_actor_destroy (ClutterActor *actor, - ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - GObject *obj = G_OBJECT (actor); - - if (obj == priv->object) - { - g_object_set_qdata (priv->object, quark_object_animation, NULL); - g_signal_handlers_disconnect_by_func (priv->object, - G_CALLBACK (on_actor_destroy), - animation); - g_object_unref (animation); - } -} - -static void -clutter_animation_real_completed (ClutterAnimation *self) -{ - ClutterAnimationPrivate *priv = self->priv; - ClutterAnimatable *animatable = NULL; - ClutterAnimation *animation; - ClutterTimeline *timeline; - ClutterTimelineDirection direction; - gpointer key, value; - GHashTableIter iter; - - timeline = clutter_animation_get_timeline (self); - direction = clutter_timeline_get_direction (timeline); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - animatable = CLUTTER_ANIMATABLE (priv->object); - - /* explicitly set the final state of the animation */ - CLUTTER_NOTE (ANIMATION, "Set final state on object [%p]", priv->object); - g_hash_table_iter_init (&iter, priv->properties); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - const gchar *p_name = key; - ClutterInterval *interval = value; - GValue *p_value; - - if (direction == CLUTTER_TIMELINE_FORWARD) - p_value = clutter_interval_peek_final_value (interval); - else - p_value = clutter_interval_peek_initial_value (interval); - - if (animatable != NULL) - clutter_animatable_set_final_state (animatable, p_name, p_value); - else - g_object_set_property (priv->object, p_name, p_value); - } - - /* at this point, if this animation was created by clutter_actor_animate() - * and friends, the animation will be attached to the object's data; since - * we want to allow developers to use g_signal_connect_after("completed") - * to concatenate a new animation, we need to remove the animation back - * pointer here, and unref() the animation. FIXME - we might want to - * provide a clutter_animation_attach()/clutter_animation_detach() pair - * to let the user reattach an animation - */ - animation = g_object_get_qdata (priv->object, quark_object_animation); - if (animation == self) - { - CLUTTER_NOTE (ANIMATION, "Unsetting animation for actor [%p]", - priv->object); - - g_object_set_qdata (priv->object, quark_object_animation, NULL); - g_signal_handlers_disconnect_by_func (priv->object, - G_CALLBACK (on_actor_destroy), - animation); - - CLUTTER_NOTE (ANIMATION, "Releasing the reference Animation [%p]", - animation); - g_object_unref (animation); - } -} - -static void -clutter_animation_finalize (GObject *gobject) -{ - ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv; - - CLUTTER_NOTE (ANIMATION, - "Destroying properties table for Animation [%p]", - gobject); - g_hash_table_destroy (priv->properties); - - G_OBJECT_CLASS (clutter_animation_parent_class)->finalize (gobject); -} - -static void -clutter_animation_dispose (GObject *gobject) -{ - ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv; - ClutterTimeline *timeline; - - timeline = priv->timeline; - - if (timeline != NULL && priv->timeline_started_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_started_id); - - if (timeline != NULL && priv->timeline_completed_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_completed_id); - - if (timeline != NULL && priv->timeline_frame_id != 0) - g_signal_handler_disconnect (timeline, priv->timeline_frame_id); - - priv->timeline_started_id = 0; - priv->timeline_completed_id = 0; - priv->timeline_frame_id = 0; - - if (priv->timeline != NULL) - { - g_object_unref (priv->timeline); - priv->timeline = NULL; - } - - if (priv->object != NULL) - { - g_object_unref (priv->object); - priv->object = NULL; - } - - G_OBJECT_CLASS (clutter_animation_parent_class)->dispose (gobject); -} - -static void -clutter_animation_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ClutterAnimation *animation = CLUTTER_ANIMATION (gobject); - - switch (prop_id) - { - case PROP_OBJECT: - clutter_animation_set_object (animation, g_value_get_object (value)); - break; - - case PROP_MODE: - clutter_animation_set_mode (animation, g_value_get_ulong (value)); - break; - - case PROP_DURATION: - clutter_animation_set_duration (animation, g_value_get_uint (value)); - break; - - case PROP_LOOP: - clutter_animation_set_loop (animation, g_value_get_boolean (value)); - break; - - case PROP_TIMELINE: - clutter_animation_set_timeline (animation, g_value_get_object (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static void -clutter_animation_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ClutterAnimation *animation = CLUTTER_ANIMATION (gobject); - ClutterAnimationPrivate *priv = animation->priv; - - switch (prop_id) - { - case PROP_OBJECT: - g_value_set_object (value, priv->object); - break; - - case PROP_MODE: - g_value_set_ulong (value, clutter_animation_get_mode (animation)); - break; - - case PROP_DURATION: - g_value_set_uint (value, clutter_animation_get_duration (animation)); - break; - - case PROP_LOOP: - g_value_set_boolean (value, clutter_animation_get_loop (animation)); - break; - - case PROP_TIMELINE: - g_value_set_object (value, clutter_animation_get_timeline (animation)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - break; - } -} - -static gboolean -clutter_animation_parse_custom_node (ClutterScriptable *scriptable, - ClutterScript *script, - GValue *value, - const gchar *name, - JsonNode *node) -{ - if (strncmp (name, "mode", 4) == 0) - { - gulong mode; - - mode = _clutter_script_resolve_animation_mode (node); - - g_value_init (value, G_TYPE_ULONG); - g_value_set_ulong (value, mode); - - return TRUE; - } - - return FALSE; -} - -static void -clutter_scriptable_init (ClutterScriptableIface *iface) -{ - iface->parse_custom_node = clutter_animation_parse_custom_node; -} - -static void -clutter_animation_class_init (ClutterAnimationClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - quark_object_animation = - g_quark_from_static_string ("clutter-actor-animation"); - - klass->completed = clutter_animation_real_completed; - - gobject_class->set_property = clutter_animation_set_property; - gobject_class->get_property = clutter_animation_get_property; - gobject_class->dispose = clutter_animation_dispose; - gobject_class->finalize = clutter_animation_finalize; - - /** - * ClutterAnimation:object: - * - * The #GObject to which the animation applies. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_OBJECT] = - g_param_spec_object ("object", - P_("Object"), - P_("Object to which the animation applies"), - G_TYPE_OBJECT, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:mode: - * - * A #ClutterAnimationMode. default value is %CLUTTER_LINEAR. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_MODE] = - g_param_spec_ulong ("mode", - P_("Mode"), - P_("The mode of the animation"), - 0, G_MAXULONG, - CLUTTER_LINEAR, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:duration: - * - * The duration of the animation, expressed in milliseconds. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_DURATION] = - g_param_spec_uint ("duration", - P_("Duration"), - P_("Duration of the animation, in milliseconds"), - 0, G_MAXUINT, - 0, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:loop: - * - * Whether the animation should loop. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_LOOP] = - g_param_spec_boolean ("loop", - P_("Loop"), - P_("Whether the animation should loop"), - FALSE, - CLUTTER_PARAM_READWRITE); - - /** - * ClutterAnimation:timeline: - * - * The #ClutterTimeline used by the animation. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - obj_props[PROP_TIMELINE] = - g_param_spec_object ("timeline", - P_("Timeline"), - P_("The timeline used by the animation"), - CLUTTER_TYPE_TIMELINE, - CLUTTER_PARAM_READWRITE); - - g_object_class_install_properties (gobject_class, - PROP_LAST, - obj_props); - - /** - * ClutterAnimation::started: - * @animation: the animation that emitted the signal - * - * The ::started signal is emitted once the animation has been - * started - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - animation_signals[STARTED] = - g_signal_new (I_("started"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterAnimationClass, started), - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - /** - * ClutterAnimation::completed: - * @animation: the animation that emitted the signal - * - * The ::completed signal is emitted once the animation has - * been completed. - * - * The @animation instance is guaranteed to be valid for the entire - * duration of the signal emission chain. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ - animation_signals[COMPLETED] = - g_signal_new (I_("completed"), - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterAnimationClass, completed), - NULL, NULL, NULL, - G_TYPE_NONE, 0); -} - -static void -clutter_animation_init (ClutterAnimation *self) -{ - self->priv = clutter_animation_get_instance_private (self); - - self->priv->properties = - g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) g_object_unref); -} - -static inline void -clutter_animation_bind_property_internal (ClutterAnimation *animation, - const gchar *property_name, - GParamSpec *pspec, - ClutterInterval *interval) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (!clutter_interval_validate (interval, pspec)) - { - g_warning ("Cannot bind property '%s': the interval is out " - "of bounds", - property_name); - return; - } - - g_hash_table_insert (priv->properties, - g_strdup (property_name), - g_object_ref_sink (interval)); -} - -static inline void -clutter_animation_update_property_internal (ClutterAnimation *animation, - const gchar *property_name, - GParamSpec *pspec, - ClutterInterval *interval) -{ - ClutterAnimationPrivate *priv = animation->priv; - - if (!clutter_interval_validate (interval, pspec)) - { - g_warning ("Cannot bind property '%s': the interval is out " - "of bounds", - property_name); - return; - } - - g_hash_table_replace (priv->properties, - g_strdup (property_name), - g_object_ref_sink (interval)); -} - -/** - * clutter_animation_has_property: - * @animation: a #ClutterAnimation - * @property_name: name of the property - * - * Checks whether @animation is controlling @property_name. - * - * Return value: %TRUE if the property is animated by the - * #ClutterAnimation, %FALSE otherwise - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gboolean -clutter_animation_has_property (ClutterAnimation *animation, - const gchar *property_name) -{ - ClutterAnimationPrivate *priv; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE); - g_return_val_if_fail (property_name != NULL, FALSE); - - priv = animation->priv; - - return g_hash_table_lookup (priv->properties, property_name) != NULL; -} - -/** - * clutter_animation_get_interval: - * @animation: a #ClutterAnimation - * @property_name: name of the property - * - * Retrieves the #ClutterInterval associated to @property_name - * inside @animation. - * - * Return value: (transfer none): a #ClutterInterval or %NULL if no - * property with the same name was found. The returned interval is - * owned by the #ClutterAnimation and should not be unreferenced - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterInterval * -clutter_animation_get_interval (ClutterAnimation *animation, - const gchar *property_name) -{ - ClutterAnimationPrivate *priv; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), NULL); - g_return_val_if_fail (property_name != NULL, NULL); - - priv = animation->priv; - - return g_hash_table_lookup (priv->properties, property_name); -} - -static void -on_timeline_started (ClutterTimeline *timeline, - ClutterAnimation *animation) -{ - g_signal_emit (animation, animation_signals[STARTED], 0); -} - -static void -on_timeline_completed (ClutterTimeline *timeline, - ClutterAnimation *animation) -{ - CLUTTER_NOTE (ANIMATION, "Timeline [%p] complete", timeline); - - if (!clutter_animation_get_loop (animation)) - g_signal_emit (animation, animation_signals[COMPLETED], 0); -} - -static void -on_timeline_frame (ClutterTimeline *timeline, - gint elapsed, - ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv; - GList *properties, *p; - gdouble alpha_value; - gboolean is_animatable = FALSE; - ClutterAnimatable *animatable = NULL; - - /* make sure the animation survives the notification */ - g_object_ref (animation); - - priv = animation->priv; - - alpha_value = clutter_timeline_get_progress (priv->timeline); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - { - animatable = CLUTTER_ANIMATABLE (priv->object); - is_animatable = TRUE; - } - - g_object_freeze_notify (priv->object); - - properties = g_hash_table_get_keys (priv->properties); - for (p = properties; p != NULL; p = p->next) - { - const gchar *p_name = p->data; - ClutterInterval *interval; - GValue value = G_VALUE_INIT; - gboolean apply; - - interval = g_hash_table_lookup (priv->properties, p_name); - g_assert (CLUTTER_IS_INTERVAL (interval)); - - g_value_init (&value, clutter_interval_get_value_type (interval)); - - if (is_animatable) - { - apply = clutter_animatable_interpolate_value (animatable, p_name, - interval, - alpha_value, - &value); - } - else - { - apply = clutter_interval_compute_value (interval, - alpha_value, - &value); - } - - if (apply) - { - if (is_animatable) - clutter_animatable_set_final_state (animatable, p_name, &value); - else - g_object_set_property (priv->object, p_name, &value); - } - - g_value_unset (&value); - } - - g_list_free (properties); - - g_object_thaw_notify (priv->object); - - g_object_unref (animation); -} - -static ClutterTimeline * -clutter_animation_get_timeline_internal (ClutterAnimation *animation) -{ - ClutterAnimationPrivate *priv = animation->priv; - ClutterTimeline *timeline; - - if (priv->timeline != NULL) - return priv->timeline; - - timeline = g_object_new (CLUTTER_TYPE_TIMELINE, NULL); - - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - - priv->timeline = timeline; - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - - return priv->timeline; -} - -/** - * clutter_animation_new: - * - * Creates a new #ClutterAnimation instance. You should set the - * #GObject to be animated using clutter_animation_set_object(), - * set the duration with clutter_animation_set_duration() and the - * easing mode using clutter_animation_set_mode(). - * - * The clutter_actor_animate() and relative family of functions provide - * an easy way to animate a #ClutterActor and automatically manage the - * lifetime of a #ClutterAnimation instance, so you should consider using - * those functions instead of manually creating an animation. - * - * Return value: the newly created #ClutterAnimation. Use g_object_unref() - * to release the associated resources - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterAnimation * -clutter_animation_new (void) -{ - return g_object_new (CLUTTER_TYPE_ANIMATION, NULL); -} - -/** - * clutter_animation_set_object: - * @animation: a #ClutterAnimation - * @object: a #GObject - * - * Attaches @animation to @object. The #ClutterAnimation will take a - * reference on @object. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_object (ClutterAnimation *animation, - GObject *object) -{ - ClutterAnimationPrivate *priv; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - - priv = animation->priv; - - if (priv->object != NULL) - { - g_object_set_qdata (priv->object, quark_object_animation, NULL); - - g_object_unref (priv->object); - priv->object = NULL; - } - - if (object != NULL) - priv->object = g_object_ref (object); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_OBJECT]); -} - -/** - * clutter_animation_set_mode: - * @animation: a #ClutterAnimation - * @mode: an animation mode logical id - * - * Sets the animation @mode of @animation. The animation @mode is - * a logical id, coming from the #ClutterAnimationMode enumeration. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_mode (ClutterAnimation *animation, - gulong mode) -{ - ClutterTimeline *timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - timeline = clutter_animation_get_timeline_internal (animation); - - clutter_timeline_set_progress_mode (timeline, mode); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_MODE]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_mode: - * @animation: a #ClutterAnimation - * - * Retrieves the animation mode of @animation, as set by - * clutter_animation_set_mode(). - * - * Return value: the mode for the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gulong -clutter_animation_get_mode (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), CLUTTER_LINEAR); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_progress_mode (timeline); -} - -/** - * clutter_animation_set_duration: - * @animation: a #ClutterAnimation - * @msecs: the duration in milliseconds - * - * Sets the duration of @animation in milliseconds. - * - * This function will set #ClutterAnimation:timeline if needed. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_duration (ClutterAnimation *animation, - guint msecs) -{ - ClutterTimeline *timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - timeline = clutter_animation_get_timeline_internal (animation); - clutter_timeline_set_duration (timeline, msecs); - clutter_timeline_rewind (timeline); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_set_loop: - * @animation: a #ClutterAnimation - * @loop: %TRUE if the animation should loop - * - * Sets whether @animation should loop over itself once finished. - * - * A looping #ClutterAnimation will not emit the #ClutterAnimation::completed - * signal when finished. - * - * This function will set #ClutterAnimation:timeline if needed. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_loop (ClutterAnimation *animation, - gboolean loop) -{ - ClutterTimeline *timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - - g_object_freeze_notify (G_OBJECT (animation)); - - timeline = clutter_animation_get_timeline_internal (animation); - clutter_timeline_set_repeat_count (timeline, loop ? -1 : 0); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_loop: - * @animation: a #ClutterAnimation - * - * Retrieves whether @animation is looping. - * - * Return value: %TRUE if the animation is looping - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -gboolean -clutter_animation_get_loop (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_repeat_count (timeline) != 0; -} - -/** - * clutter_animation_get_duration: - * @animation: a #ClutterAnimation - * - * Retrieves the duration of @animation, in milliseconds. - * - * Return value: the duration of the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -guint -clutter_animation_get_duration (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), 0); - - timeline = clutter_animation_get_timeline_internal (animation); - - return clutter_timeline_get_duration (timeline); -} - -/** - * clutter_animation_set_timeline: - * @animation: a #ClutterAnimation - * @timeline: (allow-none): a #ClutterTimeline, or %NULL to unset the - * current #ClutterTimeline - * - * Sets the #ClutterTimeline used by @animation. - * - * This function will take a reference on the passed @timeline. - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -void -clutter_animation_set_timeline (ClutterAnimation *animation, - ClutterTimeline *timeline) -{ - ClutterAnimationPrivate *priv; - ClutterTimeline *cur_timeline; - - g_return_if_fail (CLUTTER_IS_ANIMATION (animation)); - g_return_if_fail (timeline == NULL || CLUTTER_IS_TIMELINE (timeline)); - - priv = animation->priv; - - cur_timeline = priv->timeline; - - if (cur_timeline == timeline) - return; - - g_object_freeze_notify (G_OBJECT (animation)); - - if (cur_timeline != NULL && priv->timeline_started_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_started_id); - - if (cur_timeline != NULL && priv->timeline_completed_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_completed_id); - - if (cur_timeline != NULL && priv->timeline_frame_id != 0) - g_signal_handler_disconnect (cur_timeline, priv->timeline_frame_id); - - priv->timeline_started_id = 0; - priv->timeline_completed_id = 0; - priv->timeline_frame_id = 0; - - /* Release previously set timeline if any */ - g_clear_object (&priv->timeline); - - priv->timeline = timeline; - - if (priv->timeline) - g_object_ref (priv->timeline); - - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_TIMELINE]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_DURATION]); - g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_LOOP]); - - if (timeline != NULL) - { - priv->timeline_started_id = - g_signal_connect (timeline, "started", - G_CALLBACK (on_timeline_started), - animation); - priv->timeline_completed_id = - g_signal_connect (timeline, "completed", - G_CALLBACK (on_timeline_completed), - animation); - priv->timeline_frame_id = - g_signal_connect (timeline, "new-frame", - G_CALLBACK (on_timeline_frame), - animation); - } - - g_object_thaw_notify (G_OBJECT (animation)); -} - -/** - * clutter_animation_get_timeline: - * @animation: a #ClutterAnimation - * - * Retrieves the #ClutterTimeline used by @animation - * - * Return value: (transfer none): the timeline used by the animation - * - * Since: 1.0 - * Deprecated: 1.12: Use #ClutterPropertyTransition instead - */ -ClutterTimeline * -clutter_animation_get_timeline (ClutterAnimation *animation) -{ - g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), NULL); - - return clutter_animation_get_timeline_internal (animation); -} - -/* - * starts the timeline - */ -static void -clutter_animation_start (ClutterAnimation *animation) -{ - ClutterTimeline *timeline; - - timeline = clutter_animation_get_timeline_internal (animation); - - if (G_LIKELY (timeline != NULL)) - clutter_timeline_start (timeline); - else - { - /* sanity check */ - g_warning (G_STRLOC ": no timeline found, unable to start the animation"); - } -} - -static void -clutter_animation_setup_property (ClutterAnimation *animation, - const gchar *property_name, - const GValue *value, - GParamSpec *pspec, - gboolean is_fixed) -{ - ClutterAnimationPrivate *priv = animation->priv; - GValue real_value = G_VALUE_INIT; - - if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) - { - g_warning ("Cannot bind property '%s': the property is " - "construct-only", - property_name); - return; - } - - if (!(pspec->flags & G_PARAM_WRITABLE)) - { - g_warning ("Cannot bind property '%s': the property is " - "not writable", - property_name); - return; - } - - /* initialize the real value that will be used to store the - * final state of the animation - */ - g_value_init (&real_value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - - /* if it's not the same type of the GParamSpec value, try to - * convert it using the GValue transformation API, otherwise - * just copy it - */ - if (!g_type_is_a (G_VALUE_TYPE (value), G_VALUE_TYPE (&real_value))) - { - /* are these two types compatible (can be directly copied)? */ - if (g_value_type_compatible (G_VALUE_TYPE (value), - G_VALUE_TYPE (&real_value))) - { - g_value_copy (value, &real_value); - goto done; - } - - /* are these two type transformable? */ - if (g_value_type_transformable (G_VALUE_TYPE (value), - G_VALUE_TYPE (&real_value))) - { - if (g_value_transform (value, &real_value)) - goto done; - } - - /* if not compatible and not transformable then we can't do much */ - g_warning ("%s: Unable to convert from %s to %s for " - "the property '%s' of object %s", - G_STRLOC, - g_type_name (G_VALUE_TYPE (value)), - g_type_name (G_VALUE_TYPE (&real_value)), - property_name, - G_OBJECT_TYPE_NAME (priv->object)); - g_value_unset (&real_value); - return; - } - else - g_value_copy (value, &real_value); - -done: - /* create an interval and bind it to the property, in case - * it's not a fixed property, otherwise just set it - */ - if (G_LIKELY (!is_fixed)) - { - ClutterInterval *interval; - GValue cur_value = G_VALUE_INIT; - - g_value_init (&cur_value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - clutter_animatable_get_initial_state (CLUTTER_ANIMATABLE (priv->object), - property_name, - &cur_value); - else - g_object_get_property (priv->object, property_name, &cur_value); - - interval = - clutter_interval_new_with_values (G_PARAM_SPEC_VALUE_TYPE (pspec), - &cur_value, - &real_value); - - if (!clutter_animation_has_property (animation, property_name)) - clutter_animation_bind_property_internal (animation, property_name, - pspec, - interval); - else - clutter_animation_update_property_internal (animation, property_name, - pspec, - interval); - - g_value_unset (&cur_value); - } - else - { - if (CLUTTER_IS_ANIMATABLE (priv->object)) - clutter_animatable_set_final_state (CLUTTER_ANIMATABLE (priv->object), - property_name, - &real_value); - else - g_object_set_property (priv->object, property_name, &real_value); - } - - g_value_unset (&real_value); -} - -static const struct -{ - const gchar *name; - GConnectFlags flags; -} signal_prefixes[] = - { - { "::", 0 }, - { "-swapped::", G_CONNECT_SWAPPED }, - { "-after::", G_CONNECT_AFTER }, - { "-swapped-after::", G_CONNECT_SWAPPED | G_CONNECT_AFTER } - }; - -static gboolean -clutter_animation_has_signal_prefix (const gchar *property_name, - GConnectFlags *flags, - int *offset) -{ - int i; - - if (!g_str_has_prefix (property_name, "signal")) - return FALSE; - - for (i = 0; i < G_N_ELEMENTS (signal_prefixes); i++) - if (g_str_has_prefix (property_name + 6, signal_prefixes[i].name)) - { - *offset = strlen (signal_prefixes[i].name) + 6; - *flags = signal_prefixes[i].flags; - return TRUE; - } - - return FALSE; -} - -static void -clutter_animation_setup_valist (ClutterAnimation *animation, - const gchar *first_property_name, - va_list var_args) -{ - ClutterAnimationPrivate *priv = animation->priv; - ClutterAnimatable *animatable = NULL; - GObjectClass *klass = NULL; - const gchar *property_name; - - if (CLUTTER_IS_ANIMATABLE (priv->object)) - animatable = CLUTTER_ANIMATABLE (priv->object); - else - klass = G_OBJECT_GET_CLASS (priv->object); - - property_name = first_property_name; - while (property_name != NULL) - { - GParamSpec *pspec; - GValue final = G_VALUE_INIT; - gchar *error = NULL; - gboolean is_fixed = FALSE; - GConnectFlags flags; - int offset; - - if (clutter_animation_has_signal_prefix (property_name, - &flags, - &offset)) - { - const gchar *signal_name = property_name + offset; - GCallback callback = va_arg (var_args, GCallback); - gpointer userdata = va_arg (var_args, gpointer); - - g_signal_connect_data (animation, signal_name, - callback, userdata, - NULL, flags); - } - else - { - if (g_str_has_prefix (property_name, "fixed::")) - { - property_name += 7; /* strlen("fixed::") */ - is_fixed = TRUE; - } - - if (animatable != NULL) - pspec = clutter_animatable_find_property (animatable, - property_name); - else - pspec = g_object_class_find_property (klass, property_name); - - if (pspec == NULL) - { - g_warning ("Cannot bind property '%s': objects of type '%s' do " - "not have this property", - property_name, - g_type_name (G_OBJECT_TYPE (priv->object))); - break; - } - - G_VALUE_COLLECT_INIT (&final, G_PARAM_SPEC_VALUE_TYPE (pspec), - var_args, 0, - &error); - - if (error) - { - g_warning ("%s: %s", G_STRLOC, error); - g_free (error); - break; - } - - clutter_animation_setup_property (animation, property_name, - &final, - pspec, - is_fixed); - - - g_value_unset (&final); - } - - property_name = va_arg (var_args, gchar*); - } -} - -static ClutterAnimation * -animation_create_for_actor (ClutterActor *actor) -{ - ClutterAnimation *animation; - GObject *object = G_OBJECT (actor); - - animation = g_object_get_qdata (object, quark_object_animation); - if (animation == NULL) - { - animation = clutter_animation_new (); - clutter_animation_set_object (animation, object); - g_object_set_qdata (object, quark_object_animation, animation); - - /* use the ::destroy signal to get a notification - * that the actor went away mid-animation - */ - g_signal_connect (object, "destroy", - G_CALLBACK (on_actor_destroy), - animation); - - CLUTTER_NOTE (ANIMATION, - "Created new Animation [%p] for actor [%p]", - animation, - actor); - } - else - { - CLUTTER_NOTE (ANIMATION, - "Reusing Animation [%p] for actor [%p]", - animation, - actor); - } - - return animation; -} - -/** - * clutter_actor_animate_with_timeline: - * @actor: a #ClutterActor - * @mode: an animation mode logical id - * @timeline: a #ClutterTimeline - * @first_property_name: the name of a property - * @...: a %NULL terminated list of property names and - * property values - * - * Animates the given list of properties of @actor between the current - * value for each property and a new final value. The animation has a - * definite duration given by @timeline and a speed given by the @mode. - * - * See clutter_actor_animate() for further details. - * - * This function is useful if you want to use an existing timeline - * to animate @actor. - * - * Return value: (transfer none): a #ClutterAnimation object. The object is - * owned by the #ClutterActor and should not be unreferenced with - * g_object_unref() - * - * Since: 1.0 - * Deprecated: 1.12: Use the implicit transition for animatable properties - * in #ClutterActor instead. See clutter_actor_save_easing_state(), - * clutter_actor_set_easing_mode(), clutter_actor_set_easing_duration(), - * clutter_actor_set_easing_delay(), and clutter_actor_restore_easing_state(). - */ -ClutterAnimation * -clutter_actor_animate_with_timeline (ClutterActor *actor, - gulong mode, - ClutterTimeline *timeline, - const gchar *first_property_name, - ...) -{ - ClutterAnimation *animation; - va_list args; - - g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); - g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), NULL); - g_return_val_if_fail (first_property_name != NULL, NULL); - - animation = animation_create_for_actor (actor); - clutter_animation_set_mode (animation, mode); - clutter_animation_set_timeline (animation, timeline); - - va_start (args, first_property_name); - clutter_animation_setup_valist (animation, first_property_name, args); - va_end (args); - - clutter_animation_start (animation); - - return animation; -} - -/** - * clutter_actor_animate: - * @actor: a #ClutterActor - * @mode: an animation mode logical id - * @duration: duration of the animation, in milliseconds - * @first_property_name: the name of a property - * @...: a %NULL terminated list of property names and - * property values - * - * Animates the given list of properties of @actor between the current - * value for each property and a new final value. The animation has a - * definite duration and a speed given by the @mode. - * - * For example, this: - * - * |[ - * clutter_actor_animate (rectangle, CLUTTER_LINEAR, 250, - * "width", 100.0, - * "height", 100.0, - * NULL); - * ]| - * - * will make width and height properties of the #ClutterActor "rectangle" - * grow linearly between the current value and 100 pixels, in 250 milliseconds. - * - * The animation @mode is a logical id, from the #ClutterAnimationMode. - * - * All the properties specified will be animated between the current value - * and the final value. If a property should be set at the beginning of - * the animation but not updated during the animation, it should be prefixed - * by the "fixed::" string, for instance: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_SINE, 100, - * "rotation-angle-z", 360.0, - * "fixed::rotation-center-z", ¢er, - * NULL); - * ]| - * - * Will animate the "rotation-angle-z" property between the current value - * and 360 degrees, and set the "rotation-center-z" property to the fixed - * value of the #graphene_point3d_t "center". - * - * This function will implicitly create a #ClutterAnimation object which - * will be assigned to the @actor and will be returned to the developer - * to control the animation or to know when the animation has been - * completed. - * - * If a name argument starts with "signal::", "signal-after::", - * "signal-swapped::" or "signal-swapped-after::" the two following arguments - * are used as callback function and data for a signal handler installed on - * the #ClutterAnimation object for the specified signal name, for instance: - * - * |[ - * static void - * on_animation_completed (ClutterAnimation *animation, - * ClutterActor *actor) - * { - * clutter_actor_hide (actor); - * } - * - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 100, - * "opacity", 0, - * "signal::completed", on_animation_completed, actor, - * NULL); - * ]| - * - * or, to automatically destroy an actor at the end of the animation: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 100, - * "opacity", 0, - * "signal-swapped-after::completed", - * clutter_actor_destroy, - * actor, - * NULL); - * ]| - * - * The "signal::" modifier is the equivalent of using g_signal_connect(); - * the "signal-after::" modifier is the equivalent of using - * g_signal_connect_after() or g_signal_connect_data() with the - * %G_CONNECT_AFTER; the "signal-swapped::" modifier is the equivalent - * of using g_signal_connect_swapped() or g_signal_connect_data() with the - * %G_CONNECT_SWAPPED flah; finally, the "signal-swapped-after::" modifier - * is the equivalent of using g_signal_connect_data() with both the - * %G_CONNECT_AFTER and %G_CONNECT_SWAPPED flags. The clutter_actor_animate() - * function will not keep track of multiple connections to the same signal, - * so it is your responsability to avoid them when calling - * clutter_actor_animate() multiple times on the same actor. - * - * Calling this function on an actor that is already being animated - * will cause the current animation to change with the new final values, - * the new easing mode and the new duration - that is, this code: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_LINEAR, 250, - * "width", 100.0, - * "height", 100.0, - * NULL); - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 500, - * "x", 100.0, - * "y", 100.0, - * "width", 200.0, - * NULL); - * ]| - * - * is the equivalent of: - * - * |[ - * clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 500, - * "x", 100.0, - * "y", 100.0, - * "width", 200.0, - * "height", 100.0, - * NULL); - * ]| - * - * Unless the animation is looping, the #ClutterAnimation created by - * clutter_actor_animate() will become invalid as soon as it is - * complete. - * - * Since the created #ClutterAnimation instance attached to @actor - * is guaranteed to be valid throughout the #ClutterAnimation::completed - * signal emission chain, you will not be able to create a new animation - * using clutter_actor_animate() on the same @actor from within the - * #ClutterAnimation::completed signal handler unless you use - * g_signal_connect_after() to connect the callback function, for instance: - * - * |[ - * static void - * on_animation_completed (ClutterAnimation *animation, - * ClutterActor *actor) - * { - * clutter_actor_animate (actor, CLUTTER_EASE_OUT_CUBIC, 250, - * "x", 500.0, - * "y", 500.0, - * NULL); - * } - * - * ... - * animation = clutter_actor_animate (actor, CLUTTER_EASE_IN_CUBIC, 250, - * "x", 100.0, - * "y", 100.0, - * NULL); - * g_signal_connect (animation, "completed", - * G_CALLBACK (on_animation_completed), - * actor); - * ... - * ]| - * - * Return value: (transfer none): a #ClutterAnimation object. The object is - * owned by the #ClutterActor and should not be unreferenced with - * g_object_unref() - * - * Since: 1.0 - * Deprecated: 1.12: Use the implicit transition for animatable properties - * in #ClutterActor instead. See clutter_actor_save_easing_state(), - * clutter_actor_set_easing_mode(), clutter_actor_set_easing_duration(), - * clutter_actor_set_easing_delay(), and clutter_actor_restore_easing_state(). - */ -ClutterAnimation * -clutter_actor_animate (ClutterActor *actor, - gulong mode, - guint duration, - const gchar *first_property_name, - ...) -{ - ClutterAnimation *animation; - va_list args; - - g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL); - g_return_val_if_fail (mode != CLUTTER_CUSTOM_MODE, NULL); - g_return_val_if_fail (duration > 0, NULL); - g_return_val_if_fail (first_property_name != NULL, NULL); - - animation = animation_create_for_actor (actor); - clutter_animation_set_mode (animation, mode); - clutter_animation_set_duration (animation, duration); - - va_start (args, first_property_name); - clutter_animation_setup_valist (animation, first_property_name, args); - va_end (args); - - clutter_animation_start (animation); - - return animation; -} diff --git a/clutter/clutter/deprecated/clutter-animation.h b/clutter/clutter/deprecated/clutter-animation.h deleted file mode 100644 index 012cf44e703..00000000000 --- a/clutter/clutter/deprecated/clutter-animation.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Clutter. - * - * An OpenGL based 'interactive canvas' library. - * - * Copyright (C) 2008 Intel Corporation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Author: - * Emmanuele Bassi - */ - -#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) -#error "Only can be included directly." -#endif - -#ifndef __CLUTTER_ANIMATION_H__ -#define __CLUTTER_ANIMATION_H__ - -#include - -G_BEGIN_DECLS - -#define CLUTTER_TYPE_ANIMATION (clutter_animation_get_type ()) -#define CLUTTER_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimation)) -#define CLUTTER_IS_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATION)) -#define CLUTTER_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass)) -#define CLUTTER_IS_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ANIMATION)) -#define CLUTTER_ANIMATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ANIMATION, ClutterAnimationClass)) - -typedef struct _ClutterAnimationPrivate ClutterAnimationPrivate; -typedef struct _ClutterAnimationClass ClutterAnimationClass; - -/** - * ClutterAnimation: - * - * The #ClutterAnimation structure contains only private data and should - * be accessed using the provided functions. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use the implicit animation on #ClutterActor - */ -struct _ClutterAnimation -{ - /*< private >*/ - GObject parent_instance; - - ClutterAnimationPrivate *priv; -}; - -/** - * ClutterAnimationClass: - * @started: class handler for the #ClutterAnimation::started signal - * @completed: class handler for the #ClutterAnimation::completed signal - * - * The #ClutterAnimationClass structure contains only private data and - * should be accessed using the provided functions. - * - * Since: 1.0 - * - * Deprecated: 1.12: Use the implicit animation on #ClutterActor - */ -struct _ClutterAnimationClass -{ - /*< private >*/ - GObjectClass parent_class; - - /*< public >*/ - void (* started) (ClutterAnimation *animation); - void (* completed) (ClutterAnimation *animation); - - /*< private >*/ - /* padding for future expansion */ - void (*_clutter_reserved1) (void); - void (*_clutter_reserved2) (void); - void (*_clutter_reserved3) (void); - void (*_clutter_reserved4) (void); - void (*_clutter_reserved5) (void); - void (*_clutter_reserved6) (void); - void (*_clutter_reserved7) (void); - void (*_clutter_reserved8) (void); -}; - -CLUTTER_DEPRECATED -GType clutter_animation_get_type (void) G_GNUC_CONST; - -CLUTTER_DEPRECATED_FOR(clutter_property_transition_new) -ClutterAnimation * clutter_animation_new (void); - -CLUTTER_DEPRECATED_FOR(clutter_transition_set_animatable) -void clutter_animation_set_object (ClutterAnimation *animation, - GObject *object); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_progress_mode) -void clutter_animation_set_mode (ClutterAnimation *animation, - gulong mode); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_progress_mode) -gulong clutter_animation_get_mode (ClutterAnimation *animation); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_duration) -void clutter_animation_set_duration (ClutterAnimation *animation, - guint msecs); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_duration) -guint clutter_animation_get_duration (ClutterAnimation *animation); -CLUTTER_DEPRECATED_FOR(clutter_timeline_set_repeat_count) -void clutter_animation_set_loop (ClutterAnimation *animation, - gboolean loop); -CLUTTER_DEPRECATED_FOR(clutter_timeline_get_repeat_count) -gboolean clutter_animation_get_loop (ClutterAnimation *animation); -CLUTTER_DEPRECATED -void clutter_animation_set_timeline (ClutterAnimation *animation, - ClutterTimeline *timeline); -CLUTTER_DEPRECATED -ClutterTimeline * clutter_animation_get_timeline (ClutterAnimation *animation); -CLUTTER_DEPRECATED -gboolean clutter_animation_has_property (ClutterAnimation *animation, - const gchar *property_name); -CLUTTER_DEPRECATED -ClutterInterval * clutter_animation_get_interval (ClutterAnimation *animation, - const gchar *property_name); - -/* - * ClutterActor API - */ - -CLUTTER_DEPRECATED -ClutterAnimation * clutter_actor_animate (ClutterActor *actor, - gulong mode, - guint duration, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; -CLUTTER_DEPRECATED -ClutterAnimation * clutter_actor_animate_with_timeline (ClutterActor *actor, - gulong mode, - ClutterTimeline *timeline, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; - -G_END_DECLS - -#endif /* __CLUTTER_ANIMATION_DEPRECATED_H__ */ diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index 22c5e4ee4a5..f21d0e77c3a 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -219,7 +219,6 @@ clutter_nonintrospected_sources = [ clutter_deprecated_headers = [ 'deprecated/clutter-actor.h', - 'deprecated/clutter-animation.h', 'deprecated/clutter-box.h', 'deprecated/clutter-container.h', 'deprecated/clutter-group.h', @@ -229,7 +228,6 @@ clutter_deprecated_headers = [ ] clutter_deprecated_sources = [ - 'deprecated/clutter-animation.c', 'deprecated/clutter-box.c', 'deprecated/clutter-group.c', 'deprecated/clutter-rectangle.c', diff --git a/src/tests/clutter/conform/script-parser.c b/src/tests/clutter/conform/script-parser.c index b51db38d6a3..7a7e6a8b6c3 100644 --- a/src/tests/clutter/conform/script-parser.c +++ b/src/tests/clutter/conform/script-parser.c @@ -251,28 +251,6 @@ script_named_object (void) g_free (test_file); } -static void -script_animation (void) -{ - ClutterScript *script = clutter_script_new (); - GObject *animation = NULL; - GError *error = NULL; - gchar *test_file; - - test_file = g_test_build_filename (G_TEST_DIST, "scripts", "test-script-animation.json", NULL); - clutter_script_load_from_file (script, test_file, &error); - if (g_test_verbose () && error) - g_print ("Error: %s", error->message); - - g_assert_no_error (error); - - animation = clutter_script_get_object (script, "test"); - g_assert (CLUTTER_IS_ANIMATION (animation)); - - g_object_unref (script); - g_free (test_file); -} - static void script_layout_property (void) { @@ -383,7 +361,6 @@ CLUTTER_TEST_SUITE ( CLUTTER_TEST_UNIT ("/script/single-object", script_single) CLUTTER_TEST_UNIT ("/script/container-child", script_child) CLUTTER_TEST_UNIT ("/script/named-object", script_named_object) - CLUTTER_TEST_UNIT ("/script/animation", script_animation) CLUTTER_TEST_UNIT ("/script/object-property", script_object_property) CLUTTER_TEST_UNIT ("/script/layout-property", script_layout_property) CLUTTER_TEST_UNIT ("/script/actor-margin", script_margin) diff --git a/src/tests/clutter/conform/scripts/test-script-animation.json b/src/tests/clutter/conform/scripts/test-script-animation.json deleted file mode 100644 index d6ef90343f9..00000000000 --- a/src/tests/clutter/conform/scripts/test-script-animation.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type" : "ClutterAnimation", - "id" : "test", - "mode" : "easeInCubic", - "duration" : 500, - "object" : { - "type" : "ClutterRectangle", - "id" : "rect", - "opacity" : 128, - "width" : 100, - "height" : 16, - "color" : "white" - } -} diff --git a/src/tests/clutter/interactive/meson.build b/src/tests/clutter/interactive/meson.build index 59aead6351c..0e7180f1360 100644 --- a/src/tests/clutter/interactive/meson.build +++ b/src/tests/clutter/interactive/meson.build @@ -17,7 +17,6 @@ clutter_tests_interactive_link_args = [ clutter_tests_interactive_test_sources = [ 'test-events.c', 'test-actors.c', - 'test-shader-effects.c', 'test-script.c', 'test-grab.c', 'test-cogl-shader-glsl.c', @@ -25,9 +24,7 @@ clutter_tests_interactive_test_sources = [ 'test-cogl-tex-convert.c', 'test-cogl-offscreen.c', 'test-cogl-tex-polygon.c', - 'test-cogl-multitexture.c', 'test-paint-wrapper.c', - 'test-layout.c', 'test-animation.c', 'test-easing.c', 'test-binding-pool.c', @@ -38,11 +35,9 @@ clutter_tests_interactive_test_sources = [ 'test-stage-sizing.c', 'test-swipe-action.c', 'test-cogl-point-sprites.c', - 'test-path-constraint.c', 'test-devices.c', 'test-content.c', 'test-keyframe-transition.c', - 'test-bind-constraint.c', 'test-touch-events.c', 'test-rotate-zoom.c', 'test-image.c', diff --git a/src/tests/clutter/interactive/test-easing.c b/src/tests/clutter/interactive/test-easing.c index c0d175a2181..1ec88e8144d 100644 --- a/src/tests/clutter/interactive/test-easing.c +++ b/src/tests/clutter/interactive/test-easing.c @@ -53,8 +53,6 @@ static gboolean recenter = FALSE; static ClutterActor *main_stage = NULL; static ClutterActor *easing_mode_label = NULL; -static ClutterAnimation *last_animation = NULL; - int test_easing_main (int argc, char *argv[]); @@ -66,21 +64,23 @@ test_easing_describe (void); * repositions (through an animation) the bouncer at the center of the stage */ static void -recenter_bouncer (ClutterAnimation *animation, - ClutterActor *rectangle) +recenter_bouncer (ClutterActor *rectangle) { gfloat base_x, base_y; gint cur_mode; + + cur_mode = easing_modes[current_mode].mode; base_x = clutter_actor_get_width (main_stage) / 2; base_y = clutter_actor_get_height (main_stage) / 2; - cur_mode = easing_modes[current_mode].mode; + clutter_actor_set_easing_duration (rectangle, 250); + clutter_actor_set_easing_mode (rectangle, cur_mode); + clutter_actor_set_position (rectangle, base_x, base_y); - clutter_actor_animate (rectangle, cur_mode, 250, - "x", base_x, - "y", base_y, - NULL); + g_signal_connect_after (rectangle, "transition-completed", + G_CALLBACK (clutter_actor_restore_easing_state), + NULL); } static gboolean @@ -108,28 +108,22 @@ on_button_press (ClutterActor *actor, } else if (event->button == CLUTTER_BUTTON_PRIMARY) { - ClutterAnimation *animation; ClutterAnimationMode cur_mode; cur_mode = easing_modes[current_mode].mode; - /* tween the actor using the current easing mode */ - animation = - clutter_actor_animate (rectangle, cur_mode, duration * 1000, - "x", event->x, - "y", event->y, - NULL); + clutter_actor_save_easing_state (rectangle); + clutter_actor_set_easing_duration (rectangle, duration * 1000); + clutter_actor_set_easing_mode (rectangle, cur_mode); + clutter_actor_set_position (rectangle, event->x, event->y); /* if we were asked to, recenter the bouncer at the end of the * animation. we keep track of the animation to avoid connecting * the signal handler to the same Animation twice. */ - if (recenter && last_animation != animation) - g_signal_connect_after (animation, "completed", - G_CALLBACK (recenter_bouncer), - rectangle); - - last_animation = animation; + g_signal_connect_after (rectangle, "transition-completed", + G_CALLBACK (recenter_bouncer), + rectangle); } return TRUE; -- GitLab