]> git.lyx.org Git - features.git/commitdiff
Work around a bug with crash on view close on Mac OSX. 2.0.7
authorStephan Witt <switt@lyx.org>
Mon, 20 Jan 2014 20:22:59 +0000 (21:22 +0100)
committerStephan Witt <switt@lyx.org>
Mon, 20 Jan 2014 20:22:59 +0000 (21:22 +0100)
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
src/frontends/qt4/GuiView.cpp
src/frontends/qt4/Menus.cpp

index d82d0152ca0dc13224ec22716f261447e427a729..f60fc9fe28b8b63f83b21a3c93a38abebbdc4f7e 100644 (file)
@@ -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:
index 3514bfbb2c027bd2e8cfca80dfd82f52558ce3a8..fff7f24fd41385ab4de3550257360da894ae2ab6 100644 (file)
@@ -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_);
 
index a3adbbac58b0c5b56a9e6073cefac31717130a03..9e90147ba45378a936c37653510f14b14f27fff1 100644 (file)
@@ -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);
+               }
        }
 }