commit 5a5d6a524ca8335149f394824bcdc307f70ebfc7
Author: Stephan Witt <[email protected]>
Date: Mon Jan 20 21:22:59 2014 +0100
Work around a bug with crash on view close on Mac OSX.
See also https://bugreports.qt-project.org/browse/QTBUG-25399
It improves the situation with LyX ticket #8063 and fixes #8062 for Cocoa
builds
diff --git a/src/frontends/qt4/GuiApplication.cpp
b/src/frontends/qt4/GuiApplication.cpp
index d82d015..f60fc9f 100644
--- a/src/frontends/qt4/GuiApplication.cpp
+++ b/src/frontends/qt4/GuiApplication.cpp
@@ -1033,7 +1033,14 @@ bool GuiApplication::getStatus(FuncRequest const & cmd,
FuncStatus & flag) const
case LFUN_SERVER_NOTIFY:
enable = true;
break;
-
+
+ case LFUN_DIALOG_SHOW: {
+ string const name = cmd.getArg(0);
+ if (name == "aboutlyx" || name == "prefs") {
+ return true;
+ }
+ }
+
default:
return false;
}
@@ -1634,6 +1641,15 @@ void GuiApplication::dispatch(FuncRequest const & cmd,
DispatchResult & dr)
lyxerr.setLevel(Debug::value(to_utf8(cmd.argument())));
break;
+ case LFUN_DIALOG_SHOW: {
+ string const name = cmd.getArg(0);
+
+ if ( name == "aboutlyx" || name == "prefs") {
+ if (current_view_ == 0)
+ createView();
+ }
+ }
+
default:
// The LFUN must be for one of GuiView, BufferView, Buffer or
Cursor;
// let's try that:
diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp
index 3514bfb..fff7f24 100644
--- a/src/frontends/qt4/GuiView.cpp
+++ b/src/frontends/qt4/GuiView.cpp
@@ -424,9 +424,14 @@ GuiView::GuiView(int id)
// filling, at least for the static special menu item on Mac. Otherwise
// they are greyed out.
guiApp->setCurrentView(this);
-
- // Fill up the menu bar.
- guiApp->menus().fillMenuBar(menuBar(), this, true);
+
+#if defined(Q_WS_MACX)
+ static QMenuBar * qmb = new QMenuBar(0);
+#else
+ QMenuBar * qmb = menuBar();
+#endif
+ // Fill up the menu bar.
+ guiApp->menus().fillMenuBar(qmb, this, true);
setCentralWidget(d.stack_widget_);
diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp
index a3adbba..9e90147 100644
--- a/src/frontends/qt4/Menus.cpp
+++ b/src/frontends/qt4/Menus.cpp
@@ -1724,7 +1724,7 @@ void Menus::Impl::macxMenuBarInit(GuiView * view,
QMenuBar * qmb)
QAction::MenuRole role;
};
- MacMenuEntry entries[] = {
+ static MacMenuEntry entries[] = {
{LFUN_DIALOG_SHOW, "aboutlyx", "About LyX",
QAction::AboutRole},
{LFUN_DIALOG_SHOW, "prefs", "Preferences",
@@ -1743,18 +1743,18 @@ void Menus::Impl::macxMenuBarInit(GuiView * view,
QMenuBar * qmb)
mac_special_menu_.add(MenuItem(MenuItem::Command,
entries[i].label, func));
}
- }
-
- // add the entries to a QMenu that will eventually be empty
- // and therefore invisible.
- QMenu * qMenu = qmb->addMenu("special");
- MenuDefinition::const_iterator cit = mac_special_menu_.begin();
- MenuDefinition::const_iterator end = mac_special_menu_.end();
- for (size_t i = 0 ; cit != end ; ++cit, ++i) {
- Action * action = new Action(view, QIcon(), cit->label(),
- cit->func(), QString(), qMenu);
- action->setMenuRole(entries[i].role);
- qMenu->addAction(action);
+
+ // add the entries to a QMenu that will eventually be empty
+ // and therefore invisible.
+ QMenu * qMenu = qmb->addMenu("special");
+ MenuDefinition::const_iterator cit = mac_special_menu_.begin();
+ MenuDefinition::const_iterator end = mac_special_menu_.end();
+ for (size_t i = 0 ; cit != end ; ++cit, ++i) {
+ Action * action = new Action(view, QIcon(),
cit->label(),
+ cit->func(), QString(), qMenu);
+ action->setMenuRole(entries[i].role);
+ qMenu->addAction(action);
+ }
}
}