X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=879e9c2df6560862ac6feee6ae955ed82ad59053;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=eb5d7b0289d18ad3d593a9d5fab056cf04c095fd;hpb=50257b86904437b6695a7a9a823fbe4301ba0ce3;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index eb5d7b0289..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" @@ -58,7 +61,7 @@ using lyx::support::AddName; using lyx::support::AddPath; using lyx::support::bformat; using lyx::support::createDirectory; -using lyx::support::CreateLyXTmpDir; +using lyx::support::createLyXTmpDir; using lyx::support::FileInfo; using lyx::support::FileSearch; using lyx::support::GetEnv; @@ -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,9 +404,23 @@ void LyX::init(bool gui) if (lyxerr.debugging(Debug::LYXRC)) lyxrc.print(); - os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path)); + 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" + "path exists and is writable and try again."), + lyxrc.tempdir_path)); + // createLyXTmpDir() tries sufficiently hard to create a + // usable temp dir, so the probability to come here is + // close to zero. We therefore don't try to overcome this + // problem with e.g. asking the user for a new path and + // trying again but simply exit. + exit(EXIT_FAILURE); + } + if (lyxerr.debugging(Debug::INIT)) { - lyxerr << "LyX tmp dir: `" << os::getTmpDir() << '\'' << endl; + lyxerr << "LyX tmp dir: `" << getTmpDir() << '\'' << endl; } lyxerr[Debug::INIT] << "Reading lastfiles `" @@ -424,10 +452,6 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) kbmap->bind("Delete", FuncRequest(LFUN_DELETE)); kbmap->bind("BackSpace", FuncRequest(LFUN_BACKSPACE)); - // sub- and superscript -MV - kbmap->bind("~S-underscore", FuncRequest(LFUN_SUBSCRIPT)); - kbmap->bind("~S-asciicircum", FuncRequest(LFUN_SUPERSCRIPT)); - // kbmap->bindings to enable the use of the numeric keypad // e.g. Num Lock set //kbmap->bind("KP_0", FuncRequest(LFUN_SELFINSERT));