X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c039d08bfbb59c0abcbc705fb49f9b2cb321edf..619d05280a2b929908565d87a6edbba5a04dc21b:/utils/wxPython/src/helpers.h diff --git a/utils/wxPython/src/helpers.h b/utils/wxPython/src/helpers.h index d86aa6593f..849625a4bf 100644 --- a/utils/wxPython/src/helpers.h +++ b/utils/wxPython/src/helpers.h @@ -16,11 +16,33 @@ #include +//---------------------------------------------------------------------- + +// if we want to handle threads and Python threads are available... +#if defined(WXP_USE_THREAD) && defined(WITH_THREAD) + +#define WXP_WITH_THREAD +#define wxPy_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS +#define wxPy_END_ALLOW_THREADS Py_END_ALLOW_THREADS + +#else // no Python threads... +#undef WXP_WITH_THREAD +#define wxPy_BEGIN_ALLOW_THREADS +#define wxPy_END_ALLOW_THREADS +#endif + +#ifdef WXP_WITH_THREAD +extern PyThreadState* wxPyEventThreadState; +extern bool wxPyInEvent; +#endif + //---------------------------------------------------------------------- class wxPyApp: public wxApp { public: + wxPyApp(); + ~wxPyApp(); int MainLoop(void); bool OnInit(void); void AfterMainLoop(void); @@ -54,6 +76,8 @@ extern "C" char *SWIG_GetPtr(char *, void **, char *); # pragma warning(disable:4800) #endif +typedef unsigned char byte; + // Non-const versions to keep SWIG happy. extern wxPoint wxPyDefaultPosition; @@ -64,8 +88,8 @@ extern wxString wxPyEmptyStr; class wxPyCallback : public wxObject { public: - wxPyCallback(PyObject* func) { m_func = func; Py_INCREF(m_func); } - ~wxPyCallback() { Py_DECREF(m_func); } + wxPyCallback(PyObject* func); + ~wxPyCallback(); void EventThunker(wxEvent& event); @@ -99,25 +123,110 @@ private: }; //--------------------------------------------------------------------------- -///////////////////////////////////////////////////////////////////////////// -// -// $Log$ -// Revision 1.5 1998/10/02 06:40:40 RD -// Version 0.4 of wxPython for MSW. -// -// Revision 1.4 1998/08/27 21:59:09 RD -// Some chicken-and-egg problems solved for wxPython on wxGTK -// -// Revision 1.3 1998/08/16 04:31:09 RD -// More wxGTK work. -// -// Revision 1.2 1998/08/14 23:36:37 RD -// Beginings of wxGTK compatibility -// -// Revision 1.1 1998/08/09 08:25:51 RD -// Initial version -// -// + +class wxPyEvent : public wxCommandEvent { + DECLARE_DYNAMIC_CLASS(wxPyEvent) +public: + wxPyEvent(wxEventType commandType = wxEVT_NULL, PyObject* userData = Py_None); + ~wxPyEvent(); + + void SetUserData(PyObject* userData); + PyObject* GetUserData(); + +private: + PyObject* m_userData; +}; + + + + + +//--------------------------------------------------------------------------- +// This class holds an instance of a Python Shadow Class object and assists +// with looking up and invoking Python callback methods from C++ virtual +// method redirections. For all classes which have virtuals which should be +// overridable in wxPython, a new subclass is created that contains a +// wxPyCallbackHelper. +//--------------------------------------------------------------------------- + +class wxPyCallbackHelper { +public: + wxPyCallbackHelper(); + ~wxPyCallbackHelper(); + + void setSelf(PyObject* self); + + bool findCallback(const wxString& name); + int callCallback(PyObject* argTuple); + PyObject* callCallbackObj(PyObject* argTuple); + +private: + PyObject* m_self; + PyObject* m_lastFound; +}; + + + +//--------------------------------------------------------------------------- +// These macros are used to implement the virtual methods that should +// redirect to a Python method if one exists. The names designate the +// return type, if any as well as any parameter types. +//--------------------------------------------------------------------------- + +#define PYCALLBACK_BOOL_INTINT(PCLASS, CBNAME) \ + bool CBNAME(int a, int b) { \ + if (m_myInst.findCallback(#CBNAME)) \ + return m_myInst.callCallback(Py_BuildValue("(ii)",a,b)); \ + else \ + return PCLASS::CBNAME(a,b); \ + } \ + bool base_##CBNAME(int a, int b) { \ + return PCLASS::CBNAME(a,b); \ + } + +//--------------------------------------------------------------------------- + +#define PYCALLBACK_BOOL_INT(PCLASS, CBNAME) \ + bool CBNAME(int a) { \ + if (m_myInst.findCallback(#CBNAME)) \ + return m_myInst.callCallback(Py_BuildValue("(i)",a)); \ + else \ + return PCLASS::CBNAME(a); \ + } \ + bool base_##CBNAME(int a) { \ + return PCLASS::CBNAME(a); \ + } + +#define PYCALLBACK_BOOL_INT_pure(PCLASS, CBNAME) \ + bool CBNAME(int a) { \ + if (m_myInst.findCallback(#CBNAME)) \ + return m_myInst.callCallback(Py_BuildValue("(i)",a)); \ + else return false; \ + } + + +//--------------------------------------------------------------------------- + +#define PYCALLBACK__(PCLASS, CBNAME) \ + void CBNAME() { \ + if (m_myInst.findCallback(#CBNAME)) \ + m_myInst.callCallback(Py_BuildValue("()")); \ + else \ + PCLASS::CBNAME(); \ + } \ + void base_##CBNAME() { \ + PCLASS::CBNAME(); \ + } + +//--------------------------------------------------------------------------- + +#define PYPRIVATE \ + void _setSelf(PyObject* self) { \ + m_myInst.setSelf(self); \ + } \ + private: wxPyCallbackHelper m_myInst; + +//--------------------------------------------------------------------------- #endif