#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"
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;
using lyx::support::system_lyxdir;
using lyx::support::user_lyxdir;
+using lyx::support::os::getTmpDir;
+using lyx::support::os::setTmpDir;
+
namespace os = lyx::support::os;
using std::endl;
// Start the real execution loop.
singleton_->priv_exec(argc, argv);
}
-
+
LyX & LyX::ref()
{
}
-Buffer const * const LyX::updateInset(InsetOld const * inset) const
+Buffer const * const LyX::updateInset(InsetBase const * inset) const
{
if (!inset)
return 0;
if (want_gui)
lyx_gui::parse_lyxrc();
+ initMath();
+
vector<string> files;
for (int argi = argc - 1; argi >= 1; --argi)
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
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);
}
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();
system_lyxrc = lyxrc;
system_formats = formats;
system_converters = converters;
+ system_movers = movers;
system_lcolor = lcolor;
string prefsfile = "preferences";
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 `"
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));
if (!createDirectory(user_lyxdir(), 0755)) {
// Failed, let's use $HOME instead.
- user_lyxdir(GetEnvPath("HOME"));
+ user_lyxdir(os::homepath());
lyxerr << bformat(_("Failed. Will use %1$s instead."),
user_lyxdir()) << endl;
return;