]> git.lyx.org Git - lyx.git/blobdiff - src/LyX.cpp
add busy.gif to resources (in line with cmake)
[lyx.git] / src / LyX.cpp
index 4992de8e73a6bede93ddee20d00f1441041e263c..e65ef903209b06b3d589cd49528327e182a72ea7 100644 (file)
@@ -90,6 +90,13 @@ namespace os = support::os;
 bool use_gui = true;
 
 
+// We default to open documents in an already running instance, provided that
+// the lyxpipe has been setup. This can be overridden either on the command
+// line or through preference settings.
+
+RunMode run_mode = PREFERRED;
+
+
 // Tell what files can be silently overwritten during batch export.
 // Possible values are: NO_FILES, MAIN_FILE, ALL_FILES, UNSPECIFIED.
 // Unless specified on command line (through the -f switch) or through the
@@ -366,12 +373,19 @@ int LyX::exec(int & argc, char * argv[])
                return exit_status;
        }
 
+       // If not otherwise specified by a command line option or
+       // by preferences, we default to reuse a running instance.
+       if (run_mode == PREFERRED)
+               run_mode = USE_REMOTE;
+
        // FIXME
        /* Create a CoreApplication class that will provide the main event loop
        * and the socket callback registering. With Qt4, only QtCore
        * library would be needed.
        * When this is done, a server_mode could be created and the following two
        * line would be moved out from here.
+       * However, note that the first of the two lines below triggers the
+       * "single instance" behavior, which should occur right at this point.
        */
        // Note: socket callback must be registered after init(argc, argv)
        // such that package().temp_dir() is properly initialized.
@@ -380,7 +394,15 @@ int LyX::exec(int & argc, char * argv[])
                        FileName(package().temp_dir().absFileName() + "/lyxsocket")));
 
        // Start the real execution loop.
-       exit_status = pimpl_->application_->exec();
+       if (!theServer().deferredLoadingToOtherInstance())
+               exit_status = pimpl_->application_->exec();
+       else if (!pimpl_->files_to_load_.empty()) {
+               vector<string>::const_iterator it = pimpl_->files_to_load_.begin();
+               vector<string>::const_iterator end = pimpl_->files_to_load_.end();
+               lyxerr << _("The following files could not be loaded:") << endl;
+               for (; it != end; ++it)
+                       lyxerr << *it << endl;
+       }
 
        prepareExit();
 
@@ -496,7 +518,7 @@ bool LyX::loadFiles()
                        continue;
 
                Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFileName(), false);
-               if (buf->loadLyXFile(fname)) {
+               if (buf->loadLyXFile() == Buffer::ReadSuccess) {
                        ErrorList const & el = buf->errorList("Parse");
                        if (!el.empty())
                                for_each(el.begin(), el.end(),
@@ -530,10 +552,10 @@ void LyX::execCommands()
                        _("No textclass is found"),
                        _("LyX will only have minimal functionality because no textclasses "
                                "have been found. You can either try to reconfigure LyX normally, "
-                               "try to reconfigure using only the defaults, or continue."),
+                               "try to reconfigure without checking your LaTeX installation, or continue."),
                        0, 2,
                        _("&Reconfigure"),
-                       _("&Use Defaults"),
+                       _("&Without LaTeX"),
                        _("&Continue")))
                {
                case 0:
@@ -723,6 +745,12 @@ bool LyX::init()
                                              "templates");
        }
 
+       // init LyXDir environment variable
+       string const lyx_dir = package().lyx_dir().absFileName();
+       LYXERR(Debug::INIT, "Setting LyXDir... to \"" << lyx_dir << "\"");
+       if (!setEnv("LyXDir", lyx_dir))
+               LYXERR(Debug::INIT, "\t... failed!");
+
        //
        // Read configuration files
        //
@@ -742,7 +770,7 @@ bool LyX::init()
                prependEnvPath("PATH", package().binary_dir().absFileName());
 #endif
        if (!lyxrc.path_prefix.empty())
-               prependEnvPath("PATH", lyxrc.path_prefix);
+               prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix));
 
        // Check that user LyX directory is ok.
        if (queryUserLyXDir(package().explicit_user_support()))
@@ -784,7 +812,7 @@ bool LyX::init()
        system_lcolor = lcolor;
 
        // This one is edited through the preferences dialog.
-       if (!readRcFile("preferences"))
+       if (!readRcFile("preferences", true))
                return false;
 
        if (!readEncodingsFile("encodings", "unicodesymbols"))
@@ -820,7 +848,7 @@ bool LyX::init()
 
        os::windows_style_tex_paths(lyxrc.windows_style_tex_paths);
        if (!lyxrc.path_prefix.empty())
-               prependEnvPath("PATH", lyxrc.path_prefix);
+               prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix));
 
        FileName const document_path(lyxrc.document_path);
        if (document_path.exists() && document_path.isDirectory())
@@ -938,21 +966,22 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
 }
 
 
-bool LyX::readRcFile(string const & name)
+bool LyX::readRcFile(string const & name, bool check_format)
 {
        LYXERR(Debug::INIT, "About to read " << name << "... ");
 
        FileName const lyxrc_path = libFileSearch(string(), name);
-       if (!lyxrc_path.empty()) {
-               LYXERR(Debug::INIT, "Found in " << lyxrc_path);
-               if (lyxrc.read(lyxrc_path) < 0) {
-                       showFileError(name);
-                       return false;
-               }
-       } else {
+       if (lyxrc_path.empty()) {
                LYXERR(Debug::INIT, "Not found." << lyxrc_path);
+               // FIXME
+               // This was the previous logic, but can it be right??
+               return true;
        }
-       return true;
+       LYXERR(Debug::INIT, "Found in " << lyxrc_path);
+       bool const success = lyxrc.read(lyxrc_path, check_format);
+       if (!success)
+               showFileError(name);
+       return success;
 }
 
 // Read the languages file `name'
@@ -1040,8 +1069,13 @@ int parse_help(string const &, string const &, string &)
                  "                  specifying whether all files, main file only, or no files,\n"
                  "                  respectively, are to be overwritten during a batch export.\n"
                  "                  Anything else is equivalent to `all', but is not consumed.\n"
-                 "\t-batch          execute commands without launching GUI and exit.\n"
-                 "\t-version        summarize version and build info\n"
+                 "\t-n [--no-remote]\n"
+                 "                  open documents in a new instance\n"
+                 "\t-r [--remote]\n"
+                 "                  open documents in an already running instance\n"
+                 "                  (a working lyxpipe is needed)\n"
+                 "\t-batch    execute commands without launching GUI and exit.\n"
+                 "\t-version  summarize version and build info\n"
                               "Check the LyX man page for more details.")) << endl;
        exit(0);
        return 0;
@@ -1142,6 +1176,20 @@ int parse_batch(string const &, string const &, string &)
 }
 
 
+int parse_noremote(string const &, string const &, string &)
+{
+       run_mode = NEW_INSTANCE;
+       return 0;
+}
+
+
+int parse_remote(string const &, string const &, string &)
+{
+       run_mode = USE_REMOTE;
+       return 0;
+}
+
+
 int parse_force(string const & arg, string const &, string &)
 {
        if (arg == "all") {
@@ -1183,6 +1231,10 @@ void LyX::easyParse(int & argc, char * argv[])
        cmdmap["-batch"] = parse_batch;
        cmdmap["-f"] = parse_force;
        cmdmap["--force-overwrite"] = parse_force;
+       cmdmap["-n"] = parse_noremote;
+       cmdmap["--no-remote"] = parse_noremote;
+       cmdmap["-r"] = parse_remote;
+       cmdmap["--remote"] = parse_remote;
 
        for (int i = 1; i < argc; ++i) {
                map<string, cmd_helper>::const_iterator it
@@ -1236,6 +1288,13 @@ void dispatch(FuncRequest const & action, DispatchResult & dr)
 }
 
 
+vector<string> & theFilesToLoad()
+{
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->files_to_load_;
+}
+
+
 BufferList & theBufferList()
 {
        LASSERT(singleton_, /**/);