X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d37f9642887a5602d7c0b59527f213c32dd501a..41b0a1139d039c486983ad3ca020217f17fd7414:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index e4c6354b20..9c4cb6ecda 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -101,7 +101,6 @@ void WXDLLEXPORT wxEntryCleanup(); #ifdef WXP_WITH_THREAD -//PyThreadState* wxPyEventThreadState = NULL; PyInterpreterState* wxPyInterpreter = NULL; #endif @@ -118,7 +117,6 @@ void __wxPreStart() #ifdef WXP_WITH_THREAD PyEval_InitThreads(); -// wxPyEventThreadState = PyThreadState_Get(); // PyThreadState_New(PyThreadState_Get()->interp); wxPyInterpreter = PyThreadState_Get()->interp; #endif @@ -294,6 +292,8 @@ PyObject* wxPyMake_wxObject(wxObject* source) { bool isEvtHandler = FALSE; if (source) { + // If it's derived from wxEvtHandler then there may + // already be a pointer to a Python objec that we can use. if (wxIsKindOf(source, wxEvtHandler)) { wxEvtHandler* eh = (wxEvtHandler*)source; wxPyClientData* data = (wxPyClientData*)eh->GetClientObject(); @@ -302,8 +302,19 @@ PyObject* wxPyMake_wxObject(wxObject* source) { Py_INCREF(target); } } + else if (wxIsKindOf(source, wxSizer)) { + // wxSizers also track the original object + wxSizer* sz = (wxSizer*)source; + wxPyClientData* data = (wxPyClientData*)sz->GetClientObject(); + if (data) { + target = data->m_obj; + Py_INCREF(target); + } + } if (! target) { + // Otherwise make it the old fashioned way by making a + // new shadow object and putting this pointer in it. wxClassInfo* info = source->GetClassInfo(); wxChar* name = (wxChar*)info->GetClassName(); PyObject* klass = wxPyClassExists(name); @@ -391,42 +402,6 @@ PyObject* wxPyConstructObject(void* ptr, //--------------------------------------------------------------------------- -// static PyThreadState* myPyThreadState_Get() { -// PyThreadState* current; -// current = PyThreadState_Swap(NULL); -// PyThreadState_Swap(current); -// return current; -// } - - -// bool wxPyRestoreThread() { -// // NOTE: The Python API docs state that if a thread already has the -// // interpreter lock and calls PyEval_RestoreThread again a deadlock -// // occurs, so I put in this code as a guard condition since there are -// // many possibilites for nested events and callbacks in wxPython. If -// // The current thread is our thread, then we can assume that we -// // already have the lock. (I hope!) -// // -// #ifdef WXP_WITH_THREAD -// if (wxPyEventThreadState != myPyThreadState_Get()) { -// PyEval_AcquireThread(wxPyEventThreadState); -// return TRUE; -// } -// else -// #endif -// return FALSE; -// } - - -// void wxPySaveThread(bool doSave) { -// #ifdef WXP_WITH_THREAD -// if (doSave) { -// PyEval_ReleaseThread(wxPyEventThreadState); -// } -// #endif -// } - - wxPyTState* wxPyBeginBlockThreads() { wxPyTState* state = NULL; @@ -619,7 +594,7 @@ void wxPyCBH_delete(wxPyCallbackHelper* cbh) { //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -// These classes can be derived from in Python and passed through the event +// These event classes can be derived from in Python and passed through the event // system without losing anything. They do this by keeping a reference to // themselves and some special case handling in wxPyCallback::EventThunker. @@ -655,37 +630,41 @@ PyObject* wxPyEvtSelfRef::GetSelf() const { } +IMPLEMENT_ABSTRACT_CLASS(wxPyEvent, wxEvent); +IMPLEMENT_ABSTRACT_CLASS(wxPyCommandEvent, wxCommandEvent); + + wxPyEvent::wxPyEvent(int id) : wxEvent(id) { } -wxPyEvent::~wxPyEvent() { -} -// This one is so the event object can be Cloned... -void wxPyEvent::CopyObject(wxObject& dest) const { - wxEvent::CopyObject(dest); - ((wxPyEvent*)&dest)->SetSelf(m_self, TRUE); +wxPyEvent::wxPyEvent(const wxPyEvent& evt) + : wxEvent(evt) +{ + SetSelf(evt.m_self, TRUE); } -IMPLEMENT_DYNAMIC_CLASS(wxPyEvent, wxEvent); +wxPyEvent::~wxPyEvent() { +} wxPyCommandEvent::wxPyCommandEvent(wxEventType commandType, int id) : wxCommandEvent(commandType, id) { } -wxPyCommandEvent::~wxPyCommandEvent() { -} -void wxPyCommandEvent::CopyObject(wxObject& dest) const { - wxCommandEvent::CopyObject(dest); - ((wxPyCommandEvent*)&dest)->SetSelf(m_self, TRUE); +wxPyCommandEvent::wxPyCommandEvent(const wxPyCommandEvent& evt) + : wxCommandEvent(evt) +{ + SetSelf(evt.m_self, TRUE); } -IMPLEMENT_DYNAMIC_CLASS(wxPyCommandEvent, wxCommandEvent); +wxPyCommandEvent::~wxPyCommandEvent() { +} + @@ -1320,6 +1299,19 @@ bool wxColour_helper(PyObject* source, wxColour** obj) { //---------------------------------------------------------------------- + +PyObject* wxArrayString2PyList_helper(const wxArrayString& arr) { + + PyObject* list = PyList_New(0); + for (size_t i=0; i < arr.GetCount(); i++) { + PyObject* str = PyString_FromString(arr[i].c_str()); + PyList_Append(list, str); + Py_DECREF(str); + } + return list; +} + + //---------------------------------------------------------------------- //----------------------------------------------------------------------