From ea1ad04b434f92c1269e6dde222a77698d6f873c Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 28 Feb 2002 22:42:14 +0000 Subject: [PATCH] Lots of things to make menus and submenus work. Also added wxPopTransientWindow::CanDismiss() which will be needed for pop-up menus, although that actually still has to be done... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14436 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/popupwin.h | 4 ++++ src/common/popupcmn.cpp | 2 -- src/univ/button.cpp | 2 +- src/univ/menu.cpp | 15 ++++++++++++++- src/x11/app.cpp | 15 ++++++++++++--- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/include/wx/popupwin.h b/include/wx/popupwin.h index 2de6e2e50d..0bef727d28 100644 --- a/include/wx/popupwin.h +++ b/include/wx/popupwin.h @@ -86,6 +86,10 @@ public: // hide the window virtual void Dismiss(); + + + virtual bool CanDismiss() + { return TRUE; } // called when a mouse is pressed while the popup is shown: return TRUE // from here to prevent its normal processing by the popup (which consists diff --git a/src/common/popupcmn.cpp b/src/common/popupcmn.cpp index db3250b429..7da199a713 100644 --- a/src/common/popupcmn.cpp +++ b/src/common/popupcmn.cpp @@ -427,8 +427,6 @@ void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event) win = win->GetParent(); } - printf( "Dismiss now.\n" ); - m_popup->DismissAndNotify(); } diff --git a/src/univ/button.cpp b/src/univ/button.cpp index 05c25ef66b..eaf7fea91b 100644 --- a/src/univ/button.cpp +++ b/src/univ/button.cpp @@ -45,7 +45,7 @@ // ---------------------------------------------------------------------------- // default margins around the image -static const wxCoord DEFAULT_BTN_MARGIN_X = 0; +static const wxCoord DEFAULT_BTN_MARGIN_X = 0; // We should give space for the border, at least. static const wxCoord DEFAULT_BTN_MARGIN_Y = 0; // ============================================================================ diff --git a/src/univ/menu.cpp b/src/univ/menu.cpp index a880d50037..e78fc96cd9 100644 --- a/src/univ/menu.cpp +++ b/src/univ/menu.cpp @@ -123,6 +123,8 @@ class wxPopupMenuWindow : public wxPopupTransientWindow { public: wxPopupMenuWindow(wxWindow *parent, wxMenu *menu); + + ~wxPopupMenuWindow(); // override the base class version to select the first item initially virtual void Popup(wxWindow *focus = NULL); @@ -308,6 +310,10 @@ wxPopupMenuWindow::wxPopupMenuWindow(wxWindow *parent, wxMenu *menu) SetCursor(wxCURSOR_ARROW); } +wxPopupMenuWindow::~wxPopupMenuWindow() +{ +} + // ---------------------------------------------------------------------------- // wxPopupMenuWindow current item/node handling // ---------------------------------------------------------------------------- @@ -1154,6 +1160,10 @@ wxWindow *wxMenu::GetRootWindow() const wxMenu *menu = GetParent(); while ( menu ) { + // We are a submenu of a menu of a menubar + if (menu->GetMenuBar()) + return menu->GetMenuBar(); + win = menu->GetInvokingWindow(); if ( win ) break; @@ -1164,7 +1174,7 @@ wxWindow *wxMenu::GetRootWindow() const // we're probably going to crash in the caller anyhow, but try to detect // this error as soon as possible wxASSERT_MSG( win, _T("menu without any associated window?") ); - + // also remember it in this menu so that we don't have to search for it the // next time wxConstCast(this, wxMenu)->m_invokingWindow = win; @@ -2379,6 +2389,9 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) void wxWindow::DismissPopupMenu() { wxCHECK_RET( ms_evtLoopPopup, _T("no popup menu shown") ); + + char *crash = NULL; + (*crash) = 0; ms_evtLoopPopup->Exit(); } diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 9dc4c4243b..91b39edbb7 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -647,23 +647,32 @@ void wxApp::ProcessXEvent(WXEvent* _event) tlw = tlw->GetParent(); if (tlw && !tlw->IsEnabled()) return; - + if (event->type == ButtonPress) { if ((win != wxWindow::FindFocus()) && win->AcceptsFocus()) { // This might actually be done in wxWindow::SetFocus() - // and not here. + // and not here. TODO. g_prevFocus = wxWindow::FindFocus(); g_nextFocus = win; win->SetFocus(); } } - + +#if !wxUSE_NANOX + if (event->type == LeaveNotify || event->type == EnterNotify) + { + // Throw out NotifyGrab and NotifyUngrab + if (event->xcrossing.mode != NotifyNormal) + return; + } +#endif wxMouseEvent wxevent; wxTranslateMouseEvent(wxevent, win, window, event); win->GetEventHandler()->ProcessEvent( wxevent ); + return; } case FocusIn: -- 2.45.2