+ wxMenuItem *menuitem = node->GetData();
+ if (menuitem->IsSubMenu())
+ wxMenubarSetInvokingWindow( menuitem->GetSubMenu(), win );
+ node = node->GetNext();
+ }
+}
+
+void wxMenuBar::SetInvokingWindow( wxWindow *win )
+{
+ m_invokingWindow = win;
+ wxWindow *top_frame = win;
+ while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
+ top_frame = top_frame->GetParent();
+
+#ifndef __WXGTK20__
+ // support for native key accelerators indicated by underscroes
+ ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget);
+ if ( !g_slist_find( ACCEL_OBJECTS(m_accel), obj ) )
+ gtk_accel_group_attach( m_accel, obj );
+#endif
+
+ wxMenuList::compatibility_iterator node = m_menus.GetFirst();
+ while (node)
+ {
+ wxMenu *menu = node->GetData();
+ wxMenubarSetInvokingWindow( menu, win );
+ node = node->GetNext();
+ }
+}
+
+void wxMenuBar::UnsetInvokingWindow( wxWindow *win )
+{
+ m_invokingWindow = (wxWindow*) NULL;
+ wxWindow *top_frame = win;
+ while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
+ top_frame = top_frame->GetParent();
+
+#ifndef __WXGTK20__
+ // support for native key accelerators indicated by underscroes
+ gtk_accel_group_detach( m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) );
+#endif
+
+ wxMenuList::compatibility_iterator node = m_menus.GetFirst();
+ while (node)
+ {
+ wxMenu *menu = node->GetData();
+ wxMenubarUnsetInvokingWindow( menu, win );
+ node = node->GetNext();
+ }
+}
+
+bool wxMenuBar::Append( wxMenu *menu, const wxString &title )
+{
+ if ( !wxMenuBarBase::Append( menu, title ) )
+ return FALSE;
+
+ return GtkAppend(menu, title);
+}
+
+bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
+{
+ wxString str( wxReplaceUnderscore( title ) );
+
+ // This doesn't have much effect right now.
+ menu->SetTitle( str );
+
+ // The "m_owner" is the "menu item"
+#ifdef __WXGTK20__
+ menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) );
+#else
+ menu->m_owner = gtk_menu_item_new_with_label( wxGTK_CONV( str ) );
+ GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child );
+ // set new text
+ gtk_label_set_text( label, wxGTK_CONV( str ) );
+ // reparse key accel
+ guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( str ) );
+ if (accel_key != GDK_VoidSymbol)
+ {
+ gtk_widget_add_accelerator (menu->m_owner,
+ "activate_item",
+ m_accel,//gtk_menu_ensure_uline_accel_group(GTK_MENU(m_menubar)),
+ accel_key,
+ GDK_MOD1_MASK,
+ GTK_ACCEL_LOCKED);
+ }
+#endif