From: Robin Dunn Date: Tue, 14 Mar 2006 01:28:22 +0000 (+0000) Subject: Sometimes we do need to allow recursion of callbacks X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/369ac260a9c8cf3a6bbc33e561d6d298fa90da1a Sometimes we do need to allow recursion of callbacks git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38061 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/include/wx/wxPython/wxPython.h b/wxPython/include/wx/wxPython/wxPython.h index 6c87f80b73..1cf05fc148 100644 --- a/wxPython/include/wx/wxPython/wxPython.h +++ b/wxPython/include/wx/wxPython/wxPython.h @@ -92,7 +92,8 @@ inline wxPyCoreAPI* wxPyGetCoreAPIPtr() #define wxColour_typecheck(a) (wxPyGetCoreAPIPtr()->p_wxColour_typecheck(a)) #define wxPyCBH_setCallbackInfo(a, b, c, d) (wxPyGetCoreAPIPtr()->p_wxPyCBH_setCallbackInfo(a,b,c,d)) -#define wxPyCBH_findCallback(a, b) (wxPyGetCoreAPIPtr()->p_wxPyCBH_findCallback(a, b)) +#define wxPyCBH_findCallback(a, b) (wxPyGetCoreAPIPtr()->p_wxPyCBH_findCallback(a, b, true)) +#define wxPyCBH_findCallback2(a, b, c) (wxPyGetCoreAPIPtr()->p_wxPyCBH_findCallback(a, b, c)) #define wxPyCBH_callCallback(a, b) (wxPyGetCoreAPIPtr()->p_wxPyCBH_callCallback(a, b)) #define wxPyCBH_callCallbackObj(a, b) (wxPyGetCoreAPIPtr()->p_wxPyCBH_callCallbackObj(a, b)) #define wxPyCBH_delete(a) (wxPyGetCoreAPIPtr()->p_wxPyCBH_delete(a)) diff --git a/wxPython/include/wx/wxPython/wxPython_int.h b/wxPython/include/wx/wxPython/wxPython_int.h index 302288b4aa..f53949f059 100644 --- a/wxPython/include/wx/wxPython/wxPython_int.h +++ b/wxPython/include/wx/wxPython/wxPython_int.h @@ -405,7 +405,7 @@ struct wxPyCoreAPI { bool (*p_wxColour_typecheck)(PyObject* source); void (*p_wxPyCBH_setCallbackInfo)(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); - bool (*p_wxPyCBH_findCallback)(const wxPyCallbackHelper& cbh, const char* name); + bool (*p_wxPyCBH_findCallback)(const wxPyCallbackHelper& cbh, const char* name, bool setGuard); int (*p_wxPyCBH_callCallback)(const wxPyCallbackHelper& cbh, PyObject* argTuple); PyObject* (*p_wxPyCBH_callCallbackObj)(const wxPyCallbackHelper& cbh, PyObject* argTuple); void (*p_wxPyCBH_delete)(wxPyCallbackHelper* cbh); @@ -560,7 +560,7 @@ public: } void setSelf(PyObject* self, PyObject* klass, int incref=true); - bool findCallback(const char* name) const; + bool findCallback(const char* name, bool setGuard=true) const; int callCallback(PyObject* argTuple) const; PyObject* callCallbackObj(PyObject* argTuple) const; PyObject* GetLastFound() const { return m_lastFound; } @@ -579,7 +579,7 @@ private: void wxPyCBH_setCallbackInfo(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref); -bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name); +bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name, bool setGuard=true); int wxPyCBH_callCallback(const wxPyCallbackHelper& cbh, PyObject* argTuple); PyObject* wxPyCBH_callCallbackObj(const wxPyCallbackHelper& cbh, PyObject* argTuple); void wxPyCBH_delete(wxPyCallbackHelper* cbh); @@ -1409,7 +1409,7 @@ extern wxPyApp *wxPythonApp; #define IMP_PYCALLBACK_STRING__constpure(CLASS, PCLASS, CBNAME) \ wxString CLASS::CBNAME() const { \ wxString rval; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("()")); \ @@ -1431,8 +1431,8 @@ extern wxPyApp *wxPythonApp; #define IMP_PYCALLBACK_BOOL_TAG_pure(CLASS, PCLASS, CBNAME) \ bool CLASS::CBNAME(const wxHtmlTag& a) { \ bool rval=false; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ - if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + if (wxPyCBH_findCallback2(m_myInst, #CBNAME, false)) { \ PyObject* obj = wxPyConstructObject((void*)&a, wxT("wxHtmlTag"), 0);\ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", obj)); \ Py_DECREF(obj); \ @@ -1449,7 +1449,7 @@ extern wxPyApp *wxPythonApp; #define IMP_PYCALLBACK__CELLINTINT(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y) { \ bool found; \ - wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* obj = wxPyMake_wxObject(cell, 0); \ wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(Oii)",obj,x,y)); \ diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 963d0c58df..65457ddfba 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -1775,7 +1775,7 @@ void wxPyCallbackHelper::clearRecursionGuard(PyObject* method) const // } -bool wxPyCallbackHelper::findCallback(const char* name) const { +bool wxPyCallbackHelper::findCallback(const char* name, bool setGuard) const { wxPyCallbackHelper* self = (wxPyCallbackHelper*)this; // cast away const PyObject *method, *klass; PyObject* nameo = PyString_FromString(name); @@ -1795,7 +1795,8 @@ bool wxPyCallbackHelper::findCallback(const char* name) const { // ...then we'll save a pointer to the method so callCallback can // call it. But first, set a recursion guard in case the // overridden method wants to call the base class version. - setRecursionGuard(method); + if (setGuard) + setRecursionGuard(method); self->m_lastFound = method; } else { @@ -1847,8 +1848,8 @@ void wxPyCBH_setCallbackInfo(wxPyCallbackHelper& cbh, PyObject* self, PyObject* cbh.setSelf(self, klass, incref); } -bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name) { - return cbh.findCallback(name); +bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name, bool setGuard) { + return cbh.findCallback(name, setGuard); } int wxPyCBH_callCallback(const wxPyCallbackHelper& cbh, PyObject* argTuple) {