2.0: First pass at deprecated API removal
This is the minimum required commit to get Clutter and the examples building.
This commit is contained in:
parent
4da1b8b523
commit
a2993f5de3
@ -183,22 +183,13 @@ struct _ClutterTransformInfo
|
||||
{
|
||||
/* rotation (angle and center) */
|
||||
gdouble rx_angle;
|
||||
AnchorCoord rx_center;
|
||||
|
||||
gdouble ry_angle;
|
||||
AnchorCoord ry_center;
|
||||
|
||||
gdouble rz_angle;
|
||||
AnchorCoord rz_center;
|
||||
|
||||
/* scaling */
|
||||
gdouble scale_x;
|
||||
gdouble scale_y;
|
||||
gdouble scale_z;
|
||||
AnchorCoord scale_center;
|
||||
|
||||
/* anchor point */
|
||||
AnchorCoord anchor;
|
||||
|
||||
/* translation */
|
||||
ClutterVertex translation;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -67,80 +67,6 @@ clutter_animatable_default_init (ClutterAnimatableInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_animatable_animate_property:
|
||||
* @animatable: a #ClutterAnimatable
|
||||
* @animation: a #ClutterAnimation
|
||||
* @property_name: the name of the animated property
|
||||
* @initial_value: the initial value of the animation interval
|
||||
* @final_value: the final value of the animation interval
|
||||
* @progress: the progress factor
|
||||
* @value: return location for the animation value
|
||||
*
|
||||
* Calls the animate_property() virtual function for @animatable.
|
||||
*
|
||||
* The @initial_value and @final_value #GValue<!-- -->s must contain
|
||||
* the same type; @value must have been initialized to the same
|
||||
* type of @initial_value and @final_value.
|
||||
*
|
||||
* All implementation of the #ClutterAnimatable interface must
|
||||
* implement this function.
|
||||
*
|
||||
* Return value: %TRUE if the value has been validated and can
|
||||
* be applied to the #ClutterAnimatable, and %FALSE otherwise
|
||||
*
|
||||
* Since: 1.0
|
||||
*
|
||||
* Deprecated: 1.8: Use clutter_animatable_interpolate_value()
|
||||
* instead
|
||||
*/
|
||||
gboolean
|
||||
clutter_animatable_animate_property (ClutterAnimatable *animatable,
|
||||
ClutterAnimation *animation,
|
||||
const gchar *property_name,
|
||||
const GValue *initial_value,
|
||||
const GValue *final_value,
|
||||
gdouble progress,
|
||||
GValue *value)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
gboolean res;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
|
||||
g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE);
|
||||
g_return_val_if_fail (property_name != NULL, FALSE);
|
||||
g_return_val_if_fail (initial_value != NULL && final_value != NULL, FALSE);
|
||||
g_return_val_if_fail (G_VALUE_TYPE (initial_value) != G_TYPE_INVALID, FALSE);
|
||||
g_return_val_if_fail (G_VALUE_TYPE (final_value) != G_TYPE_INVALID, FALSE);
|
||||
g_return_val_if_fail (value != NULL, FALSE);
|
||||
g_return_val_if_fail (G_VALUE_TYPE (value) == G_VALUE_TYPE (initial_value) &&
|
||||
G_VALUE_TYPE (value) == G_VALUE_TYPE (final_value),
|
||||
FALSE);
|
||||
|
||||
iface = CLUTTER_ANIMATABLE_GET_IFACE (animatable);
|
||||
if (iface->animate_property == NULL)
|
||||
{
|
||||
ClutterInterval *interval;
|
||||
|
||||
interval = clutter_animation_get_interval (animation, property_name);
|
||||
if (interval == NULL)
|
||||
return FALSE;
|
||||
|
||||
res = clutter_animatable_interpolate_value (animatable, property_name,
|
||||
interval,
|
||||
progress,
|
||||
value);
|
||||
}
|
||||
else
|
||||
res = iface->animate_property (animatable, animation,
|
||||
property_name,
|
||||
initial_value, final_value,
|
||||
progress,
|
||||
value);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_animatable_find_property:
|
||||
* @animatable: a #ClutterAnimatable
|
||||
|
@ -103,21 +103,6 @@ clutter_interval_real_validate (ClutterInterval *interval,
|
||||
{
|
||||
GType pspec_gtype = G_PARAM_SPEC_VALUE_TYPE (pspec);
|
||||
|
||||
/* check the GTypes we provide first */
|
||||
if (pspec_gtype == COGL_TYPE_FIXED)
|
||||
{
|
||||
ClutterParamSpecFixed *pspec_fixed = CLUTTER_PARAM_SPEC_FIXED (pspec);
|
||||
CoglFixed a, b;
|
||||
|
||||
a = b = 0;
|
||||
clutter_interval_get_interval (interval, &a, &b);
|
||||
if ((a >= pspec_fixed->minimum && a <= pspec_fixed->maximum) &&
|
||||
(b >= pspec_fixed->minimum && b <= pspec_fixed->maximum))
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* then check the fundamental types */
|
||||
switch (G_TYPE_FUNDAMENTAL (pspec_gtype))
|
||||
{
|
||||
|
@ -79,173 +79,6 @@
|
||||
* function whenever one of these properties changes.</para>
|
||||
* </refsect2>
|
||||
*
|
||||
* <refsect2 id="ClutterLayoutManager-animation">
|
||||
* <title>Animating a ClutterLayoutManager</title>
|
||||
* <para>A layout manager is used to let a #ClutterContainer take complete
|
||||
* ownership over the layout (that is: the position and sizing) of its
|
||||
* children; this means that using the Clutter animation API, like
|
||||
* clutter_actor_animate(), to animate the position and sizing of a child of
|
||||
* a layout manager it is not going to work properly, as the animation will
|
||||
* automatically override any setting done by the layout manager
|
||||
* itself.</para>
|
||||
* <para>It is possible for a #ClutterLayoutManager sub-class to animate its
|
||||
* children layout by using the base class animation support. The
|
||||
* #ClutterLayoutManager animation support consists of three virtual
|
||||
* functions: #ClutterLayoutManagerClass.begin_animation(),
|
||||
* #ClutterLayoutManagerClass.get_animation_progress(), and
|
||||
* #ClutterLayoutManagerClass.end_animation().</para>
|
||||
* <variablelist>
|
||||
* <varlistentry>
|
||||
* <term><function>begin_animation (duration, easing)</function></term>
|
||||
* <listitem><para>This virtual function is invoked when the layout
|
||||
* manager should begin an animation. The implementation should set up
|
||||
* the state for the animation and create the ancillary objects for
|
||||
* animating the layout. The default implementation creates a
|
||||
* #ClutterTimeline for the given duration and a #ClutterAlpha binding
|
||||
* the timeline to the given easing mode. This function returns a
|
||||
* #ClutterAlpha which should be used to control the animation from
|
||||
* the caller perspective.</para></listitem>
|
||||
* </varlistentry>
|
||||
* <varlistentry>
|
||||
* <term><function>get_animation_progress()</function></term>
|
||||
* <listitem><para>This virtual function should be invoked when animating
|
||||
* a layout manager. It returns the progress of the animation, using the
|
||||
* same semantics as the #ClutterAlpha:alpha value.</para></listitem>
|
||||
* </varlistentry>
|
||||
* <varlistentry>
|
||||
* <term><function>end_animation()</function></term>
|
||||
* <listitem><para>This virtual function is invoked when the animation of
|
||||
* a layout manager ends, and it is meant to be used for bookkeeping the
|
||||
* objects created in the <function>begin_animation()</function>
|
||||
* function. The default implementation will call it implicitly when the
|
||||
* timeline is complete.</para></listitem>
|
||||
* </varlistentry>
|
||||
* </variablelist>
|
||||
* <para>The simplest way to animate a layout is to create a #ClutterTimeline
|
||||
* inside the <function>begin_animation()</function> virtual function, along
|
||||
* with a #ClutterAlpha, and for each #ClutterTimeline::new-frame signal
|
||||
* emission call clutter_layout_manager_layout_changed(), which will cause a
|
||||
* relayout. The #ClutterTimeline::completed signal emission should cause
|
||||
* clutter_layout_manager_end_animation() to be called. The default
|
||||
* implementation provided internally by #ClutterLayoutManager does exactly
|
||||
* this, so most sub-classes should either not override any animation-related
|
||||
* virtual function or simply override #ClutterLayoutManagerClass.begin_animation()
|
||||
* and #ClutterLayoutManagerClass.end_animation() to set up ad hoc state, and then
|
||||
* chain up to the parent's implementation.</para>
|
||||
* <example id="example-ClutterLayoutManager-animation">
|
||||
* <title>Animation of a Layout Manager</title>
|
||||
* <para>The code below shows how a #ClutterLayoutManager sub-class should
|
||||
* provide animating the allocation of its children from within the
|
||||
* #ClutterLayoutManagerClass.allocate() virtual function implementation. The
|
||||
* animation is computed between the last stable allocation performed
|
||||
* before the animation started and the desired final allocation.</para>
|
||||
* <para>The <varname>is_animating</varname> variable is stored inside the
|
||||
* #ClutterLayoutManager sub-class and it is updated by overriding the
|
||||
* #ClutterLayoutManagerClass.begin_animation() and the
|
||||
* #ClutterLayoutManagerClass.end_animation() virtual functions and chaining up
|
||||
* to the base class implementation.</para>
|
||||
* <para>The last stable allocation is stored within a #ClutterLayoutMeta
|
||||
* sub-class used by the implementation.</para>
|
||||
* <programlisting>
|
||||
* static void
|
||||
* my_layout_manager_allocate (ClutterLayoutManager *manager,
|
||||
* ClutterContainer *container,
|
||||
* const ClutterActorBox *allocation,
|
||||
* ClutterAllocationFlags flags)
|
||||
* {
|
||||
* MyLayoutManager *self = MY_LAYOUT_MANAGER (manager);
|
||||
* ClutterActor *child;
|
||||
*
|
||||
* for (child = clutter_actor_get_first_child (CLUTTER_ACTOR (container));
|
||||
* child != NULL;
|
||||
* child = clutter_actor_get_next_sibling (child))
|
||||
* {
|
||||
* ClutterLayoutMeta *meta;
|
||||
* MyLayoutMeta *my_meta;
|
||||
*
|
||||
* /* retrieve the layout meta-object */
|
||||
* meta = clutter_layout_manager_get_child_meta (manager,
|
||||
* container,
|
||||
* child);
|
||||
* my_meta = MY_LAYOUT_META (meta);
|
||||
*
|
||||
* /* compute the desired allocation for the child */
|
||||
* compute_allocation (self, my_meta, child,
|
||||
* allocation, flags,
|
||||
* &child_box);
|
||||
*
|
||||
* /* this is the additional code that deals with the animation
|
||||
* * of the layout manager
|
||||
* */
|
||||
* if (!self->is_animating)
|
||||
* {
|
||||
* /* store the last stable allocation for later use */
|
||||
* my_meta->last_alloc = clutter_actor_box_copy (&child_box);
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* ClutterActorBox end = { 0, };
|
||||
* gdouble p;
|
||||
*
|
||||
* /* get the progress of the animation */
|
||||
* p = clutter_layout_manager_get_animation_progress (manager);
|
||||
*
|
||||
* if (my_meta->last_alloc != NULL)
|
||||
* {
|
||||
* /* copy the desired allocation as the final state */
|
||||
* end = child_box;
|
||||
*
|
||||
* /* then interpolate the initial and final state
|
||||
* * depending on the progress of the animation,
|
||||
* * and put the result inside the box we will use
|
||||
* * to allocate the child
|
||||
* */
|
||||
* clutter_actor_box_interpolate (my_meta->last_alloc,
|
||||
* &end,
|
||||
* p,
|
||||
* &child_box);
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* /* if there is no stable allocation then the child was
|
||||
* * added while animating; one possible course of action
|
||||
* * is to just bail out and fall through to the allocation
|
||||
* * to position the child directly at its final state
|
||||
* */
|
||||
* my_meta->last_alloc =
|
||||
* clutter_actor_box_copy (&child_box);
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* /* allocate the child */
|
||||
* clutter_actor_allocate (child, &child_box, flags);
|
||||
* }
|
||||
* }
|
||||
* </programlisting>
|
||||
* </example>
|
||||
* <para>Sub-classes of #ClutterLayoutManager that support animations of the
|
||||
* layout changes should call clutter_layout_manager_begin_animation()
|
||||
* whenever a layout property changes value, e.g.:</para>
|
||||
* <informalexample>
|
||||
* <programlisting>
|
||||
* if (self->orientation != new_orientation)
|
||||
* {
|
||||
* ClutterLayoutManager *manager;
|
||||
*
|
||||
* self->orientation = new_orientation;
|
||||
*
|
||||
* manager = CLUTTER_LAYOUT_MANAGER (self);
|
||||
* clutter_layout_manager_layout_changed (manager);
|
||||
* clutter_layout_manager_begin_animation (manager, 500, CLUTTER_LINEAR);
|
||||
*
|
||||
* g_object_notify (G_OBJECT (self), "orientation");
|
||||
* }
|
||||
* </programlisting>
|
||||
* </informalexample>
|
||||
* <para>The code above will animate a change in the
|
||||
* <varname>orientation</varname> layout property of a layout manager.</para>
|
||||
* </refsect2>
|
||||
*
|
||||
* <refsect2 id="clutter-layout-properties">
|
||||
* <title>Layout Properties</title>
|
||||
* <para>If a layout manager has layout properties, that is properties that
|
||||
@ -362,7 +195,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, };
|
||||
|
||||
@ -375,15 +207,15 @@ layout_manager_freeze_layout_change (ClutterLayoutManager *manager)
|
||||
G_OBJECT_TYPE_NAME (manager),
|
||||
manager);
|
||||
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "freeze-change");
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change");
|
||||
if (is_frozen == NULL)
|
||||
g_object_set_data (G_OBJECT (manager), "freeze-change",
|
||||
g_object_set_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change",
|
||||
GUINT_TO_POINTER (1));
|
||||
else
|
||||
{
|
||||
guint level = GPOINTER_TO_UINT (is_frozen) + 1;
|
||||
|
||||
g_object_set_data (G_OBJECT (manager), "freeze-change",
|
||||
g_object_set_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change",
|
||||
GUINT_TO_POINTER (level));
|
||||
}
|
||||
}
|
||||
@ -393,7 +225,7 @@ layout_manager_thaw_layout_change (ClutterLayoutManager *manager)
|
||||
{
|
||||
gpointer is_frozen;
|
||||
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "freeze-change");
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change");
|
||||
if (is_frozen == NULL)
|
||||
g_critical (G_STRLOC ": Mismatched thaw; you have to call "
|
||||
"clutter_layout_manager_freeze_layout_change() prior to "
|
||||
@ -410,9 +242,9 @@ layout_manager_thaw_layout_change (ClutterLayoutManager *manager)
|
||||
|
||||
level -= 1;
|
||||
if (level == 0)
|
||||
g_object_set_data (G_OBJECT (manager), "freeze-change", NULL);
|
||||
g_object_set_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change", NULL);
|
||||
else
|
||||
g_object_set_data (G_OBJECT (manager), "freeze-change",
|
||||
g_object_set_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change",
|
||||
GUINT_TO_POINTER (level));
|
||||
}
|
||||
|
||||
@ -464,7 +296,7 @@ layout_manager_real_set_container (ClutterLayoutManager *manager,
|
||||
ClutterContainer *container)
|
||||
{
|
||||
if (container != NULL)
|
||||
g_object_set_data (G_OBJECT (container), "clutter-layout-manager", manager);
|
||||
g_object_set_data (G_OBJECT (container), "-clutter-layout-manager", manager);
|
||||
}
|
||||
|
||||
static ClutterLayoutMeta *
|
||||
@ -499,101 +331,11 @@ 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, "completed",
|
||||
G_CALLBACK (clutter_layout_manager_end_animation),
|
||||
manager);
|
||||
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_end_animation),
|
||||
manager);
|
||||
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");
|
||||
g_quark_from_static_string ("-clutter-layout-manager-child-meta");
|
||||
|
||||
g_type_class_add_private (klass, sizeof (ClutterLayoutManagerPrivate));
|
||||
|
||||
@ -602,11 +344,6 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
|
||||
klass->allocate = layout_manager_real_allocate;
|
||||
klass->create_child_meta = layout_manager_real_create_child_meta;
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -775,7 +512,7 @@ clutter_layout_manager_layout_changed (ClutterLayoutManager *manager)
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager));
|
||||
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "freeze-change");
|
||||
is_frozen = g_object_get_data (G_OBJECT (manager), "-clutter-layout-manager-freeze-change");
|
||||
if (is_frozen == NULL)
|
||||
g_signal_emit (manager, manager_signals[LAYOUT_CHANGED], 0);
|
||||
else
|
||||
|
@ -79,17 +79,6 @@ struct _ClutterLayoutManager
|
||||
* @create_child_meta: virtual function; override to create a
|
||||
* #ClutterLayoutMeta instance associated to a #ClutterContainer and a
|
||||
* child #ClutterActor, used to maintain layout manager specific properties
|
||||
* @begin_animation: virtual function; override to control the animation
|
||||
* of a #ClutterLayoutManager with the given duration and easing mode.
|
||||
* This virtual function is deprecated, and it should not be overridden
|
||||
* in newly written code.
|
||||
* @end_animation: virtual function; override to end an animation started
|
||||
* by clutter_layout_manager_begin_animation(). This virtual function is
|
||||
* deprecated, and it should not be overriden in newly written code.
|
||||
* @get_animation_progress: virtual function; override to control the
|
||||
* progress of the animation of a #ClutterLayoutManager. This virtual
|
||||
* function is deprecated, and it should not be overridden in newly written
|
||||
* code.
|
||||
* @layout_changed: class handler for the #ClutterLayoutManager::layout-changed
|
||||
* signal
|
||||
*
|
||||
@ -127,15 +116,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 >*/
|
||||
|
@ -34,22 +34,16 @@
|
||||
#include <glib.h>
|
||||
#include <gmodule.h>
|
||||
|
||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
|
||||
#include "deprecated/clutter-container.h"
|
||||
#include "deprecated/clutter-alpha.h"
|
||||
|
||||
#include "clutter-actor.h"
|
||||
#include "clutter-container.h"
|
||||
#include "clutter-debug.h"
|
||||
#include "clutter-enum-types.h"
|
||||
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-script.h"
|
||||
#include "clutter-script-private.h"
|
||||
#include "clutter-scriptable.h"
|
||||
|
||||
#include "clutter-stage-manager.h"
|
||||
|
||||
#include "clutter-private.h"
|
||||
|
||||
static void clutter_script_parser_object_end (JsonParser *parser,
|
||||
JsonObject *object);
|
||||
static void clutter_script_parser_parse_end (JsonParser *parser);
|
||||
@ -707,42 +701,8 @@ parse_signals (ClutterScript *script,
|
||||
}
|
||||
}
|
||||
|
||||
/* mandatory: "target-state" or "handler" */
|
||||
if (json_object_has_member (object, "target-state"))
|
||||
{
|
||||
const gchar *state = NULL;
|
||||
const gchar *target = NULL;
|
||||
gboolean warp_to = FALSE;
|
||||
|
||||
target = json_object_get_string_member (object, "target-state");
|
||||
if (target == NULL)
|
||||
{
|
||||
_clutter_script_warn_invalid_value (script,
|
||||
"target-state", "string",
|
||||
val);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (json_object_has_member (object, "states"))
|
||||
state = json_object_get_string_member (object, "states");
|
||||
|
||||
if (json_object_has_member (object, "warp"))
|
||||
warp_to = json_object_get_boolean_member (object, "warp");
|
||||
|
||||
CLUTTER_NOTE (SCRIPT,
|
||||
"Added signal '%s' (states:%s, target-state:%s, warp:%s)",
|
||||
name,
|
||||
state != NULL ? state : "<default>", target,
|
||||
warp_to ? "true" : "false");
|
||||
|
||||
sinfo = g_slice_new0 (SignalInfo);
|
||||
sinfo->is_handler = FALSE;
|
||||
sinfo->name = g_strdup (name);
|
||||
sinfo->state = g_strdup (state);
|
||||
sinfo->target = g_strdup (target);
|
||||
sinfo->warp_to = warp_to;
|
||||
}
|
||||
else if (json_object_has_member (object, "handler"))
|
||||
/* mandatory: "handler" */
|
||||
if (json_object_has_member (object, "handler"))
|
||||
{
|
||||
const gchar *handler;
|
||||
const gchar *connect;
|
||||
@ -792,7 +752,7 @@ parse_signals (ClutterScript *script,
|
||||
else
|
||||
_clutter_script_warn_missing_attribute (script,
|
||||
NULL,
|
||||
"handler or state");
|
||||
"handler");
|
||||
if (sinfo != NULL)
|
||||
retval = g_list_prepend (retval, sinfo);
|
||||
}
|
||||
@ -800,98 +760,10 @@ parse_signals (ClutterScript *script,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static ClutterTimeline *
|
||||
construct_timeline (ClutterScript *script,
|
||||
JsonObject *object)
|
||||
{
|
||||
ClutterTimeline *retval = NULL;
|
||||
ObjectInfo *oinfo;
|
||||
GList *members, *l;
|
||||
|
||||
/* we fake an ObjectInfo so we can reuse clutter_script_construct_object()
|
||||
* here; we do not save it inside the hash table, because if this had
|
||||
* been a named object then we wouldn't have ended up here in the first
|
||||
* place
|
||||
*/
|
||||
oinfo = g_slice_new0 (ObjectInfo);
|
||||
oinfo->gtype = CLUTTER_TYPE_TIMELINE;
|
||||
oinfo->id = g_strdup ("dummy");
|
||||
|
||||
members = json_object_get_members (object);
|
||||
for (l = members; l != NULL; l = l->next)
|
||||
{
|
||||
const gchar *name = l->data;
|
||||
JsonNode *node = json_object_get_member (object, name);
|
||||
PropertyInfo *pinfo = g_slice_new0 (PropertyInfo);
|
||||
|
||||
pinfo->name = g_strdelimit (g_strdup (name), G_STR_DELIMITERS, '-');
|
||||
pinfo->node = json_node_copy (node);
|
||||
|
||||
oinfo->properties = g_list_prepend (oinfo->properties, pinfo);
|
||||
}
|
||||
|
||||
g_list_free (members);
|
||||
|
||||
_clutter_script_construct_object (script, oinfo);
|
||||
_clutter_script_apply_properties (script, oinfo);
|
||||
retval = CLUTTER_TIMELINE (oinfo->object);
|
||||
|
||||
/* we transfer ownership to the alpha function, so we ref before
|
||||
* destroying the ObjectInfo to avoid the timeline going away
|
||||
*/
|
||||
g_object_ref (retval);
|
||||
object_info_free (oinfo);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* define the names of the animation modes to match the ones
|
||||
* that developers might be more accustomed to
|
||||
*/
|
||||
static const struct
|
||||
{
|
||||
const gchar *name;
|
||||
ClutterAnimationMode mode;
|
||||
} animation_modes[] = {
|
||||
{ "linear", CLUTTER_LINEAR },
|
||||
{ "easeInQuad", CLUTTER_EASE_IN_QUAD },
|
||||
{ "easeOutQuad", CLUTTER_EASE_OUT_QUAD },
|
||||
{ "easeInOutQuad", CLUTTER_EASE_IN_OUT_QUAD },
|
||||
{ "easeInCubic", CLUTTER_EASE_IN_CUBIC },
|
||||
{ "easeOutCubic", CLUTTER_EASE_OUT_CUBIC },
|
||||
{ "easeInOutCubic", CLUTTER_EASE_IN_OUT_CUBIC },
|
||||
{ "easeInQuart", CLUTTER_EASE_IN_QUART },
|
||||
{ "easeOutQuart", CLUTTER_EASE_OUT_QUART },
|
||||
{ "easeInOutQuart", CLUTTER_EASE_IN_OUT_QUART },
|
||||
{ "easeInQuint", CLUTTER_EASE_IN_QUINT },
|
||||
{ "easeOutQuint", CLUTTER_EASE_OUT_QUINT },
|
||||
{ "easeInOutQuint", CLUTTER_EASE_IN_OUT_QUINT },
|
||||
{ "easeInSine", CLUTTER_EASE_IN_SINE },
|
||||
{ "easeOutSine", CLUTTER_EASE_OUT_SINE },
|
||||
{ "easeInOutSine", CLUTTER_EASE_IN_OUT_SINE },
|
||||
{ "easeInExpo", CLUTTER_EASE_IN_EXPO },
|
||||
{ "easeOutExpo", CLUTTER_EASE_OUT_EXPO },
|
||||
{ "easeInOutExpo", CLUTTER_EASE_IN_OUT_EXPO },
|
||||
{ "easeInCirc", CLUTTER_EASE_IN_CIRC },
|
||||
{ "easeOutCirc", CLUTTER_EASE_OUT_CIRC },
|
||||
{ "easeInOutCirc", CLUTTER_EASE_IN_OUT_CIRC },
|
||||
{ "easeInElastic", CLUTTER_EASE_IN_ELASTIC },
|
||||
{ "easeOutElastic", CLUTTER_EASE_OUT_ELASTIC },
|
||||
{ "easeInOutElastic", CLUTTER_EASE_IN_OUT_ELASTIC },
|
||||
{ "easeInBack", CLUTTER_EASE_IN_BACK },
|
||||
{ "easeOutBack", CLUTTER_EASE_OUT_BACK },
|
||||
{ "easeInOutBack", CLUTTER_EASE_IN_OUT_BACK },
|
||||
{ "easeInBounce", CLUTTER_EASE_IN_BOUNCE },
|
||||
{ "easeOutBounce", CLUTTER_EASE_OUT_BOUNCE },
|
||||
{ "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE },
|
||||
};
|
||||
|
||||
static const gint n_animation_modes = G_N_ELEMENTS (animation_modes);
|
||||
|
||||
gulong
|
||||
_clutter_script_resolve_animation_mode (JsonNode *node)
|
||||
{
|
||||
gint i, res = CLUTTER_CUSTOM_MODE;
|
||||
gint res = CLUTTER_CUSTOM_MODE;
|
||||
|
||||
if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE)
|
||||
return CLUTTER_CUSTOM_MODE;
|
||||
@ -903,18 +775,6 @@ _clutter_script_resolve_animation_mode (JsonNode *node)
|
||||
{
|
||||
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))
|
||||
@ -926,106 +786,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)
|
||||
@ -1786,7 +1546,8 @@ apply_layout_properties (ClutterScript *script,
|
||||
ClutterLayoutManager *manager;
|
||||
GType meta_type;
|
||||
|
||||
manager = g_object_get_data (G_OBJECT (container), "clutter-layout-manager");
|
||||
/* XXX:2.0 remove; only ClutterActor should have a layout manager */
|
||||
manager = g_object_get_data (G_OBJECT (container), "-clutter-layout-manager");
|
||||
if (manager == NULL)
|
||||
return;
|
||||
|
||||
@ -1980,7 +1741,7 @@ static void
|
||||
add_children (ClutterScript *script,
|
||||
ObjectInfo *oinfo)
|
||||
{
|
||||
ClutterContainer *container = CLUTTER_CONTAINER (oinfo->object);
|
||||
ClutterActor *container = CLUTTER_ACTOR (oinfo->object);
|
||||
GList *l, *unresolved;
|
||||
|
||||
unresolved = NULL;
|
||||
@ -2019,7 +1780,7 @@ add_children (ClutterScript *script,
|
||||
name,
|
||||
g_type_name (G_OBJECT_TYPE (container)));
|
||||
|
||||
clutter_container_add_actor (container, CLUTTER_ACTOR (object));
|
||||
clutter_actor_add_child (container, CLUTTER_ACTOR (object));
|
||||
}
|
||||
|
||||
g_list_foreach (oinfo->children, (GFunc) g_free, NULL);
|
||||
|
@ -88,13 +88,10 @@ typedef struct {
|
||||
gchar *name;
|
||||
gchar *handler;
|
||||
gchar *object;
|
||||
gchar *state;
|
||||
gchar *target;
|
||||
|
||||
GConnectFlags flags;
|
||||
|
||||
guint is_handler : 1;
|
||||
guint warp_to : 1;
|
||||
} SignalInfo;
|
||||
|
||||
void property_info_free (gpointer data);
|
||||
@ -128,8 +125,6 @@ gboolean _clutter_script_parse_geometry (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,
|
||||
ClutterPoint *point);
|
||||
|
@ -75,66 +75,6 @@
|
||||
* packing rules of Clutter still apply, and an actor cannot be packed
|
||||
* in multiple containers without unparenting it in between).
|
||||
*
|
||||
* Behaviours and timelines can also be defined inside a UI definition
|
||||
* buffer:
|
||||
*
|
||||
* <informalexample><programlisting><![CDATA[
|
||||
* {
|
||||
* "id" : "rotate-behaviour",
|
||||
* "type" : "ClutterBehaviourRotate",
|
||||
* "angle-start" : 0.0,
|
||||
* "angle-end" : 360.0,
|
||||
* "axis" : "z-axis",
|
||||
* "alpha" : {
|
||||
* "timeline" : { "duration" : 4000, "loop" : true },
|
||||
* "mode" : "easeInSine"
|
||||
* }
|
||||
* }
|
||||
* ]]></programlisting></informalexample>
|
||||
*
|
||||
* And then to apply a defined behaviour to an actor defined inside the
|
||||
* definition of an actor, the "behaviour" member can be used:
|
||||
*
|
||||
* <informalexample><programlisting><![CDATA[
|
||||
* {
|
||||
* "id" : "my-rotating-actor",
|
||||
* "type" : "ClutterTexture",
|
||||
* ...
|
||||
* "behaviours" : [ "rotate-behaviour" ]
|
||||
* }
|
||||
* ]]></programlisting></informalexample>
|
||||
*
|
||||
* A #ClutterAlpha belonging to a #ClutterBehaviour can only be defined
|
||||
* implicitly like in the example above, or explicitly by setting the
|
||||
* "alpha" property to point to a previously defined #ClutterAlpha, e.g.:
|
||||
*
|
||||
* <informalexample><programlisting><![CDATA[
|
||||
* {
|
||||
* "id" : "rotate-behaviour",
|
||||
* "type" : "ClutterBehaviourRotate",
|
||||
* "angle-start" : 0.0,
|
||||
* "angle-end" : 360.0,
|
||||
* "axis" : "z-axis",
|
||||
* "alpha" : {
|
||||
* "id" : "rotate-alpha",
|
||||
* "type" : "ClutterAlpha",
|
||||
* "timeline" : {
|
||||
* "id" : "rotate-timeline",
|
||||
* "type : "ClutterTimeline",
|
||||
* "duration" : 4000,
|
||||
* "loop" : true
|
||||
* },
|
||||
* "function" : "custom_sine_alpha"
|
||||
* }
|
||||
* }
|
||||
* ]]></programlisting></informalexample>
|
||||
*
|
||||
* Implicitely defined #ClutterAlpha<!-- -->s and #ClutterTimeline<!-- -->s
|
||||
* can omit the <varname>id</varname> member, as well as the
|
||||
* <varname>type</varname> member, but will not be available using
|
||||
* clutter_script_get_object() (they can, however, be extracted using the
|
||||
* #ClutterBehaviour and #ClutterAlpha API respectively).
|
||||
*
|
||||
* Signal handlers can be defined inside a Clutter UI definition file and
|
||||
* then autoconnected to their respective signals using the
|
||||
* clutter_script_connect_signals() function:
|
||||
@ -158,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:
|
||||
@ -248,11 +145,6 @@
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-debug.h"
|
||||
|
||||
#include "deprecated/clutter-alpha.h"
|
||||
#include "deprecated/clutter-behaviour.h"
|
||||
#include "deprecated/clutter-container.h"
|
||||
#include "deprecated/clutter-state.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
@ -277,8 +169,6 @@ struct _ClutterScriptPrivate
|
||||
|
||||
ClutterScriptParser *parser;
|
||||
|
||||
GHashTable *states;
|
||||
|
||||
gchar **search_paths;
|
||||
|
||||
gchar *translation_domain;
|
||||
@ -331,8 +221,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);
|
||||
}
|
||||
@ -389,7 +277,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);
|
||||
@ -526,9 +413,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1048,65 +932,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,
|
||||
@ -1144,67 +975,6 @@ connect_each_object (gpointer key,
|
||||
connect_data->user_data);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GObject *state_object = NULL;
|
||||
const gchar *signal_name, *signal_detail;
|
||||
gchar **components;
|
||||
GQuark signal_quark;
|
||||
guint signal_id;
|
||||
HookData *hook_data;
|
||||
|
||||
if (sinfo->state == NULL)
|
||||
state_object = (GObject *) clutter_script_get_states (script, NULL);
|
||||
else
|
||||
{
|
||||
state_object = clutter_script_get_object (script, sinfo->state);
|
||||
if (state_object == NULL)
|
||||
state_object = (GObject *) clutter_script_get_states (script, sinfo->state);
|
||||
}
|
||||
|
||||
if (state_object == NULL)
|
||||
continue;
|
||||
|
||||
components = g_strsplit (sinfo->name, "::", 2);
|
||||
if (g_strv_length (components) == 2)
|
||||
{
|
||||
signal_name = components[0];
|
||||
signal_detail = components[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
signal_name = components[0];
|
||||
signal_detail = NULL;
|
||||
}
|
||||
|
||||
signal_id = g_signal_lookup (signal_name, G_OBJECT_TYPE (object));
|
||||
if (signal_id == 0)
|
||||
{
|
||||
g_strfreev (components);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (signal_detail != NULL)
|
||||
signal_quark = g_quark_from_string (signal_detail);
|
||||
else
|
||||
signal_quark = 0;
|
||||
|
||||
hook_data = g_slice_new (HookData);
|
||||
hook_data->emitter = object;
|
||||
hook_data->state = CLUTTER_STATE (state_object);
|
||||
hook_data->target = g_strdup (sinfo->target);
|
||||
hook_data->warp_to = sinfo->warp_to;
|
||||
hook_data->signal_id = signal_id;
|
||||
hook_data->hook_id =
|
||||
g_signal_add_emission_hook (signal_id, signal_quark,
|
||||
clutter_script_state_change_hook,
|
||||
hook_data,
|
||||
hook_data_free);
|
||||
|
||||
g_object_weak_ref (hook_data->emitter,
|
||||
clutter_script_remove_state_change_hook,
|
||||
hook_data);
|
||||
}
|
||||
|
||||
signal_info_free (sinfo);
|
||||
}
|
||||
@ -1428,72 +1198,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
|
||||
|
@ -81,7 +81,7 @@
|
||||
|
||||
static void clutter_container_iface_init (ClutterContainerIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterStage, clutter_stage, CLUTTER_TYPE_GROUP,
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterStage, clutter_stage, CLUTTER_TYPE_ACTOR,
|
||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
|
||||
clutter_container_iface_init))
|
||||
|
||||
@ -2244,6 +2244,8 @@ clutter_stage_init (ClutterStage *self)
|
||||
ClutterBackend *backend;
|
||||
GError *error;
|
||||
|
||||
CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_VISIBLE);
|
||||
|
||||
/* a stage is a top-level object */
|
||||
CLUTTER_SET_PRIVATE_FLAGS (self, CLUTTER_IS_TOPLEVEL);
|
||||
|
||||
|
@ -55,7 +55,7 @@ typedef struct _ClutterStagePrivate ClutterStagePrivate;
|
||||
struct _ClutterStage
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroup parent_instance;
|
||||
ClutterActor parent_instance;
|
||||
|
||||
ClutterStagePrivate *priv;
|
||||
};
|
||||
@ -75,7 +75,7 @@ struct _ClutterStage
|
||||
struct _ClutterStageClass
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroupClass parent_class;
|
||||
ClutterActorClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
/* signals */
|
||||
|
@ -142,7 +142,7 @@ gesture_end (ClutterGestureAction *action,
|
||||
gfloat press_x, press_y;
|
||||
gfloat release_x, release_y;
|
||||
ClutterSwipeDirection direction = 0;
|
||||
gboolean can_emit_swipe;
|
||||
gboolean unused;
|
||||
|
||||
clutter_gesture_action_get_press_coords (action,
|
||||
0,
|
||||
@ -162,20 +162,8 @@ gesture_end (ClutterGestureAction *action,
|
||||
else if (press_y - release_y > priv->threshold)
|
||||
direction |= CLUTTER_SWIPE_DIRECTION_UP;
|
||||
|
||||
/* XXX:2.0 remove */
|
||||
g_signal_emit (action, swipe_signals[SWIPE], 0, actor, direction,
|
||||
&can_emit_swipe);
|
||||
if (can_emit_swipe)
|
||||
g_signal_emit (action, swipe_signals[SWEPT], 0, actor, direction);
|
||||
}
|
||||
|
||||
/* XXX:2.0 remove */
|
||||
static gboolean
|
||||
clutter_swipe_action_real_swipe (ClutterSwipeAction *action,
|
||||
ClutterActor *actor,
|
||||
ClutterSwipeDirection direction)
|
||||
{
|
||||
return TRUE;
|
||||
&unused);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -190,34 +178,6 @@ clutter_swipe_action_class_init (ClutterSwipeActionClass *klass)
|
||||
gesture_class->gesture_progress = gesture_progress;
|
||||
gesture_class->gesture_end = gesture_end;
|
||||
|
||||
/* XXX:2.0 remove */
|
||||
klass->swipe = clutter_swipe_action_real_swipe;
|
||||
|
||||
/**
|
||||
* ClutterSwipeAction::swept:
|
||||
* @action: the #ClutterSwipeAction that emitted the signal
|
||||
* @actor: the #ClutterActor attached to the @action
|
||||
* @direction: the main direction of the swipe gesture
|
||||
*
|
||||
* The ::swept signal is emitted when a swipe gesture is recognized on the
|
||||
* attached actor.
|
||||
*
|
||||
* Deprecated: 1.14: Use the ::swipe signal instead.
|
||||
*
|
||||
* Since: 1.8
|
||||
*/
|
||||
swipe_signals[SWEPT] =
|
||||
g_signal_new (I_("swept"),
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST |
|
||||
G_SIGNAL_DEPRECATED,
|
||||
G_STRUCT_OFFSET (ClutterSwipeActionClass, swept),
|
||||
NULL, NULL,
|
||||
_clutter_marshal_VOID__OBJECT_FLAGS,
|
||||
G_TYPE_NONE, 2,
|
||||
CLUTTER_TYPE_ACTOR,
|
||||
CLUTTER_TYPE_SWIPE_DIRECTION);
|
||||
|
||||
/**
|
||||
* ClutterSwipeAction::swipe:
|
||||
* @action: the #ClutterSwipeAction that emitted the signal
|
||||
|
Loading…
Reference in New Issue
Block a user