diff --git a/ChangeLog b/ChangeLog index 0e2531d2d7..a310095e31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-05-08 Edward Hervey + + Patch by: Johan Dahlin + * gst/__init__.py: + * gst/gstelement.override: + * testsuite/test_element.py: + New 'fancy' constructor for gst.Element, allows creating elements in a + more pythonic way (i.e. myelement = gst.Element("oggmux")). + Fixes #530417 + 2008-05-08 Edward Hervey * gst/__init__.py: diff --git a/gst/__init__.py b/gst/__init__.py index cfd0d2f507..54a441ae09 100644 --- a/gst/__init__.py +++ b/gst/__init__.py @@ -148,6 +148,14 @@ if RTLD_GLOBAL != -1 and RTLD_LAZY != -1: except: pass +import gobject +from _gst import _install_element_meta + +_GstElementBaseMeta = getattr(gobject, 'GObjectMeta', type) +class _GstElementMeta(_GstElementBaseMeta): + __call__ = element_factory_make +_install_element_meta(_GstElementMeta) + version = get_gst_version sys.setdlopenflags(dlsave) diff --git a/gst/gstelement.override b/gst/gstelement.override index 7cc0d03843..0c86732997 100644 --- a/gst/gstelement.override +++ b/gst/gstelement.override @@ -26,6 +26,22 @@ ignore gst_element_get_property gst_element_set_property %% +define _install_element_meta +static PyObject * +_wrap__install_element_meta(PyObject *self, PyObject *args) +{ + PyObject *metaclass; + + if (!PyArg_ParseTuple(args, "O", &metaclass)) + return NULL; + + Py_INCREF(metaclass); + PyGstElement_Type.ob_type = (PyTypeObject*)metaclass; + + Py_INCREF(Py_None); + return Py_None; +} +%% override gst_element_get_pad_template args static PyObject * _wrap_gst_element_get_pad_template(PyGObject *self, PyObject *args) diff --git a/testsuite/test_element.py b/testsuite/test_element.py index 3c84e1a3ad..e354ec8e63 100644 --- a/testsuite/test_element.py +++ b/testsuite/test_element.py @@ -40,6 +40,12 @@ class ElementTest(TestCase): assert isinstance(element, gst.Element) assert element.get_name() == self.alias + def testFancyConstructor(self): + element = gst.Element(self.name, self.alias) + self.failUnless(element, 'element is None') + self.failUnless(isinstance(element, gst.Element)) + self.assertEquals(element.get_name(), self.alias) + ## FIXME : Make a new test for state changes, using bus signals ## class FakeSinkTest(ElementTest): @@ -147,6 +153,7 @@ class NonExistentTest(ElementTest): testGoodConstructor = lambda s: None testGoodConstructor2 = lambda s: None + testFancyConstructor = lambda s: None class FileSrcTest(ElementTest): name = 'filesrc'