Allow the OOR reference to be saved without doing an INCREF. This
solves the circular reference problem with wx.Timer. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31095 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -35,7 +35,14 @@ enum {
|
||||
//IMP_PYCALLBACK__(wxPyTimer, wxTimer, Notify);
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxPyTimer, wxTimer);
|
||||
|
||||
|
||||
wxPyTimer::wxPyTimer(wxEvtHandler *owner, int id)
|
||||
: wxTimer(owner, id)
|
||||
{
|
||||
if (owner == NULL) SetOwner(this);
|
||||
}
|
||||
|
||||
|
||||
void wxPyTimer::Notify() {
|
||||
bool found;
|
||||
bool blocked = wxPyBeginBlockThreads();
|
||||
@@ -58,7 +65,11 @@ MustHaveApp(wxPyTimer);
|
||||
%name(Timer) class wxPyTimer : public wxEvtHandler
|
||||
{
|
||||
public:
|
||||
%pythonAppend wxPyTimer "self._setCallbackInfo(self, Timer, 0); self._setOORInfo(self)"
|
||||
// Don't let the OOR or callback info hold references to the object so
|
||||
// there won't be a reference cycle and it can clean itself up via normal
|
||||
// Python refcounting
|
||||
%pythonAppend wxPyTimer
|
||||
"self._setCallbackInfo(self, Timer, 0); self._setOORInfo(self, 0)"
|
||||
|
||||
|
||||
// if you don't call SetOwner() or provide an owner in the contstructor
|
||||
@@ -66,6 +77,8 @@ public:
|
||||
// notification. If the owner is set then it will get the timer
|
||||
// notifications which can be handled with EVT_TIMER.
|
||||
wxPyTimer(wxEvtHandler *owner=NULL, int id = -1);
|
||||
|
||||
// Destructor.
|
||||
virtual ~wxPyTimer();
|
||||
|
||||
void _setCallbackInfo(PyObject* self, PyObject* _class, int incref=1);
|
||||
@@ -101,6 +114,11 @@ public:
|
||||
// return the timer ID
|
||||
int GetId() const;
|
||||
|
||||
%pythoncode {
|
||||
def Destroy():
|
||||
"""NO-OP: Timers must be destroyed by normal refrence counting"""
|
||||
pass
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user