mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 19:40:43 -05:00
state-machine: add completed signal
Added a completed signal to the animator
This commit is contained in:
parent
fcdc3a8989
commit
8761b279a7
@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
#include "clutter-private.h"
|
#include "clutter-private.h"
|
||||||
#include "clutter-state.h"
|
#include "clutter-state.h"
|
||||||
|
#include "clutter-marshal.h"
|
||||||
#include <gobject/gvaluecollector.h>
|
#include <gobject/gvaluecollector.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -98,6 +99,13 @@ typedef struct _ClutterStateKey
|
|||||||
gint ref_count;
|
gint ref_count;
|
||||||
} _ClutterStateKey;
|
} _ClutterStateKey;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
COMPLETED,
|
||||||
|
LAST_SIGNAL
|
||||||
|
};
|
||||||
|
|
||||||
|
static guint state_signals[LAST_SIGNAL] = {0, };
|
||||||
|
|
||||||
#define CLUTTER_STATE_GET_PRIVATE(obj) \
|
#define CLUTTER_STATE_GET_PRIVATE(obj) \
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
|
||||||
@ -309,7 +317,7 @@ clutter_state_finalize (GObject *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void clutter_state_completed (ClutterTimeline *timeline,
|
static void clutter_state_completed (ClutterTimeline *timeline,
|
||||||
ClutterState *state)
|
ClutterState *state)
|
||||||
{
|
{
|
||||||
if (state->priv->current_animator)
|
if (state->priv->current_animator)
|
||||||
{
|
{
|
||||||
@ -317,6 +325,7 @@ static void clutter_state_completed (ClutterTimeline *timeline,
|
|||||||
NULL);
|
NULL);
|
||||||
state->priv->current_animator = NULL;
|
state->priv->current_animator = NULL;
|
||||||
}
|
}
|
||||||
|
g_signal_emit (state, state_signals[COMPLETED], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clutter_state_new_frame (ClutterTimeline *timeline,
|
static void clutter_state_new_frame (ClutterTimeline *timeline,
|
||||||
@ -925,6 +934,15 @@ clutter_state_class_init (ClutterStateClass *klass)
|
|||||||
gobject_class->finalize = clutter_state_finalize;
|
gobject_class->finalize = clutter_state_finalize;
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (ClutterStatePrivate));
|
g_type_class_add_private (klass, sizeof (ClutterStatePrivate));
|
||||||
|
|
||||||
|
state_signals[COMPLETED] =
|
||||||
|
g_signal_new (I_("completed"),
|
||||||
|
G_TYPE_FROM_CLASS (gobject_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
G_STRUCT_OFFSET (ClutterStateClass, completed),
|
||||||
|
NULL, NULL,
|
||||||
|
clutter_marshal_VOID__VOID,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1264,11 +1282,19 @@ clutter_state_set_duration (ClutterState *state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* should have durations for:
|
/**
|
||||||
|
* clutter_state_get_duration:
|
||||||
|
* @state: a #ClutterState
|
||||||
|
* @source_state_name: the name of the source state to set duration for or NULL
|
||||||
|
* @target_state_name: the name of the source state to set duration for or NULL
|
||||||
*
|
*
|
||||||
* global: NULL, NULL
|
* Query the duration used for transitions between source/target state pair,
|
||||||
* per-state-default: NULL, state
|
* the semantics for the query are the same as the semantics used for setting
|
||||||
* directly encoded: state, state
|
* in #clutter_state_set_duration.
|
||||||
|
*
|
||||||
|
* Since: 1.4
|
||||||
|
*
|
||||||
|
* Returns: the duration in ms.
|
||||||
*/
|
*/
|
||||||
guint
|
guint
|
||||||
clutter_state_get_duration (ClutterState *state,
|
clutter_state_get_duration (ClutterState *state,
|
||||||
@ -1308,3 +1334,21 @@ clutter_state_get_duration (ClutterState *state,
|
|||||||
ret = state->priv->duration;
|
ret = state->priv->duration;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clutter_state_get_target_state:
|
||||||
|
* @state: a #ClutterState
|
||||||
|
*
|
||||||
|
* Query the currently set target-state, during a transition it will also
|
||||||
|
* return the current target. Can be useful in the completed callback.
|
||||||
|
*
|
||||||
|
* Since: 1.4
|
||||||
|
*
|
||||||
|
* Returns: the duration in ms.
|
||||||
|
*/
|
||||||
|
const gchar *
|
||||||
|
clutter_state_get_target_state (ClutterState *state)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL);
|
||||||
|
return state->priv->target_state_name;
|
||||||
|
}
|
||||||
|
@ -82,6 +82,9 @@ struct _ClutterStateClass
|
|||||||
/*< private >*/
|
/*< private >*/
|
||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
|
/*< public >*/
|
||||||
|
void (*completed) (ClutterState *state);
|
||||||
|
|
||||||
/* padding for future expansion */
|
/* padding for future expansion */
|
||||||
gpointer _padding_dummy[16];
|
gpointer _padding_dummy[16];
|
||||||
};
|
};
|
||||||
@ -97,7 +100,8 @@ ClutterTimeline * clutter_state_change (ClutterState *state,
|
|||||||
const gchar *target_transition_name);
|
const gchar *target_transition_name);
|
||||||
ClutterTimeline * clutter_state_change_noanim (ClutterState *state,
|
ClutterTimeline * clutter_state_change_noanim (ClutterState *state,
|
||||||
const gchar *target_transition_name);
|
const gchar *target_transition_name);
|
||||||
ClutterState * clutter_state_set_key (ClutterState *state,
|
const gchar * clutter_state_get_target_state (ClutterState *state);
|
||||||
|
ClutterState * clutter_state_set_key (ClutterState *state,
|
||||||
const gchar *source_transition_name,
|
const gchar *source_transition_name,
|
||||||
const gchar *target_transition_name,
|
const gchar *target_transition_name,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
|
@ -23,6 +23,12 @@ static gboolean release_event (ClutterActor *actor,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void completed (ClutterState *state,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
g_print ("Completed transitioning to state: %s\n",
|
||||||
|
clutter_state_get_target_state (state), data);
|
||||||
|
}
|
||||||
|
|
||||||
static ClutterActor *new_rect (gint r,
|
static ClutterActor *new_rect (gint r,
|
||||||
gint g,
|
gint g,
|
||||||
@ -86,6 +92,7 @@ test_state_main (gint argc,
|
|||||||
rects[1], "scale-y", CLUTTER_LINEAR, 2.0,
|
rects[1], "scale-y", CLUTTER_LINEAR, 2.0,
|
||||||
NULL);
|
NULL);
|
||||||
clutter_state_set_duration (state, "start", "end", 5000);
|
clutter_state_set_duration (state, "start", "end", 5000);
|
||||||
|
g_signal_connect (state, "completed", G_CALLBACK (completed), NULL);
|
||||||
|
|
||||||
clutter_actor_show (stage);
|
clutter_actor_show (stage);
|
||||||
clutter_state_change (state, "start");
|
clutter_state_change (state, "start");
|
||||||
|
Loading…
Reference in New Issue
Block a user