X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2809785e15e15fbb474140567c6f60452cd9a116..9269629e9edf24ce170f225d408a5472ab6864ac:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index b5ad3f8f6b..13f89c15e6 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -97,6 +97,7 @@ 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 @@ -125,6 +126,8 @@ wxPyApp::wxPyApp() { wxPyApp::~wxPyApp() { + wxPythonApp = NULL; + wxApp::SetInstance(NULL); } @@ -407,11 +410,11 @@ void wxPyApp::_BootstrapApp() if (sysargv != NULL && executable != NULL) { argc = PyList_Size(sysargv) + 1; argv = new char*[argc+1]; - argv[0] = PyString_AsString(executable); + argv[0] = strdup(PyString_AsString(executable)); int x; for(x=1; xargc = 0; + this->argv = NULL; + } + // It's now ok to generate exceptions for assertion errors. wxPythonApp->SetStartupComplete(true); @@ -691,21 +701,6 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) } -//--------------------------------------------------------------------------- - -// Python's PyInstance_Check does not return True for instances of new-style -// classes. This should get close enough for both new and old classes but I -// should re-evaluate the need for doing instance checks... -bool wxPyInstance_Check(PyObject* obj) { - return PyObject_HasAttrString(obj, "__class__") != 0; -} - - -// This one checks if the object is an instance of a SWIG proxy class (it has -// a .this attribute) -bool wxPySwigInstance_Check(PyObject* obj) { - return PyObject_HasAttrString(obj, "this") != 0; -} //--------------------------------------------------------------------------- @@ -991,6 +986,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 @@ -1007,6 +1003,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 @@ -1024,6 +1032,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(); @@ -1039,25 +1049,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); } @@ -1159,6 +1152,9 @@ void wxPyEndAllowThreads(PyThreadState* saved) { wxPyBlock_t wxPyBeginBlockThreads() { #ifdef WXP_WITH_THREAD + if (! Py_IsInitialized()) { + return (wxPyBlock_t)0; + } #if wxPyUSE_GIL_STATE PyGILState_STATE state = PyGILState_Ensure(); return state; @@ -1177,13 +1173,16 @@ wxPyBlock_t wxPyBeginBlockThreads() { return blocked; #endif #else - return false; + return (wxPyBlock_t)0; #endif } void wxPyEndBlockThreads(wxPyBlock_t blocked) { #ifdef WXP_WITH_THREAD + if (! Py_IsInitialized()) { + return; + } #if wxPyUSE_GIL_STATE PyGILState_Release(blocked); #else @@ -2711,6 +2710,145 @@ PyObject* wxArrayInt2PyList_helper(const wxArrayInt& arr) { } +//---------------------------------------------------------------------- +// wxPyImageHandler methods +// +// TODO: Switch these to use wxPython's standard macros and helper classes +// for calling callbacks. + +PyObject* wxPyImageHandler::m_DoCanRead_Name = NULL; +PyObject* wxPyImageHandler::m_GetImageCount_Name = NULL; +PyObject* wxPyImageHandler::m_LoadFile_Name = NULL; +PyObject* wxPyImageHandler::m_SaveFile_Name = NULL; + +PyObject* wxPyImageHandler::py_InputStream(wxInputStream* stream) { + return wxPyConstructObject(new wxPyInputStream(stream), + wxT("wxPyInputStream"), 0); +} + +PyObject* wxPyImageHandler::py_Image(wxImage* image) { + return wxPyConstructObject(image, wxT("wxImage"), 0); +} + +PyObject* wxPyImageHandler::py_OutputStream(wxOutputStream* stream) { + return wxPyConstructObject(stream, wxT("wxOutputStream"), 0); +} + +wxPyImageHandler::wxPyImageHandler(): + m_self(NULL) +{ + if (!m_DoCanRead_Name) { + m_DoCanRead_Name = PyString_FromString("DoCanRead"); + m_GetImageCount_Name = PyString_FromString("GetImageCount"); + m_LoadFile_Name = PyString_FromString("LoadFile"); + m_SaveFile_Name = PyString_FromString("SaveFile"); + } +} + +wxPyImageHandler::~wxPyImageHandler() { + if (m_self) { + Py_DECREF(m_self); + m_self = NULL; + } +} + +void wxPyImageHandler::_SetSelf(PyObject *self) { + // should check here for isinstance(PyImageHandler) ?? + m_self = self; + Py_INCREF(m_self); +} + +bool wxPyImageHandler::DoCanRead(wxInputStream& stream) { + // check if our object has this method + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if (!m_self || !PyObject_HasAttr(m_self, m_DoCanRead_Name)) { + wxPyEndBlockThreads(blocked); + return false; + } + + PyObject* res = PyObject_CallMethodObjArgs(m_self, m_DoCanRead_Name, + py_InputStream(&stream), NULL); + bool retval = false; + if (res) { + retval = PyInt_AsLong(res); + Py_DECREF(res); + PyErr_Clear(); + } + else + PyErr_Print(); + wxPyEndBlockThreads(blocked); + return retval; +} + +bool wxPyImageHandler::LoadFile( wxImage* image, wxInputStream& stream, + bool verbose, int index ) { + // check if our object has this method + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if (!m_self || !PyObject_HasAttr(m_self, m_LoadFile_Name)) { + wxPyEndBlockThreads(blocked); + return false; + } + PyObject* res = PyObject_CallMethodObjArgs(m_self, m_LoadFile_Name, + py_Image(image), + py_InputStream(&stream), + PyInt_FromLong(verbose), + PyInt_FromLong(index), + NULL); + bool retval = false; + if (res) { + retval = PyInt_AsLong(res); + Py_DECREF(res); + PyErr_Clear(); + } else + PyErr_Print(); + wxPyEndBlockThreads(blocked); + return retval; +} + +bool wxPyImageHandler::SaveFile( wxImage* image, wxOutputStream& stream, + bool verbose ) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if (!m_self || !PyObject_HasAttr(m_self, m_SaveFile_Name)) { + wxPyEndBlockThreads(blocked); + return false; + } + PyObject* res = PyObject_CallMethodObjArgs(m_self, m_SaveFile_Name, + py_Image(image), + py_OutputStream(&stream), + PyInt_FromLong(verbose), + NULL); + bool retval = false; + if(res) { + retval=PyInt_AsLong(res); + Py_DECREF(res); + PyErr_Clear(); + } else + PyErr_Print(); + wxPyEndBlockThreads(blocked); + return retval; +} + +int wxPyImageHandler::GetImageCount( wxInputStream& stream ) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if (!m_self || !PyObject_HasAttr(m_self, m_GetImageCount_Name)) { + wxPyEndBlockThreads(blocked); + return 1; + } + PyObject *res=PyObject_CallMethodObjArgs(m_self, m_GetImageCount_Name, + py_InputStream(&stream), + NULL); + int retval = 1; + if(res) { + retval=PyInt_AsLong(res); + Py_DECREF(res); + PyErr_Clear(); + } else + PyErr_Print(); + wxPyEndBlockThreads(blocked); + return retval; +} + + //---------------------------------------------------------------------- //----------------------------------------------------------------------