blob: b369dca45e27ac1a2745dd9744e5dc11d86e052a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
/* -*- 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) {
PyErr_Clear();
return -1;
}
api = PyObject_GetAttrString(module, "_API");
if (api == NULL) {
PyErr_Clear();
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
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_ */
|