>>>>> "Bennett" == Bennett Helm <[EMAIL PROTECTED]> writes:
Bennett> 2. Selecting either Preferences or About LyX (from either the
Bennett> LyX or File menus) results in a crash. Here's the backtrace:
OK, here am I again with a new approach to the menu merging issue.
With the patch below, everything should be fine, except that you'll
see an ugly but empty "special" menu in the menubar. I have ideas to
get rid of it, we'll see whe/if the rest works.
The new approach is to put the menu items that we want to merge in a
separate dummy menu and hope that this will be enough to populate LyX
menu and avoid further merging.
Bennett, I'd be interested to know how well it fares.
JMarc
Index: src/frontends/qt4/QLMenubar.C
===================================================================
--- src/frontends/qt4/QLMenubar.C (revision 16318)
+++ src/frontends/qt4/QLMenubar.C (working copy)
@@ -14,6 +14,7 @@
// All is well if the namespace is visible first.
#include "GuiView.h"
+#include "Action.h"
#include "QLMenubar.h"
#include "QLPopupMenu.h"
@@ -126,6 +127,8 @@ MenuBackend const & QLMenubar::backend()
}
+/// Some special Qt/Mac support hacks
+
/*
Here is what the Qt documentation says about how a menubar is chosen:
@@ -156,17 +159,44 @@ QMenuBar * QLMenubar::menuBar() const
#endif
}
+#ifdef Q_WS_MACX
+# define MERGE_MAC_MENUS
+# ifndef MERGE_MAC_MENUS
+extern void qt_mac_set_menubar_merge(bool b);
+# endif
+#endif
+
void QLMenubar::macxMenuBarInit()
{
#ifdef Q_WS_MACX
mac_menubar_.reset(new QMenuBar);
+# ifdef MERGE_MAC_MENUS
+ /* The qt/mac menu code has a very silly hack that moves some
+ menu entries that it recognizes by name (e.g.
+ "Preferences...") to the "LyX" menu. This feature can only
+ work if the menu entries are always available. Since we
+ build menus on demand, we add the entries to a dummy menu
+ (JMarc)
+ */
+
// this is the name of the menu that contains our special entries
- menubackend_.specialMenu(lyx::from_ascii("LyX"));
- // make sure that the special entries are added to the first
- // menu even before this menu has been opened.
- //name_map_[menubackend_.getMenubar().begin()->submenuname()]->update();
-#endif
+ docstring const & specialname = from_ascii("LyX");
+ if (menubackend_.hasMenu(specialname)) {
+ QMenu * qMenu = owner_->menuBar()->addMenu("special");
+ //qMenu->setVisible(false);
+
+ menubackend_.specialMenu(specialname);
+ Menu const & special = menubackend_.getMenu(specialname);
+ Menu::const_iterator end = special.end();
+ for (Menu::const_iterator cit = special.begin();
+ cit != end ; ++cit)
+ qMenu->addAction(new Action(*owner_, cit->label(), cit->func()));
+ }
+# else
+ qt_mac_set_menubar_merge(false);
+# endif // MERGE_MAC_MENUS
+#endif // Q_WS_MACX
}
} // namespace frontend
Index: src/frontends/qt4/QLPopupMenu.C
===================================================================
--- src/frontends/qt4/QLPopupMenu.C (revision 16318)
+++ src/frontends/qt4/QLPopupMenu.C (working copy)
@@ -41,8 +41,6 @@ namespace lyx {
namespace frontend {
-// MacOSX specific stuff is at the end.
-
QLPopupMenu::QLPopupMenu(QLMenubar * owner,
MenuItem const & mi, bool topLevelMenu)
: owner_(owner)
@@ -77,8 +75,6 @@ void QLPopupMenu::update()
lyxerr[Debug::GUI] << "\tWARNING: menu seems empty" << lyx::to_utf8(topLevelMenu_.name()) << endl;
}
populate(this, &topLevelMenu_);
-
- specialMacXmenuHack();
}
void QLPopupMenu::populate(QMenu* qMenu, Menu * menu)
@@ -138,7 +134,6 @@ docstring const QLPopupMenu::getLabel(Me
return label;
}
-/// \todo Mac specific binding handling.
void QLPopupMenu::addBinding(docstring & label, MenuItem const & mi)
{
docstring const binding(mi.binding());
@@ -147,31 +142,6 @@ void QLPopupMenu::addBinding(docstring &
}
}
-/// \todo Fix Mac specific menu hack
-void QLPopupMenu::specialMacXmenuHack()
-{
-#ifdef Q_WS_MACX
- /* The qt/mac menu code has a very silly hack that
- moves some menu entries that it recognizes by name
- (e.g. "Preferences...") to the "LyX" menu. This
- feature can only work if the menu entries are
- always available. Since we build menus on demand,
- we add some dummy contents to one of the menus (JMarc)
- */
-/*
- static QLPopupMenu * themenu = this;
- if (themenu == this && owner_->backend().hasMenu("LyX")) {
- Menu special = owner_->backend().getMenu("LyX");
- Menu::const_iterator end = special.end();
- Menu::size_type i = 0;
- for (Menu::const_iterator cit = special.begin();
- cit != end ; ++cit, ++i)
- insertItem(toqstr(cit->label()), indexOffset + i);
- }
-*/
-#endif
-}
-
} // namespace frontend
} // namespace lyx
Index: src/frontends/qt4/QLPopupMenu.h
===================================================================
--- src/frontends/qt4/QLPopupMenu.h (revision 16318)
+++ src/frontends/qt4/QLPopupMenu.h (working copy)
@@ -50,15 +50,10 @@ private:
lyx::docstring const getLabel(MenuItem const & mi);
/// add binding keys a the menu item label.
- /// \todo Mac specific binding handling.
void addBinding(lyx::docstring & label, MenuItem const & mi);
/// Top Level Menu
Menu topLevelMenu_;
-
- /// Mac specific menu hack
- /// \todo Fix it
- void specialMacXmenuHack();
};
} // namespace frontend