summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gcarneiro@src.gnome.org>2004-04-09 22:37:34 +0000
committerGustavo J. A. M. Carneiro <gcarneiro@src.gnome.org>2004-04-09 22:37:34 +0000
commit01eb05a5e5cd38b35814b3f9780ed48f2b95a769 (patch)
treeb313b4d60519d592f6704d87d4c1ce93db9b2f71
parentb6696cc7e9b29a7a0b1d2a14472c8ee74dfbb6ce (diff)
downloadpygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.tar.gz
pygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.tar.xz
pygobject-01eb05a5e5cd38b35814b3f9780ed48f2b95a769.zip
G_TYPE_STRV handling; GValueArray conversion fix
-rw-r--r--gobject/gobjectmodule.c40
-rw-r--r--gobject/pygtype.c5
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));