mirror of
https://github.com/brl/mutter.git
synced 2024-12-28 22:02:14 +00:00
2008-05-28 Emmanuele Bassi <ebassi@openedhand.com>
Fix merging of objects with the same id. * clutter/clutter-script.c: (json_object_end): If there already is an ObjectInfo under the parsed id, merge the construction with the currently stored state. (parse_children), (parse_signals), (parse_behaviours): Append the newly parsed children, signals and behaviours, in case the ObjectInfo already has unresolved items. (clutter_script_construct_object): Fix a typo in the type check. (clutter_script_init): Do not copy the key inside the hash table holding the objects - we are already holding it inside the value.
This commit is contained in:
parent
1502d0690c
commit
c74dfa96ca
@ -282,7 +282,8 @@ get_id_from_node (JsonNode *node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GList *
|
static GList *
|
||||||
parse_children (JsonNode *node)
|
parse_children (ObjectInfo *oinfo,
|
||||||
|
JsonNode *node)
|
||||||
{
|
{
|
||||||
JsonArray *array;
|
JsonArray *array;
|
||||||
GList *retval;
|
GList *retval;
|
||||||
@ -291,7 +292,7 @@ parse_children (JsonNode *node)
|
|||||||
if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY)
|
if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retval = NULL;
|
retval = oinfo->children;
|
||||||
|
|
||||||
array = json_node_get_array (node);
|
array = json_node_get_array (node);
|
||||||
array_len = json_array_get_length (array);
|
array_len = json_array_get_length (array);
|
||||||
@ -310,7 +311,8 @@ parse_children (JsonNode *node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GList *
|
static GList *
|
||||||
parse_signals (JsonNode *node)
|
parse_signals (ObjectInfo *oinfo,
|
||||||
|
JsonNode *node)
|
||||||
{
|
{
|
||||||
JsonArray *array;
|
JsonArray *array;
|
||||||
GList *retval;
|
GList *retval;
|
||||||
@ -322,7 +324,7 @@ parse_signals (JsonNode *node)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = NULL;
|
retval = oinfo->signals;
|
||||||
array = json_node_get_array (node);
|
array = json_node_get_array (node);
|
||||||
array_len = json_array_get_length (array);
|
array_len = json_array_get_length (array);
|
||||||
|
|
||||||
@ -429,7 +431,8 @@ parse_signals (JsonNode *node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GList *
|
static GList *
|
||||||
parse_behaviours (JsonNode *node)
|
parse_behaviours (ObjectInfo *oinfo,
|
||||||
|
JsonNode *node)
|
||||||
{
|
{
|
||||||
JsonArray *array;
|
JsonArray *array;
|
||||||
GList *retval;
|
GList *retval;
|
||||||
@ -438,7 +441,7 @@ parse_behaviours (JsonNode *node)
|
|||||||
if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY)
|
if (JSON_NODE_TYPE (node) != JSON_NODE_ARRAY)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
retval = NULL;
|
retval = oinfo->behaviours;
|
||||||
|
|
||||||
array = json_node_get_array (node);
|
array = json_node_get_array (node);
|
||||||
array_len = json_array_get_length (array);
|
array_len = json_array_get_length (array);
|
||||||
@ -660,6 +663,7 @@ json_object_end (JsonParser *parser,
|
|||||||
ClutterScriptPrivate *priv = script->priv;
|
ClutterScriptPrivate *priv = script->priv;
|
||||||
ObjectInfo *oinfo;
|
ObjectInfo *oinfo;
|
||||||
JsonNode *val;
|
JsonNode *val;
|
||||||
|
const gchar *id;
|
||||||
GList *members, *l;
|
GList *members, *l;
|
||||||
|
|
||||||
if (!json_object_has_member (object, "id"))
|
if (!json_object_has_member (object, "id"))
|
||||||
@ -688,11 +692,15 @@ json_object_end (JsonParser *parser,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val = json_object_get_member (object, "id");
|
||||||
|
id = json_node_get_string (val);
|
||||||
|
|
||||||
|
oinfo = g_hash_table_lookup (priv->objects, id);
|
||||||
|
if (G_LIKELY (!oinfo))
|
||||||
|
{
|
||||||
oinfo = g_slice_new0 (ObjectInfo);
|
oinfo = g_slice_new0 (ObjectInfo);
|
||||||
oinfo->merge_id = priv->last_merge_id;
|
oinfo->merge_id = priv->last_merge_id;
|
||||||
|
oinfo->id = g_strdup (id);
|
||||||
val = json_object_get_member (object, "id");
|
|
||||||
oinfo->id = json_node_dup_string (val);
|
|
||||||
|
|
||||||
val = json_object_get_member (object, "type");
|
val = json_object_get_member (object, "type");
|
||||||
oinfo->class_name = json_node_dup_string (val);
|
oinfo->class_name = json_node_dup_string (val);
|
||||||
@ -704,11 +712,12 @@ json_object_end (JsonParser *parser,
|
|||||||
|
|
||||||
json_object_remove_member (object, "type_func");
|
json_object_remove_member (object, "type_func");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (json_object_has_member (object, "children"))
|
if (json_object_has_member (object, "children"))
|
||||||
{
|
{
|
||||||
val = json_object_get_member (object, "children");
|
val = json_object_get_member (object, "children");
|
||||||
oinfo->children = parse_children (val);
|
oinfo->children = parse_children (oinfo, val);
|
||||||
|
|
||||||
json_object_remove_member (object, "children");
|
json_object_remove_member (object, "children");
|
||||||
}
|
}
|
||||||
@ -716,7 +725,7 @@ json_object_end (JsonParser *parser,
|
|||||||
if (json_object_has_member (object, "behaviours"))
|
if (json_object_has_member (object, "behaviours"))
|
||||||
{
|
{
|
||||||
val = json_object_get_member (object, "behaviours");
|
val = json_object_get_member (object, "behaviours");
|
||||||
oinfo->behaviours = parse_behaviours (val);
|
oinfo->behaviours = parse_behaviours (oinfo, val);
|
||||||
|
|
||||||
json_object_remove_member (object, "behaviours");
|
json_object_remove_member (object, "behaviours");
|
||||||
}
|
}
|
||||||
@ -724,7 +733,7 @@ json_object_end (JsonParser *parser,
|
|||||||
if (json_object_has_member (object, "signals"))
|
if (json_object_has_member (object, "signals"))
|
||||||
{
|
{
|
||||||
val = json_object_get_member (object, "signals");
|
val = json_object_get_member (object, "signals");
|
||||||
oinfo->signals = parse_signals (val);
|
oinfo->signals = parse_signals (oinfo, val);
|
||||||
|
|
||||||
json_object_remove_member (object, "signals");
|
json_object_remove_member (object, "signals");
|
||||||
}
|
}
|
||||||
@ -776,7 +785,8 @@ json_object_end (JsonParser *parser,
|
|||||||
g_list_length (oinfo->properties),
|
g_list_length (oinfo->properties),
|
||||||
g_list_length (oinfo->signals));
|
g_list_length (oinfo->signals));
|
||||||
|
|
||||||
g_hash_table_replace (priv->objects, g_strdup (oinfo->id), oinfo);
|
g_hash_table_steal (priv->objects, oinfo->id);
|
||||||
|
g_hash_table_insert (priv->objects, oinfo->id, oinfo);
|
||||||
|
|
||||||
oinfo->object = clutter_script_construct_object (script, oinfo);
|
oinfo->object = clutter_script_construct_object (script, oinfo);
|
||||||
}
|
}
|
||||||
@ -1375,7 +1385,7 @@ clutter_script_construct_object (ClutterScript *script,
|
|||||||
GType t_type;
|
GType t_type;
|
||||||
|
|
||||||
t_type = clutter_script_get_type_from_name (script, t_name);
|
t_type = clutter_script_get_type_from_name (script, t_name);
|
||||||
if (g_type_is_a (oinfo->gtype, t_name))
|
if (g_type_is_a (oinfo->gtype, t_type))
|
||||||
{
|
{
|
||||||
oinfo->is_toplevel = clutter_toplevels[i].is_toplevel;
|
oinfo->is_toplevel = clutter_toplevels[i].is_toplevel;
|
||||||
break;
|
break;
|
||||||
@ -1506,7 +1516,7 @@ object_info_free (gpointer data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* destroy every actor, unless it's the default stage */
|
/* destroy every actor, unless it's the default stage */
|
||||||
if (oinfo->is_stage_default != TRUE &&
|
if (oinfo->is_stage_default == FALSE &&
|
||||||
CLUTTER_IS_ACTOR (oinfo->object))
|
CLUTTER_IS_ACTOR (oinfo->object))
|
||||||
clutter_actor_destroy (CLUTTER_ACTOR (oinfo->object));
|
clutter_actor_destroy (CLUTTER_ACTOR (oinfo->object));
|
||||||
}
|
}
|
||||||
@ -1622,7 +1632,7 @@ clutter_script_init (ClutterScript *script)
|
|||||||
priv->last_merge_id = 0;
|
priv->last_merge_id = 0;
|
||||||
|
|
||||||
priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal,
|
priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free,
|
NULL,
|
||||||
object_info_free);
|
object_info_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user