X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyX.cpp;h=d2484d152e1f25195eeca966702258200a77744d;hb=4c724a6072013247ac178f0acec06825585c6c55;hp=8b75b44c087d5e41a8a1cf2708836dcf81b9e326;hpb=7b48e2aac0d63fe23cbeadf6ddd50ab0c26c1b6e;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index 8b75b44c08..d2484d152e 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -175,8 +175,6 @@ 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; @@ -406,10 +404,8 @@ 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()))); } } } @@ -472,72 +468,66 @@ int LyX::execWithoutGui(int & argc, char * argv[]) { int exit_status = init(argc, argv); if (exit_status) { - prepareExit(); - return exit_status; - } - - // this is correct, since return values are inverted. - exit_status = !loadFiles(); - - if (pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) { prepareExit(); return exit_status; } - 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; -} - + // 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; -bool LyX::loadFiles() -{ - LATTEST(!use_gui); - bool success = true; + // 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()); + LYXERR(Debug::FILES, "Loading " << fname); if (buf->loadLyXFile() == Buffer::ReadSuccess) { ErrorList const & el = buf->errorList("Parse"); if (!el.empty()) - for_each(el.begin(), el.end(), - bind(&LyX::printError, this, _1)); - } - else { + for_each(el.begin(), el.end(), + bind(&LyX::printError, this, _1)); + command_line_buffers.push_back(buf); + } else { pimpl_->buffer_list_.release(buf); docstring const error_message = - bformat(_("LyX failed to load the following file: %1$s"), - from_utf8(fname.absFileName())); + bformat(_("LyX failed to load the following file: %1$s"), + from_utf8(fname.absFileName())); lyxerr << to_utf8(error_message) << endl; - success = false; + exit_status = 1; // failed } } - return success; + + 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(); + } + } + prepareExit(); + return !final_success; } @@ -763,7 +753,9 @@ void cleanDuplicateEnvVars() } // Loop over the list of duplicated variables - for (std::set::iterator dupe = dupes.begin(); dupe != dupes.end(); dupe++) { + 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) { @@ -779,6 +771,45 @@ void cleanDuplicateEnvVars() } #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() { #ifdef SIGHUP @@ -801,10 +832,7 @@ 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(); @@ -833,7 +861,7 @@ bool LyX::init() return false; // 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()) @@ -849,6 +877,8 @@ bool LyX::init() if (queryUserLyXDir(package().explicit_user_support())) { package().reconfigureUserLyXDir(""); + // Now the user directory is present on first start. + initTemplatePath(); } fileUnlock(fd, lock_file.c_str()); } @@ -1147,8 +1177,6 @@ int parse_version(string const &, string const &, string &) if (string(lyx_git_commit_hash) != "none") cout << to_utf8(_(" Git commit hash ")) << string(lyx_git_commit_hash).substr(0,8) << endl; - cout << to_utf8(bformat(_("Built on %1$s[[date]], %2$s[[time]]"), - from_ascii(lyx_build_date), from_ascii(lyx_build_time))) << endl; cout << lyx_version_info << endl; exit(0); return 0; @@ -1301,7 +1329,7 @@ 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; @@ -1354,7 +1382,7 @@ FuncStatus getStatus(FuncRequest const & action) } -void dispatch(FuncRequest const & action) +DispatchResult const & dispatch(FuncRequest const & action) { LAPPERR(theApp()); return theApp()->dispatch(action); @@ -1364,7 +1392,7 @@ void dispatch(FuncRequest const & action) void dispatch(FuncRequest const & action, DispatchResult & dr) { LAPPERR(theApp()); - return theApp()->dispatch(action, dr); + theApp()->dispatch(action, dr); }