X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyX.cpp;h=8c9fdbcb02b8433ded8909e5329bb3139bf11997;hb=b436a03b3468dd15b27ee1c35e09d79b49192996;hp=05cca99c7838fbdd1dbd3c122e92a75131ff0d62;hpb=850e4d80c0ec8df578c4ab5d73952e435141b7d6;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index 05cca99c78..8c9fdbcb02 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -34,6 +34,7 @@ #include "HunspellChecker.h" #include "KeyMap.h" #include "Language.h" +#include "LaTeXFonts.h" #include "LayoutFile.h" #include "Lexer.h" #include "LyX.h" @@ -44,6 +45,7 @@ #include "Server.h" #include "ServerSocket.h" #include "Session.h" +#include "WordList.h" #include "frontends/alert.h" #include "frontends/Application.h" @@ -136,18 +138,14 @@ void reconfigureUserLyXDir() } // namespace anon /// The main application class private implementation. -struct LyX::Impl -{ - Impl() : spell_checker_(0), apple_spell_checker_(0), aspell_checker_(0), enchant_checker_(0), hunspell_checker_(0) - { - // Set the default User Interface language as soon as possible. - // The language used will be derived from the environment - // variables. - messages_["GUI"] = Messages(); - } +struct LyX::Impl { + Impl() + : latexfonts_(0), spell_checker_(0), apple_spell_checker_(0), aspell_checker_(0), enchant_checker_(0), hunspell_checker_(0) + {} ~Impl() { + delete latexfonts_; delete apple_spell_checker_; delete aspell_checker_; delete enchant_checker_; @@ -190,6 +188,9 @@ struct LyX::Impl bool first_start; /// the parsed command line batch command if any vector batch_commands; + + /// + LaTeXFonts * latexfonts_; /// SpellChecker * spell_checker_; @@ -203,6 +204,7 @@ struct LyX::Impl SpellChecker * hunspell_checker_; }; + /// frontend::Application * theApp() { @@ -217,6 +219,7 @@ LyX::~LyX() { delete pimpl_; singleton_ = 0; + WordList::cleanupWordLists(); } @@ -263,25 +266,6 @@ Messages & LyX::messages(string const & language) } -void setRcGuiLanguage() -{ - LASSERT(singleton_, /**/); - if (lyxrc.gui_language == "auto") - return; - Language const * language = languages.getLanguage(lyxrc.gui_language); - if (language) { - LYXERR(Debug::LOCALE, "Setting LANGUAGE to " << language->code()); - if (!setEnv("LANGUAGE", language->code())) - LYXERR(Debug::LOCALE, "\t... failed!"); - } - LYXERR(Debug::LOCALE, "Setting LC_ALL to en_US"); - if (!setEnv("LC_ALL", "en_US")) - LYXERR(Debug::LOCALE, "\t... failed!"); - Messages::init(); - singleton_->pimpl_->messages_["GUI"] = Messages(); -} - - int LyX::exec(int & argc, char * argv[]) { // Minimal setting of locale before parsing command line @@ -338,7 +322,7 @@ int LyX::exec(int & argc, char * argv[]) vector::const_iterator bcit = pimpl_->batch_commands.begin(); vector::const_iterator bcend = pimpl_->batch_commands.end(); DispatchResult dr; - for (; bcit != bcend; bcit++) { + for (; bcit != bcend; ++bcit) { LYXERR(Debug::ACTION, "Buffer::dispatch: cmd: " << *bcit); buf->dispatch(*bcit, dr); final_success |= !dr.error(); @@ -446,8 +430,7 @@ void LyX::prepareExit() // Kill the application object before exiting. This avoids crashes // when exiting on Linux. - if (pimpl_->application_) - pimpl_->application_.reset(); + pimpl_->application_.reset(); } @@ -510,7 +493,7 @@ bool LyX::loadFiles() if (fname.empty()) continue; - Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFileName(), false); + Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFileName()); if (buf->loadLyXFile() == Buffer::ReadSuccess) { ErrorList const & el = buf->errorList("Parse"); if (!el.empty()) @@ -586,7 +569,7 @@ void LyX::execCommands() vector::const_iterator bcit = pimpl_->batch_commands.begin(); vector::const_iterator bcend = pimpl_->batch_commands.end(); - for (; bcit != bcend; bcit++) { + for (; bcit != bcend; ++bcit) { LYXERR(Debug::INIT, "About to handle -x '" << *bcit << '\''); lyx::dispatch(lyxaction.lookupFunc(*bcit)); } @@ -752,9 +735,6 @@ bool LyX::init() if (!readRcFile("lyxrc.dist")) return false; - // Set the language defined by the distributor. - setRcGuiLanguage(); - // Set the PATH correctly. #if !defined (USE_POSIX_PACKAGING) // Add the directory containing the LyX executable to the path @@ -795,9 +775,6 @@ bool LyX::init() // Read lyxrc.dist again to be able to override viewer auto-detection. readRcFile("lyxrc.dist"); - // Set again the language defined by the distributor. - setRcGuiLanguage(); - system_lyxrc = lyxrc; system_formats = formats; pimpl_->system_converters_ = pimpl_->converters_; @@ -813,9 +790,6 @@ bool LyX::init() if (!readLanguagesFile("languages")) return false; - // Set the language defined by the user. - setRcGuiLanguage(); - LYXERR(Debug::INIT, "Reading layouts..."); // Load the layouts LayoutFileList::get().read(); @@ -897,7 +871,7 @@ void emergencyCleanup() static bool needsUpdate(string const & file) { // We cannot initialize configure_script directly because the package - // is not initialized yet when static objects are constructed. + // is not initialized yet when static objects are constructed. static FileName configure_script; static bool firstrun = true; if (firstrun) { @@ -1023,8 +997,8 @@ typedef boost::function cmd_helpe int parse_dbg(string const & arg, string const &, string &) { if (arg.empty()) { - lyxerr << to_utf8(_("List of supported debug flags:")) << endl; - Debug::showTags(lyxerr); + cout << to_utf8(_("List of supported debug flags:")) << endl; + Debug::showTags(cout); exit(0); } lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl; @@ -1037,7 +1011,7 @@ int parse_dbg(string const & arg, string const &, string &) int parse_help(string const &, string const &, string &) { - lyxerr << + cout << to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n" "Command line switches (case sensitive):\n" "\t-help summarize LyX usage\n" @@ -1050,10 +1024,13 @@ int parse_help(string const &, string const &, string &) "\t-x [--execute] command\n" " where command is a lyx command.\n" "\t-e [--export] fmt\n" - " where fmt is the export format of choice.\n" - " Look on Tools->Preferences->File formats->Format\n" + " where fmt is the export format of choice. Look in\n" + " Tools->Preferences->File Handling->File Formats->Short Name\n" " to get an idea which parameters should be passed.\n" " Note that the order of -e and -x switches matters.\n" + "\t-E [--export-to] fmt filename\n" + " where fmt is the export format of choice (see --export),\n" + " and filename is the destination filename.\n" "\t-i [--import] fmt file.xxx\n" " where fmt is the import format of choice\n" " and file.xxx is the file to be imported.\n" @@ -1077,11 +1054,11 @@ int parse_help(string const &, string const &, string &) int parse_version(string const &, string const &, string &) { - lyxerr << "LyX " << lyx_version + cout << "LyX " << lyx_version << " (" << lyx_release_date << ")" << endl; - lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl; + cout << "Built on " << __DATE__ << ", " << __TIME__ << endl; - lyxerr << lyx_version_info << endl; + cout << lyx_version_info << endl; exit(0); return 0; } @@ -1123,6 +1100,24 @@ int parse_execute(string const & arg, string const &, string & batch) } +int parse_export_to(string const & type, string const & output_file, string & batch) +{ + if (type.empty()) { + lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after " + "--export-to switch")) << endl; + exit(1); + } + if (output_file.empty()) { + lyxerr << to_utf8(_("Missing destination filename after " + "--export-to switch")) << endl; + exit(1); + } + batch = "buffer-export " + type + " " + output_file; + use_gui = false; + return 2; +} + + int parse_export(string const & type, string const &, string & batch) { if (type.empty()) { @@ -1216,8 +1211,10 @@ void LyX::easyParse(int & argc, char * argv[]) cmdmap["-userdir"] = parse_userdir; cmdmap["-x"] = parse_execute; cmdmap["--execute"] = parse_execute; - cmdmap["-e"] = parse_export; + cmdmap["-e"] = parse_export; cmdmap["--export"] = parse_export; + cmdmap["-E"] = parse_export_to; + cmdmap["--export-to"] = parse_export_to; cmdmap["-i"] = parse_import; cmdmap["--import"] = parse_import; cmdmap["-geometry"] = parse_geometry; @@ -1372,7 +1369,19 @@ Messages const & getMessages(string const & language) Messages const & getGuiMessages() { LASSERT(singleton_, /**/); - return singleton_->pimpl_->messages_["GUI"]; + // A cache to translate full language name to language code + static string last_language = "auto"; + static string code; + if (lyxrc.gui_language != last_language) { + if (lyxrc.gui_language == "auto") + code.clear(); + else { + Language const * l = languages.getLanguage(lyxrc.gui_language); + code = l ? l->code() : string(); + } + last_language = lyxrc.gui_language; + } + return singleton_->messages(code); } @@ -1383,6 +1392,15 @@ Session & theSession() } +LaTeXFonts & theLaTeXFonts() +{ + LASSERT(singleton_, /**/); + if (!singleton_->pimpl_->latexfonts_) + singleton_->pimpl_->latexfonts_ = new LaTeXFonts; + return *singleton_->pimpl_->latexfonts_; +} + + CmdDef & theTopLevelCmdDef() { LASSERT(singleton_, /**/); @@ -1406,7 +1424,7 @@ void setSpellChecker() if (lyxrc.spellchecker == "native") { #if defined(USE_MACOSX_PACKAGING) if (!singleton_->pimpl_->apple_spell_checker_) - singleton_->pimpl_->apple_spell_checker_ = new AppleSpellChecker(); + singleton_->pimpl_->apple_spell_checker_ = new AppleSpellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->apple_spell_checker_; #else singleton_->pimpl_->spell_checker_ = 0; @@ -1414,7 +1432,7 @@ void setSpellChecker() } else if (lyxrc.spellchecker == "aspell") { #if defined(USE_ASPELL) if (!singleton_->pimpl_->aspell_checker_) - singleton_->pimpl_->aspell_checker_ = new AspellChecker(); + singleton_->pimpl_->aspell_checker_ = new AspellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->aspell_checker_; #else singleton_->pimpl_->spell_checker_ = 0; @@ -1422,7 +1440,7 @@ void setSpellChecker() } else if (lyxrc.spellchecker == "enchant") { #if defined(USE_ENCHANT) if (!singleton_->pimpl_->enchant_checker_) - singleton_->pimpl_->enchant_checker_ = new EnchantChecker(); + singleton_->pimpl_->enchant_checker_ = new EnchantChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->enchant_checker_; #else singleton_->pimpl_->spell_checker_ = 0; @@ -1430,7 +1448,7 @@ void setSpellChecker() } else if (lyxrc.spellchecker == "hunspell") { #if defined(USE_HUNSPELL) if (!singleton_->pimpl_->hunspell_checker_) - singleton_->pimpl_->hunspell_checker_ = new HunspellChecker(); + singleton_->pimpl_->hunspell_checker_ = new HunspellChecker; singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->hunspell_checker_; #else singleton_->pimpl_->spell_checker_ = 0;