X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=879e9c2df6560862ac6feee6ae955ed82ad59053;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=7608131af2d8c26baa10bd86dd9faba35edf7ba6;hpb=d891a896f47df2d7f048ad7e4498f2fd4f3c5d3b;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index 7608131af2..879e9c2df6 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -36,8 +36,11 @@ #include "lyxtextclasslist.h" #include "lyxserver.h" #include "MenuBackend.h" +#include "mover.h" #include "ToolbarBackend.h" +#include "mathed/math_inset.h" + #include "frontends/Alert.h" #include "frontends/lyx_gui.h" #include "frontends/LyXView.h" @@ -71,7 +74,8 @@ using lyx::support::setLyxPaths; using lyx::support::system_lyxdir; using lyx::support::user_lyxdir; -namespace os = lyx::support::os; +using lyx::support::os::getTmpDir; +using lyx::support::os::setTmpDir; using std::endl; using std::string; @@ -119,7 +123,7 @@ void LyX::exec(int & argc, char * argv[]) // Start the real execution loop. singleton_->priv_exec(argc, argv); } - + LyX & LyX::ref() { @@ -160,7 +164,7 @@ void LyX::addLyXView(boost::shared_ptr const & lyxview) } -Buffer const * const LyX::updateInset(InsetOld const * inset) const +Buffer const * const LyX::updateInset(InsetBase const * inset) const { if (!inset) return 0; @@ -204,6 +208,8 @@ void LyX::priv_exec(int & argc, char * argv[]) if (want_gui) lyx_gui::parse_lyxrc(); + initMath(); + vector files; for (int argi = argc - 1; argi >= 1; --argi) @@ -258,34 +264,45 @@ extern "C" { static void error_handler(int err_sig) { + // Throw away any signals other than the first one received. + static sig_atomic_t handling_error = false; + if (handling_error) + return; + handling_error = true; + + // We have received a signal indicating a fatal error, so + // try and save the data ASAP. + LyX::cref().emergencyCleanup(); + + // These lyxerr calls may or may not work: + + // Signals are asynchronous, so the main program may be in a very + // fragile state when a signal is processed and thus while a signal + // handler function executes. + // In general, therefore, we should avoid performing any + // I/O operations or calling most library and system functions from + // signal handlers. + + // This shouldn't matter here, however, as we've already invoked + // emergencyCleanup. switch (err_sig) { case SIGHUP: - lyxerr << "\nlyx: SIGHUP signal caught" << endl; - break; - case SIGINT: - // no comments + lyxerr << "\nlyx: SIGHUP signal caught\nBye." << endl; break; case SIGFPE: - lyxerr << "\nlyx: SIGFPE signal caught" << endl; + lyxerr << "\nlyx: SIGFPE signal caught\nBye." << endl; break; case SIGSEGV: - lyxerr << "\nlyx: SIGSEGV signal caught" << endl; - lyxerr << - "Sorry, you have found a bug in LyX. " - "Please read the bug-reporting instructions " - "in Help->Introduction and send us a bug report, " - "if necessary. Thanks !" << endl; + lyxerr << "\nlyx: SIGSEGV signal caught\n" + "Sorry, you have found a bug in LyX. " + "Please read the bug-reporting instructions " + "in Help->Introduction and send us a bug report, " + "if necessary. Thanks !\nBye." << endl; break; + case SIGINT: case SIGTERM: // no comments break; - case SIGPIPE: - // This will be received if lyx tries to write to a socket - // whose reading end was closed. It can safely be ignored, - // as in this case the ::write() system call will return -1 - // and errno will be set to EPIPE - return; - //break; } // Deinstall the signal handlers @@ -294,13 +311,9 @@ static void error_handler(int err_sig) signal(SIGFPE, SIG_DFL); signal(SIGSEGV, SIG_DFL); signal(SIGTERM, SIG_DFL); - signal(SIGPIPE, SIG_DFL); - - LyX::cref().emergencyCleanup(); - lyxerr << "Bye." << endl; - if (err_sig!= SIGHUP && - (!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV)) + if (err_sig == SIGSEGV || + (err_sig != SIGHUP && !GetEnv("LYXDEBUG").empty())) lyx::support::abort(); exit(0); } @@ -323,7 +336,7 @@ void LyX::init(bool gui) signal(SIGSEGV, error_handler); signal(SIGINT, error_handler); signal(SIGTERM, error_handler); - signal(SIGPIPE, error_handler); + // SIGPIPE can be safely ignored. bool const explicit_userdir = setLyxPaths(); @@ -361,6 +374,7 @@ void LyX::init(bool gui) system_lyxrc = lyxrc; system_formats = formats; system_converters = converters; + system_movers = movers; system_lcolor = lcolor; string prefsfile = "preferences"; @@ -390,8 +404,8 @@ void LyX::init(bool gui) if (lyxerr.debugging(Debug::LYXRC)) lyxrc.print(); - os::setTmpDir(createLyXTmpDir(lyxrc.tempdir_path)); - if (os::getTmpDir().empty()) { + setTmpDir(createLyXTmpDir(lyxrc.tempdir_path)); + if (getTmpDir().empty()) { Alert::error(_("Could not create temporary directory"), bformat(_("Could not create a temporary directory in\n" "%1$s. Make sure that this\n" @@ -406,7 +420,7 @@ void LyX::init(bool gui) } if (lyxerr.debugging(Debug::INIT)) { - lyxerr << "LyX tmp dir: `" << os::getTmpDir() << '\'' << endl; + lyxerr << "LyX tmp dir: `" << getTmpDir() << '\'' << endl; } lyxerr[Debug::INIT] << "Reading lastfiles `"