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.
- Fix the bug with wxFileDialog not being shown at all if the default file name
was invalid.
- Fix hang in keyboard navigation code with radio buttons under Windows 2000.
wxGTK:

View File

@@ -120,18 +120,14 @@ bool wxRadioButton::Create(wxWindow *parent,
if ( HasFlag(wxRB_GROUP) )
msStyle |= WS_GROUP;
/*
wxRB_SINGLE is a temporary workaround for the following problem: if you
have 2 radiobuttons in the same group but which are not consecutive in
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
radio button: then checking the last button hangs the app.
Ideally, we'd detect (and avoid) such situation automatically but for
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;
// we use BS_RADIOBUTTON and not BS_AUTORADIOBUTTON because the use of the
// latter can easily result in the application entering an infinite loop
// inside IsDialogMessage()
//
// we used to use BS_RADIOBUTTON only for wxRB_SINGLE buttons but there
// doesn't seem to be any harm to always use it and it prevents some hangs,
// see #9786
msStyle |= BS_RADIOBUTTON;
if ( HasFlag(wxCLIP_SIBLINGS) )
msStyle |= WS_CLIPSIBLINGS;
@@ -143,7 +139,7 @@ bool wxRadioButton::Create(wxWindow *parent,
// 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
// 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)
if ( HasFlag(wxRB_GROUP) )
SetValue(true);
@@ -166,7 +162,7 @@ void wxRadioButton::SetValue(bool value)
if ( m_isChecked )
{
// 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.
bool shouldSetFocus = false;
wxWindow* pFocusWnd = FindFocus();
@@ -261,9 +257,8 @@ bool wxRadioButton::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
if ( !m_isChecked )
{
// we have to do this for BS_RADIOBUTTON anyhow and, strangely enough,
// sometimes this is needed even for BS_AUTORADIOBUTTON (when we
// receive focus the button gets BN_CLICKED but stays unchecked!)
// we need to manually update the button state as we use BS_RADIOBUTTON
// and not BS_AUTORADIOBUTTON
SetValue(true);
wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId());