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:
@@ -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:
|
||||
|
||||
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user