From 354fa437cdc4b67ca6c2452756a261222109b289 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 25 Jun 2009 18:56:52 +0100 Subject: [PATCH 1/2] Update JSON-GLib dependency Currently, Clutter depends on the internal copy of JSON-GLib for the ClutterScript parser. This is done to allow building Clutter on platforms that do not have the library installed on the system. Just like we use the internal PNG/JPEG loader as a fallback in case we don't have GdkPixbuf or CoreGraphics available, we should use the internal copy of JSON-GLib only in case the system copy is not present. The change is simply to move the default for the --with-json configure switch from "internal" to "check". In order to allow stricter compliance, a third setting should be present: "system", which fails if the system copy is not available. We should also change the introspection generation to avoid breaking in case we require the installed Json-1.0.gir instead of the generated ClutterJson.gir --- clutter/Makefile.am | 5 ++++- configure.ac | 46 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/clutter/Makefile.am b/clutter/Makefile.am index 0acd9b2e9..c636f3ce8 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -244,6 +244,9 @@ BUILT_GIRSOURCES = if LOCAL_JSON_GLIB json_gir_include_path=--add-include-path=json +json_gir_include=--include=ClutterJson-@CLUTTER_API_VERSION@ +else +json_gir_include=--include=Json-1.0 endif # We can't reference the list of COGL header files, since they are in a @@ -261,7 +264,7 @@ Clutter-@CLUTTER_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libclutter-@CLUTTER_ --include=Pango-1.0 \ --include=PangoCairo-1.0 \ --include=Cogl-@CLUTTER_API_VERSION@ \ - --include=ClutterJson-@CLUTTER_API_VERSION@ \ + $(json_gir_include) \ --library=clutter-@CLUTTER_FLAVOUR@-@CLUTTER_API_VERSION@ \ --libtool="$(top_builddir)/doltlibtool" \ --pkg gobject-2.0 \ diff --git a/configure.ac b/configure.ac index 433ba36e7..2b4254468 100644 --- a/configure.ac +++ b/configure.ac @@ -540,14 +540,15 @@ AM_CONDITIONAL(X11_TESTS, [test "x$x11_tests" = "xyes"]) dnl === JSON parser check ===================================================== -# allow building clutter with an external dependency on json-glib -# using the --with-json=check argument, but keep the default to -# the internal version +# we allow building clutter with the internal copy of json-glib +# for platforms without it, but by default we depend on the +# system copy +m4_define([default_json], [check]) AC_ARG_WITH([json], - AC_HELP_STRING([--with-json=@<:@internal/check@:>@], - [Select the JSON-GLib copy to use @<:@default=internal@:>@]), + AC_HELP_STRING([--with-json=@<:@internal/check/system@:>@], + [Select the JSON-GLib copy to use @<:@default=default_json@:>@]), [], - [with_json=internal]) + [with_json=default_json]) AS_CASE([$with_json], @@ -557,16 +558,41 @@ AS_CASE([$with_json], have_json=no ], - [check], + [system], [ AC_MSG_CHECKING([for installed JSON-GLib]) - PKG_CHECK_EXISTS([json-glib-1.0], [have_json=yes], [have_json=no]) + PKG_CHECK_EXISTS([json-glib-1.0 >= 0.7], + [have_json=yes], + [have_json=no]) AS_IF([test "x$have_json" = "xyes"], [ JSON_PREFIX=json-glib - JSON_GLIB_PC=json-glib-1.0 + JSON_GLIB_PC="json-glib-1.0 >= 0.7" - AC_DEFINE(HAVE_JSON_GLIB, 1, [Have the JSON-GLib library installed]) + AC_DEFINE([HAVE_JSON_GLIB], + [1], + [Have the JSON-GLib library installed]) + + AC_MSG_RESULT([found]) + ], + [AC_MSG_ERROR([not found])] + ) + ], + + [check], + [ + AC_MSG_CHECKING([for installed JSON-GLib]) + PKG_CHECK_EXISTS([json-glib-1.0 >= 0.7], + [have_json=yes], + [have_json=no]) + AS_IF([test "x$have_json" = "xyes"], + [ + JSON_PREFIX=json-glib + JSON_GLIB_PC="json-glib-1.0 >= 0.7" + + AC_DEFINE([HAVE_JSON_GLIB], + [1], + [Have the JSON-GLib library installed]) AC_MSG_RESULT([found]) ], From df572d089c0811ecbc5e41d1c68d39fae47040e9 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 29 Jun 2009 16:33:36 +0100 Subject: [PATCH 2/2] [script] Simplify the parser code JSON-GLib provides simple accessors for basic types so that we can avoid getting the JsonNode out of a complex type. This makes the code simpler to understand. --- clutter/clutter-script.c | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/clutter/clutter-script.c b/clutter/clutter-script.c index b9227394d..573d2acb7 100644 --- a/clutter/clutter-script.c +++ b/clutter/clutter-script.c @@ -281,11 +281,7 @@ get_id_from_node (JsonNode *node) case JSON_NODE_OBJECT: object = json_node_get_object (node); if (json_object_has_member (object, "id")) - { - JsonNode *id = json_object_get_member (object, "id"); - - return json_node_get_string (id); - } + return json_object_get_string_member (object, "id"); break; case JSON_NODE_VALUE: @@ -372,11 +368,8 @@ parse_signals (ClutterScript *script, } else { - val = json_object_get_member (object, "name"); - if ((JSON_NODE_TYPE (val) == JSON_NODE_VALUE) && - json_node_get_string (val) != NULL) - name = json_node_get_string (val); - else + name = json_object_get_string_member (object, "name"); + if (!name) { warn_invalid_value (script, "name", "string", val); continue; @@ -391,11 +384,8 @@ parse_signals (ClutterScript *script, } else { - val = json_object_get_member (object, "handler"); - if ((JSON_NODE_TYPE (val) == JSON_NODE_VALUE) && - json_node_get_string (val) != NULL) - handler = json_node_get_string (val); - else + handler = json_object_get_string_member (object, "handler"); + if (!handler) { warn_invalid_value (script, "handler", "string", val); continue; @@ -404,30 +394,21 @@ parse_signals (ClutterScript *script, /* optional: "object" */ if (json_object_has_member (object, "object")) - { - val = json_object_get_member (object, "object"); - if ((JSON_NODE_TYPE (val) == JSON_NODE_VALUE) && - json_node_get_string (val) != NULL) - connect = json_node_get_string (val); - else - connect = NULL; - } + connect = json_object_get_string_member (object, "object"); else connect = NULL; /* optional: "after" */ if (json_object_has_member (object, "after")) { - val = json_object_get_member (object, "after"); - if (json_node_get_boolean (val)) + if (json_object_get_boolean_member (object, "after")) flags |= G_CONNECT_AFTER; } /* optional: "swapped" */ if (json_object_has_member (object, "swapped")) { - val = json_object_get_member (object, "swapped"); - if (json_node_get_boolean (val)) + if (json_object_get_boolean_member (object, "swapped")) flags |= G_CONNECT_SWAPPED; } @@ -764,8 +745,8 @@ json_object_end (JsonParser *parser, if (strcmp (oinfo->class_name, "ClutterStage") == 0 && json_object_has_member (object, "is-default")) { - val = json_object_get_member (object, "is-default"); - oinfo->is_stage_default = json_node_get_boolean (val); + oinfo->is_stage_default = + json_object_get_boolean_member (object, "is-default"); json_object_remove_member (object, "is-default"); }