X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/853b255a6b035f9448b4ca7e07a453be7bd2f892..76784eecd960198bc54429a6e16d5bd7af458fce:/utils/wxPython/src/helpers.h?ds=inline diff --git a/utils/wxPython/src/helpers.h b/utils/wxPython/src/helpers.h index 242f154c0f..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); @@ -74,7 +98,6 @@ public: //--------------------------------------------------------------------------- -#ifdef __WXMSW__ class wxPyMenu : public wxMenu { public: wxPyMenu(const wxString& title = "", PyObject* func=NULL); @@ -84,7 +107,7 @@ private: static void MenuCallback(wxMenu& menu, wxCommandEvent& evt); PyObject* func; }; -#endif + //--------------------------------------------------------------------------- @@ -100,16 +123,111 @@ private: }; //--------------------------------------------------------------------------- -///////////////////////////////////////////////////////////////////////////// -// -// $Log$ -// 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