X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FLyX.cpp;h=04c1dd4f257e49e962cba22f24452b0f94dd96da;hb=4ed0312c51704780af1c452d3a82a84171b3725a;hp=12bdbe6666afac3463f8523cc4cd61fc01d993a4;hpb=b925728591829af96552f39cabea229efb1d6fdb;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index 12bdbe6666..04c1dd4f25 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -27,6 +27,7 @@ #include "ConverterCache.h" #include "Converter.h" #include "CutAndPaste.h" +#include "DispatchResult.h" #include "EnchantChecker.h" #include "Encoding.h" #include "ErrorList.h" @@ -37,8 +38,6 @@ #include "Language.h" #include "LaTeXFonts.h" #include "LayoutFile.h" -#include "Lexer.h" -#include "LyX.h" #include "LyXAction.h" #include "LyXRC.h" #include "ModuleList.h" @@ -46,7 +45,6 @@ #include "Server.h" #include "ServerSocket.h" #include "Session.h" -#include "WordList.h" #include "frontends/alert.h" #include "frontends/Application.h" @@ -65,7 +63,6 @@ #include "support/Package.h" #include "support/unique_ptr.h" -#include #include #include #include @@ -141,7 +138,7 @@ string cl_user_support; string geometryArg; -LyX * singleton_ = 0; +LyX * singleton_ = nullptr; void showFileError(string const & error) { @@ -150,12 +147,14 @@ void showFileError(string const & error) "Please check your installation."), from_utf8(error))); } -} // namespace anon +} // namespace /// The main application class private implementation. struct LyX::Impl { Impl() - : latexfonts_(0), spell_checker_(0), apple_spell_checker_(0), aspell_checker_(0), enchant_checker_(0), hunspell_checker_(0) + : latexfonts_(nullptr), spell_checker_(nullptr), + apple_spell_checker_(nullptr), aspell_checker_(nullptr), + enchant_checker_(nullptr), hunspell_checker_(nullptr) {} ~Impl() @@ -192,7 +191,7 @@ struct LyX::Impl { Converters converters_; /// The system converters after reading lyxrc.defaults. Converters system_converters_; - + /// Global format information Formats formats_; /// The system formats after reading lyxrc.defaults. @@ -232,7 +231,7 @@ public: argc_(argc), argv_(argv) { } - void doExec() + void doExec() override { int const exit_status = lyx_->execWithoutGui(argc_, argv_); exit(exit_status); @@ -250,14 +249,14 @@ frontend::Application * theApp() if (singleton_) return singleton_->pimpl_->application_.get(); else - return 0; + return nullptr; } LyX::~LyX() { delete pimpl_; - singleton_ = 0; + singleton_ = nullptr; } @@ -397,11 +396,9 @@ int LyX::exec(int & argc, char * argv[]) if (!pimpl_->lyx_server_->deferredLoadingToOtherInstance()) exit_status = pimpl_->application_->exec(); else if (!pimpl_->files_to_load_.empty()) { - vector::const_iterator it = pimpl_->files_to_load_.begin(); - vector::const_iterator end = pimpl_->files_to_load_.end(); lyxerr << _("The following files could not be loaded:") << endl; - for (; it != end; ++it) - lyxerr << *it << endl; + for (auto const & f : pimpl_->files_to_load_) + lyxerr << f << endl; } prepareExit(); @@ -419,8 +416,12 @@ void LyX::prepareExit() // Write the index file of the converter cache ConverterCache::get().writeIndex(); - // close buffers first - pimpl_->buffer_list_.closeAll(); + // closing buffer may throw exceptions, but we ignore them since we + // are quitting. + try { + // close buffers first + pimpl_->buffer_list_.closeAll(); + } catch (ExceptionMessage const &) {} // register session changes and shutdown server and socket if (use_gui) { @@ -434,17 +435,16 @@ void LyX::prepareExit() // do any other cleanup procedures now if (package().temp_dir() != package().system_temp_dir()) { string const abs_tmpdir = package().temp_dir().absFileName(); - if (!contains(package().temp_dir().absFileName(), "lyx_tmpdir")) { + if (!contains(abs_tmpdir, "lyx_tmpdir")) { docstring const msg = bformat(_("%1$s does not appear like a LyX created temporary directory."), from_utf8(abs_tmpdir)); Alert::warning(_("Cannot remove temporary directory"), msg); } else { - LYXERR(Debug::INFO, "Deleting tmp dir " - << package().temp_dir().absFileName()); + LYXERR(Debug::INFO, "Deleting tmp dir " << abs_tmpdir); if (!package().temp_dir().destroyDirectory()) { LYXERR0(bformat(_("Unable to remove the temporary directory %1$s"), - from_utf8(package().temp_dir().absFileName()))); + from_utf8(abs_tmpdir))); } } } @@ -496,7 +496,7 @@ int LyX::init(int & argc, char * argv[]) if (first_start) { pimpl_->files_to_load_.push_back( - i18nLibFileSearch("examples", "splash.lyx").absFileName()); + i18nLibFileSearch("examples", "Welcome.lyx").absFileName()); } return EXIT_SUCCESS; @@ -512,7 +512,7 @@ int LyX::execWithoutGui(int & argc, char * argv[]) } // Used to keep track of which buffers were explicitly loaded by user request. - // This is necessary because master and child document buffers are loaded, even + // This is necessary because master and child document buffers are loaded, even // if they were not named on the command line. We do not want to dispatch to // those. vector command_line_buffers; @@ -581,10 +581,11 @@ void LyX::execCommands() { // The advantage of doing this here is that the event loop // is already started. So any need for interaction will be - // aknowledged. + // acknowledged. // if reconfiguration is needed. - if (LayoutFileList::get().empty()) { + const bool noLayouts = LayoutFileList::get().empty(); + if (noLayouts && os::hasPython()) { switch (Alert::prompt( _("No textclass is found"), _("LyX will only have minimal functionality because no textclasses " @@ -593,7 +594,8 @@ void LyX::execCommands() 0, 2, _("&Reconfigure"), _("&Without LaTeX"), - _("&Continue"))) + _("&Continue"), + _("&Exit LyX"))) { case 0: // regular reconfigure @@ -604,6 +606,25 @@ void LyX::execCommands() lyx::dispatch(FuncRequest(LFUN_RECONFIGURE, " --without-latex-config")); break; + case 3: + lyx::dispatch(FuncRequest(LFUN_LYX_QUIT, "")); + return; + default: + break; + } + } else if (noLayouts) { + switch (Alert::prompt( + _("No python is found"), + _("LyX will only have minimal functionality because no python interpreter " + "has been found. Consider installing python with your software manager " + "or from the python.org website."), + 0, 1, + _("&Continue"), + _("&Exit LyX"))) + { + case 1: + lyx::dispatch(FuncRequest(LFUN_LYX_QUIT, "")); + return; default: break; } @@ -771,7 +792,7 @@ namespace { return std::string(line, nameLen); } } -} +} // namespace void cleanDuplicateEnvVars() { @@ -865,7 +886,7 @@ bool LyX::init() #endif lyxrc.tempdir_path = package().temp_dir().absFileName(); - lyxrc.document_path = "."; + lyxrc.document_path = package().document_dir().absFileName(); if (lyxrc.example_path.empty()) { lyxrc.example_path = addPath(package().system_support().absFileName(), @@ -906,6 +927,25 @@ bool LyX::init() if (package().build_support().empty()) prependEnvPath("PATH", package().binary_dir().absFileName()); #endif + { + // Add the directory containing the dt2dv and dv2dt executables to the path + FileName dtldir; + if (!package().build_support().empty()) { + // dtl executables should be in the same dir ar tex2lyx + dtldir = package().binary_dir(); + } + else { + dtldir = FileName(addName(package().system_support().absFileName(), "extratools")); + } +#if defined(_WIN32) + string dtlexe = "dt2dv.exe"; +#else + string dtlexe = "dt2dv"; +#endif + FileName const dt2dv = FileName(addName(dtldir.absFileName(), dtlexe)); + if (dt2dv.exists()) + prependEnvPath("PATH", dtldir.absFileName()); + } if (!lyxrc.path_prefix.empty()) prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix)); @@ -986,7 +1026,7 @@ bool LyX::init() pimpl_->toplevel_keymap_.read("site"); pimpl_->toplevel_keymap_.read(lyxrc.bind_file); // load user bind file user.bind - pimpl_->toplevel_keymap_.read("user", 0, KeyMap::MissingOK); + pimpl_->toplevel_keymap_.read("user", nullptr, KeyMap::MissingOK); if (lyxerr.debugging(Debug::LYXRC)) lyxrc.print(); @@ -1084,7 +1124,7 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) if (!sup.createDirectory(0755)) { // Failed, so let's exit. - lyxerr << to_utf8(_("Failed to create directory. Exiting.")) + lyxerr << to_utf8(_("Failed to create directory. Perhaps wrong -userdir command-line option?\nExiting.")) << endl; earlyExit(EXIT_FAILURE); } @@ -1161,10 +1201,15 @@ int parse_dbg(string const & arg, string const &, string &) Debug::showTags(cout); exit(0); } - lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl; - - lyxerr.setLevel(Debug::value(arg)); - Debug::showLevel(lyxerr, lyxerr.level()); + string bad = Debug::badValue(arg); + if (bad.empty()) { + lyxerr.setLevel(Debug::value(arg)); + Debug::showLevel(lyxerr, lyxerr.level()); + } else { + cout << to_utf8(bformat(_("Bad debug value `%1$s'. Exiting."), + from_utf8(bad))) << endl; + exit(1); + } return 1; } @@ -1380,7 +1425,7 @@ int parse_force(string const & arg, string const &, string &) } -} // namespace anon +} // namespace void LyX::easyParse(int & argc, char * argv[]) @@ -1617,7 +1662,7 @@ void setSpellChecker() singleton_->pimpl_->apple_spell_checker_ = new AppleSpellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->apple_spell_checker_; #else - singleton_->pimpl_->spell_checker_ = 0; + singleton_->pimpl_->spell_checker_ = nullptr; #endif } else if (lyxrc.spellchecker == "aspell") { #if defined(USE_ASPELL) @@ -1625,7 +1670,7 @@ void setSpellChecker() singleton_->pimpl_->aspell_checker_ = new AspellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->aspell_checker_; #else - singleton_->pimpl_->spell_checker_ = 0; + singleton_->pimpl_->spell_checker_ = nullptr; #endif } else if (lyxrc.spellchecker == "enchant") { #if defined(USE_ENCHANT) @@ -1633,7 +1678,7 @@ void setSpellChecker() singleton_->pimpl_->enchant_checker_ = new EnchantChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->enchant_checker_; #else - singleton_->pimpl_->spell_checker_ = 0; + singleton_->pimpl_->spell_checker_ = nullptr; #endif } else if (lyxrc.spellchecker == "hunspell") { #if defined(USE_HUNSPELL) @@ -1641,10 +1686,10 @@ void setSpellChecker() singleton_->pimpl_->hunspell_checker_ = new HunspellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->hunspell_checker_; #else - singleton_->pimpl_->spell_checker_ = 0; + singleton_->pimpl_->spell_checker_ = nullptr; #endif } else { - singleton_->pimpl_->spell_checker_ = 0; + singleton_->pimpl_->spell_checker_ = nullptr; } if (singleton_->pimpl_->spell_checker_) { singleton_->pimpl_->spell_checker_->changeNumber(speller_change_number);