X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLyX.cpp;h=29c8defc23149d180a26a0e89131a8d7b676848f;hb=4056f0ddb150d0e5d60bc5941d51e365eed0ac86;hp=f4fdda708ffe9f18e70114f0b51b10696aaa7e7d;hpb=b89cc942eb458284f40f4d4e7db58890c3288979;p=lyx.git diff --git a/src/LyX.cpp b/src/LyX.cpp index f4fdda708f..29c8defc23 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -17,7 +17,6 @@ #include "LyX.h" -#include "buffer_funcs.h" #include "Buffer.h" #include "BufferList.h" #include "CmdDef.h" @@ -52,7 +51,6 @@ #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" -#include "support/lyxlib.h" #include "support/Messages.h" #include "support/os.h" #include "support/Package.h" @@ -66,6 +64,7 @@ #include #include #include +#include #include #include @@ -93,7 +92,7 @@ namespace { string cl_system_support; string cl_user_support; -std::string geometryArg; +string geometryArg; LyX * singleton_ = 0; @@ -110,7 +109,7 @@ void reconfigureUserLyXDir() string const configure_command = package().configure_command(); lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl; - support::PathChanger p(package().user_support()); + PathChanger p(package().user_support()); Systemcall one; one.startscript(Systemcall::Wait, configure_command); lyxerr << "LyX: " << to_utf8(_("Done!")) << endl; @@ -147,7 +146,7 @@ struct LyX::Impl boost::scoped_ptr session_; /// Files to load at start. - vector files_to_load_; + vector files_to_load_; /// The messages translators. map messages_; @@ -166,7 +165,7 @@ struct LyX::Impl /// has this user started lyx for the first time? bool first_start; /// the parsed command line batch command if any - std::string batch_command; + string batch_command; }; /// @@ -185,6 +184,26 @@ LyX::~LyX() } +void LyX::exit(int exit_code) const +{ + if (exit_code) + // Something wrong happened so better save everything, just in + // case. + emergencyCleanup(); + +#ifndef NDEBUG + // Properly crash in debug mode in order to get a useful backtrace. + abort(); +#endif + + // In release mode, try to exit gracefully. + if (theApp()) + theApp()->exit(exit_code); + else + exit(exit_code); +} + + LyX & LyX::ref() { BOOST_ASSERT(singleton_); @@ -317,15 +336,15 @@ KeyMap const & LyX::topLevelKeymap() const } -Messages & LyX::getMessages(std::string const & language) +Messages & LyX::getMessages(string const & language) { map::iterator it = pimpl_->messages_.find(language); if (it != pimpl_->messages_.end()) return it->second; - std::pair::iterator, bool> result = - pimpl_->messages_.insert(std::make_pair(language, Messages(language))); + pair::iterator, bool> result = + pimpl_->messages_.insert(make_pair(language, Messages(language))); BOOST_ASSERT(result.second); return result.first->second; @@ -338,7 +357,7 @@ Messages & LyX::getGuiMessages() } -void LyX::setGuiLanguage(std::string const & language) +void LyX::setGuiLanguage(string const & language) { pimpl_->messages_["GUI"] = Messages(language); } @@ -351,14 +370,14 @@ int LyX::exec(int & argc, char * argv[]) easyParse(argc, argv); try { - support::init_package(to_utf8(from_local8bit(argv[0])), + init_package(to_utf8(from_local8bit(argv[0])), cl_system_support, cl_user_support, - support::top_build_dir_is_one_level_up); - } catch (support::ExceptionMessage const & message) { - if (message.type_ == support::ErrorException) { + top_build_dir_is_one_level_up); + } catch (ExceptionMessage const & message) { + if (message.type_ == ErrorException) { Alert::error(message.title_, message.details_); exit(1); - } else if (message.type_ == support::WarningException) { + } else if (message.type_ == WarningException) { Alert::warning(message.title_, message.details_); } } @@ -505,24 +524,22 @@ int LyX::init(int & argc, char * argv[]) if (!success) return EXIT_FAILURE; - for (int argi = argc - 1; argi >= 1; --argi) { - // get absolute path of file and add ".lyx" to - // the filename if necessary - pimpl_->files_to_load_.push_back(fileSearch(string(), - os::internal_path(to_utf8(from_local8bit(argv[argi]))), - "lyx", support::allow_unreadable)); - } + // Remaining arguments are assumed to be files to load. + for (int argi = argc - 1; argi >= 1; --argi) + pimpl_->files_to_load_.push_back(to_utf8(from_local8bit(argv[argi]))); - if (first_start) - pimpl_->files_to_load_.push_back(i18nLibFileSearch("examples", "splash.lyx")); + if (first_start) { + pimpl_->files_to_load_.push_back( + i18nLibFileSearch("examples", "splash.lyx").absFilename()); + } return EXIT_SUCCESS; } -void LyX::addFileToLoad(FileName const & fname) +void LyX::addFileToLoad(string const & fname) { - vector::const_iterator cit = std::find( + vector::const_iterator cit = find( pimpl_->files_to_load_.begin(), pimpl_->files_to_load_.end(), fname); @@ -533,15 +550,20 @@ void LyX::addFileToLoad(FileName const & fname) void LyX::loadFiles() { - vector::const_iterator it = pimpl_->files_to_load_.begin(); - vector::const_iterator end = pimpl_->files_to_load_.end(); + vector::const_iterator it = pimpl_->files_to_load_.begin(); + vector::const_iterator end = pimpl_->files_to_load_.end(); for (; it != end; ++it) { - if (it->empty()) + // 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); + + if (fname.empty()) continue; - Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false); - if (buf->loadLyXFile(*it)) { + Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFilename(), false); + if (buf->loadLyXFile(fname)) { ErrorList const & el = buf->errorList("Parse"); if (!el.empty()) for_each(el.begin(), el.end(), @@ -558,10 +580,9 @@ void LyX::execBatchCommands() // The advantage of doing this here is that the event loop // is already started. So any need for interaction will be // aknowledged. - restoreGuiSession(); // if reconfiguration is needed. - if (textclasslist.empty()) { + while (textclasslist.empty()) { switch (Alert::prompt( _("No textclass is found"), _("LyX cannot continue because no textclass is found. " @@ -581,62 +602,38 @@ void LyX::execBatchCommands() pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE, " --without-latex-config")); break; + default: + pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT)); + return; } - pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT)); - return; } - // Execute batch commands if available - if (pimpl_->batch_command.empty()) - return; - - LYXERR(Debug::INIT, "About to handle -x '" << pimpl_->batch_command << '\''); - - pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(pimpl_->batch_command)); -} - - -void LyX::restoreGuiSession() -{ - // create the main window + // create the first main window pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg)); - // if there is no valid class list, do not load any file. - if (textclasslist.empty()) - return; - - // if some files were specified at command-line we assume that the - // user wants to edit *these* files and not to restore the session. if (!pimpl_->files_to_load_.empty()) { - for_each(pimpl_->files_to_load_.begin(), - pimpl_->files_to_load_.end(), - bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, true)); + // if some files were specified at command-line we assume that the + // user wants to edit *these* files and not to restore the session. + for (size_t i = 0; i != pimpl_->files_to_load_.size(); ++i) { + pimpl_->lyxfunc_.dispatch( + FuncRequest(LFUN_FILE_OPEN, pimpl_->files_to_load_[i])); + } // clear this list to save a few bytes of RAM pimpl_->files_to_load_.clear(); - pimpl_->session_->lastOpened().clear(); + } + else + pimpl_->application_->restoreGuiSession(); - } else if (lyxrc.load_session) { - vector const & lastopened = pimpl_->session_->lastOpened().getfiles(); - // do not add to the lastfile list since these files are restored from - // last session, and should be already there (regular files), or should - // not be added at all (help files). - for_each(lastopened.begin(), lastopened.end(), - bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, false)); + // Execute batch commands if available + if (pimpl_->batch_command.empty()) + return; - // clear this list to save a few bytes of RAM - pimpl_->session_->lastOpened().clear(); - } + LYXERR(Debug::INIT, "About to handle -x '" << pimpl_->batch_command << '\''); - BufferList::iterator I = pimpl_->buffer_list_.begin(); - BufferList::iterator end = pimpl_->buffer_list_.end(); - for (; I != end; ++I) { - Buffer * buf = *I; - if (buf != buf->masterBuffer()) - continue; - updateLabels(*buf); - } + pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(pimpl_->batch_command)); } + /* Signals and Windows =================== @@ -729,7 +726,7 @@ static void error_handler(int err_sig) #else if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty()) #endif - support::abort(); + abort(); exit(0); } @@ -740,7 +737,7 @@ void LyX::printError(ErrorItem const & ei) { docstring tmp = _("LyX: ") + ei.error + char_type(':') + ei.description; - std::cerr << to_utf8(tmp) << std::endl; + cerr << to_utf8(tmp) << endl; } @@ -848,7 +845,7 @@ bool LyX::init() pimpl_->lyxfunc_.initKeySequences(&pimpl_->toplevel_keymap_); // Read menus - if (!readUIFile(lyxrc.ui_file)) + if (use_gui && !readUIFile(lyxrc.ui_file)) return false; if (lyxerr.debugging(Debug::LYXRC)) @@ -1037,10 +1034,10 @@ bool LyX::readUIFile(string const & name, bool include) }; // Ensure that a file is read only once (prevents include loops) - static std::list uifiles; - std::list::const_iterator it = uifiles.begin(); - std::list::const_iterator end = uifiles.end(); - it = std::find(it, end, name); + static list uifiles; + list::const_iterator it = uifiles.begin(); + list::const_iterator end = uifiles.end(); + it = find(it, end, name); if (it != end) { LYXERR(Debug::INIT, "UI file '" << name << "' has been read already. " << "Is this an include loop?"); @@ -1089,7 +1086,7 @@ bool LyX::readUIFile(string const & name, bool include) break; } case ui_menuset: - menubackend.read(lex); + theApp()->menuBackend().read(lex); break; case ui_toolbarset: @@ -1295,7 +1292,7 @@ int parse_geometry(string const & arg1, string const &) void LyX::easyParse(int & argc, char * argv[]) { - std::map cmdmap; + map cmdmap; cmdmap["-dbg"] = parse_dbg; cmdmap["-help"] = parse_help; @@ -1313,7 +1310,7 @@ void LyX::easyParse(int & argc, char * argv[]) cmdmap["-geometry"] = parse_geometry; for (int i = 1; i < argc; ++i) { - std::map::const_iterator it + map::const_iterator it = cmdmap.find(argv[i]); // don't complain if not found - may be parsed later @@ -1405,13 +1402,13 @@ Movers & theMovers() } -Mover const & getMover(std::string const & fmt) +Mover const & getMover(string const & fmt) { return LyX::ref().pimpl_->movers_(fmt); } -void setMover(std::string const & fmt, std::string const & command) +void setMover(string const & fmt, string const & command) { LyX::ref().pimpl_->movers_.set(fmt, command); } @@ -1423,7 +1420,7 @@ Movers & theSystemMovers() } -Messages & getMessages(std::string const & language) +Messages & getMessages(string const & language) { return LyX::ref().getMessages(language); }