[gegl] Improve gegl_node_get_property, fix introspection



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]