From: Vadim Zeitlin Date: Mon, 26 Apr 2010 14:19:26 +0000 (+0000) Subject: Use wxMenuBar::Attach/Detach() instead of SetInvokingWindow() in wxGTK1. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/61f09f569358d7b2752733c4a24d1bd10daefae2 Use wxMenuBar::Attach/Detach() instead of SetInvokingWindow() in wxGTK1. This is the same as r64127 for wxGTK. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64145 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/gtk1/menu.h b/include/wx/gtk1/menu.h index 32136bdd09..ce9b60299c 100644 --- a/include/wx/gtk1/menu.h +++ b/include/wx/gtk1/menu.h @@ -37,17 +37,15 @@ public: virtual void SetMenuLabel( size_t pos, const wxString& label ); virtual wxString GetMenuLabel( size_t pos ) const; - // implementation only from now on - void SetInvokingWindow( wxWindow *win ); - void UnsetInvokingWindow( wxWindow *win ); - // common part of Append and Insert bool GtkAppend(wxMenu *menu, const wxString& title, int pos=-1); + virtual void Attach(wxFrame *frame); + virtual void Detach(); + GtkAccelGroup *m_accel; GtkWidget *m_menubar; long m_style; - wxWindow *m_invokingWindow; private: void Init(size_t n, wxMenu *menus[], const wxString titles[], long style); diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index 94e99c07a5..83474b3a55 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -552,7 +552,7 @@ void wxFrame::DetachMenuBar() if ( m_frameMenuBar ) { - m_frameMenuBar->UnsetInvokingWindow( this ); + m_frameMenuBar->Attach( this ); if (m_frameMenuBar->GetWindowStyle() & wxMB_DOCKABLE) { @@ -577,8 +577,6 @@ void wxFrame::AttachMenuBar( wxMenuBar *menuBar ) if (m_frameMenuBar) { - m_frameMenuBar->SetInvokingWindow( this ); - m_frameMenuBar->SetParent(this); gtk_pizza_put( GTK_PIZZA(m_mainWidget), m_frameMenuBar->m_widget, diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 5e83afe2c2..e2cb0b3765 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -178,7 +178,7 @@ void wxMDIParentFrame::OnInternalIdle() gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), menu_bar->m_widget, 0, 0, m_width, wxMENU_HEIGHT ); - menu_bar->SetInvokingWindow(active_child_frame); + menu_bar->Attach(active_child_frame); } } m_justInserted = false; @@ -209,7 +209,14 @@ void wxMDIParentFrame::OnInternalIdle() gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), menu_bar->m_widget, 0, 0, m_width, wxMENU_HEIGHT ); - menu_bar->SetInvokingWindow( child_frame ); + + // Attach() asserts if we call it for an already + // attached menu bar so don't do it if we're already + // associated with this frame (it would be nice to get + // rid of this check and ensure that this doesn't + // happen...) + if ( menu_bar->GetFrame() != child_frame ) + menu_bar->Attach( child_frame ); } visible_child_menu = true; } @@ -217,7 +224,7 @@ void wxMDIParentFrame::OnInternalIdle() { if (menu_bar->Show(false)) { - menu_bar->UnsetInvokingWindow( child_frame ); + menu_bar->Detach(); } } } @@ -233,12 +240,12 @@ void wxMDIParentFrame::OnInternalIdle() if (visible_child_menu) { m_frameMenuBar->Show( false ); - m_frameMenuBar->UnsetInvokingWindow( this ); + m_frameMenuBar->Detach(); } else { m_frameMenuBar->Show( true ); - m_frameMenuBar->SetInvokingWindow( this ); + m_frameMenuBar->Attach( this ); m_frameMenuBar->m_width = m_width; m_frameMenuBar->m_height = wxMENU_HEIGHT; diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 5e3e83d92f..b70a196e3e 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -141,7 +141,7 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) if (handler && handler->ProcessEvent(event)) return; - wxWindow *win = menu->GetInvokingWindow(); + wxWindow *win = menu->GetWindow(); if (win) win->HandleWindowEvent( event ); } @@ -181,7 +181,6 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st // the parent window is known after wxFrame::SetMenu() m_needParent = false; m_style = style; - m_invokingWindow = NULL; if (!PreCreation( NULL, wxDefaultPosition, wxDefaultSize ) || !CreateBase( NULL, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, wxT("menubar") )) @@ -241,10 +240,8 @@ wxMenuBar::~wxMenuBar() { } -static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) +static void DetachFromFrame( wxMenu *menu, wxWindow *win ) { - menu->SetInvokingWindow( NULL ); - wxWindow *top_frame = win; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); @@ -257,15 +254,13 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) { wxMenuItem *menuitem = node->GetData(); if (menuitem->IsSubMenu()) - wxMenubarUnsetInvokingWindow( menuitem->GetSubMenu(), win ); + DetachFromFrame( menuitem->GetSubMenu(), win ); node = node->GetNext(); } } -static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win ) +static void AttachToFrame( wxMenu *menu, wxWindow *win ) { - menu->SetInvokingWindow( win ); - wxWindow *top_frame = win; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); @@ -280,14 +275,15 @@ static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win ) { wxMenuItem *menuitem = node->GetData(); if (menuitem->IsSubMenu()) - wxMenubarSetInvokingWindow( menuitem->GetSubMenu(), win ); + AttachToFrame( menuitem->GetSubMenu(), win ); node = node->GetNext(); } } -void wxMenuBar::SetInvokingWindow( wxWindow *win ) +void wxMenuBar::Attach( wxFrame *win ) { - m_invokingWindow = win; + wxMenuBarBase::Attach(win); + wxWindow *top_frame = win; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); @@ -301,15 +297,14 @@ void wxMenuBar::SetInvokingWindow( wxWindow *win ) while (node) { wxMenu *menu = node->GetData(); - wxMenubarSetInvokingWindow( menu, win ); + AttachToFrame( menu, win ); node = node->GetNext(); } } -void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) +void wxMenuBar::Detach() { - m_invokingWindow = NULL; - wxWindow *top_frame = win; + wxWindow *top_frame = m_menuBarFrame; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) top_frame = top_frame->GetParent(); @@ -320,9 +315,11 @@ void wxMenuBar::UnsetInvokingWindow( wxWindow *win ) while (node) { wxMenu *menu = node->GetData(); - wxMenubarUnsetInvokingWindow( menu, win ); + DetachFromFrame( menu, top_frame ); node = node->GetNext(); } + + wxMenuBarBase::Detach(); } bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) @@ -370,11 +367,9 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) GTK_SIGNAL_FUNC(gtk_menu_open_callback), (gpointer)menu ); - // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables - // addings menu later on. - if (m_invokingWindow) + if (m_menuBarFrame) { - wxMenubarSetInvokingWindow( menu, m_invokingWindow ); + AttachToFrame( menu, m_menuBarFrame ); // OPTIMISE ME: we should probably cache this, or pass it // directly, but for now this is a minimal @@ -382,10 +377,7 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) // see (and refactor :) similar code in Remove // below. - wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame ); - - if( frame ) - frame->UpdateMenuBarSize(); + m_menuBarFrame->UpdateMenuBarSize(); } return true; @@ -429,13 +421,10 @@ wxMenu *wxMenuBar::Remove(size_t pos) gtk_widget_destroy( menu->m_owner ); menu->m_owner = NULL; - if (m_invokingWindow) + if (m_menuBarFrame) { // OPTIMISE ME: see comment in GtkAppend - wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame ); - - if( frame ) - frame->UpdateMenuBarSize(); + m_menuBarFrame->UpdateMenuBarSize(); } return menu; @@ -578,7 +567,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) int id = menu->FindMenuIdByMenuItem(widget); /* should find it for normal (not popup) menu */ - wxASSERT_MSG( (id != -1) || (menu->GetInvokingWindow() != NULL), + wxASSERT_MSG( (id != -1) || (menu->GetWindow() != NULL), wxT("menu item not found in gtk_menu_clicked_callback") ); if (!menu->IsEnabled(id)) @@ -619,7 +608,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) // FIXME: why do we have to call wxFrame::GetEventHandler() directly here? // normally wxMenu::SendEvent() should be enough, if it doesn't work - // in wxGTK then we have a bug in wxMenu::GetInvokingWindow() which + // in wxGTK then we have a bug in wxMenu::GetWindow() which // should be fixed instead of working around it here... if (frame) { @@ -665,7 +654,7 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) if (handler && handler->ProcessEvent(event)) return; - wxWindow *win = menu->GetInvokingWindow(); + wxWindow *win = menu->GetWindow(); if (win) win->HandleWindowEvent( event ); } } @@ -693,7 +682,7 @@ static void gtk_menu_nolight_callback( GtkWidget *widget, wxMenu *menu ) if (handler && handler->ProcessEvent(event)) return; - wxWindow *win = menu->GetInvokingWindow(); + wxWindow *win = menu->GetWindow(); if (win) win->HandleWindowEvent( event ); } @@ -1091,12 +1080,6 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), mitem->GetSubMenu()->m_menu ); gtk_widget_show( mitem->GetSubMenu()->m_menu ); - - // if adding a submenu to a menu already existing in the menu bar, we - // must set invoking window to allow processing events from this - // submenu - if ( m_invokingWindow ) - wxMenubarSetInvokingWindow(mitem->GetSubMenu(), m_invokingWindow); } else {