From: Julian Smart Date: Sat, 13 Aug 2005 09:48:29 +0000 (+0000) Subject: Fixed dangling pointers bug; radio button was not removing itself from X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/992b3f1da4dded1c5e6dc5faa2b872ade56b241f Fixed dangling pointers bug; radio button was not removing itself from the cycle when deleted, so when deleting and then adding a radio button, we get a crash git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35182 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index defea037a0..31f1fb7990 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -54,6 +54,12 @@ wxGTK: - Added support for left, centre and right text alignment attributes under GTK+2 multi-line text controls (Mart Raudsepp). +wxMac: + +- Automatic menu management improved. +- Fixed crash when wxRadioButton is deleted from a group of radio buttons, + due to dangling cycle pointers. + wxOS2 - Adjustments for building with Open Watcom C++. diff --git a/include/wx/mac/carbon/radiobut.h b/include/wx/mac/carbon/radiobut.h index c0732eb32f..583bea5581 100644 --- a/include/wx/mac/carbon/radiobut.h +++ b/include/wx/mac/carbon/radiobut.h @@ -31,6 +31,7 @@ public: { Create(parent, id, label, pos, size, style, validator, name); } + ~wxRadioButton(); bool Create(wxWindow *parent, wxWindowID id, const wxString& label, @@ -47,6 +48,7 @@ public: virtual wxInt32 MacControlHit( WXEVENTHANDLERREF handler , WXEVENTREF event ) ; void Command(wxCommandEvent& event); wxRadioButton *AddInCycle(wxRadioButton *cycle); + void RemoveFromCycle(); inline wxRadioButton *NextInCycle() {return m_cycle;} protected: diff --git a/src/mac/carbon/radiobut.cpp b/src/mac/carbon/radiobut.cpp index e7f983642d..746ca6c877 100644 --- a/src/mac/carbon/radiobut.cpp +++ b/src/mac/carbon/radiobut.cpp @@ -72,6 +72,11 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id, return true; } +wxRadioButton::~wxRadioButton() +{ + RemoveFromCycle(); +} + void wxRadioButton::SetValue(bool val) { wxRadioButton *cycle; @@ -150,4 +155,20 @@ wxRadioButton *wxRadioButton::AddInCycle(wxRadioButton *cycle) } } +void wxRadioButton::RemoveFromCycle() +{ + if (m_cycle==NULL || m_cycle == this) + { + return; + } + else + { + // Find the previous one and make it point to the next one + wxRadioButton* prev = this; + while (prev->m_cycle != this) + prev = prev->m_cycle; + prev->m_cycle = m_cycle; + } +} + #endif