]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
revert recent change to development/FORMAT (don't change history)
[lyx.git] / src / lyx_main.C
index 226bbb998f86dbd77a5b0a3860e6cb4b17b0cb5a..72709815b8f0655347fe0274522df3f845be0273 100644 (file)
@@ -113,6 +113,7 @@ void lyx_exit(int status)
        // guarantees a return to the system, no application cleanup.
        // This may cause troubles with not executed destructors.
        if (lyx_gui::use_gui)
+               // lyx_gui::exit may return and only schedule the exit
                lyx_gui::exit(status);
        exit(status);
 }
@@ -123,7 +124,6 @@ void showFileError(string const & error)
        Alert::warning(_("Could not read configuration file"),
                   bformat(_("Error while reading the configuration file\n%1$s.\n"
                     "Please check your installation."), error));
-       lyx_exit(EXIT_FAILURE);
 }
 
 
@@ -143,7 +143,7 @@ void reconfigureUserLyXDir()
 
 boost::scoped_ptr<LyX> LyX::singleton_;
 
-void LyX::exec(int & argc, char * argv[])
+int LyX::exec(int & argc, char * argv[])
 {
        BOOST_ASSERT(!singleton_.get());
        // We must return from this before launching the gui so that
@@ -151,7 +151,7 @@ void LyX::exec(int & argc, char * argv[])
        // LyX::ref and LyX::cref.
        singleton_.reset(new LyX);
        // Start the real execution loop.
-       singleton_->priv_exec(argc, argv);
+       return singleton_->priv_exec(argc, argv);
 }
 
 
@@ -188,7 +188,7 @@ lyx::Session const & LyX::session() const
 }
 
 
-void LyX::addLyXView(boost::shared_ptr<LyXView> const & lyxview)
+void LyX::addLyXView(LyXView * lyxview)
 {
        views_.push_back(lyxview);
 }
@@ -211,7 +211,7 @@ Buffer const * const LyX::updateInset(InsetBase const * inset) const
 }
 
 
-void LyX::priv_exec(int & argc, char * argv[])
+int LyX::priv_exec(int & argc, char * argv[])
 {
        // Here we need to parse the command line. At least
        // we need to parse for "-dbg" and "-help"
@@ -222,13 +222,13 @@ void LyX::priv_exec(int & argc, char * argv[])
 
        // Start the real execution loop.
        if (lyx_gui::use_gui)
-               lyx_gui::exec(argc, argv);
+               return lyx_gui::exec(argc, argv);
        else
-               exec2(argc, argv);
+               return exec2(argc, argv);
 }
 
 
-void LyX::exec2(int & argc, char * argv[])
+int LyX::exec2(int & argc, char * argv[])
 {
        // check for any spurious extra arguments
        // other than documents
@@ -236,14 +236,16 @@ void LyX::exec2(int & argc, char * argv[])
                if (argv[argi][0] == '-') {
                        lyxerr << bformat(_("Wrong command line option `%1$s'. Exiting."),
                                argv[argi]) << endl;
-                       exit(1);
+                       return EXIT_FAILURE;
                }
        }
 
        // Initialization of LyX (reads lyxrc and more)
        lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl;
-       init();
+       bool const success = init();
        lyxerr[Debug::INIT] << "Initializing LyX::init...done" << endl;
+       if (!success)
+               return EXIT_FAILURE;
 
        if (lyx_gui::use_gui)
                lyx_gui::parse_lyxrc();
@@ -256,14 +258,6 @@ void LyX::exec2(int & argc, char * argv[])
        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()) {
 
@@ -280,12 +274,18 @@ void LyX::exec2(int & argc, char * argv[])
                        // the filename if necessary
                        string s = fileSearch(string(), *it, "lyx");
                        if (s.empty()) {
-                               last_loaded = newFile(*it, string(), true);
+                               Buffer * const b = newFile(*it, string(), true);
+                               if (b)
+                                       last_loaded = b;
                        } else {
                                Buffer * buf = bufferlist.newBuffer(s, false);
-                               buf->error.connect(boost::bind(&LyX::printError, this, _1));
-                               if (loadLyXFile(buf, s))
+                               if (loadLyXFile(buf, s)) {
                                        last_loaded = buf;
+                                       ErrorList const & el = buf->errorList("Parse");
+                                       if (!el.empty())
+                                               for_each(el.begin(), el.end(),
+                                                       boost::bind(&LyX::printError, this, _1));
+                               }
                                else
                                        bufferlist.release(buf);
                        }
@@ -296,7 +296,7 @@ void LyX::exec2(int & argc, char * argv[])
                        bool success = false;
                        if (last_loaded->dispatch(batch_command, &success)) {
                                quitLyX(false);
-                               lyx_exit(!success);
+                               return !success;
                        }
                }
                files.clear(); // the files are already loaded
@@ -337,16 +337,33 @@ void LyX::exec2(int & argc, char * argv[])
                }
 
                if (geometryOption_) {
-                       width = -1;
-                       height = -1;
+                       width = 0;
+                       height = 0;
                }
+               // create the main window
+               LyXView * view = lyx_gui::create_view(width, height, posx, posy, maximize);
+               
+               // load files
+               for_each(files.begin(), files.end(),
+                       bind(&LyXView::loadLyXFile, view, _1, true));
+
+               // 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();
+                       // do not add to the lastfile list since these files are restored from
+                       // last seesion, and should be already there (regular files), or should
+                       // not be added at all (help files).
+                       for_each(lastopened.begin(), lastopened.end(),
+                               bind(&LyXView::loadLyXFile, view, _1, false));
+               }
+               // clear this list to save a few bytes of RAM
+               session_->clearLastOpenedFiles();
 
-               lyx_gui::start(batch_command, files, width, height, posx, posy, maximize);
-
+               return lyx_gui::start(view, batch_command);
        } else {
                // Something went wrong above
                quitLyX(false);
-               lyx_exit(EXIT_FAILURE);
+               return EXIT_FAILURE;
        }
 }
 
@@ -458,7 +475,7 @@ void LyX::printError(ErrorItem const & ei)
 }
 
 
-void LyX::init()
+bool LyX::init()
 {
 #ifdef SIGHUP
        signal(SIGHUP, error_handler);
@@ -489,7 +506,8 @@ void LyX::init()
        //
 
        // This one may have been distributed along with LyX.
-       readRcFile("lyxrc.dist");
+       if (!readRcFile("lyxrc.dist"))
+               return false;
 
        // Set the PATH correctly.
 #if !defined (USE_POSIX_PACKAGING)
@@ -501,17 +519,18 @@ void LyX::init()
        if (!lyxrc.path_prefix.empty())
                prependEnvPath("PATH", lyxrc.path_prefix);
 
-       // Check that user LyX directory is ok. We don't do that if
-       // running in batch mode.
-       if (lyx_gui::use_gui) {
-               if (queryUserLyXDir(package().explicit_user_support()))
-                       reconfigureUserLyXDir();
-       } else {
+       // Check that user LyX directory is ok. 
+       if (queryUserLyXDir(package().explicit_user_support()))
+               reconfigureUserLyXDir();
+
+       // no need for a splash when there is no GUI
+       if (!lyx_gui::use_gui) {
                first_start = false;
        }
 
        // This one is generated in user_support directory by lib/configure.py.
-       readRcFile("lyxrc.defaults");
+       if (!readRcFile("lyxrc.defaults"))
+               return false;
 
        // Query the OS to know what formats are viewed natively
        formats.setAutoOpen();
@@ -523,14 +542,18 @@ void LyX::init()
        system_lcolor = lcolor;
 
        // This one is edited through the preferences dialog.
-       readRcFile("preferences");
+       if (!readRcFile("preferences"))
+               return false;
 
-       readEncodingsFile("encodings");
-       readLanguagesFile("languages");
+       if (!readEncodingsFile("encodings"))
+               return false;
+       if (!readLanguagesFile("languages"))
+               return false;
 
        // Load the layouts
        lyxerr[Debug::INIT] << "Reading layouts..." << endl;
-       LyXSetStyle();
+       if (!LyXSetStyle())
+               return false;
 
        if (lyx_gui::use_gui) {
                // Set up bindings
@@ -539,13 +562,14 @@ void LyX::init()
                toplevel_keymap->read(lyxrc.bind_file);
 
                // Read menus
-               readUIFile(lyxrc.ui_file);
+               if (!readUIFile(lyxrc.ui_file))
+                       return false;
        }
 
        if (lyxerr.debugging(Debug::LYXRC))
                lyxrc.print();
 
-       os::cygwin_path_fix(lyxrc.cygwin_path_fix);
+       os::windows_style_tex_paths(lyxrc.windows_style_tex_paths);
        if (!lyxrc.path_prefix.empty())
                prependEnvPath("PATH", lyxrc.path_prefix);
 
@@ -565,7 +589,7 @@ void LyX::init()
                // 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.
-               lyx_exit(EXIT_FAILURE);
+               return false;
        }
 
        if (lyxerr.debugging(Debug::INIT)) {
@@ -574,6 +598,7 @@ void LyX::init()
 
        lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl;
        session_.reset(new lyx::Session(lyxrc.num_lastfiles));
+       return true;
 }
 
 
@@ -731,7 +756,7 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
 }
 
 
-void LyX::readRcFile(string const & name)
+bool LyX::readRcFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "... ";
 
@@ -740,16 +765,19 @@ void LyX::readRcFile(string const & name)
 
                lyxerr[Debug::INIT] << "Found in " << lyxrc_path << endl;
 
-               if (lyxrc.read(lyxrc_path) < 0)
+               if (lyxrc.read(lyxrc_path) < 0) {
                        showFileError(name);
+                       return false;
+               }
        } else
                lyxerr[Debug::INIT] << "Not found." << lyxrc_path << endl;
+       return true;
 
 }
 
 
 // Read the ui file `name'
-void LyX::readUIFile(string const & name)
+bool LyX::readUIFile(string const & name)
 {
        enum Uitags {
                ui_menuset = 1,
@@ -776,7 +804,7 @@ void LyX::readUIFile(string const & name)
                                    << "' has been read already. "
                                    << "Is this an include loop?"
                                    << endl;
-               return;
+               return false;
        }
 
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
@@ -786,7 +814,7 @@ void LyX::readUIFile(string const & name)
        if (ui_path.empty()) {
                lyxerr[Debug::INIT] << "Could not find " << name << endl;
                showFileError(name);
-               return;
+               return false;
        }
        uifiles.push_back(name);
 
@@ -807,7 +835,8 @@ void LyX::readUIFile(string const & name)
                case ui_include: {
                        lex.next(true);
                        string const file = lex.getString();
-                       readUIFile(file);
+                       if (!readUIFile(file))
+                               return false;
                        break;
                }
                case ui_menuset:
@@ -829,34 +858,37 @@ void LyX::readUIFile(string const & name)
                        break;
                }
        }
+       return true;
 }
 
 
 // Read the languages file `name'
-void LyX::readLanguagesFile(string const & name)
+bool LyX::readLanguagesFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
        string const lang_path = libFileSearch(string(), name);
        if (lang_path.empty()) {
                showFileError(name);
-               return;
+               return false;
        }
        languages.read(lang_path);
+       return true;
 }
 
 
 // Read the encodings file `name'
-void LyX::readEncodingsFile(string const & name)
+bool LyX::readEncodingsFile(string const & name)
 {
        lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
 
        string const enc_path = libFileSearch(string(), name);
        if (enc_path.empty()) {
                showFileError(name);
-               return;
+               return false;
        }
        encodings.read(enc_path);
+       return true;
 }
 
 
@@ -911,7 +943,7 @@ int parse_help(string const &, string const &)
 int parse_version(string const &, string const &)
 {
        lyxerr << "LyX " << lyx_version
-              << " of " << lyx_release_date << endl;
+              << " (" << lyx_release_date << ")" << endl;
        lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl;
 
        lyxerr << lyx_version_info << endl;