X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FLyX.cpp;h=8c9fdbcb02b8433ded8909e5329bb3139bf11997;hb=2e72a0af48023956ae6ce3285b47168c2fed5099;hp=5ae488d8f847d10d4d950f2a3e97c23d858eabba;hpb=97a5c0882d0890999422e2f339b5dc66693800ee;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index 5ae488d8f8..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,12 +45,11 @@ #include "Server.h" #include "ServerSocket.h" #include "Session.h" +#include "WordList.h" #include "frontends/alert.h" #include "frontends/Application.h" -#include "graphics/Previews.h" - #include "support/lassert.h" #include "support/debug.h" #include "support/environment.h" @@ -138,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_; @@ -192,9 +188,10 @@ struct LyX::Impl bool first_start; /// the parsed command line batch command if any vector batch_commands; - + /// - graphics::Previews preview_; + LaTeXFonts * latexfonts_; + /// SpellChecker * spell_checker_; /// @@ -207,6 +204,7 @@ struct LyX::Impl SpellChecker * hunspell_checker_; }; + /// frontend::Application * theApp() { @@ -221,6 +219,7 @@ LyX::~LyX() { delete pimpl_; singleton_ = 0; + WordList::cleanupWordLists(); } @@ -267,44 +266,23 @@ 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 try { - init_package(os::utf8_argv(0), string(), string(), - top_build_dir_is_one_level_up); + init_package(os::utf8_argv(0), string(), string()); + // we do not get to this point when init_package throws an exception + locale_init(); } catch (ExceptionMessage const & message) { LYXERR(Debug::LOCALE, message.title_ + ", " + message.details_); } - locale_init(); // Here we need to parse the command line. At least // we need to parse for "-dbg" and "-help" easyParse(argc, argv); try { - init_package(os::utf8_argv(0), - cl_system_support, cl_user_support, - top_build_dir_is_one_level_up); + init_package(os::utf8_argv(0), cl_system_support, cl_user_support); } catch (ExceptionMessage const & message) { if (message.type_ == ErrorException) { Alert::error(message.title_, message.details_); @@ -344,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(); @@ -452,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(); } @@ -516,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()) @@ -592,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)); } @@ -758,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 @@ -801,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_; @@ -819,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(); @@ -903,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) { @@ -1029,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; @@ -1043,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" @@ -1056,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" @@ -1083,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; } @@ -1129,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()) { @@ -1222,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; @@ -1378,21 +1369,35 @@ 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); } -graphics::Previews & thePreviews() +Session & theSession() { LASSERT(singleton_, /**/); - return singleton_->pimpl_->preview_; + return *singleton_->pimpl_->session_.get(); } -Session & theSession() +LaTeXFonts & theLaTeXFonts() { LASSERT(singleton_, /**/); - return *singleton_->pimpl_->session_.get(); + if (!singleton_->pimpl_->latexfonts_) + singleton_->pimpl_->latexfonts_ = new LaTeXFonts; + return *singleton_->pimpl_->latexfonts_; } @@ -1419,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; @@ -1427,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; @@ -1435,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; @@ -1443,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;