From be43cc441addda05d1590e0ce983a84d949376da Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 12 Feb 2002 21:28:41 +0000 Subject: [PATCH] A fix for Python 2.2 which can sometimes call __wxCleanup before all the other wxPython objects have been deleted. Other various things to match recent CVS changes in wx. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14163 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/demo/wxCheckListBox.py | 12 +++++++-- wxPython/src/_defs.i | 1 + wxPython/src/_extras.py | 22 +++++++++++----- wxPython/src/events.i | 9 +++++++ wxPython/src/helpers.cpp | 13 +++++++--- wxPython/src/msw/events.cpp | 45 +++++++++++++++++++++++++++++++++ wxPython/src/msw/events.py | 14 ++++++++++ wxPython/src/msw/wx.cpp | 1 + wxPython/src/msw/wx.py | 23 ++++++++++++----- 9 files changed, 123 insertions(+), 17 deletions(-) diff --git a/wxPython/demo/wxCheckListBox.py b/wxPython/demo/wxCheckListBox.py index 00fab47ec4..4a0fd024c7 100644 --- a/wxPython/demo/wxCheckListBox.py +++ b/wxPython/demo/wxCheckListBox.py @@ -13,13 +13,17 @@ class TestPanel(wxPanel): 'twelve', 'thirteen', 'fourteen'] wxStaticText(self, -1, "This example uses the wxCheckListBox control.", - wxPoint(45, 15)) + (45, 15)) - lb = wxCheckListBox(self, 60, wxPoint(80, 50), wxSize(80, 120), + lb = wxCheckListBox(self, 60, (80, 50), (80, 120), sampleList) EVT_LISTBOX(self, 60, self.EvtListBox) EVT_LISTBOX_DCLICK(self, 60, self.EvtListBoxDClick) lb.SetSelection(0) + self.lb = lb + + btn = wxButton(self, -1, "Test SetString", (180, 50)) + EVT_BUTTON(self, btn.GetId(), self.OnTestButton) EVT_RIGHT_UP(self, self.OnDoPopup) @@ -30,6 +34,10 @@ class TestPanel(wxPanel): def EvtListBoxDClick(self, event): self.log.WriteText('EvtListBoxDClick:\n') + def OnTestButton(self, evt): + self.lb.SetString(4, "FUBAR") + + def OnDoPopup(self, evt): menu = wxMenu() # Make this first item bold diff --git a/wxPython/src/_defs.i b/wxPython/src/_defs.i index 265e11bfd0..501704110a 100644 --- a/wxPython/src/_defs.i +++ b/wxPython/src/_defs.i @@ -1000,6 +1000,7 @@ enum wxEventType { wxEVT_MENU_HIGHLIGHT, wxEVT_POPUP_MENU_INIT, wxEVT_SYS_COLOUR_CHANGED, + wxEVT_DISPLAY_CHANGED, wxEVT_SETTING_CHANGED, wxEVT_QUERY_NEW_PALETTE, wxEVT_PALETTE_CHANGED, diff --git a/wxPython/src/_extras.py b/wxPython/src/_extras.py index a3aa030977..2c27bf0584 100644 --- a/wxPython/src/_extras.py +++ b/wxPython/src/_extras.py @@ -98,6 +98,9 @@ def EVT_INIT_DIALOG(win, func): def EVT_SYS_COLOUR_CHANGED(win, func): win.Connect(-1, -1, wxEVT_SYS_COLOUR_CHANGED, func) +def EVT_DISPLAY_CHANGED(win, func): + win.Connect(-1, -1, wxEVT_DISPLAY_CHANGED, func) + def EVT_SHOW(win, func): win.Connect(-1, -1, wxEVT_SHOW, func) @@ -772,13 +775,20 @@ class wxPyWidgetTester(wxApp): # unloaded, the refcount on __cleanMeUp goes to zero and it calls the # wxApp_CleanUp function. -class __wxPyCleanup: - def __init__(self): - self.cleanup = wxc.wxApp_CleanUp - def __del__(self): - self.cleanup() +## class __wxPyCleanup: +## def __init__(self): +## self.cleanup = wxc.wxApp_CleanUp +## def __del__(self): +## self.cleanup() + +## __cleanMeUp = __wxPyCleanup() + +if sys.version[0] == '2': + import atexit + atexit.register(wxc.wxApp_CleanUp) +else: + sys.exitfunc = wxc.wxApp_CleanUp -__cleanMeUp = __wxPyCleanup() #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- diff --git a/wxPython/src/events.i b/wxPython/src/events.i index 9b1ef37431..1b348b9dd9 100644 --- a/wxPython/src/events.i +++ b/wxPython/src/events.i @@ -425,6 +425,15 @@ public: }; +//--------------------------------------------------------------------------- + +class wxDisplayChangedEvent : public wxEvent +{ +public: + wxDisplayChangedEvent(); +}; + + //--------------------------------------------------------------------------- class wxPaletteChangedEvent : public wxEvent { diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 13f93b78c3..340c740037 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -256,8 +256,8 @@ PyObject* __wxSetDictionary(PyObject* /* self */, PyObject* args) #ifdef __WXMOTIF__ #define wxPlatform "__WXMOTIF__" #endif -#ifdef __WXQT__ -#define wxPlatform "__WXQT__" +#ifdef __WXX11__ +#define wxPlatform "__WXX11__" #endif #ifdef __WXGTK__ #define wxPlatform "__WXGTK__" @@ -450,9 +450,12 @@ unsigned long wxPyGetCurrentThreadId() { return wxThread::GetCurrentId(); } - +static PyThreadState* gs_shutdownTState; static PyThreadState* wxPyGetThreadState() { + if (wxPyTMutex == NULL) // Python is shutting down... + return gs_shutdownTState; + unsigned long ctid = wxPyGetCurrentThreadId(); PyThreadState* tstate = NULL; @@ -471,6 +474,10 @@ PyThreadState* wxPyGetThreadState() { static void wxPySaveThreadState(PyThreadState* tstate) { + if (wxPyTMutex == NULL) { // Python is shutting down, assume a single thread... + gs_shutdownTState = tstate; + return; + } unsigned long ctid = wxPyGetCurrentThreadId(); wxPyTMutex->Lock(); for(size_t i=0; i < wxPyTStates->GetCount(); i++) { diff --git a/wxPython/src/msw/events.cpp b/wxPython/src/msw/events.cpp index 9a7318567a..fa953aecb9 100644 --- a/wxPython/src/msw/events.cpp +++ b/wxPython/src/msw/events.cpp @@ -6192,6 +6192,48 @@ static PyObject *_wrap_wxNotifyEvent_Veto(PyObject *self, PyObject *args, PyObje return _resultobj; } +static void *SwigwxDisplayChangedEventTowxEvent(void *ptr) { + wxDisplayChangedEvent *src; + wxEvent *dest; + src = (wxDisplayChangedEvent *) ptr; + dest = (wxEvent *) src; + return (void *) dest; +} + +static void *SwigwxDisplayChangedEventTowxObject(void *ptr) { + wxDisplayChangedEvent *src; + wxObject *dest; + src = (wxDisplayChangedEvent *) ptr; + dest = (wxObject *) src; + return (void *) dest; +} + +#define new_wxDisplayChangedEvent() (new wxDisplayChangedEvent()) +static PyObject *_wrap_new_wxDisplayChangedEvent(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxDisplayChangedEvent * _result; + char *_kwnames[] = { NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,":new_wxDisplayChangedEvent",_kwnames)) + return NULL; +{ + PyThreadState* __tstate = wxPyBeginAllowThreads(); + _result = (wxDisplayChangedEvent *)new_wxDisplayChangedEvent(); + + wxPyEndAllowThreads(__tstate); + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxDisplayChangedEvent_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + static void *SwigwxPaletteChangedEventTowxEvent(void *ptr) { wxPaletteChangedEvent *src; wxEvent *dest; @@ -7097,6 +7139,7 @@ static PyMethodDef eventscMethods[] = { { "wxPaletteChangedEvent_GetChangedWindow", (PyCFunction) _wrap_wxPaletteChangedEvent_GetChangedWindow, METH_VARARGS | METH_KEYWORDS }, { "wxPaletteChangedEvent_SetChangedWindow", (PyCFunction) _wrap_wxPaletteChangedEvent_SetChangedWindow, METH_VARARGS | METH_KEYWORDS }, { "new_wxPaletteChangedEvent", (PyCFunction) _wrap_new_wxPaletteChangedEvent, METH_VARARGS | METH_KEYWORDS }, + { "new_wxDisplayChangedEvent", (PyCFunction) _wrap_new_wxDisplayChangedEvent, METH_VARARGS | METH_KEYWORDS }, { "wxNotifyEvent_Veto", (PyCFunction) _wrap_wxNotifyEvent_Veto, METH_VARARGS | METH_KEYWORDS }, { "wxNotifyEvent_Allow", (PyCFunction) _wrap_wxNotifyEvent_Allow, METH_VARARGS | METH_KEYWORDS }, { "wxNotifyEvent_IsAllowed", (PyCFunction) _wrap_wxNotifyEvent_IsAllowed, METH_VARARGS | METH_KEYWORDS }, @@ -7306,6 +7349,7 @@ static struct { char *n1; char *n2; void *(*pcnv)(void *); } _swig_mapping[] = { { "_wxEvent","_wxWindowCreateEvent",SwigwxWindowCreateEventTowxEvent}, { "_wxEvent","_wxQueryNewPaletteEvent",SwigwxQueryNewPaletteEventTowxEvent}, { "_wxEvent","_wxPaletteChangedEvent",SwigwxPaletteChangedEventTowxEvent}, + { "_wxEvent","_wxDisplayChangedEvent",SwigwxDisplayChangedEventTowxEvent}, { "_wxEvent","_wxNotifyEvent",SwigwxNotifyEventTowxEvent}, { "_wxEvent","_wxSysColourChangedEvent",SwigwxSysColourChangedEventTowxEvent}, { "_wxEvent","_wxUpdateUIEvent",SwigwxUpdateUIEventTowxEvent}, @@ -7396,6 +7440,7 @@ static struct { char *n1; char *n2; void *(*pcnv)(void *); } _swig_mapping[] = { { "_wxObject","_wxWindowCreateEvent",SwigwxWindowCreateEventTowxObject}, { "_wxObject","_wxQueryNewPaletteEvent",SwigwxQueryNewPaletteEventTowxObject}, { "_wxObject","_wxPaletteChangedEvent",SwigwxPaletteChangedEventTowxObject}, + { "_wxObject","_wxDisplayChangedEvent",SwigwxDisplayChangedEventTowxObject}, { "_wxObject","_wxNotifyEvent",SwigwxNotifyEventTowxObject}, { "_wxObject","_wxSysColourChangedEvent",SwigwxSysColourChangedEventTowxObject}, { "_wxObject","_wxUpdateUIEvent",SwigwxUpdateUIEventTowxObject}, diff --git a/wxPython/src/msw/events.py b/wxPython/src/msw/events.py index 03051a0702..d6ba0941e7 100644 --- a/wxPython/src/msw/events.py +++ b/wxPython/src/msw/events.py @@ -874,6 +874,20 @@ class wxNotifyEvent(wxNotifyEventPtr): +class wxDisplayChangedEventPtr(wxEventPtr): + def __init__(self,this): + self.this = this + self.thisown = 0 + def __repr__(self): + return "" % (self.this,) +class wxDisplayChangedEvent(wxDisplayChangedEventPtr): + def __init__(self,*_args,**_kwargs): + self.this = apply(eventsc.new_wxDisplayChangedEvent,_args,_kwargs) + self.thisown = 1 + + + + class wxPaletteChangedEventPtr(wxEventPtr): def __init__(self,this): self.this = this diff --git a/wxPython/src/msw/wx.cpp b/wxPython/src/msw/wx.cpp index 2dfe4d69c7..5636d3cfcd 100644 --- a/wxPython/src/msw/wx.cpp +++ b/wxPython/src/msw/wx.cpp @@ -2627,6 +2627,7 @@ SWIGEXPORT(void) initwxc() { PyDict_SetItemString(d,"wxEVT_MENU_HIGHLIGHT", PyInt_FromLong((long) wxEVT_MENU_HIGHLIGHT)); PyDict_SetItemString(d,"wxEVT_POPUP_MENU_INIT", PyInt_FromLong((long) wxEVT_POPUP_MENU_INIT)); PyDict_SetItemString(d,"wxEVT_SYS_COLOUR_CHANGED", PyInt_FromLong((long) wxEVT_SYS_COLOUR_CHANGED)); + PyDict_SetItemString(d,"wxEVT_DISPLAY_CHANGED", PyInt_FromLong((long) wxEVT_DISPLAY_CHANGED)); PyDict_SetItemString(d,"wxEVT_SETTING_CHANGED", PyInt_FromLong((long) wxEVT_SETTING_CHANGED)); PyDict_SetItemString(d,"wxEVT_QUERY_NEW_PALETTE", PyInt_FromLong((long) wxEVT_QUERY_NEW_PALETTE)); PyDict_SetItemString(d,"wxEVT_PALETTE_CHANGED", PyInt_FromLong((long) wxEVT_PALETTE_CHANGED)); diff --git a/wxPython/src/msw/wx.py b/wxPython/src/msw/wx.py index 781cc2ca5b..9a7a30f149 100644 --- a/wxPython/src/msw/wx.py +++ b/wxPython/src/msw/wx.py @@ -859,6 +859,7 @@ wxEVT_MENU_INIT = wxc.wxEVT_MENU_INIT wxEVT_MENU_HIGHLIGHT = wxc.wxEVT_MENU_HIGHLIGHT wxEVT_POPUP_MENU_INIT = wxc.wxEVT_POPUP_MENU_INIT wxEVT_SYS_COLOUR_CHANGED = wxc.wxEVT_SYS_COLOUR_CHANGED +wxEVT_DISPLAY_CHANGED = wxc.wxEVT_DISPLAY_CHANGED wxEVT_SETTING_CHANGED = wxc.wxEVT_SETTING_CHANGED wxEVT_QUERY_NEW_PALETTE = wxc.wxEVT_QUERY_NEW_PALETTE wxEVT_PALETTE_CHANGED = wxc.wxEVT_PALETTE_CHANGED @@ -990,6 +991,9 @@ def EVT_INIT_DIALOG(win, func): def EVT_SYS_COLOUR_CHANGED(win, func): win.Connect(-1, -1, wxEVT_SYS_COLOUR_CHANGED, func) +def EVT_DISPLAY_CHANGED(win, func): + win.Connect(-1, -1, wxEVT_DISPLAY_CHANGED, func) + def EVT_SHOW(win, func): win.Connect(-1, -1, wxEVT_SHOW, func) @@ -1664,13 +1668,20 @@ class wxPyWidgetTester(wxApp): # unloaded, the refcount on __cleanMeUp goes to zero and it calls the # wxApp_CleanUp function. -class __wxPyCleanup: - def __init__(self): - self.cleanup = wxc.wxApp_CleanUp - def __del__(self): - self.cleanup() +## class __wxPyCleanup: +## def __init__(self): +## self.cleanup = wxc.wxApp_CleanUp +## def __del__(self): +## self.cleanup() + +## __cleanMeUp = __wxPyCleanup() + +if sys.version[0] == '2': + import atexit + atexit.register(wxc.wxApp_CleanUp) +else: + sys.exitfunc = wxc.wxApp_CleanUp -__cleanMeUp = __wxPyCleanup() #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- -- 2.47.2