X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyX.cpp;h=a732c7ee809e5fcd9a0b52429394e3133d6f96c9;hb=0c7bd9a57f2a308bb9659200eda3b7e45f8d5d3c;hp=3f43e1d956a3cfe72cab0abcc9dd87186f5cf441;hpb=0de73b88667dca7a21070c1177ae7b899f01bc3d;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index 3f43e1d956..a732c7ee80 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,12 @@ #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/ConsoleApplication.h" #include "support/lassert.h" #include "support/debug.h" #include "support/environment.h" @@ -60,15 +61,12 @@ #include "support/Messages.h" #include "support/os.h" #include "support/Package.h" -#include "support/Path.h" -#include "support/Systemcall.h" - -#include "support/bind.h" -#include +#include "support/unique_ptr.h" #include -#include #include +#include +#include #include #include #include @@ -77,6 +75,10 @@ using namespace std; using namespace lyx::support; +#if defined (USE_MACOSX_PACKAGING) +#include +#endif + namespace lyx { namespace Alert = frontend::Alert; @@ -123,33 +125,17 @@ void showFileError(string const & error) "Please check your installation."), from_utf8(error))); } - -void reconfigureUserLyXDir() -{ - string const configure_command = package().configure_command(); - - lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl; - PathChanger p(package().user_support()); - Systemcall one; - one.startscript(Systemcall::Wait, configure_command); - lyxerr << "LyX: " << to_utf8(_("Done!")) << endl; -} - } // 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_; @@ -163,13 +149,13 @@ struct LyX::Impl /// CmdDef toplevel_cmddef_; /// - boost::scoped_ptr lyx_server_; + unique_ptr lyx_server_; /// - boost::scoped_ptr lyx_socket_; + unique_ptr lyx_socket_; /// - boost::scoped_ptr application_; + unique_ptr application_; /// lyx session, containing lastfiles, lastfilepos, and lastopened - boost::scoped_ptr session_; + unique_ptr session_; /// Files to load at start. vector files_to_load_; @@ -188,13 +174,12 @@ struct LyX::Impl /// Movers system_movers_; - /// has this user started lyx for the first time? - bool first_start; /// the parsed command line batch command if any vector batch_commands; /// - graphics::Previews preview_; + LaTeXFonts * latexfonts_; + /// SpellChecker * spell_checker_; /// @@ -207,6 +192,28 @@ struct LyX::Impl SpellChecker * hunspell_checker_; }; + +/// The main application class for console mode +class LyXConsoleApp : public ConsoleApplication +{ +public: + LyXConsoleApp(LyX * lyx, int & argc, char * argv[]) + : ConsoleApplication(lyx_package, argc, argv), lyx_(lyx), + argc_(argc), argv_(argv) + { + } + void doExec() + { + int const exit_status = lyx_->execWithoutGui(argc_, argv_); + exit(exit_status); + } +private: + LyX * lyx_; + int & argc_; + char ** argv_; +}; + + /// frontend::Application * theApp() { @@ -221,6 +228,7 @@ LyX::~LyX() { delete pimpl_; singleton_ = 0; + WordList::cleanupWordLists(); } @@ -262,50 +270,28 @@ Messages & LyX::messages(string const & language) pair::iterator, bool> result = pimpl_->messages_.insert(make_pair(language, Messages(language))); - LASSERT(result.second, /**/); + LATTEST(result.second); return result.first->second; } -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 + setLocale(); } catch (ExceptionMessage const & message) { LYXERR(Debug::LOCALE, message.title_ + ", " + message.details_); } - // FIXME: This breaks out of source build under Windows. - 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_); @@ -317,42 +303,16 @@ int LyX::exec(int & argc, char * argv[]) // Reinit the messages machinery in case package() knows // something interesting about the locale directory. - Messages::init(); + setLocale(); if (!use_gui) { - // FIXME: create a ConsoleApplication - int exit_status = init(argc, argv); - if (exit_status) { - prepareExit(); - return exit_status; - } - - // this is correct, since return values are inverted. - exit_status = !loadFiles(); + LyXConsoleApp app(this, argc, argv); - if (pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) { - prepareExit(); - return exit_status; - } + // Reestablish our defaults, as Qt overwrites them + // after creating app + setLocale();//??? - BufferList::iterator begin = pimpl_->buffer_list_.begin(); - - bool final_success = false; - for (BufferList::iterator I = begin; I != pimpl_->buffer_list_.end(); ++I) { - Buffer * buf = *I; - if (buf != buf->masterBuffer()) - continue; - vector::const_iterator bcit = pimpl_->batch_commands.begin(); - vector::const_iterator bcend = pimpl_->batch_commands.end(); - DispatchResult dr; - for (; bcit != bcend; bcit++) { - LYXERR(Debug::ACTION, "Buffer::dispatch: cmd: " << *bcit); - buf->dispatch(*bcit, dr); - final_success |= !dr.error(); - } - } - prepareExit(); - return !final_success; + return app.exec(); } // Let the frontend parse and remove all arguments that it knows @@ -360,7 +320,7 @@ int LyX::exec(int & argc, char * argv[]) // Reestablish our defaults, as Qt overwrites them // after createApplication() - locale_init(); + setLocale();//??? // Parse and remove all known arguments in the LyX singleton // Give an error for all remaining ones. @@ -380,7 +340,7 @@ int LyX::exec(int & argc, char * argv[]) // FIXME /* Create a CoreApplication class that will provide the main event loop - * and the socket callback registering. With Qt4, only QtCore + * and the socket callback registering. With Qt, only QtCore * library would be needed. * When this is done, a server_mode could be created and the following two * line would be moved out from here. @@ -443,24 +403,21 @@ void LyX::prepareExit() LYXERR(Debug::INFO, "Deleting tmp dir " << package().temp_dir().absFileName()); if (!package().temp_dir().destroyDirectory()) { - docstring const msg = - bformat(_("Unable to remove the temporary directory %1$s"), - from_utf8(package().temp_dir().absFileName())); - Alert::warning(_("Unable to remove temporary directory"), msg); + LYXERR0(bformat(_("Unable to remove the temporary directory %1$s"), + from_utf8(package().temp_dir().absFileName()))); } } } // Kill the application object before exiting. This avoids crashes // when exiting on Linux. - if (pimpl_->application_) - pimpl_->application_.reset(); + pimpl_->application_.reset(); } void LyX::earlyExit(int status) { - LASSERT(pimpl_->application_.get(), /**/); + LATTEST(pimpl_->application_.get()); // LyX::pimpl_::application_ is not initialised at this // point so it's safe to just exit after some cleanup. prepareExit(); @@ -492,6 +449,11 @@ int LyX::init(int & argc, char * argv[]) for (int argi = 1; argi < argc; ++argi) pimpl_->files_to_load_.push_back(os::utf8_argv(argi)); + if (!use_gui && pimpl_->files_to_load_.empty()) { + lyxerr << to_utf8(_("Missing filename for this operation.")) << endl; + return EXIT_FAILURE; + } + if (first_start) { pimpl_->files_to_load_.push_back( i18nLibFileSearch("examples", "splash.lyx").absFileName()); @@ -501,41 +463,76 @@ int LyX::init(int & argc, char * argv[]) } -bool LyX::loadFiles() +int LyX::execWithoutGui(int & argc, char * argv[]) { - LASSERT(!use_gui, /**/); - bool success = true; + int exit_status = init(argc, argv); + if (exit_status) { + prepareExit(); + return exit_status; + } + + // 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 + // if they were not named on the command line. We do not want to dispatch to + // those. + vector command_line_buffers; + + // Load the files specified on the command line vector::const_iterator it = pimpl_->files_to_load_.begin(); vector::const_iterator end = pimpl_->files_to_load_.end(); - for (; it != end; ++it) { - // get absolute path of file and add ".lyx" to - // the filename if necessary + // get absolute path of file and add ".lyx" to the filename if necessary FileName fname = fileSearch(string(), os::internal_path(*it), "lyx", - may_not_exist); + may_not_exist); if (fname.empty()) continue; - Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFileName(), false); - if (buf->loadLyXFile() == Buffer::ReadSuccess) { + Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFileName()); + LYXERR(Debug::FILES, "Loading " << fname); + if (buf && buf->loadLyXFile() == Buffer::ReadSuccess) { ErrorList const & el = buf->errorList("Parse"); - if (!el.empty()) - for_each(el.begin(), el.end(), - bind(&LyX::printError, this, _1)); + for(ErrorItem const & e : el) + printError(e); + command_line_buffers.push_back(buf); + } else { + if (buf) + pimpl_->buffer_list_.release(buf); + docstring const error_message = + bformat(_("LyX failed to load the following file: %1$s"), + from_utf8(fname.absFileName())); + lyxerr << to_utf8(error_message) << endl; + exit_status = 1; // failed } - else { - pimpl_->buffer_list_.release(buf); - success = false; + } + + if (exit_status || pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) { + prepareExit(); + return exit_status; + } + + // Iterate through the buffers that were specified on the command line + bool final_success = false; + vector::iterator buf_it = command_line_buffers.begin(); + for (; buf_it != command_line_buffers.end(); ++buf_it) { + Buffer * buf = *buf_it; + vector::const_iterator bcit = pimpl_->batch_commands.begin(); + vector::const_iterator bcend = pimpl_->batch_commands.end(); + DispatchResult dr; + for (; bcit != bcend; ++bcit) { + LYXERR(Debug::ACTION, "Buffer::dispatch: cmd: " << *bcit); + buf->dispatch(*bcit, dr); + final_success |= !dr.error(); } } - return success; + prepareExit(); + return !final_success; } void execBatchCommands() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); singleton_->execCommands(); } @@ -593,7 +590,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)); } @@ -671,7 +668,7 @@ static void error_handler(int err_sig) "hope you have not lost any data.\n" "Please read the bug-reporting instructions " "in 'Help->Introduction' and send us a bug report, " - "if necessary. Thanks !\nBye."); + "if necessary. Thanks!\nBye."); break; case SIGINT: case SIGTERM: @@ -682,7 +679,7 @@ static void error_handler(int err_sig) if (!msg.empty()) { lyxerr << "\nlyx: " << msg << endl; // try to make a GUI message - Alert::error(_("LyX crashed!"), msg); + Alert::error(_("LyX crashed!"), msg, true); } // Deinstall the signal handlers @@ -721,6 +718,96 @@ void LyX::printError(ErrorItem const & ei) cerr << to_utf8(tmp) << endl; } +#if defined (USE_MACOSX_PACKAGING) +namespace { + // Unexposed--extract an environment variable name from its NAME=VALUE + // representation + std::string varname(const char* line) + { + size_t nameLen = strcspn(line, "="); + if (nameLen == strlen(line)) { + return std::string(); + } else { + return std::string(line, nameLen); + } + } +} + +void cleanDuplicateEnvVars() +{ + std::set seen; + std::set dupes; + + // Create a list of the environment variables that appear more than once + for (char **read = *_NSGetEnviron(); *read; read++) { + std::string name = varname(*read); + if (name.size() == 0) { + continue; + } + if (seen.find(name) != seen.end()) { + dupes.insert(name); + } else { + seen.insert(name); + } + } + + // Loop over the list of duplicated variables + std::set::iterator dupe = dupes.begin(); + std::set::iterator const dend = dupes.end(); + for (; dupe != dend; ++dupe) { + const char *name = (*dupe).c_str(); + char *val = getenv(name); + if (val != NULL) { + LYXERR(Debug::INIT, "Duplicate environment variable: " << name); + // unsetenv removes *all* instances of the variable from the environment + unsetenv(name); + + // replace with the value from getenv (in practice appears to be the + // first value in the list) + setenv(name, val, 0); + } + } +} +#endif + + +static void initTemplatePath() +{ + FileName const package_template_path = + FileName(addName(package().system_support().absFileName(), "templates")); + + if (lyxrc.template_path.empty()) { + lyxrc.template_path = package_template_path.absFileName(); + } +#if defined (USE_MACOSX_PACKAGING) + FileName const user_template_path = + FileName(addName(package().user_support().absFileName(), "templates")); + + if (package_template_path != FileName(lyxrc.template_path) && + user_template_path != FileName(lyxrc.template_path)) + { + return; + } + FileName const user_template_link = + FileName(addName(user_template_path.absFileName(),"SystemTemplates")); + if (user_template_link.isSymLink() && !equivalent(user_template_link, package_template_path)) { + user_template_link.removeFile(); + } + if (!user_template_link.exists()) { + if (!package_template_path.link(user_template_link)) { + FileName const user_support = package().user_support(); + if (user_support.exists() && user_support.isDirectory()) { + LYXERR(Debug::INIT, "Cannot create symlink " + user_template_link.absFileName()); + lyxrc.template_path = package_template_path.absFileName(); + } + return; + } + LYXERR(Debug::INIT, "Symlink \"" << user_template_link.absFileName() << "\" created."); + } + lyxrc.template_path = user_template_path.absFileName(); +#endif +} + bool LyX::init() { @@ -733,6 +820,10 @@ bool LyX::init() signal(SIGTERM, error_handler); // SIGPIPE can be safely ignored. +#if defined (USE_MACOSX_PACKAGING) + cleanDuplicateEnvVars(); +#endif + lyxrc.tempdir_path = package().temp_dir().absFileName(); lyxrc.document_path = package().document_dir().absFileName(); @@ -740,9 +831,24 @@ bool LyX::init() lyxrc.example_path = addPath(package().system_support().absFileName(), "examples"); } - if (lyxrc.template_path.empty()) { - lyxrc.template_path = addPath(package().system_support().absFileName(), - "templates"); + initTemplatePath(); + + // init LyXDir environment variable + string const lyx_dir = package().lyx_dir().absFileName(); + LYXERR(Debug::INIT, "Setting LyXDir... to \"" << lyx_dir << "\""); + if (!setEnv("LyXDir", lyx_dir)) + LYXERR(Debug::INIT, "\t... failed!"); + + if (package().explicit_user_support() && getEnv(LYX_USERDIR_VER).empty()) { + // -userdir was given on the command line. + // Make it available to child processes, otherwise tex2lyx + // would not find all layout files, and other converters might + // use it as well. + string const user_dir = package().user_support().absFileName(); + LYXERR(Debug::INIT, "Setting " LYX_USERDIR_VER "... to \"" + << user_dir << '"'); + if (!setEnv(LYX_USERDIR_VER, user_dir)) + LYXERR(Debug::INIT, "\t... failed!"); } // @@ -753,22 +859,28 @@ 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) +#if !defined (USE_POSIX_PACKAGING) && !defined (USE_HAIKU_PACKAGING) // Add the directory containing the LyX executable to the path // so that LyX can find things like tex2lyx. if (package().build_support().empty()) prependEnvPath("PATH", package().binary_dir().absFileName()); #endif if (!lyxrc.path_prefix.empty()) - prependEnvPath("PATH", lyxrc.path_prefix); + prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix)); // Check that user LyX directory is ok. - if (queryUserLyXDir(package().explicit_user_support())) - reconfigureUserLyXDir(); + { + string const lock_file = package().getConfigureLockName(); + int fd = fileLock(lock_file.c_str()); + + if (queryUserLyXDir(package().explicit_user_support())) { + package().reconfigureUserLyXDir(""); + // Now the user directory is present on first start. + initTemplatePath(); + } + fileUnlock(fd, lock_file.c_str()); + } if (!use_gui) { // No need for a splash when there is no GUI @@ -796,9 +908,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_; @@ -809,14 +918,14 @@ bool LyX::init() if (!readRcFile("preferences", true)) return false; + // The language may have been set to someting useful through prefs + setLocale(); + if (!readEncodingsFile("encodings", "unicodesymbols")) return false; if (!readLanguagesFile("languages")) return false; - // Set the language defined by the user. - setRcGuiLanguage(); - LYXERR(Debug::INIT, "Reading layouts..."); // Load the layouts LayoutFileList::get().read(); @@ -841,8 +950,9 @@ bool LyX::init() lyxrc.print(); os::windows_style_tex_paths(lyxrc.windows_style_tex_paths); + // Prepend path prefix a second time to take the user preferences into a account if (!lyxrc.path_prefix.empty()) - prependEnvPath("PATH", lyxrc.path_prefix); + prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix)); FileName const document_path(lyxrc.document_path); if (document_path.exists() && document_path.isDirectory()) @@ -894,27 +1004,6 @@ void emergencyCleanup() } -// return true if file does not exist or is older than configure.py. -static bool needsUpdate(string const & file) -{ - // We cannot initialize configure_script directly because the package - // is not initialized yet when static objects are constructed. - static FileName configure_script; - static bool firstrun = true; - if (firstrun) { - configure_script = - FileName(addName(package().system_support().absFileName(), - "configure.py")); - firstrun = false; - } - - FileName absfile = - FileName(addName(package().user_support().absFileName(), file)); - return !absfile.exists() - || configure_script.lastModified() > absfile.lastModified(); -} - - bool LyX::queryUserLyXDir(bool explicit_userdir) { // Does user directory exist? @@ -922,10 +1011,10 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) if (sup.exists() && sup.isDirectory()) { first_start = false; - return needsUpdate("lyxrc.defaults") - || needsUpdate("lyxmodules.lst") - || needsUpdate("textclass.lst") - || needsUpdate("packages.lst"); + return configFileNeedsUpdate("lyxrc.defaults") + || configFileNeedsUpdate("lyxmodules.lst") + || configFileNeedsUpdate("textclass.lst") + || configFileNeedsUpdate("packages.lst"); } first_start = !explicit_userdir; @@ -1019,13 +1108,13 @@ bool LyX::readEncodingsFile(string const & enc_name, namespace { /// return the the number of arguments consumed -typedef boost::function cmd_helper; +typedef function cmd_helper; 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; @@ -1038,7 +1127,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" @@ -1051,10 +1140,14 @@ 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" - " to get an idea which parameters should be passed.\n" + " where fmt is the export format of choice. Look in\n" + " Tools->Preferences->File Handling->File Formats->Short Name\n" + " to see which parameter (which differs from the format name\n" + " in the File->Export menu) 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" @@ -1078,11 +1171,12 @@ 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; - - lyxerr << lyx_version_info << endl; + if (string(lyx_git_commit_hash) != "none") + cout << to_utf8(_(" Git commit hash ")) + << string(lyx_git_commit_hash).substr(0,8) << endl; + cout << lyx_version_info << endl; exit(0); return 0; } @@ -1124,6 +1218,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()) { @@ -1148,7 +1260,6 @@ int parse_import(string const & type, string const & file, string & batch) lyxerr << to_utf8(_("Missing filename for --import")) << endl; exit(1); } - batch = "buffer-import " + type + ' ' + file; return 2; } @@ -1219,6 +1330,8 @@ void LyX::easyParse(int & argc, char * argv[]) cmdmap["--execute"] = parse_execute; 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; @@ -1263,35 +1376,35 @@ void LyX::easyParse(int & argc, char * argv[]) FuncStatus getStatus(FuncRequest const & action) { - LASSERT(theApp(), /**/); + LAPPERR(theApp()); return theApp()->getStatus(action); } -void dispatch(FuncRequest const & action) +DispatchResult const & dispatch(FuncRequest const & action) { - LASSERT(theApp(), /**/); + LAPPERR(theApp()); return theApp()->dispatch(action); } void dispatch(FuncRequest const & action, DispatchResult & dr) { - LASSERT(theApp(), /**/); - return theApp()->dispatch(action, dr); + LAPPERR(theApp()); + theApp()->dispatch(action, dr); } vector & theFilesToLoad() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->files_to_load_; } BufferList & theBufferList() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->buffer_list_; } @@ -1299,101 +1412,103 @@ BufferList & theBufferList() Server & theServer() { // FIXME: this should not be use_gui dependent - LASSERT(use_gui, /**/); - LASSERT(singleton_, /**/); - return *singleton_->pimpl_->lyx_server_.get(); + LWARNIF(use_gui); + LAPPERR(singleton_); + return *singleton_->pimpl_->lyx_server_; } ServerSocket & theServerSocket() { // FIXME: this should not be use_gui dependent - LASSERT(use_gui, /**/); - LASSERT(singleton_, /**/); - return *singleton_->pimpl_->lyx_socket_.get(); + LWARNIF(use_gui); + LAPPERR(singleton_); + return *singleton_->pimpl_->lyx_socket_; } KeyMap & theTopLevelKeymap() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->toplevel_keymap_; } Converters & theConverters() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->converters_; } Converters & theSystemConverters() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->system_converters_; } Movers & theMovers() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->movers_; } Mover const & getMover(string const & fmt) { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->movers_(fmt); } void setMover(string const & fmt, string const & command) { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); singleton_->pimpl_->movers_.set(fmt, command); } Movers & theSystemMovers() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->system_movers_; } Messages const & getMessages(string const & language) { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->messages(language); } Messages const & getGuiMessages() { - LASSERT(singleton_, /**/); - return singleton_->pimpl_->messages_["GUI"]; + LAPPERR(singleton_); + return singleton_->messages(Messages::guiLanguage()); } -graphics::Previews & thePreviews() +Session & theSession() { - LASSERT(singleton_, /**/); - return singleton_->pimpl_->preview_; + LAPPERR(singleton_); + return *singleton_->pimpl_->session_.get(); } -Session & theSession() +LaTeXFonts & theLaTeXFonts() { - LASSERT(singleton_, /**/); - return *singleton_->pimpl_->session_.get(); + LAPPERR(singleton_); + if (!singleton_->pimpl_->latexfonts_) + singleton_->pimpl_->latexfonts_ = new LaTeXFonts; + return *singleton_->pimpl_->latexfonts_; } CmdDef & theTopLevelCmdDef() { - LASSERT(singleton_, /**/); + LAPPERR(singleton_); return singleton_->pimpl_->toplevel_cmddef_; } @@ -1414,7 +1529,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; @@ -1422,7 +1537,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; @@ -1430,7 +1545,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; @@ -1438,7 +1553,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;