2007-10-09 09:29:03 -04:00
|
|
|
/*
|
|
|
|
* Clutter.
|
|
|
|
*
|
|
|
|
* An OpenGL based 'interactive canvas' library.
|
|
|
|
*
|
|
|
|
* Authored By Matthew Allum <mallum@openedhand.com>
|
|
|
|
*
|
|
|
|
* Copyright (C) 2006 OpenedHand
|
|
|
|
*
|
|
|
|
* 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
|
2010-03-01 07:56:10 -05:00
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*
|
2007-10-09 09:29:03 -04:00
|
|
|
*/
|
|
|
|
|
2007-10-08 11:03:22 -04:00
|
|
|
#ifndef __CLUTTER_SCRIPT_PRIVATE_H__
|
|
|
|
#define __CLUTTER_SCRIPT_PRIVATE_H__
|
|
|
|
|
|
|
|
#include <glib-object.h>
|
2010-09-22 07:56:33 -04:00
|
|
|
#include <json-glib/json-glib.h>
|
|
|
|
|
2008-08-04 12:21:27 -04:00
|
|
|
#include "clutter-color.h"
|
2007-10-25 10:34:54 -04:00
|
|
|
#include "clutter-types.h"
|
2007-10-08 11:03:22 -04:00
|
|
|
#include "clutter-script.h"
|
|
|
|
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
|
2012-02-09 13:40:03 -05:00
|
|
|
#define CLUTTER_TYPE_SCRIPT_PARSER (_clutter_script_parser_get_type ())
|
2009-11-04 08:32:26 -05:00
|
|
|
#define CLUTTER_SCRIPT_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_SCRIPT_PARSER, ClutterScriptParser))
|
|
|
|
#define CLUTTER_IS_SCRIPT_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_SCRIPT_PARSER))
|
|
|
|
|
|
|
|
typedef struct _ClutterScriptParser ClutterScriptParser;
|
|
|
|
typedef struct _JsonParserClass ClutterScriptParserClass;
|
|
|
|
|
|
|
|
struct _ClutterScriptParser
|
|
|
|
{
|
|
|
|
JsonParser parent_instance;
|
|
|
|
|
|
|
|
/* back reference */
|
|
|
|
ClutterScript *script;
|
|
|
|
};
|
|
|
|
|
2007-10-08 11:03:22 -04:00
|
|
|
typedef GType (* GTypeGetFunc) (void);
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
gchar *id;
|
2007-10-10 06:42:19 -04:00
|
|
|
gchar *class_name;
|
|
|
|
gchar *type_func;
|
2007-10-08 11:03:22 -04:00
|
|
|
|
|
|
|
GList *properties;
|
2007-10-08 12:25:10 -04:00
|
|
|
GList *children;
|
2007-11-15 10:24:43 -05:00
|
|
|
GList *signals;
|
2007-10-08 11:03:22 -04:00
|
|
|
|
|
|
|
GType gtype;
|
|
|
|
GObject *object;
|
2007-10-10 06:42:19 -04:00
|
|
|
|
2007-10-18 08:31:07 -04:00
|
|
|
guint merge_id;
|
|
|
|
|
script: Fix the memory management
Currently, the memory management in ClutterScript is overly complicated.
The basic design tenet should be:
- ClutterScript owns a reference on every object it creates
This allows the Script instance to reliably handle the lifetime of the
instances from creation to disposal.
In case of unmerge, the Script instance should destroy any Actor
instance, except for the Stage, and release the reference it owns. The
Stage is special because it's really owned by Clutter itself, and it
should be destroyed explicitly.
When disposing the Script itself, it should just release the reference;
any parented actor, or any InitiallyUnowned instance, will then be
managed by the parent object, as they should, while every GObject
instance will go away, as documented.
This commit is based on a patch by:
Henrik Hedberg <hhedberg@innologies.fi>
http://bugzilla.clutter-project.org/show_bug.cgi?id=2316
2010-09-13 16:29:52 -04:00
|
|
|
guint is_actor : 1;
|
|
|
|
guint is_stage : 1;
|
2008-05-09 09:58:04 -04:00
|
|
|
guint is_stage_default : 1;
|
|
|
|
guint has_unresolved : 1;
|
|
|
|
guint is_unmerged : 1;
|
2007-10-08 11:03:22 -04:00
|
|
|
} ObjectInfo;
|
|
|
|
|
2007-10-25 10:34:54 -04:00
|
|
|
void object_info_free (gpointer data);
|
|
|
|
|
2007-10-08 11:03:22 -04:00
|
|
|
typedef struct {
|
2007-10-25 10:34:54 -04:00
|
|
|
gchar *name;
|
|
|
|
JsonNode *node;
|
|
|
|
GParamSpec *pspec;
|
2009-11-04 11:45:44 -05:00
|
|
|
|
|
|
|
guint is_child : 1;
|
2010-06-07 17:45:34 -04:00
|
|
|
guint is_layout : 1;
|
2007-10-08 11:03:22 -04:00
|
|
|
} PropertyInfo;
|
2007-11-15 10:24:43 -05:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
gchar *name;
|
|
|
|
gchar *handler;
|
|
|
|
gchar *object;
|
script: Allow connecting signal to ClutterState states
One of the uses of a ClutterState state machine along with ClutterScript
is to provide a quick way to transition from state to state in response
to signal emitted on specific instances.
Connecting a real function, in code, to a specific signal does not
improve the ease of use of ClutterScript to define scenes.
By adding a new signal definition to the current one we can have both a
simple way to define application logic in code and in the UI definition
file.
The new syntax is trivial:
{
"name" : <signal name>,
"state" : <state machine script id>,
"target-state" : <target state>
}
The ClutterState instance is identified by its script id, and the target
state is resolved at run-time, so it can be defined both in
ClutterScript or in code. Ideally, we should find a way to associate a
default ClutterState instance to the ClutterScript one that parses the
definition; this way we would be able to remove the "state" member, or
even "style" the behaviour of an object by replacing the ClutterState
instance.
The implementation uses a signal emission hook, to avoid knowing the
signal signature; we check the emitter of the signal against the object
that defined the signal, to avoid erroneous state changes.
2011-02-07 08:48:58 -05:00
|
|
|
gchar *state;
|
|
|
|
gchar *target;
|
2007-11-15 10:24:43 -05:00
|
|
|
|
|
|
|
GConnectFlags flags;
|
script: Allow connecting signal to ClutterState states
One of the uses of a ClutterState state machine along with ClutterScript
is to provide a quick way to transition from state to state in response
to signal emitted on specific instances.
Connecting a real function, in code, to a specific signal does not
improve the ease of use of ClutterScript to define scenes.
By adding a new signal definition to the current one we can have both a
simple way to define application logic in code and in the UI definition
file.
The new syntax is trivial:
{
"name" : <signal name>,
"state" : <state machine script id>,
"target-state" : <target state>
}
The ClutterState instance is identified by its script id, and the target
state is resolved at run-time, so it can be defined both in
ClutterScript or in code. Ideally, we should find a way to associate a
default ClutterState instance to the ClutterScript one that parses the
definition; this way we would be able to remove the "state" member, or
even "style" the behaviour of an object by replacing the ClutterState
instance.
The implementation uses a signal emission hook, to avoid knowing the
signal signature; we check the emitter of the signal against the object
that defined the signal, to avoid erroneous state changes.
2011-02-07 08:48:58 -05:00
|
|
|
|
|
|
|
guint is_handler : 1;
|
2011-06-13 08:07:04 -04:00
|
|
|
guint warp_to : 1;
|
2007-11-15 10:24:43 -05:00
|
|
|
} SignalInfo;
|
2007-10-08 11:03:22 -04:00
|
|
|
|
2007-10-25 10:34:54 -04:00
|
|
|
void property_info_free (gpointer data);
|
|
|
|
|
2012-02-09 13:40:03 -05:00
|
|
|
GType _clutter_script_parser_get_type (void) G_GNUC_CONST;
|
2009-11-04 08:32:26 -05:00
|
|
|
|
2011-09-07 11:14:10 -04:00
|
|
|
gboolean _clutter_script_parse_node (ClutterScript *script,
|
|
|
|
GValue *value,
|
|
|
|
const gchar *name,
|
|
|
|
JsonNode *node,
|
|
|
|
GParamSpec *pspec);
|
|
|
|
|
|
|
|
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);
|
|
|
|
gboolean _clutter_script_flags_from_string (GType gtype,
|
|
|
|
const gchar *string,
|
|
|
|
gint *flags_value);
|
|
|
|
|
|
|
|
gboolean _clutter_script_parse_knot (ClutterScript *script,
|
|
|
|
JsonNode *node,
|
|
|
|
ClutterKnot *knot);
|
|
|
|
gboolean _clutter_script_parse_geometry (ClutterScript *script,
|
|
|
|
JsonNode *node,
|
|
|
|
ClutterGeometry *geometry);
|
|
|
|
gboolean _clutter_script_parse_color (ClutterScript *script,
|
|
|
|
JsonNode *node,
|
|
|
|
ClutterColor *color);
|
2009-11-06 06:33:32 -05:00
|
|
|
GObject *_clutter_script_parse_alpha (ClutterScript *script,
|
|
|
|
JsonNode *node);
|
2007-10-25 10:34:54 -04:00
|
|
|
|
2009-11-04 09:05:13 -05:00
|
|
|
void _clutter_script_construct_object (ClutterScript *script,
|
|
|
|
ObjectInfo *oinfo);
|
|
|
|
void _clutter_script_apply_properties (ClutterScript *script,
|
|
|
|
ObjectInfo *oinfo);
|
|
|
|
|
2009-11-04 08:32:26 -05:00
|
|
|
gchar *_clutter_script_generate_fake_id (ClutterScript *script);
|
|
|
|
|
|
|
|
void _clutter_script_warn_missing_attribute (ClutterScript *script,
|
|
|
|
const gchar *id,
|
|
|
|
const gchar *attribute);
|
|
|
|
|
|
|
|
void _clutter_script_warn_invalid_value (ClutterScript *script,
|
|
|
|
const gchar *attribute,
|
|
|
|
const gchar *expected,
|
|
|
|
JsonNode *node);
|
|
|
|
|
|
|
|
ObjectInfo *_clutter_script_get_object_info (ClutterScript *script,
|
|
|
|
const gchar *script_id);
|
|
|
|
|
|
|
|
guint _clutter_script_get_last_merge_id (ClutterScript *script);
|
|
|
|
|
|
|
|
void _clutter_script_add_object_info (ClutterScript *script,
|
|
|
|
ObjectInfo *oinfo);
|
|
|
|
|
2010-06-17 11:41:44 -04:00
|
|
|
const gchar *_clutter_script_get_id_from_node (JsonNode *node);
|
|
|
|
|
2007-10-08 11:03:22 -04:00
|
|
|
G_END_DECLS
|
|
|
|
|
|
|
|
#endif /* __CLUTTER_SCRIPT_PRIVATE_H__ */
|