diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gtk/gtkcontainer.override | 57 | ||||
-rw-r--r-- | tests/test_container.py | 26 |
3 files changed, 93 insertions, 0 deletions
@@ -1,3 +1,13 @@ +2007-07-27 Paul Pogonyshev <pogonyshev@gmx.net> + + reviewed by: Johan, Fix bug #389777 + + * tests/test_container.py (MyAlignment): New auxiliary widget class. + (ContainerTest.testSuperclassForAll): New test case. + + * gtk/gtkcontainer.override (_wrap_GtkContainer__do_forall_callback) + (_wrap_GtkContainer__do_forall): New functions. + 2007-07-26 Gian Mario Tagliaretti <gianmt@gnome.org> reviewed by: gjc, Fix bug #460200 diff --git a/gtk/gtkcontainer.override b/gtk/gtkcontainer.override index 17a2c8a5..7e07f42a 100644 --- a/gtk/gtkcontainer.override +++ b/gtk/gtkcontainer.override @@ -1082,3 +1082,60 @@ _wrap_GtkContainer__do_get_child_property(PyObject *cls, PyObject *args, PyObjec g_value_unset(&value); return py_value; } + +%% +override GtkContainer__do_forall kwargs + +typedef struct { + PyObject *callback; + PyObject *callback_data; +} PyGtkContainerPyCallbackData; + +static void +_wrap_GtkContainer__do_forall_callback(GtkWidget *child, PyGtkContainerPyCallbackData *data) +{ + PyObject *pychild = pygobject_new((GObject *) child); + PyObject *result; + + result = PyObject_CallFunctionObjArgs(data->callback, pychild, data->callback_data, NULL); + /* Just discard it. */ + Py_DECREF(result); +} + +static PyObject * +_wrap_GtkContainer__do_forall(PyObject *cls, PyObject *args, PyObject *kwargs) +{ + gpointer klass; + static char *kwlist[] = { "self", "include_internals", "callback", "callback_data", NULL }; + PyGObject *self; + char include_internals; + PyObject *callback; + PyObject *callback_data = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!bO|O:GtkContainer.forall", kwlist, + &PyGtkContainer_Type, &self, + &include_internals, + &callback, &callback_data)) + return NULL; + + klass = g_type_class_ref(pyg_type_from_object(cls)); + if (GTK_CONTAINER_CLASS(klass)->forall) { + PyGtkContainerPyCallbackData *data = g_new(PyGtkContainerPyCallbackData, 1); + data->callback = callback; + data->callback_data = callback_data; + + GTK_CONTAINER_CLASS(klass)->forall(GTK_CONTAINER(self->obj), + include_internals, + (GtkCallback)_wrap_GtkContainer__do_forall_callback, + data); + g_free(data); + g_type_class_unref(klass); + Py_INCREF(Py_None); + return Py_None; + } + else { + PyErr_SetString(PyExc_NotImplementedError, "virtual method GtkContainer.forall not implemented"); + g_type_class_unref(klass); + return NULL; + } +} diff --git a/tests/test_container.py b/tests/test_container.py index a970fa44..fa1f6411 100644 --- a/tests/test_container.py +++ b/tests/test_container.py @@ -41,6 +41,23 @@ MyContainer.install_child_property(1, 'Dumb Prop', 'Dumb Property for testing purposes', '', gobject.PARAM_READWRITE)) + +class MyAlignment(gtk.Alignment): + + def __init__(self, caption): + self.caption = gtk.Label() + self.caption.set_markup('<b>%s</b>' % gobject.markup_escape_text(caption)) + + gtk.Alignment.__init__(self) + + self.caption.set_parent(self) + + def do_forall(self, include_internals, callback, callback_data): + callback(self.caption, callback_data) + gtk.Alignment.do_forall(self, include_internals, callback, callback_data) + +# FIXME: Why is it needed? +gobject.type_register(MyAlignment) class ContainerTest(unittest.TestCase): @@ -52,5 +69,14 @@ class ContainerTest(unittest.TestCase): obj.child_set_property(label, 'dumb_prop', v) self.assertEqual(v, obj.child_get_property(label, 'dumb_prop')) + def testSuperclassForAll(self): + alignment = MyAlignment('test') + label = gtk.Label('foo') + alignment.add(label) + alignment.show_all() + + self.assert_(label.flags() & gtk.VISIBLE) + self.assert_(alignment.caption.flags() & gtk.VISIBLE) + if __name__ == '__main__': unittest.main() |