X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ba02fb4aced5868d047a5bffbd2ed87583daee4d..0252a3bc3bb43d56b35f0ffe05df0b734b3c9588:/lib/python/enigma_python.i diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index c9dc42e4..d0d46723 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -1,38 +1,250 @@ +/* + 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 + +extern void runMainloop(); +extern void quitMainloop(int exit_code); +extern void setLCD(const char *c); +extern void setLCDClock(const char *c); + +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 %include %include %include + %template(eServiceCenterPtr) ePtr; +%include + +// TODO: embed these... +%immutable eButton::selected; +%immutable eInput::changed; +%immutable eComponentScan::statusChanged; +%immutable pNavigation::m_event; + +%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 +{ +public: + PyObject *get(); +}; + +template class PSignal1 +{ +public: + PyObject *get(); +}; + +template class PSignal2 +{ +public: + PyObject *get(); +}; + +%template(PSignal1VI) PSignal1; + +%typemap(out) PSignal1VI { + $1 = $input->get(); +} + +%template(PSignal0V) PSignal0; + +%typemap(out) PSignal0V { + $1 = $input->get(); +} + +/************** base **************/ + +%immutable eTimer::timeout; + +class eTimer +{ +public: + eTimer(eMainloop *context = eApp); + PSignal0 timeout; + + void start(long msec, bool singleShot=false); + void stop(); + void changeInterval(long msek); +}; + +/************** debug **************/ + +void runMainloop(); +void quitMainloop(int exit_code); +void setLCD(const char*); +void setLCDClock(const char*); +%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; +} +%}