summaryrefslogtreecommitdiffstats
path: root/gobject/pygi-external.h
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/pygi-external.h')
-rw-r--r--gobject/pygi-external.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/gobject/pygi-external.h b/gobject/pygi-external.h
new file mode 100644
index 0000000..e0d11c2
--- /dev/null
+++ b/gobject/pygi-external.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C; c-basic-offset: 4 -*-
+ * vim: tabstop=4 shiftwidth=4 expandtab
+ */
+
+#ifndef _PYGI_EXTERNAL_H_
+#define _PYGI_EXTERNAL_H_
+
+#include <Python.h>
+#include <glib.h>
+
+struct PyGI_API {
+ PyObject* (*type_import_by_g_type) (GType g_type);
+};
+
+static struct PyGI_API *PyGI_API = NULL;
+
+static int
+_pygi_import (void)
+{
+#if ENABLE_PYGI
+ PyObject *module;
+ PyObject *api;
+
+ if (PyGI_API != NULL) {
+ return 1;
+ }
+
+ module = PyImport_ImportModule("gi");
+ if (module == NULL) {
+ return -1;
+ }
+
+ api = PyObject_GetAttrString(module, "_API");
+ if (api == NULL) {
+ Py_DECREF(module);
+ return -1;
+ }
+ if (!PyCObject_Check(api)) {
+ Py_DECREF(module);
+ Py_DECREF(api);
+ PyErr_Format(PyExc_TypeError, "gi._API must be cobject, not %s",
+ api->ob_type->tp_name);
+ return -1;
+ }
+
+ PyGI_API = (struct PyGI_API *)PyCObject_AsVoidPtr(api);
+
+ Py_DECREF(module);
+
+ return 0;
+#else
+ PyErr_SetString(PyExc_ImportError, "PyGI support not enabled");
+ return -1;
+#endif /* ENABLE_PYGI */
+}
+
+static inline PyObject *
+pygi_type_import_by_g_type (GType g_type)
+{
+ if (_pygi_import() < 0) {
+ return NULL;
+ }
+ return PyGI_API->type_import_by_g_type(g_type);
+}
+
+#endif /* _PYGI_EXTERNAL_H_ */