X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/714e6a9e261da3da9185acaa10c67789081a64ec..76784eecd960198bc54429a6e16d5bd7af458fce:/utils/wxPython/src/helpers.h diff --git a/utils/wxPython/src/helpers.h b/utils/wxPython/src/helpers.h index fedb01c3c3..02433e748b 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); @@ -30,6 +52,7 @@ extern wxPyApp *wxPythonApp; //---------------------------------------------------------------------- +void __wxPreStart(); PyObject* __wxStart(PyObject*, PyObject* args); extern PyObject* wxPython_dict; @@ -53,19 +76,20 @@ 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; extern wxSize wxPyDefaultSize; -extern char* wxPyPanelNameStr; 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,19 +123,111 @@ private: }; //--------------------------------------------------------------------------- -///////////////////////////////////////////////////////////////////////////// -// -// $Log$ -// 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 +// wxPyCallbackList. This list is used to hold references to the Python +// methods. +//--------------------------------------------------------------------------- + +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