]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
cleanup after svn hang-up, #undef CursorShape. Should be compilable ganin now.
[lyx.git] / src / lyx_main.C
index 8df387930fff02caa33b41c5373484197b187df1..1627140e71ebdfbb4462f02ebb3530466f469939 100644 (file)
@@ -40,8 +40,6 @@
 #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,12 +69,12 @@ using lyx::support::getEnv;
 using lyx::support::i18nLibFileSearch;
 using lyx::support::libFileSearch;
 using lyx::support::package;
-using lyx::support::Path;
 using lyx::support::prependEnvPath;
-using lyx::support::quoteName;
 using lyx::support::rtrim;
 using lyx::support::Systemcall;
 
+using lyx::docstring;
+
 namespace os = lyx::support::os;
 namespace fs = boost::filesystem;
 
@@ -113,6 +111,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);
 }
@@ -121,9 +120,8 @@ void lyx_exit(int status)
 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);
+                      bformat(_("Error while reading the configuration file\n%1$s.\n"
+                          "Please check your installation."), lyx::from_utf8(error)));
 }
 
 
@@ -131,11 +129,11 @@ void reconfigureUserLyXDir()
 {
        string const configure_command = package().configure_command();
 
-       lyxerr << _("LyX: reconfiguring user directory") << endl;
-       Path p(package().user_support());
+       lyxerr << lyx::to_utf8(_("LyX: reconfiguring user directory")) << endl;
+       lyx::support::Path p(package().user_support());
        Systemcall one;
        one.startscript(Systemcall::Wait, configure_command);
-       lyxerr << "LyX: " << _("Done!") << endl;
+       lyxerr << "LyX: " << lyx::to_utf8(_("Done!")) << endl;
 }
 
 } // namespace anon
@@ -143,7 +141,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 +149,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);
 }
 
 
@@ -170,7 +168,7 @@ LyX const & LyX::cref()
 
 
 LyX::LyX()
-       : first_start(false)
+       : first_start(false), geometryOption_(false)
 {}
 
 
@@ -188,7 +186,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 +209,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,28 +220,31 @@ 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
        for (int argi = 1; argi < argc ; ++argi) {
                if (argv[argi][0] == '-') {
-                       lyxerr << bformat(_("Wrong command line option `%1$s'. Exiting."),
-                               argv[argi]) << endl;
-                       exit(1);
+                       lyxerr << lyx::to_utf8(
+                               bformat(_("Wrong command line option `%1$s'. Exiting."),
+                               lyx::from_utf8(argv[argi]))) << endl;
+                       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 +257,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 +273,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 +295,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
@@ -307,6 +306,7 @@ void LyX::exec2(int & argc, char * argv[])
                // initial geometry
                unsigned int width = 690;
                unsigned int height = 510;
+               bool maximize = false;
                // first try lyxrc
                if (lyxrc.geometry_width != 0 && lyxrc.geometry_height != 0 ) {
                        width = lyxrc.geometry_width;
@@ -320,6 +320,8 @@ void LyX::exec2(int & argc, char * argv[])
                        val = session().loadSessionInfo("WindowHeight");
                        if (!val.empty())
                                height = convert<unsigned int>(val);
+                       if (session().loadSessionInfo("WindowIsMaximized") == "yes")
+                               maximize = true;
                }
                // if user wants to restore window position
                int posx = -1;
@@ -332,11 +334,35 @@ void LyX::exec2(int & argc, char * argv[])
                        if (!val.empty())
                                posy = convert<int>(val);
                }
-               lyx_gui::start(batch_command, files, width, height, posx, posy);
+
+               if (geometryOption_) {
+                       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();
+
+               return lyx_gui::start(view, batch_command);
        } else {
                // Something went wrong above
                quitLyX(false);
-               lyx_exit(EXIT_FAILURE);
+               return EXIT_FAILURE;
        }
 }
 
@@ -442,13 +468,13 @@ static void error_handler(int err_sig)
 
 void LyX::printError(ErrorItem const & ei)
 {
-       std::cerr << _("LyX: ") << ei.error
-                 << ':' << ei.description << std::endl;
-
+       docstring tmp = _("LyX: ") + ei.error + lyx::char_type(':')
+               + ei.description;
+       std::cerr << lyx::to_utf8(tmp) << std::endl;
 }
 
 
-void LyX::init()
+bool LyX::init()
 {
 #ifdef SIGHUP
        signal(SIGHUP, error_handler);
@@ -479,7 +505,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)
@@ -491,17 +518,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();
@@ -513,14 +541,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
@@ -529,13 +561,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);
 
@@ -547,15 +580,15 @@ void LyX::init()
        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));
+                                                   "%1$s. Make sure that this\n"
+                                                   "path exists and is writable and try again."),
+                                    lyx::from_utf8(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.
-               lyx_exit(EXIT_FAILURE);
+               return false;
        }
 
        if (lyxerr.debugging(Debug::INIT)) {
@@ -564,6 +597,7 @@ void LyX::init()
 
        lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl;
        session_.reset(new lyx::Session(lyxrc.num_lastfiles));
+       return true;
 }
 
 
@@ -669,7 +703,7 @@ bool needsUpdate(string const & file)
                addName(package().user_support(), file);
 
        return (! fs::exists(absfile))
-               || (fs::last_write_time(configure_script) 
+               || (fs::last_write_time(configure_script)
                    > fs::last_write_time(absfile));
 }
 
@@ -682,9 +716,9 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
        if (fs::exists(package().user_support()) &&
            fs::is_directory(package().user_support())) {
                first_start = false;
-               
-               return needsUpdate("lyxrc.defaults") 
-                       || needsUpdate("textclass.lst") 
+
+               return needsUpdate("lyxrc.defaults")
+                       || needsUpdate("textclass.lst")
                        || needsUpdate("packages.lst");
        }
 
@@ -696,23 +730,23 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
            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()),
+                                          "LyX directory, %1$s.\n"
+                                          "It is needed to keep your own configuration."),
+                           lyx::from_utf8(package().user_support())),
                    1, 0,
                    _("&Create directory"),
                    _("&Exit LyX"))) {
-               lyxerr << _("No user LyX directory. Exiting.") << endl;
+               lyxerr << lyx::to_utf8(_("No user LyX directory. Exiting.")) << endl;
                lyx_exit(EXIT_FAILURE);
        }
 
-       lyxerr << bformat(_("LyX: Creating directory %1$s"),
-                         package().user_support())
+       lyxerr << lyx::to_utf8(bformat(_("LyX: Creating directory %1$s"),
+                         lyx::from_utf8(package().user_support())))
               << endl;
 
        if (!createDirectory(package().user_support(), 0755)) {
                // Failed, so let's exit.
-               lyxerr << _("Failed to create directory. Exiting.")
+               lyxerr << lyx::to_utf8(_("Failed to create directory. Exiting."))
                       << endl;
                lyx_exit(EXIT_FAILURE);
        }
@@ -721,7 +755,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 << "... ";
 
@@ -730,16 +764,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,
@@ -766,7 +803,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;
@@ -776,7 +813,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);
 
@@ -797,7 +834,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:
@@ -819,34 +857,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;
 }
 
 
@@ -861,11 +902,11 @@ typedef boost::function<int(string const &, string const &)> cmd_helper;
 int parse_dbg(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << _("List of supported debug flags:") << endl;
+               lyxerr << lyx::to_utf8(_("List of supported debug flags:")) << endl;
                Debug::showTags(lyxerr);
                exit(0);
        }
-       lyxerr << bformat(_("Setting debug level to %1$s"), arg) << endl;
+       lyxerr << lyx::to_utf8(bformat(_("Setting debug level to %1$s"), lyx::from_utf8(arg))) << endl;
 
        lyxerr.level(Debug::value(arg));
        Debug::showLevel(lyxerr, lyxerr.level());
@@ -876,7 +917,7 @@ int parse_dbg(string const & arg, string const &)
 int parse_help(string const &, string const &)
 {
        lyxerr <<
-               _("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
+               lyx::to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
                  "Command line switches (case sensitive):\n"
                  "\t-help              summarize LyX usage\n"
                  "\t-userdir dir       set user directory to dir\n"
@@ -893,7 +934,7 @@ int parse_help(string const &, string const &)
                  "                  where fmt is the import format of choice\n"
                  "                  and file.xxx is the file to be imported.\n"
                  "\t-version        summarize version and build info\n"
-                 "Check the LyX man page for more details.") << endl;
+                              "Check the LyX man page for more details.")) << endl;
        exit(0);
        return 0;
 }
@@ -901,7 +942,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;
@@ -912,7 +953,7 @@ int parse_version(string const &, string const &)
 int parse_sysdir(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << _("Missing directory for -sysdir switch") << endl;
+               lyxerr << lyx::to_utf8(_("Missing directory for -sysdir switch")) << endl;
                exit(1);
        }
        cl_system_support = arg;
@@ -922,7 +963,7 @@ int parse_sysdir(string const & arg, string const &)
 int parse_userdir(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << _("Missing directory for -userdir switch") << endl;
+               lyxerr << lyx::to_utf8(_("Missing directory for -userdir switch")) << endl;
                exit(1);
        }
        cl_user_support = arg;
@@ -932,7 +973,7 @@ int parse_userdir(string const & arg, string const &)
 int parse_execute(string const & arg, string const &)
 {
        if (arg.empty()) {
-               lyxerr << _("Missing command string after --execute switch") << endl;
+               lyxerr << lyx::to_utf8(_("Missing command string after --execute switch")) << endl;
                exit(1);
        }
        batch = arg;
@@ -942,8 +983,8 @@ int parse_execute(string const & arg, string const &)
 int parse_export(string const & type, string const &)
 {
        if (type.empty()) {
-               lyxerr << _("Missing file type [eg latex, ps...] after "
-                       "--export switch") << endl;
+               lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after "
+                                        "--export switch")) << endl;
                exit(1);
        }
        batch = "buffer-export " + type;
@@ -954,12 +995,12 @@ int parse_export(string const & type, string const &)
 int parse_import(string const & type, string const & file)
 {
        if (type.empty()) {
-               lyxerr << _("Missing file type [eg latex, ps...] after "
-                       "--import switch") << endl;
+               lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after "
+                                        "--import switch")) << endl;
                exit(1);
        }
        if (file.empty()) {
-               lyxerr << _("Missing filename for --import") << endl;
+               lyxerr << lyx::to_utf8(_("Missing filename for --import")) << endl;
                exit(1);
        }
 
@@ -992,6 +1033,10 @@ bool LyX::easyParse(int & argc, char * argv[])
                std::map<string, cmd_helper>::const_iterator it
                        = cmdmap.find(argv[i]);
 
+               // check for X11 -geometry option
+               if (lyx::support::compare(argv[i], "-geometry") == 0)
+                       geometryOption_ = true;
+
                // don't complain if not found - may be parsed later
                if (it == cmdmap.end())
                        continue;