disable UI updating during GetPopupMenuSelectionFromUser() execution to avoid unexpected clashes between the ids used in it and the update UI handlers elsewhere in the program

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-15 11:02:49 +00:00
parent fe79f76ba9
commit 565382de29
3 changed files with 43 additions and 14 deletions

View File

@@ -2407,6 +2407,11 @@ void wxWindowBase::InternalOnPopupMenu(wxCommandEvent& event)
gs_popupMenuSelection = event.GetId();
}
void wxWindowBase::InternalOnPopupMenuUpdate(wxUpdateUIEvent& WXUNUSED(event))
{
// nothing to do but do not skip it
}
int
wxWindowBase::DoGetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y)
{
@@ -2417,8 +2422,24 @@ wxWindowBase::DoGetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y)
NULL,
this);
// it is common to construct the menu passed to this function dynamically
// using some fixed range of ids which could clash with the ids used
// elsewhere in the program, which could result in some menu items being
// unintentionally disabled or otherwise modified by update UI handlers
// elsewhere in the program code and this is difficult to avoid in the
// program itself, so instead we just temporarily suspend UI updating while
// this menu is shown
Connect(wxEVT_UPDATE_UI,
wxUpdateUIEventHandler(wxWindowBase::InternalOnPopupMenuUpdate),
NULL,
this);
PopupMenu(&menu, x, y);
Disconnect(wxEVT_UPDATE_UI,
wxUpdateUIEventHandler(wxWindowBase::InternalOnPopupMenuUpdate),
NULL,
this);
Disconnect(wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(wxWindowBase::InternalOnPopupMenu),
NULL,