diff options
author | Gustavo J. A. M. Carneiro <gcarneiro@src.gnome.org> | 2004-04-09 22:37:34 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gcarneiro@src.gnome.org> | 2004-04-09 22:37:34 +0000 |
commit | 01eb05a5e5cd38b35814b3f9780ed48f2b95a769 (patch) | |
tree | b313b4d60519d592f6704d87d4c1ce93db9b2f71 | |
parent | b6696cc7e9b29a7a0b1d2a14472c8ee74dfbb6ce (diff) | |
download | pygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.tar.gz pygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.tar.xz pygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.zip |
G_TYPE_STRV handling; GValueArray conversion fix
-rw-r--r-- | gobject/gobjectmodule.c | 40 | ||||
-rw-r--r-- | gobject/pygtype.c | 5 |
2 files changed, 43 insertions, 2 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index 068e823..bea061e 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -1900,6 +1900,42 @@ pyg_error_check(GError **error) return FALSE; } + +static PyObject * +_pyg_strv_from_gvalue(const GValue *value) +{ + gchar **argv = (gchar **) g_value_get_boxed(value); + int argc, i; + PyObject *py_argv; + + for (argc = -1; argv[++argc];); + py_argv = PyList_New(argc); + for (i = 0; i < argc; ++i) + PyList_SET_ITEM(py_argv, i, PyString_FromString(argv[i])); + return py_argv; +} + +static int +_pyg_strv_to_gvalue(GValue *value, PyObject *obj) +{ + int argc, i; + gchar **argv; + + if (!PySequence_Check(obj)) return -1; + argc = PySequence_Length(obj); + for (i = 0; i < argc; ++i) + if (!PyString_Check(PySequence_Fast_GET_ITEM(obj, i))) + return -1; + argv = g_new(gchar *, argc + 1); + for (i = 0; i < argc; ++i) + argv[i] = g_strdup(PyString_AsString(PySequence_Fast_GET_ITEM(obj, i))); + argv[i] = NULL; + g_value_init(value, G_TYPE_STRV); + g_value_take_boxed(value, argv); + return 0; +} + + /* ----------------- gobject module initialisation -------------- */ struct _PyGObject_Functions pygobject_api_functions = { @@ -2087,4 +2123,8 @@ initgobject(void) PyModule_AddObject(m, "TYPE_PARAM", pyg_type_wrapper_new(G_TYPE_PARAM)); PyModule_AddObject(m, "TYPE_OBJECT", pyg_type_wrapper_new(G_TYPE_OBJECT)); PyModule_AddObject(m, "TYPE_PYOBJECT", pyg_type_wrapper_new(PY_TYPE_OBJECT)); + + pyg_register_boxed_custom(G_TYPE_STRV, + _pyg_strv_from_gvalue, + _pyg_strv_to_gvalue); } diff --git a/gobject/pygtype.c b/gobject/pygtype.c index 85bef4a..908a02f 100644 --- a/gobject/pygtype.c +++ b/gobject/pygtype.c @@ -683,10 +683,11 @@ pyg_value_as_pyobject(const GValue *value, gboolean copy_boxed) return ret; } else if (G_VALUE_HOLDS(value, G_TYPE_VALUE_ARRAY)) { GValueArray *array = (GValueArray *) g_value_get_boxed(value); - PyObject *ret = PyTuple_New(array->n_values); + PyObject *ret = PyList_New(array->n_values); int i; for (i = 0; i < array->n_values; ++i) - PyTuple_SET_ITEM(ret, i, pyg_value_as_pyobject(array->values + i, copy_boxed)); + PyList_SET_ITEM(ret, i, pyg_value_as_pyobject + (array->values + i, copy_boxed)); return ret; } bm = pyg_boxed_lookup(G_VALUE_TYPE(value)); |