X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/059a841c9651ba15b1ecc7a8c35189a813a122eb..240889a18cb17f20884c6ce36e52a6dcf589bb08:/wxPython/src/helpers.h?ds=sidebyside diff --git a/wxPython/src/helpers.h b/wxPython/src/helpers.h index cae2b86d8f..62230c6400 100644 --- a/wxPython/src/helpers.h +++ b/wxPython/src/helpers.h @@ -134,6 +134,7 @@ wxPoint* wxPoint_LIST_helper(PyObject* source, int* npoints); wxBitmap** wxBitmap_LIST_helper(PyObject* source); wxString* wxString_LIST_helper(PyObject* source); wxAcceleratorEntry* wxAcceleratorEntry_LIST_helper(PyObject* source); +wxPen** wxPen_LIST_helper(PyObject* source); bool wxSize_helper(PyObject* source, wxSize** obj); bool wxPoint_helper(PyObject* source, wxPoint** obj); @@ -141,6 +142,20 @@ bool wxRealPoint_helper(PyObject* source, wxRealPoint** obj); bool wxRect_helper(PyObject* source, wxRect** obj); bool wxColour_helper(PyObject* source, wxColour** obj); +#if PYTHON_API_VERSION < 1009 +#define PySequence_Fast_GET_ITEM(o, i) \ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) +#endif + +bool _2int_seq_helper(PyObject* source, int* i1, int* i2); +bool _4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4); + + +PyObject* wxArrayString2PyList_helper(const wxArrayString& app); + + +#define RETURN_NONE() { Py_INCREF(Py_None); return Py_None; } + //---------------------------------------------------------------------- #ifndef SWIGCODE @@ -260,7 +275,7 @@ struct wxPyCoreAPI { bool (*p_wxRect_helper)(PyObject* source, wxRect** obj); bool (*p_wxColour_helper)(PyObject* source, wxColour** obj); - void (*p_wxPyCBH_setSelf)(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); + void (*p_wxPyCBH_setCallbackInfo)(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); bool (*p_wxPyCBH_findCallback)(const wxPyCallbackHelper& cbh, const char* name); int (*p_wxPyCBH_callCallback)(const wxPyCallbackHelper& cbh, PyObject* argTuple); PyObject* (*p_wxPyCBH_callCallbackObj)(const wxPyCallbackHelper& cbh, PyObject* argTuple); @@ -318,7 +333,7 @@ private: }; -void wxPyCBH_setSelf(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); +void wxPyCBH_setCallbackInfo(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name); int wxPyCBH_callCallback(const wxPyCallbackHelper& cbh, PyObject* argTuple); PyObject* wxPyCBH_callCallbackObj(const wxPyCallbackHelper& cbh, PyObject* argTuple); @@ -351,6 +366,29 @@ public: +class wxPyClientData : public wxClientData { +public: + wxPyClientData(PyObject* obj) { + m_obj = obj; + Py_INCREF(m_obj); + } + + ~wxPyClientData() { +#ifdef wxPyUSE_EXPORT + wxPyTState* state = wxPyCoreAPIPtr->p_wxPyBeginBlockThreads(); + Py_DECREF(m_obj); + wxPyCoreAPIPtr->p_wxPyEndBlockThreads(state); +#else + wxPyTState* state = wxPyBeginBlockThreads(); + Py_DECREF(m_obj); + wxPyEndBlockThreads(state); +#endif + } + PyObject* m_obj; +}; + + + //--------------------------------------------------------------------------- // These macros are used to implement the virtual methods that should // redirect to a Python method if one exists. The names designate the @@ -358,8 +396,8 @@ public: //--------------------------------------------------------------------------- #define PYPRIVATE \ - void _setSelf(PyObject* self, PyObject* _class, int incref=1) { \ - wxPyCBH_setSelf(m_myInst, self, _class, incref); \ + void _setCallbackInfo(PyObject* self, PyObject* _class, int incref=1) { \ + wxPyCBH_setCallbackInfo(m_myInst, self, _class, incref); \ } \ private: wxPyCallbackHelper m_myInst @@ -997,6 +1035,58 @@ public: return rval; \ } +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK__CELLINTINT(CBNAME) \ + void CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y); \ + void base_##CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y); + +#define IMP_PYCALLBACK__CELLINTINT(CLASS, PCLASS, CBNAME) \ + void CLASS::CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y) { \ + wxString rval; \ + bool found; \ + wxPyTState* state = wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* obj = wxPyConstructObject((void*)cell, "wxHtmlCell", 0); \ + wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(Oii)",obj,x,y)); \ + Py_DECREF(obj); \ + } \ + wxPyEndBlockThreads(state); \ + if (! found) \ + PCLASS::CBNAME(cell, x, y); \ + } \ + void CLASS::base_##CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y) { \ + PCLASS::CBNAME(cell, x, y); \ + } + + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK__CELLINTINTME(CBNAME) \ + void CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& e); \ + void base_##CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& e); + +#define IMP_PYCALLBACK__CELLINTINTME(CLASS, PCLASS, CBNAME) \ + void CLASS::CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& e) { \ + bool found; \ + wxPyTState* state = wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* obj = wxPyConstructObject((void*)cell, "wxHtmlCell", 0); \ + PyObject* o2 = wxPyConstructObject((void*)&e, "wxMouseEvent", 0); \ + wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OiiO)",obj,x,y,o2)); \ + Py_DECREF(obj); \ + Py_DECREF(o2); \ + } \ + wxPyEndBlockThreads(state); \ + if (! found) \ + PCLASS::CBNAME(cell, x, y, e); \ + } \ + void CLASS::base_##CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& e) { \ + PCLASS::CBNAME(cell, x, y, e); \ + } + + + //--------------------------------------------------------------------------- #define DEC_PYCALLBACK___pure(CBNAME) \ @@ -1408,4 +1498,35 @@ public: //--------------------------------------------------------------------------- +#define DEC_PYCALLBACK_BOOL_ME(CBNAME) \ + bool CBNAME(wxMouseEvent& e); \ + bool base_##CBNAME(wxMouseEvent& e); + +#define IMP_PYCALLBACK_BOOL_ME(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME(wxMouseEvent& e) { \ + bool rval; \ + bool found; \ + wxPyTState* state = wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* ro; \ + PyObject* obj = wxPyConstructObject((void*)&e, "wxMouseEvent", 0); \ + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(O)",obj)); \ + if (ro) { \ + rval = PyInt_AsLong(ro); \ + Py_DECREF(ro); \ + } \ + Py_DECREF(obj); \ + } \ + wxPyEndBlockThreads(state); \ + if (! found) \ + return PCLASS::CBNAME(e); \ + return rval; \ + } \ + bool CLASS::base_##CBNAME(wxMouseEvent& e) { \ + return PCLASS::CBNAME(e); \ + } + + +//--------------------------------------------------------------------------- + #endif