X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/7c12c1089cfbee5b0a390d5f3de37f85de210263..a1664e81dd83e11828909d10b629ed04ea7d3467:/lib/python/enigma_python.i diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 15bc16e2..42315ce7 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -1,43 +1,201 @@ +/* + NOTE: you have two options when adding classes so that + they are callable *from* python. + + - either you %include the header file + - or you re-declare it + + In both cases, you must #include the required + header file (i.e. the header file itself), otherwise + enigma_python_wrap.cxx won't build. + + In case you import the whole header file, + please make sure that no unimportant stuff + is wrapped, as this makes the wrapper stuff + much more complex and it can probably break + very easily because of missing typemaps etc. + + you could make use of dizzy macros to ensure + that some stuff is left out when parsed as SWIG + definitions, but be sure to not modify the binary + representation. DON'T USE #ifdef SWIG_COMPILE + for leaving out stuff (unless you *really* know + what you are doing,of course!). you WILL break it. + + The better way (with more work) is to re-declare + the class. It won't be compiled, so you can + leave out stuff as you like. + + + +Oh, things like "operator= is private in this context" etc. +is usually caused by not marking PSignals as immutable. +*/ + %module enigma %{ + #define SWIG_COMPILE +#include #include #include -#include +#include #include #include - +#include +#include +#include #include #include +#include +#include +#include +#include #include #include #include +#include +#include +#include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern void runMainloop(); +extern void quitMainloop(int exit_code); +extern void setLCD(const char *c); +extern void setLCDClock(const char *c); +extern eApplication *getApplication(); + +extern PSignal1 &keyPressedSignal(); %} +%feature("ref") iObject "$this->AddRef(); /* eDebug(\"AddRef (%s:%d)!\", __FILE__, __LINE__); */ " +%feature("unref") iObject "$this->Release(); /* eDebug(\"Release! %s:%d\", __FILE__, __LINE__); */ " + + +/* this magic allows smartpointer to be used as OUTPUT arguments, i.e. call-by-reference-styled return value. */ + +%define %typemap_output_simple(Type) + %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp), + Type &OUTPUT ($*1_ltype temp) + "$1 = new Type;"; + %fragment("t_out_helper"{Type},"header", + fragment="t_output_helper") {} + %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT + "$result = t_output_helper($result, (SWIG_NewPointerObj((void*)($1), $1_descriptor, 1)));" +%enddef + +%define %typemap_output_ptr(Type) + %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp), + Type &OUTPUT ($*1_ltype temp) + "$1 = new Type;"; + %fragment("t_out_helper"{Type},"header", + fragment="t_output_helper") {} + %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT + // generate None if smartpointer is NULL + "$result = t_output_helper($result, ((*$1) ? SWIG_NewPointerObj((void*)($1), $1_descriptor, 1) : (Py_INCREF(Py_None), Py_None)));" +%enddef + + #define DEBUG +typedef long time_t; +%include "typemaps.i" %include "stl.i" +%include %include %include -%include + +%immutable eTimer::timeout; +%immutable eSocketNotifier::activated; +%include %include %include %include + %template(eServiceCenterPtr) ePtr; +%include + +// TODO: embed these... +%immutable eConsoleAppContainer::appClosed; +%immutable eConsoleAppContainer::dataAvail; +%immutable eConsoleAppContainer::dataSent; %immutable eButton::selected; +%immutable eInput::changed; +%immutable eComponentScan::statusChanged; +%immutable eComponentScan::newService; +%immutable pNavigation::m_event; +%immutable eListbox::selectionChanged; +%include +%include +%include %include %include %include %include %include %include +%include +%include +%include +%include %include %include %include +%include %include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +%include +/************** eptr **************/ + +%template(eActionMapPtr) ePtr; + +/************** signals **************/ template class PSignal0 { @@ -45,27 +203,74 @@ public: PyObject *get(); }; +%template(PSignal0V) PSignal0; + +%typemap(out) PSignal0V { + $1 = $input->get(); +} + template class PSignal1 { public: PyObject *get(); }; -template class PSignal2 +%template(PSignal1VI) PSignal1; + +%typemap(out) PSignal1VI { + $1 = $input->get(); +} + +template class PSignal1Str { public: PyObject *get(); }; -%template(PSignal1VI) PSignal1; +%template(PSignal1VS) PSignal1Str; -%typemap(out) PSignal1VI { +%typemap(out) PSignal1VS { $1 = $input->get(); } -%template(PSignal0V) PSignal0; +template class PSignal2 +{ +public: + PyObject *get(); +}; -%typemap(out) PSignal0V { - $1 = $input->get(); -} +/************** debug **************/ + +void runMainloop(); +void quitMainloop(int exit_code); +void setLCD(const char*); +void setLCDClock(const char*); +eApplication *getApplication(); +%immutable keyPressed; +PSignal1 &keyPressedSignal(); + +%{ +RESULT SwigFromPython(ePtr &result, PyObject *obj) +{ + ePtr *res; + res = 0; + result = 0; + if (SWIG_Python_ConvertPtr(obj, (void **)&res, SWIGTYPE_p_ePtrTgPixmap_t, SWIG_POINTER_EXCEPTION | 0)) + return -1; + if (!res) + return -1; + result = *res; + return 0; +} +PyObject *New_TestObj() +{ + TestObj *result = (TestObj *)new TestObj(); + return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_TestObj, 1); +} +PyObject *New_eServiceReference(const eServiceReference &ref) +{ + eServiceReference *result = new eServiceReference(ref); + return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_eServiceReference, 1); +} +%}