[gegl] Improve gegl_node_get_property, fix introspection
- From: Daniel Sabo <daniels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] Improve gegl_node_get_property, fix introspection
- Date: Fri, 7 Jun 2013 05:50:52 +0000 (UTC)
commit 2c5113928b8012764e7a349e56fc4cdf88b582fc
Author: Daniel Sabo <DanielSabo gmail com>
Date: Wed Jun 5 20:57:18 2013 -0700
Improve gegl_node_get_property, fix introspection
Allow gegl_node_get_property to see all properties of the node,
and add an introspectable version that takes care of initializing
the GValue to the correct type.
gegl/Makefile.am | 77 ++++++++++++++++++-------------------
gegl/gegl-introspection-support.c | 46 ++++++++++++++++++++++
gegl/gegl-introspection-support.h | 40 +++++++++++++++++++
gegl/gegl.h | 2 +-
gegl/graph/gegl-node.c | 44 +++++++++++----------
5 files changed, 149 insertions(+), 60 deletions(-)
---
diff --git a/gegl/Makefile.am b/gegl/Makefile.am
index c03e2b2..e553196 100644
--- a/gegl/Makefile.am
+++ b/gegl/Makefile.am
@@ -39,67 +39,66 @@ LIBS = \
GEGL_publicdir = $(includedir)/gegl-$(GEGL_API_VERSION)
GEGL_introspectable_headers = \
- gegl.h \
- gegl-types.h \
- gegl-enums.h \
- gegl-utils.h \
- gegl-matrix.h \
- gegl-lookup.h \
- gegl-version.h \
- buffer/gegl-buffer.h \
- buffer/gegl-buffer-iterator.h \
- buffer/gegl-buffer-backend.h \
- buffer/gegl-tile-backend.h \
- buffer/gegl-tile-handler.h \
- buffer/gegl-tile-source.h \
- process/gegl-graph-debug.h \
- property-types/gegl-paramspecs.h \
- property-types/gegl-color.h \
- property-types/gegl-path.h \
- property-types/gegl-curve.h
+ gegl.h \
+ gegl-types.h \
+ gegl-enums.h \
+ gegl-utils.h \
+ gegl-matrix.h \
+ gegl-lookup.h \
+ gegl-version.h \
+ buffer/gegl-buffer.h \
+ buffer/gegl-buffer-iterator.h \
+ buffer/gegl-buffer-backend.h \
+ buffer/gegl-tile-backend.h \
+ buffer/gegl-tile-handler.h \
+ buffer/gegl-tile-source.h \
+ process/gegl-graph-debug.h \
+ property-types/gegl-paramspecs.h \
+ property-types/gegl-color.h \
+ property-types/gegl-path.h \
+ property-types/gegl-curve.h
GEGL_public_HEADERS = \
$(GEGL_introspectable_headers) \
- gegl-chant.h \
- gegl-cpuaccel.h \
- gegl-plugin.h \
- buffer/gegl-tile.h
+ gegl-chant.h \
+ gegl-cpuaccel.h \
+ gegl-plugin.h \
+ buffer/gegl-tile.h
-GEGL_introspectable_sources = \
+GEGL_sources = \
gegl-c.c \
- gegl-apply.c \
+ gegl-apply.c \
gegl-config.c \
gegl-cpuaccel.c \
gegl-dot.c \
gegl-dot-visitor.c \
- gegl-enums.c \
+ gegl-enums.c \
gegl-init.c \
gegl-instrument.c \
+ gegl-introspection-support.c \
gegl-utils.c \
gegl-lookup.c \
gegl-xml.c \
- gegl-random.c \
- gegl-matrix.c \
+ gegl-random.c \
+ gegl-matrix.c \
\
- gegl-lookup.h \
+ gegl-apply.h \
+ gegl-chant.h \
gegl-config.h \
gegl-cpuaccel.h \
+ gegl-cpuaccel-priv.h \
gegl-debug.h \
gegl-dot.h \
gegl-dot-visitor.h \
gegl-init.h \
gegl-instrument.h \
+ gegl-introspection-support.h \
+ gegl-lookup.h \
+ gegl-matrix.h \
+ gegl-module.h \
gegl-plugin.h \
gegl-types-internal.h \
- gegl-xml.h \
- gegl-matrix.h
-
-GEGL_sources = \
- $(GEGL_introspectable_sources) \
- gegl-module.h \
- gegl-apply.h \
- gegl-chant.h \
- gegl-cpuaccel-priv.h
+ gegl-xml.h
lib_LTLIBRARIES = libgegl- GEGL_API_VERSION@.la
@@ -117,8 +116,8 @@ libgegl_ GEGL_API_VERSION@_la_LIBADD = \
if HAVE_INTROSPECTION
introspection_sources = \
- $(GEGL_instrospectable_sources) \
- $(GEGL_introspectable_headers)
+ $(GEGL_introspectable_headers) \
+ gegl-introspection-support.h
Gegl- GEGL_API_VERSION@.gir: libgegl- GEGL_API_VERSION@.la Makefile
Gegl_ GEGL_MAJOR_VERSION@_ GEGL_MINOR_VERSION@_gir_INCLUDES = GObject-2.0 GLib-2.0
diff --git a/gegl/gegl-introspection-support.c b/gegl/gegl-introspection-support.c
new file mode 100644
index 0000000..1e5851d
--- /dev/null
+++ b/gegl/gegl-introspection-support.c
@@ -0,0 +1,46 @@
+/* This file is part of GEGL
+ *
+ * GEGL 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 3 of the License, or (at your option) any later version.
+ *
+ * GEGL 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
+ * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2013 Daniel Sabo
+ */
+
+ /*
+ * This file contains alternate versions of functions to make them
+ * more introspection friendly. They are not a public part of the
+ * C API and should not be used outside of this file.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <glib-object.h>
+
+#include "gegl-types-internal.h"
+
+#include "gegl.h"
+#include "graph/gegl-node.h"
+#include "gegl-introspection-support.h"
+
+GValue *
+gegl_node_introspectable_get_property (GeglNode *node,
+ const gchar *property_name)
+{
+ GValue *result = g_new0 (GValue, 1);
+
+ gegl_node_get_property (node, property_name, result);
+
+ return result;
+}
diff --git a/gegl/gegl-introspection-support.h b/gegl/gegl-introspection-support.h
new file mode 100644
index 0000000..0860642
--- /dev/null
+++ b/gegl/gegl-introspection-support.h
@@ -0,0 +1,40 @@
+/* This file is part of GEGL
+ *
+ * GEGL 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 3 of the License, or (at your option) any later version.
+ *
+ * GEGL 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
+ * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2013 Daniel Sabo
+ */
+
+ /*
+ * This file contains alternate versions of functions to make them
+ * more introspection friendly. They are not a public part of the
+ * C API and should not be used outside of this file.
+ */
+
+#include <glib-object.h>
+
+#include <gegl-types.h>
+
+/**
+ * gegl_node_introspectable_get_property:
+ * @node: the node to get a property from
+ * @property_name: the name of the property to get
+ *
+ * Rename to: gegl_node_get_property
+ *
+ * Return value: (transfer full): pointer to a GValue containing the value of the property
+ */
+
+GValue * gegl_node_introspectable_get_property (GeglNode *node,
+ const gchar *property_name);
diff --git a/gegl/gegl.h b/gegl/gegl.h
index 7f4a2a9..3b3d5cf 100644
--- a/gegl/gegl.h
+++ b/gegl/gegl.h
@@ -693,7 +693,7 @@ GeglNode * gegl_node_create_child (GeglNode *parent,
/**
- * gegl_node_get_property:
+ * gegl_node_get_property: (skip)
* @node: the node to get a property from
* @property_name: the name of the property to get
* @value: (out): pointer to a GValue where the value of the property should be stored
diff --git a/gegl/graph/gegl-node.c b/gegl/graph/gegl-node.c
index 15e8712..656fda1 100644
--- a/gegl/graph/gegl-node.c
+++ b/gegl/graph/gegl-node.c
@@ -1433,34 +1433,38 @@ gegl_node_get_property (GeglNode *self,
const gchar *property_name,
GValue *value)
{
+ GParamSpec *pspec;
+
g_return_if_fail (GEGL_IS_NODE (self));
g_return_if_fail (property_name != NULL);
g_return_if_fail (value != NULL);
- if (!strcmp (property_name, "operation") ||
- !strcmp (property_name, "name"))
+ /* Unlinke GObject's get_property this function also
+ * accepts a zero'd GValue and will fill it with the
+ * correct type automaticaly.
+ */
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (self), property_name);
+ if (pspec)
{
- g_object_get_property (G_OBJECT (self),
- property_name, value);
+ if (!G_IS_VALUE (value))
+ g_value_init (value, pspec->value_type);
+ g_object_get_property (G_OBJECT (self), property_name, value);
+ return;
}
- else
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (self->operation), property_name);
+ if (pspec)
{
- if (self->is_graph &&
- !strcmp (property_name, "output"))
- {
- g_warning ("Eeek!");
- g_object_get_property (G_OBJECT (gegl_node_get_output_proxy (self, "output")->operation),
- property_name, value);
- }
- else
- {
- if (self->operation)
- {
- g_object_get_property (G_OBJECT (self->operation),
- property_name, value);
- }
- }
+ if (!G_IS_VALUE (value))
+ g_value_init (value, pspec->value_type);
+ g_object_get_property (G_OBJECT (self->operation), property_name, value);
+ return;
}
+
+ g_warning ("%s is not a valid property of %s",
+ property_name,
+ gegl_node_get_debug_name (self));
}
GParamSpec *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]