]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
Fix bug 2485 and crash on middle mouse paste on math
[lyx.git] / src / lyx_main.C
index 9d0bdf105a5b81782b4221e97c23034a9fb54b9d..c61b15cd27aca7d698c085dd626eb00d884528b8 100644 (file)
@@ -28,8 +28,9 @@
 #include "gettext.h"
 #include "kbmap.h"
 #include "language.h"
-#include "lastfiles.h"
+#include "session.h"
 #include "LColor.h"
+#include "lyx_cb.h"
 #include "lyxfunc.h"
 #include "lyxlex.h"
 #include "lyxrc.h"
@@ -45,6 +46,7 @@
 #include "frontends/lyx_gui.h"
 #include "frontends/LyXView.h"
 
+#include "support/environment.h"
 #include "support/filetools.h"
 #include "support/lyxlib.h"
 #include "support/os.h"
 #include <iostream>
 #include <csignal>
 
-using lyx::support::AddName;
-using lyx::support::AddPath;
+using lyx::support::addName;
+using lyx::support::addPath;
 using lyx::support::bformat;
 using lyx::support::createDirectory;
 using lyx::support::createLyXTmpDir;
-using lyx::support::FileSearch;
-using lyx::support::GetEnv;
+using lyx::support::fileSearch;
+using lyx::support::getEnv;
 using lyx::support::i18nLibFileSearch;
-using lyx::support::LibFileSearch;
+using lyx::support::libFileSearch;
 using lyx::support::package;
 using lyx::support::Path;
 using lyx::support::prependEnvPath;
-using lyx::support::QuoteName;
+using lyx::support::quoteName;
 using lyx::support::rtrim;
 
 namespace os = lyx::support::os;
@@ -86,8 +88,6 @@ using std::system;
 #endif
 
 
-extern void QuitLyX();
-
 extern LyXServer * lyxserver;
 
 // This is the global bufferlist object
@@ -116,9 +116,9 @@ void showFileError(string const & error)
 void reconfigureUserLyXDir()
 {
        string const configure_script =
-               AddName(package().system_support(), "configure");
+               addName(package().system_support(), "configure.py");
        string const configure_command =
-               "sh " + QuoteName(configure_script);
+               "python " + quoteName(configure_script);
 
        lyxerr << _("LyX: reconfiguring user directory") << endl;
        Path p(package().user_support());
@@ -162,17 +162,17 @@ LyX::LyX()
 {}
 
 
-LastFiles & LyX::lastfiles()
+lyx::Session & LyX::session()
 {
-       BOOST_ASSERT(lastfiles_.get());
-       return *lastfiles_.get();
+       BOOST_ASSERT(session_.get());
+       return *session_.get();
 }
 
 
-LastFiles const & LyX::lastfiles() const
+lyx::Session const & LyX::session() const
 {
-       BOOST_ASSERT(lastfiles_.get());
-       return *lastfiles_.get();
+       BOOST_ASSERT(session_.get());
+       return *session_.get();
 }
 
 
@@ -205,7 +205,8 @@ void LyX::priv_exec(int & argc, char * argv[])
        // we need to parse for "-dbg" and "-help"
        bool const want_gui = easyParse(argc, argv);
 
-       lyx::support::init_package(argv[0], cl_system_support, cl_user_support);
+       lyx::support::init_package(argv[0], cl_system_support, cl_user_support,
+                                  lyx::support::top_build_dir_is_one_level_up);
 
        if (want_gui)
                lyx_gui::parse_init(argc, argv);
@@ -228,16 +229,22 @@ 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)
-               files.push_back(argv[argi]);
+               files.push_back(os::internal_path(argv[argi]));
 
        if (first_start)
                files.push_back(i18nLibFileSearch("examples", "splash.lyx"));
 
+       // if a file is specified, I assume that user wants to edit *that* file
+       if (files.empty() && lyxrc.load_session) {
+               vector<string> const & lastopened = session_->lastOpenedFiles();
+               files.insert(files.end(), lastopened.begin(), lastopened.end()  );
+               // clear this list to save a few bytes of RAM
+               session_->clearLastOpenedFiles();
+       }
+
        // Execute batch commands if available
        if (!batch_command.empty()) {
 
@@ -252,7 +259,7 @@ void LyX::priv_exec(int & argc, char * argv[])
                for (; it != end; ++it) {
                        // get absolute path of file and add ".lyx" to
                        // the filename if necessary
-                       string s = FileSearch(string(), *it, "lyx");
+                       string s = fileSearch(string(), *it, "lyx");
                        if (s.empty()) {
                                last_loaded = newFile(*it, string(), true);
                        } else {
@@ -269,14 +276,20 @@ void LyX::priv_exec(int & argc, char * argv[])
                if (last_loaded) {
                        bool success = false;
                        if (last_loaded->dispatch(batch_command, &success)) {
-                               QuitLyX();
+                               quitLyX(false);
                                exit(!success);
                        }
                }
                files.clear(); // the files are already loaded
        }
 
-       lyx_gui::start(batch_command, files);
+       if (want_gui)
+               lyx_gui::start(batch_command, files);
+       else {
+               // Something went wrong above
+               quitLyX(false);
+               exit(EXIT_FAILURE);
+       }
 }
 
 
@@ -346,10 +359,10 @@ static void error_handler(int err_sig)
                break;
        case SIGSEGV:
                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;
+                         "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:
@@ -368,9 +381,9 @@ static void error_handler(int err_sig)
 
 #ifdef SIGHUP
        if (err_sig == SIGSEGV ||
-           (err_sig != SIGHUP && !GetEnv("LYXDEBUG").empty()))
+           (err_sig != SIGHUP && !getEnv("LYXDEBUG").empty()))
 #else
-       if (err_sig == SIGSEGV || !GetEnv("LYXDEBUG").empty())
+       if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty())
 #endif
                lyx::support::abort();
        exit(0);
@@ -398,13 +411,6 @@ void LyX::init(bool gui)
        signal(SIGTERM, error_handler);
        // SIGPIPE can be safely ignored.
 
-#if !defined (USE_POSIX_PACKAGING)
-       // Add the directory containing the LyX executable to the path
-       // so that LyX can find things like reLyX.
-       if (package().build_support().empty())
-               prependEnvPath("PATH", package().binary_dir());
-#endif
-
        // Check that user LyX directory is ok. We don't do that if
        // running in batch mode.
        bool reconfigure = false;
@@ -422,14 +428,10 @@ void LyX::init(bool gui)
        lyxrc.document_path = package().document_dir();
 
        if (lyxrc.template_path.empty()) {
-               lyxrc.template_path = AddPath(package().system_support(),
+               lyxrc.template_path = addPath(package().system_support(),
                                              "templates");
        }
 
-       if (lyxrc.lastfiles.empty()) {
-               lyxrc.lastfiles = AddName(package().user_support(), "lastfiles");
-       }
-
        if (lyxrc.roman_font_name.empty())
                lyxrc.roman_font_name = lyx_gui::roman_font_name();
        if (lyxrc.sans_font_name.empty())
@@ -450,9 +452,9 @@ void LyX::init(bool gui)
 
        string prefsfile = "preferences";
        // back compatibility to lyxs < 1.1.6
-       if (LibFileSearch(string(), prefsfile).empty())
+       if (libFileSearch(string(), prefsfile).empty())
                prefsfile = "lyxrc";
-       if (!LibFileSearch(string(), prefsfile).empty())
+       if (!libFileSearch(string(), prefsfile).empty())
                readRcFile(prefsfile);
 
        readEncodingsFile("encodings");
@@ -476,23 +478,32 @@ void LyX::init(bool gui)
                lyxrc.print();
 
        os::cygwin_path_fix(lyxrc.cygwin_path_fix);
-       prependEnvPath("PATH", lyxrc.path_prefix);
+       if (!lyxrc.path_prefix.empty())
+               prependEnvPath("PATH", lyxrc.path_prefix);
+
+#if !defined (USE_POSIX_PACKAGING)
+       // Add the directory containing the LyX executable to the path
+       // so that LyX can find things like tex2lyx.
+       if (package().build_support().empty())
+               prependEnvPath("PATH", package().binary_dir());
+#endif
 
        // Having reset the PATH we're now in a position to run configure
        // if necessary.
        if (reconfigure)
                reconfigureUserLyXDir();
 
-       if (fs::is_directory(lyxrc.document_path))
+       if (fs::exists(lyxrc.document_path) &&
+           fs::is_directory(lyxrc.document_path))
                package().document_dir() = lyxrc.document_path;
 
        package().temp_dir() = createLyXTmpDir(lyxrc.tempdir_path);
        if (package().temp_dir().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));
+                            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
@@ -505,11 +516,8 @@ void LyX::init(bool gui)
                lyxerr << "LyX tmp dir: `" << package().temp_dir() << '\'' << endl;
        }
 
-       lyxerr[Debug::INIT] << "Reading lastfiles `"
-                           << lyxrc.lastfiles << "'..." << endl;
-       lastfiles_.reset(new LastFiles(lyxrc.lastfiles,
-                                      lyxrc.check_lastfiles,
-                                      lyxrc.num_lastfiles));
+       lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl;
+       session_.reset(new lyx::Session(lyxrc.num_lastfiles));
 }
 
 
@@ -521,7 +529,9 @@ void LyX::defaultKeyBindings(kb_keymap  * kbmap)
        kbmap->bind("Down", FuncRequest(LFUN_DOWN));
 
        kbmap->bind("Tab", FuncRequest(LFUN_CELL_FORWARD));
-       kbmap->bind("ISO_Left_Tab", FuncRequest(LFUN_CELL_FORWARD));
+       kbmap->bind("C-Tab", FuncRequest(LFUN_CELL_SPLIT));
+       kbmap->bind("~S-ISO_Left_Tab", FuncRequest(LFUN_CELL_BACKWARD));
+       kbmap->bind("~S-BackTab", FuncRequest(LFUN_CELL_BACKWARD));
 
        kbmap->bind("Home", FuncRequest(LFUN_HOME));
        kbmap->bind("End", FuncRequest(LFUN_END));
@@ -560,10 +570,6 @@ void LyX::defaultKeyBindings(kb_keymap  * kbmap)
        kbmap->bind("KP_End", FuncRequest(LFUN_END));
        kbmap->bind("KP_Prior", FuncRequest(LFUN_PRIOR));
        kbmap->bind("KP_Next", FuncRequest(LFUN_NEXT));
-
-       kbmap->bind("C-Tab", FuncRequest(LFUN_CELL_SPLIT));
-       kbmap->bind("S-Tab", FuncRequest(LFUN_CELL_BACKWARD));
-       kbmap->bind("S-ISO_Left_Tab", FuncRequest(LFUN_CELL_BACKWARD));
 }
 
 
@@ -611,16 +617,17 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
        bool reconfigure = false;
 
        // Does user directory exist?
-       if (fs::is_directory(package().user_support())) {
+       if (fs::exists(package().user_support()) &&
+           fs::is_directory(package().user_support())) {
                first_start = false;
                string const configure_script =
-                       AddName(package().system_support(), "configure");
+                       addName(package().system_support(), "configure.py");
                string const userDefaults =
-                       AddName(package().user_support(), "lyxrc.defaults");
+                       addName(package().user_support(), "lyxrc.defaults");
                if (fs::exists(configure_script) &&
                    fs::exists(userDefaults) &&
                    fs::last_write_time(configure_script)
-                   < fs::last_write_time(userDefaults)) {
+                   > fs::last_write_time(userDefaults)) {
                        reconfigure = true;
                }
                return reconfigure;
@@ -631,15 +638,15 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
        // If the user specified explicitly a directory, ask whether
        // to create it. If the user says "no", then exit.
        if (explicit_userdir &&
-           !Alert::prompt(
-                   _("Missing LyX support directory"),
+           Alert::prompt(
+                   _("Missing user LyX directory"),
                    bformat(_("You have specified a non-existent user "
                              "LyX directory, %1$s.\n"
                              "It is needed to keep your own configuration."),
                            package().user_support()),
                    1, 0,
-                   _("&Create directory."),
-                   _("&Exit LyX."))) {
+                   _("&Create directory"),
+                   _("&Exit LyX"))) {
                lyxerr << _("No user LyX directory. Exiting.") << endl;
                exit(1);
        }
@@ -664,7 +671,7 @@ void LyX::readRcFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
-       string const lyxrc_path = LibFileSearch(string(), name);
+       string const lyxrc_path = libFileSearch(string(), name);
        if (!lyxrc_path.empty()) {
 
                lyxerr[Debug::INIT] << "Found " << name
@@ -711,7 +718,7 @@ void LyX::readUIFile(string const & name)
 
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
-       string const ui_path = LibFileSearch("ui", name, "ui");
+       string const ui_path = libFileSearch("ui", name, "ui");
 
        if (ui_path.empty()) {
                lyxerr[Debug::INIT] << "Could not find " << name << endl;
@@ -767,7 +774,7 @@ void LyX::readLanguagesFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
-       string const lang_path = LibFileSearch(string(), name);
+       string const lang_path = libFileSearch(string(), name);
        if (lang_path.empty()) {
                showFileError(name);
                return;
@@ -781,7 +788,7 @@ void LyX::readEncodingsFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
-       string const enc_path = LibFileSearch(string(), name);
+       string const enc_path = libFileSearch(string(), name);
        if (enc_path.empty()) {
                showFileError(name);
                return;
@@ -819,8 +826,8 @@ int parse_help(string const &, string const &)
                _("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
                  "Command line switches (case sensitive):\n"
                  "\t-help              summarize LyX usage\n"
-                 "\t-userdir dir       try to set user directory to dir\n"
-                 "\t-sysdir dir        try to set system directory to dir\n"
+                 "\t-userdir dir       set user directory to dir\n"
+                 "\t-sysdir dir        set system directory to dir\n"
                  "\t-geometry WxH+X+Y  set geometry of the main window\n"
                  "\t-dbg feature[,feature]...\n"
                  "                  select the features to debug.\n"
@@ -876,9 +883,6 @@ int parse_execute(string const & arg, string const &)
                exit(1);
        }
        batch = arg;
-       // Argh. Setting gui to false segfaults..
-       // FIXME: when ? how ?
-       // is_gui = false;
        return 1;
 }