diff options
-rw-r--r-- | ChangeLog | 23 | ||||
-rw-r--r-- | gobject/gobjectmodule.c | 46 | ||||
-rw-r--r-- | gobject/pygobject-private.h | 2 | ||||
-rw-r--r-- | gobject/pygobject.h | 2 | ||||
-rw-r--r-- | gobject/pygtype.c | 15 | ||||
-rw-r--r-- | tests/test_signal.py | 16 |
6 files changed, 98 insertions, 6 deletions
@@ -1,3 +1,26 @@ +2006-06-24 Gustavo J. A. M. Carneiro <gjc@gnome.org> + + * tests/test_signal.py (TestClosures.testGString): Add unit test + for signals using the type TYPE_GSTRING. + + * gobject/pygtype.c (pyg_value_as_pyobject) + (pyg_value_from_pyobject): Implement conversion code for the type + G_TYPE_GSTRING. + + * gobject/gobjectmodule.c (pyg_filename_display_basename) + (pyg_filename_display_name): Add bindings for + g_filename_display_basename and g_filename_display_name. + (init_gobject): Add a TYPE_GSTRING definition. + + * gobject/pygobject.h, + * gobject/pygobject-private.h: Make pyg_constant_strip_prefix + receive and return const gchar*, to indicate it does not change + the string. Unfortunately since PyModule_AddIntConst is broken in + python < 2.5 this introduces const warnings elsewhere :-( + + * gobject/gobjectmodule.c (pyg_flags_add_constants) + (pyg_enum_add_constants): Fix const warnings. + 2006-06-23 John Finlay <finlay@moeraki.com> * gobject/gobjectmodule.c (pyg_object_class_list_properties) diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index e7cba75..b5dd261 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -2615,6 +2615,39 @@ pyg__install_metaclass(PyObject *dummy, PyTypeObject *metaclass) return Py_None; } + +static PyObject * +pyg_filename_display_name(PyGObject *self, PyObject *args) +{ + PyObject *py_display_name; + char *filename, *display_name; + + if (!PyArg_ParseTuple(args, "s:gobject.filename_display_name", + &filename)) + return NULL; + + display_name = g_filename_display_name(filename); + py_display_name = PyUnicode_DecodeUTF8(display_name, strlen(display_name), NULL); + g_free(display_name); + return py_display_name; +} + +static PyObject * +pyg_filename_display_basename(PyGObject *self, PyObject *args) +{ + PyObject *py_display_basename; + char *filename, *display_basename; + + if (!PyArg_ParseTuple(args, "s:gobject.filename_display_basename", + &filename)) + return NULL; + + display_basename = g_filename_display_basename(filename); + py_display_basename = PyUnicode_DecodeUTF8(display_basename, strlen(display_basename), NULL); + g_free(display_basename); + return py_display_basename; +} + static PyMethodDef pygobject_functions[] = { { "type_name", pyg_type_name, METH_VARARGS }, { "type_from_name", pyg_type_from_name, METH_VARARGS }, @@ -2668,6 +2701,10 @@ static PyMethodDef pygobject_functions[] = { (PyCFunction)pyg_remove_emission_hook, METH_VARARGS }, { "_install_metaclass", (PyCFunction)pyg__install_metaclass, METH_O }, + { "filename_display_name", + (PyCFunction)pyg_filename_display_name, METH_VARARGS }, + { "filename_display_basename", + (PyCFunction)pyg_filename_display_basename, METH_VARARGS }, { NULL, NULL, 0 } }; @@ -2688,8 +2725,8 @@ static PyMethodDef pygobject_functions[] = { * * Returns: the stripped constant name. */ -char * -pyg_constant_strip_prefix(gchar *name, const gchar *strip_prefix) +const gchar * +pyg_constant_strip_prefix(const gchar *name, const gchar *strip_prefix) { gint prefix_len; guint j; @@ -2734,7 +2771,7 @@ pyg_enum_add_constants(PyObject *module, GType enum_type, eclass = G_ENUM_CLASS(g_type_class_ref(enum_type)); for (i = 0; i < eclass->n_values; i++) { - gchar *name = eclass->values[i].value_name; + const gchar *name = eclass->values[i].value_name; gint value = eclass->values[i].value; PyModule_AddIntConstant(module, @@ -2773,7 +2810,7 @@ pyg_flags_add_constants(PyObject *module, GType flags_type, fclass = G_FLAGS_CLASS(g_type_class_ref(flags_type)); for (i = 0; i < fclass->n_values; i++) { - gchar *name = fclass->values[i].value_name; + const gchar *name = fclass->values[i].value_name; guint value = fclass->values[i].value; PyModule_AddIntConstant(module, @@ -3375,6 +3412,7 @@ init_gobject(void) /* The rest of the types are set in __init__.py */ PyModule_AddObject(m, "TYPE_INVALID", pyg_type_wrapper_new(G_TYPE_INVALID)); + PyModule_AddObject(m, "TYPE_GSTRING", pyg_type_wrapper_new(G_TYPE_GSTRING)); pyg_register_gtype_custom(G_TYPE_STRV, _pyg_strv_from_gvalue, diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h index b622563..2b6ac73 100644 --- a/gobject/pygobject-private.h +++ b/gobject/pygobject-private.h @@ -152,7 +152,7 @@ void pyg_register_pointer (PyObject *dict, const gchar *class_name, GType pointer_type, PyTypeObject *type); PyObject * pyg_pointer_new (GType pointer_type, gpointer pointer); -extern char * pyg_constant_strip_prefix(gchar *name, const gchar *strip_prefix); +const gchar * pyg_constant_strip_prefix(const gchar *name, const gchar *strip_prefix); /* pygflags */ typedef struct { diff --git a/gobject/pygobject.h b/gobject/pygobject.h index 751d37b..8eeb818 100644 --- a/gobject/pygobject.h +++ b/gobject/pygobject.h @@ -114,7 +114,7 @@ struct _PyGObject_Functions { void (* flags_add_constants)(PyObject *module, GType flags_type, const gchar *strip_prefix); - gchar *(* constant_strip_prefix)(gchar *name, + const gchar *(* constant_strip_prefix)(const gchar *name, const gchar *strip_prefix); gboolean (* error_check)(GError **error); diff --git a/gobject/pygtype.c b/gobject/pygtype.c index 296f48f..65de546 100644 --- a/gobject/pygtype.c +++ b/gobject/pygtype.c @@ -852,6 +852,17 @@ pyg_value_from_pyobject(GValue *value, PyObject *obj) else if (PySequence_Check(obj) && G_VALUE_HOLDS(value, G_TYPE_VALUE_ARRAY)) return pyg_value_array_from_pyobject(value, obj, NULL); + else if (PyString_Check(obj) && + G_VALUE_HOLDS(value, G_TYPE_GSTRING)) { + GString *string; + char *buffer; + int len; + if (PyString_AsStringAndSize(obj, &buffer, &len)) + return -1; + string = g_string_new_len(buffer, len); + g_value_set_boxed(value, string); + break; + } else if ((bm = pyg_type_lookup(G_VALUE_TYPE(value))) != NULL) return bm->tovalue(value, obj); else if (PyCObject_Check(obj)) @@ -1000,6 +1011,10 @@ pyg_value_as_pyobject(const GValue *value, gboolean copy_boxed) PyList_SET_ITEM(ret, i, pyg_value_as_pyobject (array->values + i, copy_boxed)); return ret; + } else if (G_VALUE_HOLDS(value, G_TYPE_GSTRING)) { + GString *string = (GString *) g_value_get_boxed(value); + PyObject *ret = PyString_FromStringAndSize(string->str, string->len); + return ret; } bm = pyg_type_lookup(G_VALUE_TYPE(value)); if (bm) { diff --git a/tests/test_signal.py b/tests/test_signal.py index 6cf9313..fd1e33c 100644 --- a/tests/test_signal.py +++ b/tests/test_signal.py @@ -197,5 +197,21 @@ class TestClosures(unittest.TestCase): e.emit('signal') self.assertEqual(self.count, 1) + def testGString(self): + class C(gobject.GObject): + __gsignals__ = { 'my_signal': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_GSTRING, + (gobject.TYPE_GSTRING,)) } + def __init__(self, test): + gobject.GObject.__init__(self) + self.test = test + def do_my_signal(self, data): + self.data = data + self.test.assertEqual(len(data), 3) + return ''.join([data[2], data[1], data[0]]) + c = C(self) + data = c.emit("my_signal", "\01\00\02") + self.assertEqual(data, "\02\00\01") + + if __name__ == '__main__': unittest.main() |