diff options
Diffstat (limited to 'externals/grill/py/source/py.cpp')
-rw-r--r-- | externals/grill/py/source/py.cpp | 83 |
1 files changed, 64 insertions, 19 deletions
diff --git a/externals/grill/py/source/py.cpp b/externals/grill/py/source/py.cpp index 3856739e..bf3ff8fb 100644 --- a/externals/grill/py/source/py.cpp +++ b/externals/grill/py/source/py.cpp @@ -11,19 +11,23 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "main.h" -class pyobj: - public py +class pyobj + : public pybase + , public flext_base { - FLEXT_HEADER_S(pyobj,py,Setup) + FLEXT_HEADER_S(pyobj,flext_base,Setup) public: pyobj(int argc,const t_atom *argv); ~pyobj(); protected: - bool m_method_(int n,const t_symbol *s,int argc,const t_atom *argv); + virtual void Exit(); - bool work(const t_symbol *s,int argc,const t_atom *argv); + virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv); + virtual void CbClick(); + + void m_help(); void m_reload(); void m_reload_(int argc,const t_atom *argv); @@ -31,16 +35,14 @@ protected: void m_dir_() { m__dir(function); } void m_doc_() { m__doc(function); } - virtual void m_help(); - // methods for python arguments void callwork(const t_symbol *s,int argc,const t_atom *argv); - void m_bang() { callwork(sym_bang,0,NULL); } - void m_py_list(int argc,const t_atom *argv) { callwork(sym_list,argc,argv); } - void m_py_float(int argc,const t_atom *argv) { callwork(sym_float,argc,argv); } - void m_py_int(int argc,const t_atom *argv) { callwork(sym_int,argc,argv); } - void m_py_any(const t_symbol *s,int argc,const t_atom *argv) { callwork(s,argc,argv); } + inline void m_bang() { callwork(NULL,0,NULL); } + inline void m_py_list(int argc,const t_atom *argv) { callwork(sym_list,argc,argv); } + inline void m_py_float(int argc,const t_atom *argv) { callwork(sym_float,argc,argv); } + inline void m_py_int(int argc,const t_atom *argv) { callwork(sym_int,argc,argv); } + inline void m_py_any(const t_symbol *s,int argc,const t_atom *argv) { callwork(s,argc,argv); } const t_symbol *funname; PyObject *function; @@ -51,12 +53,16 @@ protected: void SetFunction(const char *func); void ResetFunction(); + virtual bool thrcall(void *data); + virtual void DumpOut(const t_symbol *sym,int argc,const t_atom *argv); + private: virtual bool callpy(PyObject *fun,PyObject *args); static void Setup(t_classid c); + FLEXT_CALLBACK(m_help) FLEXT_CALLBACK(m_bang) FLEXT_CALLBACK(m_reload) FLEXT_CALLBACK_V(m_reload_) @@ -69,10 +75,20 @@ private: FLEXT_CALLBACK_V(m_py_int) FLEXT_CALLBACK_A(m_py_any) + // callbacks + FLEXT_ATTRVAR_I(detach) + FLEXT_ATTRVAR_B(respond) + FLEXT_CALLBACK_V(m_stop) + FLEXT_CALLBACK(m_dir) + FLEXT_CALLGET_V(mg_dir) + FLEXT_CALLBACK(m_doc) + #ifdef FLEXT_THREADS - FLEXT_THREAD_A(work) + FLEXT_CALLBACK_T(tick) + FLEXT_THREAD(threadworker) + FLEXT_THREAD_X(work_wrapper) #else - FLEXT_CALLBACK_A(work) + FLEXT_CALLBACK_X(work_wrapper) #endif }; @@ -81,6 +97,14 @@ FLEXT_LIB_V("py",pyobj) void pyobj::Setup(t_classid c) { + FLEXT_CADDMETHOD_(c,0,"doc",m_doc); + FLEXT_CADDMETHOD_(c,0,"dir",m_dir); +#ifdef FLEXT_THREADS + FLEXT_CADDATTR_VAR1(c,"detach",detach); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); +#endif + + FLEXT_CADDMETHOD_(c,0,"help",m_help); FLEXT_CADDMETHOD_(c,0,"reload",m_reload_); FLEXT_CADDMETHOD_(c,0,"reload.",m_reload); FLEXT_CADDMETHOD_(c,0,"doc+",m_doc_); @@ -100,11 +124,17 @@ void pyobj::Setup(t_classid c) pyobj::pyobj(int argc,const t_atom *argv): function(NULL),funname(NULL),withfunction(false) { - PyThreadState *state = PyLock(); - AddInAnything(2); AddOutAnything(); +#ifdef FLEXT_THREADS + FLEXT_ADDTIMER(stoptmr,tick); + // launch thread worker + FLEXT_CALLMETHOD(threadworker); +#endif + + PyThreadState *state = PyLock(); + if(argc > 2) SetArgs(argc-2,argv+2); else @@ -163,10 +193,13 @@ pyobj::~pyobj() PyUnlock(state); } +void pyobj::Exit() +{ + pybase::Exit(); + flext_base::Exit(); +} - - -bool pyobj::m_method_(int n,const t_symbol *s,int argc,const t_atom *argv) +bool pyobj::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) { if(n == 1) post("%s - no method for type %s",thisName(),GetString(s)); @@ -346,3 +379,15 @@ void pyobj::callwork(const t_symbol *s,int argc,const t_atom *argv) Respond(ret); } + +void pyobj::CbClick() { pybase::OpenEditor(); } + +void pyobj::DumpOut(const t_symbol *sym,int argc,const t_atom *argv) +{ + ToOutAnything(GetOutAttr(),sym?sym:thisTag(),argc,argv); +} + +bool pyobj::thrcall(void *data) +{ + return FLEXT_CALLMETHOD_X(work_wrapper,data); +} |