X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/94fd5e4dc14c5de8a0a787eda125987616ace638..3a9becbd5439254a77e7dbc0278d80117a397264:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index d3f1aebbb8..a1a20b66fa 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -61,6 +61,7 @@ bool wxPyDoingCleanup = false; #ifdef WXP_WITH_THREAD +#if !wxPyUSE_GIL_STATE struct wxPyThreadState { unsigned long tid; PyThreadState* tstate; @@ -76,8 +77,11 @@ WX_DEFINE_OBJARRAY(wxPyThreadStateArray); wxPyThreadStateArray* wxPyTStates = NULL; wxMutex* wxPyTMutex = NULL; + +#endif #endif + #define DEFAULTENCODING_SIZE 64 static char wxPyDefaultEncoding[DEFAULTENCODING_SIZE] = "ascii"; @@ -93,14 +97,15 @@ PyObject* wxPyPtrTypeMap = NULL; // This gets run when the DLL is loaded. We just need to save a handle. //---------------------------------------------------------------------- +extern "C" BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved ) { - // If wxPython is embedded in another wxWindows app then - // the inatance has already been set. + // If wxPython is embedded in another wxWidgets app then + // the instance has already been set. if (! wxGetInstance()) wxSetInstance(hinstDLL); return true; @@ -121,6 +126,8 @@ wxPyApp::wxPyApp() { wxPyApp::~wxPyApp() { + wxPythonApp = NULL; + wxApp::SetInstance(NULL); } @@ -150,7 +157,7 @@ int wxPyApp::MainLoop() { bool wxPyApp::OnInitGui() { bool rval=true; wxApp::OnInitGui(); // in this case always call the base class version - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "OnInitGui")) rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); wxPyEndBlockThreads(blocked); @@ -160,7 +167,7 @@ bool wxPyApp::OnInitGui() { int wxPyApp::OnExit() { int rval=0; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "OnExit")) rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); wxPyEndBlockThreads(blocked); @@ -191,7 +198,7 @@ void wxPyApp::OnAssert(const wxChar *file, // If the OnAssert is overloaded in the Python class then call it... bool found; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if ((found = wxPyCBH_findCallback(m_myInst, "OnAssert"))) { PyObject* fso = wx2PyString(file); PyObject* cso = wx2PyString(file); @@ -225,7 +232,7 @@ void wxPyApp::OnAssert(const wxChar *file, } // set the exception - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* s = wx2PyString(buf); PyErr_SetObject(wxPyAssertionError, s); Py_DECREF(s); @@ -260,7 +267,7 @@ void wxPyApp::OnAssert(const wxChar *file, // For catching Apple Events void wxPyApp::MacOpenFile(const wxString &fileName) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "MacOpenFile")) { PyObject* s = wx2PyString(fileName); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); @@ -271,7 +278,7 @@ void wxPyApp::MacOpenFile(const wxString &fileName) void wxPyApp::MacPrintFile(const wxString &fileName) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "MacPrintFile")) { PyObject* s = wx2PyString(fileName); wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); @@ -282,7 +289,7 @@ void wxPyApp::MacPrintFile(const wxString &fileName) void wxPyApp::MacNewFile() { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "MacNewFile")) wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); wxPyEndBlockThreads(blocked); @@ -290,7 +297,7 @@ void wxPyApp::MacNewFile() void wxPyApp::MacReopenApp() { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (wxPyCBH_findCallback(m_myInst, "MacReopenApp")) wxPyCBH_callCallback(m_myInst, Py_BuildValue("()")); wxPyEndBlockThreads(blocked); @@ -383,26 +390,31 @@ void wxPyApp::SetMacHelpMenuTitleName(const wxString& val) { void wxPyApp::_BootstrapApp() { static bool haveInitialized = false; - bool result, blocked; + bool result; + wxPyBlock_t blocked; PyObject* retval = NULL; PyObject* pyint = NULL; - + // Only initialize wxWidgets once if (! haveInitialized) { - + // Get any command-line args passed to this program from the sys module int argc = 0; char** argv = NULL; blocked = wxPyBeginBlockThreads(); + PyObject* sysargv = PySys_GetObject("argv"); - if (sysargv != NULL) { - argc = PyList_Size(sysargv); + PyObject* executable = PySys_GetObject("executable"); + + if (sysargv != NULL && executable != NULL) { + argc = PyList_Size(sysargv) + 1; argv = new char*[argc+1]; + argv[0] = strdup(PyString_AsString(executable)); int x; - for(x=0; xargc = 0; + this->argv = NULL; + } + // It's now ok to generate exceptions for assertion errors. wxPythonApp->SetStartupComplete(true); @@ -534,11 +553,14 @@ void __wxPyPreStart(PyObject* moduleDict) #ifdef __WXMSW__ // wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF // | _CRTDBG_CHECK_ALWAYS_DF -// | _CRTDBG_DELAY_FREE_MEM_DF +// | _CRTDBG_DELAY_FREE_MEM_DF // ); #endif #ifdef WXP_WITH_THREAD +#if wxPyUSE_GIL_STATE + PyEval_InitThreads(); +#else PyEval_InitThreads(); wxPyTStates = new wxPyThreadStateArray; wxPyTMutex = new wxMutex; @@ -546,6 +568,7 @@ void __wxPyPreStart(PyObject* moduleDict) // Save the current (main) thread state in our array PyThreadState* tstate = wxPyBeginAllowThreads(); wxPyEndAllowThreads(tstate); +#endif #endif // Ensure that the build options in the DLL (or whatever) match this build @@ -566,12 +589,14 @@ void __wxPyCleanup() { wxEntryCleanup(); } #ifdef WXP_WITH_THREAD +#if !wxPyUSE_GIL_STATE delete wxPyTMutex; wxPyTMutex = NULL; wxPyTStates->Empty(); delete wxPyTStates; wxPyTStates = NULL; #endif +#endif } @@ -602,7 +627,7 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) wxPyNoAppError = PyErr_NewException("wx._core.PyNoAppError", PyExc_RuntimeError, NULL); PyDict_SetItemString(wxPython_dict, "PyNoAppError", wxPyNoAppError); - + #ifdef __WXMOTIF__ @@ -665,13 +690,13 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) #else _AddInfoString("wx-assertions-off"); #endif - + #undef _AddInfoString PyObject* PlatInfoTuple = PyList_AsTuple(PlatInfo); Py_DECREF(PlatInfo); PyDict_SetItemString(wxPython_dict, "PlatformInfo", PlatInfoTuple); - + RETURN_NONE(); } @@ -785,7 +810,7 @@ void wxPy_ReinitStockObjects(int pass) if (pass == 1) { } \ else if (pass == 2) { rsoPass2(#name); } \ else if (pass == 3) { rsoPass3(#name, #classname, (void*)&name); } - + REINITOBJ(wxNORMAL_FONT, wxFont); REINITOBJ(wxSMALL_FONT, wxFont); @@ -868,7 +893,7 @@ bool wxPyCheckForApp() { void wxPyUserData_dtor(wxPyUserData* self) { if (! wxPyDoingCleanup) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_DECREF(self->m_obj); self->m_obj = NULL; wxPyEndBlockThreads(blocked); @@ -880,7 +905,7 @@ void wxPyClientData_dtor(wxPyClientData* self) { if (! wxPyDoingCleanup) { // Don't do it during cleanup as Python // may have already garbage collected the object... if (self->m_incRef) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_DECREF(self->m_obj); wxPyEndBlockThreads(blocked); } @@ -902,7 +927,7 @@ void wxPyOORClientData_dtor(wxPyOORClientData* self) { static PyObject* deadObjectClass = NULL; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (deadObjectClass == NULL) { deadObjectClass = PyDict_GetItemString(wxPython_dict, "_wxPyDeadObject"); // TODO: Can not wxASSERT here because inside a wxPyBeginBlock Threads, @@ -976,6 +1001,7 @@ void wxPyPtrTypeMap_Add(const char* commonName, const char* ptrName) { PyObject* wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHandler) { PyObject* target = NULL; bool isEvtHandler = false; + bool isSizer = false; if (source) { // If it's derived from wxEvtHandler then there may @@ -992,6 +1018,18 @@ PyObject* wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan } } + // Also check for wxSizer + if (!target && wxIsKindOf(source, wxSizer)) { + isSizer = true; + wxSizer* sz = (wxSizer*)source; + wxPyOORClientData* data = (wxPyOORClientData*)sz->GetClientObject(); + if (data) { + target = data->m_obj; + if (target) + Py_INCREF(target); + } + } + if (! target) { // Otherwise make it the old fashioned way by making a new shadow // object and putting this pointer in it. Look up the class @@ -1009,6 +1047,8 @@ PyObject* wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan target = wxPyConstructObject((void*)source, name, setThisOwn); if (target && isEvtHandler) ((wxEvtHandler*)source)->SetClientObject(new wxPyOORClientData(target)); + if (target && isSizer) + ((wxSizer*)source)->SetClientObject(new wxPyOORClientData(target)); } else { wxString msg(wxT("wxPython class not found for ")); msg += source->GetClassInfo()->GetClassName(); @@ -1024,25 +1064,8 @@ PyObject* wxPyMake_wxObject(wxObject* source, bool setThisOwn, bool checkEvtHan PyObject* wxPyMake_wxSizer(wxSizer* source, bool setThisOwn) { - PyObject* target = NULL; - if (source && wxIsKindOf(source, wxSizer)) { - // If it's derived from wxSizer then there may already be a pointer to - // a Python object that we can use in the OOR data. - wxSizer* sz = (wxSizer*)source; - wxPyOORClientData* data = (wxPyOORClientData*)sz->GetClientObject(); - if (data) { - target = data->m_obj; - if (target) - Py_INCREF(target); - } - } - if (! target) { - target = wxPyMake_wxObject(source, setThisOwn, false); - if (target != Py_None) - ((wxSizer*)source)->SetClientObject(new wxPyOORClientData(target)); - } - return target; + return wxPyMake_wxObject(source, setThisOwn); } @@ -1050,6 +1073,8 @@ PyObject* wxPyMake_wxSizer(wxSizer* source, bool setThisOwn) { #ifdef WXP_WITH_THREAD +#if !wxPyUSE_GIL_STATE + inline unsigned long wxPyGetCurrentThreadId() { return wxThread::GetCurrentId(); @@ -1099,7 +1124,7 @@ void wxPySaveThreadState(PyThreadState* tstate) { // (i.e. ActiveX controls) will (incorrectly IMHO) use a transient // tstate which will then be garbage the next time we try to use // it... - + wxPyTMutex->Unlock(); return; } @@ -1110,6 +1135,7 @@ void wxPySaveThreadState(PyThreadState* tstate) { } #endif +#endif @@ -1119,7 +1145,9 @@ void wxPySaveThreadState(PyThreadState* tstate) { PyThreadState* wxPyBeginAllowThreads() { #ifdef WXP_WITH_THREAD PyThreadState* saved = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS; +#if !wxPyUSE_GIL_STATE wxPySaveThreadState(saved); +#endif return saved; #else return NULL; @@ -1137,17 +1165,21 @@ void wxPyEndAllowThreads(PyThreadState* saved) { // Calls from wxWindows back to Python code, or even any PyObject // manipulations, PyDECREF's and etc. are wrapped in calls to these functions: -bool wxPyBeginBlockThreads() { +wxPyBlock_t wxPyBeginBlockThreads() { #ifdef WXP_WITH_THREAD - // This works in for 2.3, maybe a good alternative to find the needed tstate? - // PyThreadState *check = PyGILState_GetThisThreadState(); - + if (! Py_IsInitialized()) { + return (wxPyBlock_t)0; + } +#if wxPyUSE_GIL_STATE + PyGILState_STATE state = PyGILState_Ensure(); + return state; +#else PyThreadState *current = _PyThreadState_Current; // Only block if there wasn't already a tstate, or if the current one is // not the one we are wanting to change to. This should prevent deadlock // if there are nested calls to wxPyBeginBlockThreads - bool blocked = false; + wxPyBlock_t blocked = false; wxPyThreadState* tstate = wxPyGetThreadState(); if (current != tstate->tstate) { PyEval_RestoreThread(tstate->tstate); @@ -1155,11 +1187,20 @@ bool wxPyBeginBlockThreads() { } return blocked; #endif +#else + return (wxPyBlock_t)0; +#endif } -void wxPyEndBlockThreads(bool blocked) { +void wxPyEndBlockThreads(wxPyBlock_t blocked) { #ifdef WXP_WITH_THREAD + if (! Py_IsInitialized()) { + return; + } +#if wxPyUSE_GIL_STATE + PyGILState_Release(blocked); +#else // Only unblock if we blocked in the last call to wxPyBeginBlockThreads. // The value of blocked passed in needs to be the same as that returned // from wxPyBeginBlockThreads at the same nesting level. @@ -1167,6 +1208,7 @@ void wxPyEndBlockThreads(bool blocked) { PyEval_SaveThread(); } #endif +#endif } @@ -1204,7 +1246,7 @@ PyObject* wxPyInputStream::read(int size) { // check if we have a real wxInputStream to work with if (!m_wxis) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyErr_SetString(PyExc_IOError, "no valid C-wxInputStream"); wxPyEndBlockThreads(blocked); return NULL; @@ -1223,7 +1265,7 @@ PyObject* wxPyInputStream::read(int size) { } // error check - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxStreamError err = m_wxis->GetLastError(); if (err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF) { PyErr_SetString(PyExc_IOError,"IOError in wxInputStream"); @@ -1245,7 +1287,7 @@ PyObject* wxPyInputStream::readline(int size) { // check if we have a real wxInputStream to work with if (!m_wxis) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyErr_SetString(PyExc_IOError,"no valid C-wxInputStream"); wxPyEndBlockThreads(blocked); return NULL; @@ -1258,7 +1300,7 @@ PyObject* wxPyInputStream::readline(int size) { } // errorcheck - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxStreamError err = m_wxis->GetLastError(); if (err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF) { PyErr_SetString(PyExc_IOError,"IOError in wxInputStream"); @@ -1277,19 +1319,19 @@ PyObject* wxPyInputStream::readlines(int sizehint) { // check if we have a real wxInputStream to work with if (!m_wxis) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyErr_SetString(PyExc_IOError,"no valid C-wxInputStream"); wxPyEndBlockThreads(blocked); return NULL; } // init list - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); pylist = PyList_New(0); wxPyEndBlockThreads(blocked); - + if (!pylist) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyErr_NoMemory(); wxPyEndBlockThreads(blocked); return NULL; @@ -1300,12 +1342,12 @@ PyObject* wxPyInputStream::readlines(int sizehint) { for (i=0; (m_wxis->CanRead()) && ((sizehint < 0) || (i < sizehint));) { PyObject* s = this->readline(); if (s == NULL) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_DECREF(pylist); wxPyEndBlockThreads(blocked); return NULL; } - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyList_Append(pylist, s); i += PyString_Size(s); wxPyEndBlockThreads(blocked); @@ -1314,7 +1356,7 @@ PyObject* wxPyInputStream::readlines(int sizehint) { // error check wxStreamError err = m_wxis->GetLastError(); if (err != wxSTREAM_NO_ERROR && err != wxSTREAM_EOF) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_DECREF(pylist); PyErr_SetString(PyExc_IOError,"IOError in wxInputStream"); wxPyEndBlockThreads(blocked); @@ -1343,9 +1385,20 @@ wxPyCBInputStream::wxPyCBInputStream(PyObject *r, PyObject *s, PyObject *t, bool : wxInputStream(), m_read(r), m_seek(s), m_tell(t), m_block(block) {} +wxPyCBInputStream::wxPyCBInputStream(const wxPyCBInputStream& other) +{ + m_read = other.m_read; + m_seek = other.m_seek; + m_tell = other.m_tell; + m_block = other.m_block; + Py_INCREF(m_read); + Py_INCREF(m_seek); + Py_INCREF(m_tell); +} + wxPyCBInputStream::~wxPyCBInputStream() { - bool blocked=false; + wxPyBlock_t blocked; if (m_block) blocked = wxPyBeginBlockThreads(); Py_XDECREF(m_read); Py_XDECREF(m_seek); @@ -1355,7 +1408,7 @@ wxPyCBInputStream::~wxPyCBInputStream() { wxPyCBInputStream* wxPyCBInputStream::create(PyObject *py, bool block) { - bool blocked=false; + wxPyBlock_t blocked; if (block) blocked = wxPyBeginBlockThreads(); PyObject* read = getMethod(py, "read"); @@ -1380,6 +1433,10 @@ wxPyCBInputStream* wxPyCBInputStream_create(PyObject *py, bool block) { return wxPyCBInputStream::create(py, block); } +wxPyCBInputStream* wxPyCBInputStream_copy(wxPyCBInputStream* other) { + return new wxPyCBInputStream(*other); +} + PyObject* wxPyCBInputStream::getMethod(PyObject* py, char* name) { if (!PyObject_HasAttrString(py, name)) return NULL; @@ -1409,7 +1466,7 @@ size_t wxPyCBInputStream::OnSysRead(void *buffer, size_t bufsize) { if (bufsize == 0) return 0; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* arglist = Py_BuildValue("(i)", bufsize); PyObject* result = PyEval_CallObject(m_read, arglist); Py_DECREF(arglist); @@ -1438,7 +1495,7 @@ size_t wxPyCBInputStream::OnSysWrite(const void *buffer, size_t bufsize) { wxFileOffset wxPyCBInputStream::OnSysSeek(wxFileOffset off, wxSeekMode mode) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* arglist = PyTuple_New(2); if (sizeof(wxFileOffset) > sizeof(long)) @@ -1449,7 +1506,7 @@ wxFileOffset wxPyCBInputStream::OnSysSeek(wxFileOffset off, wxSeekMode mode) { PyTuple_SET_ITEM(arglist, 1, PyInt_FromLong(mode)); - + PyObject* result = PyEval_CallObject(m_seek, arglist); Py_DECREF(arglist); Py_XDECREF(result); @@ -1459,7 +1516,7 @@ wxFileOffset wxPyCBInputStream::OnSysSeek(wxFileOffset off, wxSeekMode mode) { wxFileOffset wxPyCBInputStream::OnSysTell() const { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* arglist = Py_BuildValue("()"); PyObject* result = PyEval_CallObject(m_tell, arglist); Py_DECREF(arglist); @@ -1490,7 +1547,7 @@ wxPyCallback::wxPyCallback(const wxPyCallback& other) { } wxPyCallback::~wxPyCallback() { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_DECREF(m_func); wxPyEndBlockThreads(blocked); } @@ -1508,7 +1565,7 @@ void wxPyCallback::EventThunker(wxEvent& event) { PyObject* tuple; bool checkSkip = false; - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxString className = event.GetClassInfo()->GetClassName(); // If the event is one of these types then pass the original @@ -1535,7 +1592,7 @@ void wxPyCallback::EventThunker(wxEvent& event) { s_preName = PyString_FromString(wxPy_PRECALLINIT); s_postName = PyString_FromString(wxPy_POSTCALLCLEANUP); } - + // Check if the event object needs some preinitialization if (PyObject_HasAttr(arg, s_preName)) { result = PyObject_CallMethodObjArgs(arg, s_preName, arg, NULL); @@ -1544,9 +1601,9 @@ void wxPyCallback::EventThunker(wxEvent& event) { PyErr_Clear(); // Just in case... } else { PyErr_Print(); - } + } } - + // Call the event handler, passing the event object tuple = PyTuple_New(1); PyTuple_SET_ITEM(tuple, 0, arg); // steals ref to arg @@ -1566,7 +1623,7 @@ void wxPyCallback::EventThunker(wxEvent& event) { PyErr_Clear(); // Just in case... } else { PyErr_Print(); - } + } } if ( checkSkip ) { @@ -1768,7 +1825,7 @@ PyObject* wxPyCBH_callCallbackObj(const wxPyCallbackHelper& cbh, PyObject* argTu void wxPyCBH_delete(wxPyCallbackHelper* cbh) { if (cbh->m_incRef) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_XDECREF(cbh->m_self); Py_XDECREF(cbh->m_class); wxPyEndBlockThreads(blocked); @@ -1789,14 +1846,14 @@ wxPyEvtSelfRef::wxPyEvtSelfRef() { } wxPyEvtSelfRef::~wxPyEvtSelfRef() { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (m_cloned) Py_DECREF(m_self); wxPyEndBlockThreads(blocked); } void wxPyEvtSelfRef::SetSelf(PyObject* self, bool clone) { - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); if (m_cloned) Py_DECREF(m_self); m_self = self; @@ -1863,7 +1920,7 @@ PyObject* wxPy_ConvertList(wxListBase* listbase) { wxObject* wxObj; wxNode* node = list->GetFirst(); - bool blocked = wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); pyList = PyList_New(0); while (node) { wxObj = node->GetData(); @@ -1886,7 +1943,7 @@ long wxPyGetWinHandle(wxWindow* win) { #if defined(__WXGTK__) || defined(__WXX11) return (long)GetXWindow(win); #endif - + #ifdef __WXMAC__ //return (long)MAC_WXHWND(win->MacGetTopLevelWindowRef()); return (long)win->GetHandle(); @@ -1927,7 +1984,7 @@ wxString* wxString_in_helper(PyObject* source) { if (PyUnicode_Check(source)) { str = PyUnicode_AsEncodedString(source, wxPyDefaultEncoding, "strict"); if (PyErr_Occurred()) return NULL; - } + } else if (!PyString_Check(source)) { str = PyObject_Str(source); if (PyErr_Occurred()) return NULL; @@ -1935,11 +1992,11 @@ wxString* wxString_in_helper(PyObject* source) { char* tmpPtr; int tmpSize; PyString_AsStringAndSize(str, &tmpPtr, &tmpSize); target = new wxString(tmpPtr, tmpSize); - + if (!PyString_Check(source)) Py_DECREF(str); #endif // wxUSE_UNICODE - + return target; } @@ -1955,13 +2012,13 @@ wxString Py2wxString(PyObject* source) if (!PyUnicode_Check(source)) { uni = PyUnicode_FromEncodedObject(source, wxPyDefaultEncoding, "strict"); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? - } + } size_t len = PyUnicode_GET_SIZE(uni); if (len) { PyUnicode_AsWideChar((PyUnicodeObject*)uni, target.GetWriteBuf(len), len); target.UngetWriteBuf(); } - + if (!PyUnicode_Check(source)) Py_DECREF(uni); #else @@ -1970,7 +2027,7 @@ wxString Py2wxString(PyObject* source) if (PyUnicode_Check(source)) { str = PyUnicode_AsEncodedString(source, wxPyDefaultEncoding, "strict"); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? - } + } else if (!PyString_Check(source)) { str = PyObject_Str(source); if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear? @@ -1978,7 +2035,7 @@ wxString Py2wxString(PyObject* source) char* tmpPtr; int tmpSize; PyString_AsStringAndSize(str, &tmpPtr, &tmpSize); target = wxString(tmpPtr, tmpSize); - + if (!PyString_Check(source)) Py_DECREF(str); #endif // wxUSE_UNICODE