X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/137b5242b1834999da2883c7a68fbde28c6fba37..ba77f39094de162f80a09cc84f0c93373c2584f9:/wxPython/src/helpers.h diff --git a/wxPython/src/helpers.h b/wxPython/src/helpers.h index 64d394ef00..3ad0d236a7 100644 --- a/wxPython/src/helpers.h +++ b/wxPython/src/helpers.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////// // Name: helpers.h -// Purpose: Helper functions/classes for the wxPython extenaion module +// Purpose: Helper functions/classes for the wxPython extension module // // Author: Robin Dunn // @@ -101,6 +101,9 @@ bool wxRealPoint_helper(PyObject* source, wxRealPoint** obj); bool wxRect_helper(PyObject* source, wxRect** obj); bool wxColour_helper(PyObject* source, wxColour** obj); +//---------------------------------------------------------------------- +// Other helpful stuff + #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)) @@ -113,9 +116,9 @@ bool _4int_seq_helper(PyObject* source, int* i1, int* i2, int* i3, int* i4); PyObject* wxArrayString2PyList_helper(const wxArrayString& arr); PyObject* wxArrayInt2PyList_helper(const wxArrayInt& arr); - -#define RETURN_NONE() { Py_INCREF(Py_None); return Py_None; } -#define DECLARE_DEF_STRING(name) static wxString wxPy##name(wx##name) +#define RETURN_NONE() { Py_INCREF(Py_None); return Py_None; } +#define DECLARE_DEF_STRING(name) static const wxString wxPy##name(wx##name) +#define DECLARE_DEF_STRING2(name,val) static const wxString wxPy##name(val) //---------------------------------------------------------------------- @@ -201,6 +204,18 @@ public: }; + +//---------------------------------------------------------------------- +// Forward decalre a few things used in the exported API +class wxPyClientData; +class wxPyUserData; +class wxPyOORClientData; + +void wxPyClientData_dtor(wxPyClientData* self); +void wxPyUserData_dtor(wxPyUserData* self); +void wxPyOORClientData_dtor(wxPyOORClientData* self); + + //--------------------------------------------------------------------------- // Export a C API in a struct. Other modules will be able to load this from // the wxc module and will then have safe access to these functions, even if @@ -208,14 +223,24 @@ public: class wxPyCallbackHelper; + +// Make SunCC happy and make typedef's for these that are extern "C" +typedef void (*p_SWIG_MakePtr_t)(char*, void*, char*); +typedef char* (*p_SWIG_GetPtr_t)(char*, void**, char*); +typedef char* (*p_SWIG_GetPtrObj_t)(PyObject*, void**, char*); +typedef void (*p_SWIG_RegisterMapping_t)(char*, char*, void *(*cast)(void *)); +typedef void (*p_SWIG_addvarlink_t)(PyObject*, char*, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)); +typedef PyObject* (*p_SWIG_newvarlink_t)(void); + + struct wxPyCoreAPI { - void (*p_SWIG_MakePtr)(char*, void*, char*); - char* (*p_SWIG_GetPtr)(char*, void**, char*); - char* (*p_SWIG_GetPtrObj)(PyObject*, void**, char*); - void (*p_SWIG_RegisterMapping)(char*, char*, void *(*cast)(void *)); - void (*p_SWIG_addvarlink)(PyObject*, char*, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)); - PyObject* (*p_SWIG_newvarlink)(void); + p_SWIG_MakePtr_t p_SWIG_MakePtr; + p_SWIG_GetPtr_t p_SWIG_GetPtr; + p_SWIG_GetPtrObj_t p_SWIG_GetPtrObj; + p_SWIG_RegisterMapping_t p_SWIG_RegisterMapping; + p_SWIG_addvarlink_t p_SWIG_addvarlink; + p_SWIG_newvarlink_t p_SWIG_newvarlink; PyThreadState* (*p_wxPyBeginAllowThreads)(); void (*p_wxPyEndAllowThreads)(PyThreadState* state); @@ -256,11 +281,71 @@ struct wxPyCoreAPI { void (*p_wxPyPtrTypeMap_Add)(const char* commonName, const char* ptrName); PyObject* (*p_wxArrayString2PyList_helper)(const wxArrayString& arr); PyObject* (*p_wxArrayInt2PyList_helper)(const wxArrayInt& arr); + + void (*p_wxPyClientData_dtor)(wxPyClientData*); + void (*p_wxPyUserData_dtor)(wxPyUserData*); + void (*p_wxPyOORClientData_dtor)(wxPyOORClientData*); +}; + +#ifdef wxPyUSE_EXPORT +// Notice that this is static, not extern. This is by design, each module +// needs one, but doesn't have to use it. +static wxPyCoreAPI* wxPyCoreAPIPtr = NULL; +#endif + + +//--------------------------------------------------------------------------- + + +class wxPyUserData : public wxObject { +public: + wxPyUserData(PyObject* obj) { + m_obj = obj; + Py_INCREF(m_obj); + } + + ~wxPyUserData() { +#ifdef wxPyUSE_EXPORT + wxPyCoreAPIPtr->p_wxPyUserData_dtor(this); +#else + wxPyUserData_dtor(this); +#endif + } + PyObject* m_obj; }; + +class wxPyClientData : public wxClientData { +public: + wxPyClientData(PyObject* obj) { + m_obj = obj; + Py_INCREF(m_obj); + } + + ~wxPyClientData() { #ifdef wxPyUSE_EXPORT -static wxPyCoreAPI* wxPyCoreAPIPtr = NULL; // Each module needs one, but may not use it. + wxPyCoreAPIPtr->p_wxPyClientData_dtor(this); +#else + wxPyClientData_dtor(this); #endif + } + PyObject* m_obj; +}; + + +class wxPyOORClientData : public wxPyClientData { +public: + wxPyOORClientData(PyObject* obj) + : wxPyClientData(obj) {} + + ~wxPyOORClientData() { +#ifdef wxPyUSE_EXPORT + wxPyCoreAPIPtr->p_wxPyOORClientData_dtor(this); +#else + wxPyOORClientData_dtor(this); +#endif + } +}; //--------------------------------------------------------------------------- // This class holds an instance of a Python Shadow Class object and assists @@ -312,53 +397,6 @@ void wxPyCBH_delete(wxPyCallbackHelper* cbh); -//---------------------------------------------------------------------- - -class wxPyUserData : public wxObject { -public: - wxPyUserData(PyObject* obj) { - m_obj = obj; - Py_INCREF(m_obj); - } - - ~wxPyUserData() { -#ifdef wxPyUSE_EXPORT - wxPyCoreAPIPtr->p_wxPyBeginBlockThreads(); - Py_DECREF(m_obj); - wxPyCoreAPIPtr->p_wxPyEndBlockThreads(); -#else - wxPyBeginBlockThreads(); - Py_DECREF(m_obj); - wxPyEndBlockThreads(); -#endif - } - PyObject* m_obj; -}; - - - -class wxPyClientData : public wxClientData { -public: - wxPyClientData(PyObject* obj) { - m_obj = obj; - Py_INCREF(m_obj); - } - - ~wxPyClientData() { -#ifdef wxPyUSE_EXPORT - wxPyCoreAPIPtr->p_wxPyBeginBlockThreads(); - Py_DECREF(m_obj); - wxPyCoreAPIPtr->p_wxPyEndBlockThreads(); -#else - wxPyBeginBlockThreads(); - Py_DECREF(m_obj); - wxPyEndBlockThreads(); -#endif - } - PyObject* m_obj; -}; - - //--------------------------------------------------------------------------- // These macros are used to implement the virtual methods that should @@ -425,10 +463,10 @@ public: #define IMP_PYCALLBACK_VOID_INTINT(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(int a, int b) { \ bool found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(ii)",a,b)); \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ PCLASS::CBNAME(a,b); \ } \ @@ -438,6 +476,133 @@ public: //--------------------------------------------------------------------------- +#define DEC_PYCALLBACK_VOID_INT4(CBNAME) \ + void CBNAME(int a, int b, int c, int d); \ + void base_##CBNAME(int a, int b, int c, int d); + + +#define IMP_PYCALLBACK_VOID_INT4(CLASS, PCLASS, CBNAME) \ + void CLASS::CBNAME(int a, int b, int c, int d) { \ + bool found; \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiii)",a,b,c,d)); \ + wxPyEndBlockThreads(); \ + if (! found) \ + PCLASS::CBNAME(a,b,c,d); \ + } \ + void CLASS::base_##CBNAME(int a, int b, int c, int d) { \ + PCLASS::CBNAME(a,b,c,d); \ + } + +//--------------------------------------------------------------------------- +#define DEC_PYCALLBACK_VOID_INT5(CBNAME) \ + void CBNAME(int a, int b, int c, int d, int e); \ + void base_##CBNAME(int a, int b, int c, int d, int e); + + +#define IMP_PYCALLBACK_VOID_INT5(CLASS, PCLASS, CBNAME) \ + void CLASS::CBNAME(int a, int b, int c, int d, int e) { \ + bool found; \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiiii)",a,b,c,d,e)); \ + wxPyEndBlockThreads(); \ + if (! found) \ + PCLASS::CBNAME(a,b,c,d,e); \ + } \ + void CLASS::base_##CBNAME(int a, int b, int c, int d, int e) { \ + PCLASS::CBNAME(a,b,c,d,e); \ + } + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_VOID_INTPINTP_const(CBNAME) \ + void CBNAME(int* a, int* b) const; \ + void base_##CBNAME(int* a, int* b) const; + + +#define IMP_PYCALLBACK_VOID_INTPINTP_const(CLASS, PCLASS, CBNAME) \ + void CLASS::CBNAME(int* a, int* b) const { \ + const char* errmsg = #CBNAME " should return a 2-tuple of integers."; \ + bool found; \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* ro; \ + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("()")); \ + if (ro) { \ + if (PySequence_Check(ro) && PyObject_Length(ro) == 2) { \ + PyObject* o1 = PySequence_GetItem(ro, 0); \ + PyObject* o2 = PySequence_GetItem(ro, 1); \ + if (PyNumber_Check(o1) && PyNumber_Check(o2)) { \ + *a = PyInt_AsLong(o1); *b = PyInt_AsLong(o2); \ + } \ + else \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + Py_DECREF(o1); \ + Py_DECREF(o2); \ + } \ + else { \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + } \ + Py_DECREF(ro); \ + } \ + } \ + wxPyEndBlockThreads(); \ + if (! found) \ + PCLASS::CBNAME(a,b); \ + } \ + void CLASS::base_##CBNAME(int* a, int* b) const { \ + PCLASS::CBNAME(a,b); \ + } + + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_SIZE_const(CBNAME) \ + wxSize CBNAME() const; \ + wxSize base_##CBNAME() const; + + +#define IMP_PYCALLBACK_SIZE_const(CLASS, PCLASS, CBNAME) \ + wxSize CLASS::CBNAME() const { \ + const char* errmsg = #CBNAME " should return a 2-tuple of integers."; \ + bool found; wxSize rval(0,0); \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* ro; \ + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("()")); \ + if (ro) { \ + if (PySequence_Check(ro) && PyObject_Length(ro) == 2) { \ + PyObject* o1 = PySequence_GetItem(ro, 0); \ + PyObject* o2 = PySequence_GetItem(ro, 1); \ + if (PyNumber_Check(o1) && PyNumber_Check(o2)) { \ + rval = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2)); \ + } \ + else \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + Py_DECREF(o1); \ + Py_DECREF(o2); \ + } \ + else { \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + } \ + Py_DECREF(ro); \ + } \ + } \ + wxPyEndBlockThreads(); \ + if (! found) \ + return PCLASS::CBNAME(); \ + else \ + return rval; \ + } \ + wxSize CLASS::base_##CBNAME() const { \ + return PCLASS::CBNAME(); \ + } + + +//--------------------------------------------------------------------------- + #define DEC_PYCALLBACK_BOOL_INT(CBNAME) \ bool CBNAME(int a); \ bool base_##CBNAME(int a); @@ -446,10 +611,10 @@ public: #define IMP_PYCALLBACK_BOOL_INT(CLASS, PCLASS, CBNAME) \ bool CLASS::CBNAME(int a) { \ bool rval=FALSE, found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(i)",a));\ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ rval = PCLASS::CBNAME(a); \ return rval; \ @@ -795,10 +960,10 @@ public: #define IMP_PYCALLBACK__BOOL2DBLINT(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(bool a, double b, double c, int d) { \ bool found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iddi)", (int)a,b,c,d));\ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ PCLASS::CBNAME(a, b, c, d); \ } \ @@ -816,10 +981,13 @@ public: #define IMP_PYCALLBACK__STRING(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(const wxString& a) { \ bool found; \ - wxPyBeginBlockThreads(); \ - if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ - wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", wx2PyString(a))); \ - wxPyEndBlockThreads(); \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* s = wx2PyString(a); \ + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); \ + Py_DECREF(s); \ + } \ + wxPyEndBlockThreads(); \ if (! found) \ PCLASS::CBNAME(a); \ } \ @@ -837,10 +1005,13 @@ public: bool CLASS::CBNAME(const wxString& a) { \ bool rval=FALSE; \ bool found; \ - wxPyBeginBlockThreads(); \ - if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ - rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", wx2PyString(a)));\ - wxPyEndBlockThreads(); \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* s = wx2PyString(a); \ + rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); \ + Py_DECREF(s); \ + } \ + wxPyEndBlockThreads(); \ if (! found) \ rval = PCLASS::CBNAME(a); \ return rval; \ @@ -854,15 +1025,18 @@ public: #define DEC_PYCALLBACK_BOOL_STRING_pure(CBNAME) \ bool CBNAME(const wxString& a); -#define IMP_PYCALLBACK_BOOL_STRING_pure(CLASS, PCLASS, CBNAME) \ - bool CLASS::CBNAME(const wxString& a) { \ - bool rval=FALSE; \ - wxPyBeginBlockThreads(); \ - if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ - rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", wx2PyString(a))); \ - wxPyEndBlockThreads(); \ - return rval; \ - } \ +#define IMP_PYCALLBACK_BOOL_STRING_pure(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME(const wxString& a) { \ + bool rval=FALSE; \ + wxPyBeginBlockThreads(); \ + if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ + PyObject* s = wx2PyString(a); \ + rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); \ + Py_DECREF(s); \ + } \ + wxPyEndBlockThreads(); \ + return rval; \ + } \ //--------------------------------------------------------------------------- @@ -875,7 +1049,9 @@ public: wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ - ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(O)", wx2PyString(a)));\ + PyObject* s = wx2PyString(a); \ + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(O)", s)); \ + Py_DECREF(s); \ if (ro) { \ rval = Py2wxString(ro); \ Py_DECREF(ro); \ @@ -893,10 +1069,12 @@ public: #define IMP_PYCALLBACK_STRING_STRINGINT_pure(CLASS, PCLASS, CBNAME) \ wxString CLASS::CBNAME(const wxString& a,int b) { \ wxString rval; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ - ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(Oi)", wx2PyString(a),b)); \ + PyObject* s = wx2PyString(a); \ + ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(Oi)",s,b)); \ + Py_DECREF(s); \ if (ro) { \ rval = Py2wxString(ro); \ Py_DECREF(ro); \ @@ -916,10 +1094,14 @@ public: bool CLASS::CBNAME(const wxString& a, const wxString& b) { \ bool rval=FALSE; \ bool found; \ - wxPyBeginBlockThreads(); \ - if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ - rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)", \ - wx2PyString(a), wx2PyString(b))); \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ + PyObject* s1 = wx2PyString(a); \ + PyObject* s2 = wx2PyString(b); \ + rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OO)",s1,s2)); \ + Py_DECREF(s1); \ + Py_DECREF(s2); \ + } \ wxPyEndBlockThreads(); \ if (! found) \ rval = PCLASS::CBNAME(a, b); \ @@ -987,13 +1169,13 @@ public: #define IMP_PYCALLBACK_BOOL_TAG_pure(CLASS, PCLASS, CBNAME) \ bool CLASS::CBNAME(const wxHtmlTag& a) { \ bool rval=FALSE; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* obj = wxPyConstructObject((void*)&a, "wxHtmlTag", 0); \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", obj)); \ Py_DECREF(obj); \ } \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ return rval; \ } @@ -1006,13 +1188,13 @@ public: #define IMP_PYCALLBACK__CELLINTINT(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y) { \ bool found; \ - wxPyBeginBlockThreads(); \ + 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(); \ + wxPyEndBlockThreads(); \ if (! found) \ PCLASS::CBNAME(cell, x, y); \ } \ @@ -1030,7 +1212,7 @@ public: #define IMP_PYCALLBACK__CELLINTINTME(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME(wxHtmlCell *cell, wxCoord x, wxCoord y, const wxMouseEvent& e) { \ bool found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* obj = wxPyConstructObject((void*)cell, "wxHtmlCell", 0); \ PyObject* o2 = wxPyConstructObject((void*)&e, "wxMouseEvent", 0); \ @@ -1038,12 +1220,12 @@ public: Py_DECREF(obj); \ Py_DECREF(o2); \ } \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ - PCLASS::CBNAME(cell, x, y, e); \ + 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); \ + PCLASS::CBNAME(cell, x, y, e); \ } @@ -1056,10 +1238,10 @@ public: #define IMP_PYCALLBACK___pure(CLASS, PCLASS, CBNAME) \ void CLASS::CBNAME() { \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ } //--------------------------------------------------------------------------- @@ -1070,8 +1252,9 @@ public: #define IMP_PYCALLBACK_wxSize__pure(CLASS, PCLASS, CBNAME) \ wxSize CLASS::CBNAME() { \ + const char* errmsg = #CBNAME " should return a 2-tuple of integers or a wxSize object."; \ wxSize rval(0,0); \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ wxSize* ptr; \ @@ -1079,10 +1262,23 @@ public: if (ro) { \ if (! SWIG_GetPtrObj(ro, (void **)&ptr, "_wxSize_p")) \ rval = *ptr; \ + else if (PySequence_Check(ro) && PyObject_Length(ro) == 2) { \ + PyObject* o1 = PySequence_GetItem(ro, 0); \ + PyObject* o2 = PySequence_GetItem(ro, 1); \ + if (PyNumber_Check(o1) && PyNumber_Check(o2)) \ + rval = wxSize(PyInt_AsLong(o1), PyInt_AsLong(o2)); \ + else \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + Py_DECREF(o1); \ + Py_DECREF(o2); \ + } \ + else { \ + PyErr_SetString(PyExc_TypeError, errmsg); \ + } \ Py_DECREF(ro); \ } \ } \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ return rval; \ } @@ -1097,13 +1293,13 @@ public: bool CLASS::CBNAME(wxWindow* a) { \ bool rval=FALSE; \ bool found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* obj = wxPyMake_wxObject(a); \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", obj)); \ Py_DECREF(obj); \ } \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ rval = PCLASS::CBNAME(a); \ return rval; \ @@ -1123,10 +1319,10 @@ public: bool CLASS::CBNAME() { \ bool rval=FALSE; \ bool found; \ - wxPyBeginBlockThreads(); \ + wxPyBeginBlockThreads(); \ if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ - wxPyEndBlockThreads(); \ + wxPyEndBlockThreads(); \ if (! found) \ rval = PCLASS::CBNAME(); \ return rval; \ @@ -1137,6 +1333,29 @@ public: //--------------------------------------------------------------------------- +#define DEC_PYCALLBACK_BOOL_const(CBNAME) \ + bool CBNAME() const; \ + bool base_##CBNAME() const; + + +#define IMP_PYCALLBACK_BOOL_const(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME() const { \ + bool rval=FALSE; \ + bool found; \ + wxPyBeginBlockThreads(); \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) \ + rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); \ + wxPyEndBlockThreads(); \ + if (! found) \ + rval = PCLASS::CBNAME(); \ + return rval; \ + } \ + bool CLASS::base_##CBNAME() const { \ + return PCLASS::CBNAME(); \ + } + +//--------------------------------------------------------------------------- + #define DEC_PYCALLBACK_DR_2WXCDR(CBNAME) \ wxDragResult CBNAME(wxCoord x, wxCoord y, wxDragResult def); \ wxDragResult base_##CBNAME(wxCoord x, wxCoord y, wxDragResult def); @@ -1170,13 +1389,15 @@ public: if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ PyObject* ro; \ PyObject* obj = wxPyMake_wxObject(&a); \ + PyObject* s = wx2PyString(b); \ ro = wxPyCBH_callCallbackObj(m_myInst, Py_BuildValue("(OO)",\ - obj, wx2PyString(b))); \ + obj, s)); \ if (ro) { \ SWIG_GetPtrObj(ro, (void **)&rval, "_wxFSFILE_p"); \ Py_DECREF(ro); \ } \ Py_DECREF(obj); \ + Py_DECREF(s); \ } \ wxPyEndBlockThreads(); \ return rval; \ @@ -1230,8 +1451,11 @@ public: bool CLASS::CBNAME(int a, int b, const wxString& c) { \ bool rval=FALSE; \ wxPyBeginBlockThreads(); \ - if (wxPyCBH_findCallback(m_myInst, #CBNAME)) \ - rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)",a,b, wx2PyString(c)));\ + if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ + PyObject* s = wx2PyString(c); \ + rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iiO)",a,b,s));\ + Py_DECREF(s); \ + } \ wxPyEndBlockThreads(); \ return rval; \ } \