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

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54839 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-07-29 23:19:34 +00:00
parent 5431a79f1e
commit cb738de03a

View File

@@ -121,18 +121,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;
@@ -144,7 +140,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);
@@ -170,7 +166,7 @@ void wxRadioButton::SetValue(bool value)
// buttons in the same group: Windows doesn't do it automatically // buttons in the same group: Windows doesn't do it automatically
// //
// moreover, if another radiobutton in the group currently has the focus, // moreover, if another radiobutton in the group currently has the focus,
// we have to set it to this radiobutton, else the old readiobutton will be // we have to set it to this radiobutton, else the old radiobutton will be
// reselected automatically, if a parent window loses the focus and regains // reselected automatically, if a parent window loses the focus and regains
// it. // it.
wxWindow * const focus = FindFocus(); wxWindow * const focus = FindFocus();
@@ -288,9 +284,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());