X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3b59cdbfaf7df79499424c92ff6177736429ff8a..12fddefcbbc1731b7de244d484f946d47402740d:/src/motif/menuitem.cpp diff --git a/src/motif/menuitem.cpp b/src/motif/menuitem.cpp index e07a652c58..6df0931d6c 100644 --- a/src/motif/menuitem.cpp +++ b/src/motif/menuitem.cpp @@ -21,6 +21,8 @@ // headers // ---------------------------------------------------------------------------- +#include "wx/defs.h" + #include "wx/menu.h" #include "wx/menuitem.h" #include "wx/utils.h" @@ -60,7 +62,7 @@ static void wxMenuItemDisarmCallback(Widget w, XtPointer clientData, XtPointer p // dynamic classes implementation // ---------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) // ---------------------------------------------------------------------------- // wxMenuItem @@ -69,23 +71,14 @@ static void wxMenuItemDisarmCallback(Widget w, XtPointer clientData, XtPointer p // ctor & dtor // ----------- -wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, - const wxString& strName, const wxString& strHelp, - bool bCheckable, +wxMenuItem::wxMenuItem(wxMenu *pParentMenu, + int id, + const wxString& strName, + const wxString& strHelp, + wxItemKind kind, wxMenu *pSubMenu) + : wxMenuItemBase(pParentMenu, id, strName, strHelp, kind, pSubMenu) { - wxASSERT_MSG( pParentMenu != NULL, wxT("menuitem should have a menu") ); - - // common init - m_parentMenu = pParentMenu; - m_subMenu = pSubMenu; - m_id = id; - m_isEnabled = TRUE; - m_isChecked = FALSE; - m_help = strHelp; - m_isCheckable = bCheckable; - m_text = strName; - // Motif-specific m_menuBar = NULL; m_buttonWidget = (WXWidget) NULL; @@ -157,7 +150,7 @@ void wxMenuItem::Check(bool bDoCheck) /* static */ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) { - return wxStripMenuCodes(m_text); + return wxStripMenuCodes(text); } // ---------------------------------------------------------------------------- @@ -168,10 +161,10 @@ wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu, int id, const wxString& name, const wxString& help, - bool isCheckable, + wxItemKind kind, wxMenu *subMenu) { - return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu); + return new wxMenuItem(parentMenu, id, name, help, kind, subMenu); } // ---------------------------------------------------------------------------- @@ -361,6 +354,7 @@ void wxMenuItemCallback (Widget WXUNUSED(w), XtPointer clientData, item->GetMenuBar()->GetMenuBarFrame()->GetEventHandler()->ProcessEvent(commandEvent); } + // this is the child of a popup menu else if (item->GetTopMenu()) { wxCommandEvent event (wxEVT_COMMAND_MENU_SELECTED, item->GetId()); @@ -368,6 +362,14 @@ void wxMenuItemCallback (Widget WXUNUSED(w), XtPointer clientData, event.SetInt( item->GetId() ); item->GetTopMenu()->ProcessCommand (event); + + // Since PopupMenu under Motif stills grab right mouse + // button events after it was closed, we need to delete + // the associated widgets to allow next PopUpMenu to + // appear; this needs to be done there because doing it in + // a WorkProc as before may cause crashes if a menu item causes + // the parent window of the menu to be destroyed + item->GetTopMenu()->DestroyWidgetAndDetach(); } } }