#ifdef WXP_WITH_THREAD
-//PyThreadState* wxPyEventThreadState = NULL;
PyInterpreterState* wxPyInterpreter = NULL;
#endif
#ifdef WXP_WITH_THREAD
PyEval_InitThreads();
-// wxPyEventThreadState = PyThreadState_Get(); // PyThreadState_New(PyThreadState_Get()->interp);
wxPyInterpreter = PyThreadState_Get()->interp;
#endif
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();
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);
//---------------------------------------------------------------------------
-// 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;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
-// 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.
}
+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() {
+}
+
//----------------------------------------------------------------------
+
+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;
+}
+
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------