]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
get rid of broken_header.h and some unneeded tests
[lyx.git] / src / lyx_main.C
index 7608131af2d8c26baa10bd86dd9faba35edf7ba6..879e9c2df6560862ac6feee6ae955ed82ad59053 100644 (file)
 #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<LyXView> 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<string> 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 `"