summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog23
-rw-r--r--gobject/gobjectmodule.c46
-rw-r--r--gobject/pygobject-private.h2
-rw-r--r--gobject/pygobject.h2
-rw-r--r--gobject/pygtype.c15
-rw-r--r--tests/test_signal.py16
6 files changed, 98 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 51fbc2f..8536049 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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()