don't use BS_AUTORADIOBUTTON at all, BS_RADIOBUTTON works just as well and doesn't hang the application in some circumstances (#9786) [backport from trunk]

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@55212 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-08-23 18:38:24 +00:00
parent 3b14cd750c
commit 1c802b3b14
2 changed files with 13 additions and 17 deletions

View File

@@ -140,6 +140,7 @@ wxMSW:
creating a DIB and not DDB in wxBitmap(const wxImage&) ctor. creating a DIB and not DDB in wxBitmap(const wxImage&) ctor.
- Fix the bug with wxFileDialog not being shown at all if the default file name - Fix the bug with wxFileDialog not being shown at all if the default file name
was invalid. was invalid.
- Fix hang in keyboard navigation code with radio buttons under Windows 2000.
wxGTK: wxGTK:

View File

@@ -120,18 +120,14 @@ bool wxRadioButton::Create(wxWindow *parent,
if ( HasFlag(wxRB_GROUP) ) if ( HasFlag(wxRB_GROUP) )
msStyle |= WS_GROUP; msStyle |= WS_GROUP;
/* // we use BS_RADIOBUTTON and not BS_AUTORADIOBUTTON because the use of the
wxRB_SINGLE is a temporary workaround for the following problem: if you // latter can easily result in the application entering an infinite loop
have 2 radiobuttons in the same group but which are not consecutive in // inside IsDialogMessage()
the dialog, Windows can enter an infinite loop! The simplest way to //
reproduce it is to create radio button, then a panel and then another // we used to use BS_RADIOBUTTON only for wxRB_SINGLE buttons but there
radio button: then checking the last button hangs the app. // doesn't seem to be any harm to always use it and it prevents some hangs,
// see #9786
Ideally, we'd detect (and avoid) such situation automatically but for msStyle |= BS_RADIOBUTTON;
now, as I don't know how to do it, just allow the user to create
BS_RADIOBUTTON buttons for such situations.
*/
msStyle |= HasFlag(wxRB_SINGLE) ? BS_RADIOBUTTON : BS_AUTORADIOBUTTON;
if ( HasFlag(wxCLIP_SIBLINGS) ) if ( HasFlag(wxCLIP_SIBLINGS) )
msStyle |= WS_CLIPSIBLINGS; msStyle |= WS_CLIPSIBLINGS;
@@ -143,7 +139,7 @@ bool wxRadioButton::Create(wxWindow *parent,
// for compatibility with wxGTK, the first radio button in a group is // for compatibility with wxGTK, the first radio button in a group is
// always checked (this makes sense anyhow as you need to ensure that at // always checked (this makes sense anyhow as you need to ensure that at
// least one button in the group is checked and this is the simlpest way to // least one button in the group is checked and this is the simplest way to
// do it) // do it)
if ( HasFlag(wxRB_GROUP) ) if ( HasFlag(wxRB_GROUP) )
SetValue(true); SetValue(true);
@@ -166,7 +162,7 @@ void wxRadioButton::SetValue(bool value)
if ( m_isChecked ) if ( m_isChecked )
{ {
// If another radiobutton in the group currently has the focus, we have to // If another radiobutton in the group currently has the focus, we have to
// set it to this radiobutton, else the old readiobutton will be reselected // set it to this radiobutton, else the old radiobutton will be reselected
// automatically, if a parent window loses the focus and regains it. // automatically, if a parent window loses the focus and regains it.
bool shouldSetFocus = false; bool shouldSetFocus = false;
wxWindow* pFocusWnd = FindFocus(); wxWindow* pFocusWnd = FindFocus();
@@ -261,9 +257,8 @@ bool wxRadioButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
if ( !m_isChecked ) if ( !m_isChecked )
{ {
// we have to do this for BS_RADIOBUTTON anyhow and, strangely enough, // we need to manually update the button state as we use BS_RADIOBUTTON
// sometimes this is needed even for BS_AUTORADIOBUTTON (when we // and not BS_AUTORADIOBUTTON
// receive focus the button gets BN_CLICKED but stays unchecked!)
SetValue(true); SetValue(true);
wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId()); wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId());