X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiApplication.cpp;h=69e5f09a28b06979f2409e807f456a75494e25bd;hb=4e223167ff2872ee123c8354d486352c8a368102;hp=c4bbcf46f7d5e4035a7c302577d142fb916f385f;hpb=09e90f10aeddf5f63a8dfc375406410ad4e76caa;p=lyx.git diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index c4bbcf46f7..69e5f09a28 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -16,6 +16,7 @@ #include "qt_helpers.h" #include "GuiImage.h" +#include "GuiKeySymbol.h" #include "GuiView.h" #include "frontends/alert.h" @@ -121,6 +122,27 @@ public: } }; +class GlobalMenuBar : public QMenuBar +{ +public: + /// + GlobalMenuBar() : QMenuBar(0) {} + + /// + bool event(QEvent * e) + { + if (e->type() == QEvent::ShortcutOverride) { + // && activeWindow() == 0) { + QKeyEvent * ke = static_cast(e); + KeySymbol sym; + setKeySymbol(&sym, ke); + theLyXFunc().processKeySym(sym, q_key_state(ke->modifiers())); + e->accept(); + return true; + } + return false; + } +}; /////////////////////////////////////////////////////////////// // You can find more platform specific stuff @@ -132,21 +154,24 @@ GuiApplication * guiApp; GuiApplication::GuiApplication(int & argc, char ** argv) - : QApplication(argc, argv), Application(), current_view_(0) + : QApplication(argc, argv), Application(), current_view_(0), global_menubar_(0) { QString app_name = "LyX"; QCoreApplication::setOrganizationName(app_name); QCoreApplication::setOrganizationDomain("lyx.org"); QCoreApplication::setApplicationName(app_name + "-" + lyx_version); - //FIXME: quitOnLastWindowClosed is true by default, at least on Windows and - // X11 platforms. We should have a lyxrc setting for this in order to let the - // application stay resident. + // FIXME: quitOnLastWindowClosed is true by default. We should have a + // lyxrc setting for this in order to let the application stay resident. + // But then we need some kind of dock icon, at least on Windows. /* if (lyxrc.quit_on_last_window_closed) setQuitOnLastWindowClosed(false); */ - +#ifdef Q_WS_MAC + setQuitOnLastWindowClosed(false); +#endif + #ifdef Q_WS_X11 // doubleClickInterval() is 400 ms on X11 which is just too long. // On Windows and Mac OS X, the operating system's value is used. @@ -175,11 +200,10 @@ GuiApplication::GuiApplication(int & argc, char ** argv) << fromqstr(language_name)); #ifdef Q_WS_MACX - // all windows in a Mac application share the same menu bar. - QMenuBar *menuBar = new QMenuBar(0); // This allows to translate the strings that appear in the LyX menu. addMenuTranslator(); #endif + connect(this, SIGNAL(lastWindowClosed()), this, SLOT(onLastWindowClosed())); using namespace lyx::graphics; @@ -210,6 +234,14 @@ GuiApplication::GuiApplication(int & argc, char ** argv) connect(&general_timer_, SIGNAL(timeout()), this, SLOT(handleRegularEvents())); general_timer_.start(); + +#ifdef Q_WS_MACX + if (global_menubar_ == 0) { + // Create the global default menubar which is shown for the dialogs + // and if no GuiView is visible. + global_menubar_ = new GlobalMenuBar(); + } +#endif } @@ -284,6 +316,35 @@ bool GuiApplication::dispatch(FuncRequest const & cmd) break; } + case LFUN_BUFFER_NEW: + if (viewCount() == 0 + || (!lyxrc.open_buffers_in_tabs && current_view_->buffer() != 0)) + createView(); + current_view_->newDocument(to_utf8(cmd.argument()), false); + break; + + case LFUN_BUFFER_NEW_TEMPLATE: + if (viewCount() == 0 + || (!lyxrc.open_buffers_in_tabs && current_view_->buffer() != 0)) { + createView(); + current_view_->newDocument(to_utf8(cmd.argument()), true); + if (!current_view_->buffer()) + current_view_->close(); + } else + current_view_->newDocument(to_utf8(cmd.argument()), true); + break; + + case LFUN_FILE_OPEN: + if (viewCount() == 0 + || (!lyxrc.open_buffers_in_tabs && current_view_->buffer() != 0)) { + createView(); + current_view_->openDocument(to_utf8(cmd.argument())); + if (!current_view_->buffer()) + current_view_->close(); + } else + current_view_->openDocument(to_utf8(cmd.argument())); + break; + default: // Notify the caller that the action has not been dispatched. return false; @@ -315,6 +376,9 @@ static void updateIds(map const & stdmap, vector & ids) void GuiApplication::createView(QString const & geometry_arg) { + if (global_menubar_) + global_menubar_->releaseKeyboard(); + // create new view updateIds(views_, view_ids_); int id = 0; @@ -329,8 +393,7 @@ void GuiApplication::createView(QString const & geometry_arg) // register view views_[id] = view; updateIds(views_, view_ids_); - - theLyXFunc().setLyXView(view); + view->show(); if (!geometry_arg.isEmpty()) { #ifdef Q_WS_WIN @@ -346,7 +409,7 @@ void GuiApplication::createView(QString const & geometry_arg) #endif } view->setFocus(); - + setActiveWindow(view); setCurrentView(*view); } @@ -668,6 +731,19 @@ bool GuiApplication::searchMenu(FuncRequest const & func, } +void GuiApplication::initGlobalMenu() +{ + if (global_menubar_) + menus().fillMenuBar(global_menubar_, 0); +} + + +void GuiApplication::onLastWindowClosed() +{ + if (global_menubar_) + global_menubar_->grabKeyboard(); +} + //////////////////////////////////////////////////////////////////////// // X11 specific stuff goes here... #ifdef Q_WS_X11