From 5a5d6a524ca8335149f394824bcdc307f70ebfc7 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Mon, 20 Jan 2014 21:22:59 +0100 Subject: [PATCH] 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 --- src/frontends/qt4/GuiApplication.cpp | 18 +++++++++++++++++- src/frontends/qt4/GuiView.cpp | 11 ++++++++--- src/frontends/qt4/Menus.cpp | 26 +++++++++++++------------- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index d82d0152ca..f60fc9fe28 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 3514bfbb2c..fff7f24fd4 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 a3adbbac58..9e90147ba4 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); + } } } -- 2.39.5