X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=65bd38cb65ab16655c503d6ab51701075069a380;hb=dad1fc66e44a4dad94eb1e9ffd5736bf8f59ae6d;hp=0ac6fa81d799a9684dc051db9a6cf640e0ddd6b6;hpb=6280787bdb6da8181afb704a9dad8921cd41ef5c;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index 0ac6fa81d7..65bd38cb65 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -9,10 +9,6 @@ #include #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "lyx_main.h" #include "support/filetools.h" @@ -24,8 +20,10 @@ #include "gettext.h" #include "lyxlex.h" +#include "graphics/GraphicsTypes.h" + #include "bufferlist.h" -#include "lyxtextclasslist.h" +#include "buffer.h" #include "lyxserver.h" #include "kbmap.h" #include "lyxfunc.h" @@ -35,10 +33,14 @@ #include "lastfiles.h" #include "encoding.h" #include "converter.h" +#include "lyxtextclasslist.h" #include "frontends/Alert.h" #include "frontends/lyx_gui.h" +#include "BoostFormat.h" +#include + #include #include @@ -68,9 +70,6 @@ boost::scoped_ptr lastfiles; // This is the global bufferlist object BufferList bufferlist; -// this should be static, but I need it in buffer.C -bool finished = false; // flag, that we are quitting the program - // convenient to have it here. boost::scoped_ptr toplevel_keymap; @@ -85,6 +84,11 @@ LyX::LyX(int & argc, char * argv[]) toplevel_keymap.reset(new kb_keymap); defaultKeyBindings(toplevel_keymap.get()); + // set the DisplayTranslator only once; should that be done here?? + // if this should not be in this file, please also remove + // #include "graphics/GraphicsTypes.h" at the top -- Rob Lahaye. + grfx::setDisplayTranslator(); + if (want_gui) { lyx_gui::parse_init(argc, argv); } @@ -93,9 +97,15 @@ LyX::LyX(int & argc, char * argv[]) // other than documents for (int argi = 1; argi < argc ; ++argi) { if (argv[argi][0] == '-') { +#if USE_BOOST_FORMAT + lyxerr << boost::format(_("Wrong command line option `%1$s'. Exiting.")) + % argv[argi] + << endl; +#else lyxerr << _("Wrong command line option `") - << argv[argi] - << _("'. Exiting.") << endl; + << argv[argi] << _("'. Exiting.") + << endl; +#endif exit(1); } } @@ -119,11 +129,20 @@ LyX::LyX(int & argc, char * argv[]) files.push_back(i18nLibFileSearch("examples", "splash.lyx")); } -#if 0 // FIXME: GUII // Execute batch commands if available if (!batch_command.empty()) { lyxerr[Debug::INIT] << "About to handle -x '" - << batch_command << "'" << endl; + << batch_command << '\'' << endl; + + Buffer * last_loaded = 0; + + vector::iterator it = files.begin(); + vector::iterator end = files.end(); + for (; it != end; ++it) { + last_loaded = bufferlist.loadLyXFile(*it); + } + + files.clear(); // no buffer loaded, create one if (!last_loaded) @@ -134,13 +153,11 @@ LyX::LyX(int & argc, char * argv[]) // try to dispatch to last loaded buffer first bool const dispatched = last_loaded->dispatch(batch_command, &success); - // if this was successful, finish if (dispatched) { QuitLyX(); exit(!success); } } -#endif lyx_gui::start(batch_command, files); } @@ -148,8 +165,7 @@ LyX::LyX(int & argc, char * argv[]) extern "C" { -static -void error_handler(int err_sig) +static void error_handler(int err_sig) { switch (err_sig) { case SIGHUP: @@ -195,7 +211,6 @@ void error_handler(int err_sig) void LyX::init(bool gui) { - // Install the signal handlers signal(SIGHUP, error_handler); signal(SIGFPE, error_handler); signal(SIGSEGV, error_handler); @@ -242,7 +257,6 @@ void LyX::init(bool gui) if (!system_lyxdir.empty()) searchpath = MakeAbsPath(system_lyxdir) + ';'; - // LYX_DIR_13x environment variable string const lyxdir = GetEnvPath("LYX_DIR_13x"); if (!lyxdir.empty()) { @@ -255,7 +269,7 @@ void LyX::init(bool gui) if (file.isLink()) { lyxerr[Debug::INIT] << "binary is a link" << endl; string link; - if (LyXReadLink(fullbinname, link)) { + if (LyXReadLink(fullbinname, link, true)) { // Path of binary/../share/name of binary/ searchpath += NormalizePath(AddPath(binpath, "../share/") @@ -276,10 +290,10 @@ void LyX::init(bool gui) FileInfo file(fullbinpath, true); followlink = file.isLink(); if (followlink) { - lyxerr << " directory " << fullbinpath - << " is a link" << endl; + lyxerr[Debug::INIT] << " directory " << fullbinpath + << " is a link" << endl; string link; - if (LyXReadLink(fullbinpath, link)) { + if (LyXReadLink(fullbinpath, link, true)) { fullbinpath = link; binpath = MakeAbsPath(OnlyPath(fullbinpath)); } @@ -306,7 +320,6 @@ void LyX::init(bool gui) // Hardcoded dir searchpath += LYX_DIR; - // If debugging, show complete search path lyxerr[Debug::INIT] << "System directory search path: " << searchpath << endl; @@ -344,16 +357,23 @@ void LyX::init(bool gui) << "Giving up." << endl; exit(1); } - lyxerr << _("Using built-in default ") - << LYX_DIR << _(" but expect problems.") +#if USE_BOOST_FORMAT + lyxerr << boost::format(_("Using built-in default %1$s" + " but expect problems.")) + % static_cast(LYX_DIR) << endl; +#else + lyxerr << _("Using built-in default ") << LYX_DIR + << _(" but expect problems.") + << endl; +#endif } else { lyxerr << _("Expect problems.") << endl; } system_lyxdir = LYX_DIR; path_shown = true; } - // Report the system directory if debugging is on + if (!path_shown) lyxerr[Debug::INIT] << "System directory: '" << system_lyxdir << '\'' << endl; @@ -423,11 +443,9 @@ void LyX::init(bool gui) // If there is a preferences file we read that instead // of the old lyxrc file. if (!readRcFile("preferences")) - readRcFile("lyxrc"); + readRcFile("lyxrc"); - // Read encodings readEncodingsFile("encodings"); - // Read languages readLanguagesFile("languages"); // Load the layouts @@ -441,23 +459,16 @@ void LyX::init(bool gui) // Read menus readUIFile(lyxrc.ui_file); - // Bind the X dead keys to the corresponding LyX functions if - // necessary. - if (lyxrc.override_x_deadkeys) - deadKeyBindings(toplevel_keymap.get()); - if (lyxerr.debugging(Debug::LYXRC)) { lyxrc.print(); } - // Create temp directory os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path)); system_tempdir = os::getTmpDir(); if (lyxerr.debugging(Debug::INIT)) { lyxerr << "LyX tmp dir: `" << system_tempdir << '\'' << endl; } - // load the lastfiles mini-database lyxerr[Debug::INIT] << "Reading lastfiles `" << lyxrc.lastfiles << "'..." << endl; lastfiles.reset(new LastFiles(lyxrc.lastfiles, @@ -466,7 +477,6 @@ void LyX::init(bool gui) } -// These are the default bindings known to LyX void LyX::defaultKeyBindings(kb_keymap * kbmap) { kbmap->bind("Right", LFUN_RIGHT); @@ -538,7 +548,6 @@ void LyX::emergencyCleanup() } -// LyX can optionally take over the handling of deadkeys void LyX::deadKeyBindings(kb_keymap * kbmap) { // bindKeyings for transparent handling of deadkeys @@ -565,20 +574,30 @@ void LyX::deadKeyBindings(kb_keymap * kbmap) } -// This one is not allowed to use anything on the main form, since that -// one does not exist yet. (Asger) void LyX::queryUserLyXDir(bool explicit_userdir) { + string const configure_script = AddName(system_lyxdir, "configure"); + // Does user directory exist? FileInfo fileInfo(user_lyxdir); if (fileInfo.isOK() && fileInfo.isDir()) { first_start = false; + FileInfo script(configure_script); + FileInfo defaults(AddName(user_lyxdir, "lyxrc.defaults")); + if (defaults.isOK() && script.isOK() + && defaults.getModificationTime() < script.getModificationTime()) { + lyxerr << _("LyX: reconfiguring user directory") + << endl; + Path p(user_lyxdir); + ::system(configure_script.c_str()); + lyxerr << "LyX: " << _("Done!") << endl; + } return; - } else { - first_start = !explicit_userdir; } - // If the user specified explicitely a directory, ask whether + first_start = !explicit_userdir; + + // If the user specified explicitly a directory, ask whether // to create it (otherwise, always create it) if (explicit_userdir && !Alert::askQuestion(_("You have specified an invalid LyX directory."), @@ -590,27 +609,39 @@ void LyX::queryUserLyXDir(bool explicit_userdir) return; } - // Tell the user what is going on +#if USE_BOOST_FORMAT + lyxerr << boost::format(_("LyX: Creating directory %1$s" + " and running configure...")) + % user_lyxdir + << endl; +#else lyxerr << _("LyX: Creating directory ") << user_lyxdir - << _(" and running configure...") << endl; + << _(" and running configure...") + << endl; +#endif - // Create directory structure if (!createDirectory(user_lyxdir, 0755)) { // Failed, let's use $HOME instead. user_lyxdir = GetEnvPath("HOME"); - lyxerr << _("Failed. Will use ") << user_lyxdir - << _(" instead.") << endl; +#if USE_BOOST_FORMAT + lyxerr << boost::format(_("Failed. Will use %1$s instead.")) + % user_lyxdir + << endl; +#else + lyxerr << _("Failed. Will use ") << user_lyxdir << + _(" instead.") + << endl; +#endif return; } // Run configure in user lyx directory Path p(user_lyxdir); - ::system(AddName(system_lyxdir, "configure").c_str()); + ::system(configure_script.c_str()); lyxerr << "LyX: " << _("Done!") << endl; } -// Read the rc file `name' bool LyX::readRcFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; @@ -620,9 +651,15 @@ bool LyX::readRcFile(string const & name) lyxerr[Debug::INIT] << "Found " << name << " in " << lyxrc_path << endl; if (lyxrc.read(lyxrc_path) < 0) { +#if USE_BOOST_FORMAT Alert::alert(_("LyX Warning!"), - _("Error while reading ") + lyxrc_path + ".", + boost::io::str(boost::format(_("Error while reading %1$s.")) % lyxrc_path), _("Using built-in defaults.")); +#else + Alert::alert(_("LyX Warning!"), + _("Error while reading ") + lyxrc_path, + _("Using built-in defaults.")); +#endif return false; } return true; @@ -643,7 +680,7 @@ void LyX::readUIFile(string const & name) ui_last }; - struct keyword_item uitags[ui_last-1] = { + struct keyword_item uitags[ui_last - 1] = { { "menuset", ui_menuset }, { "toolbar", ui_toolbar } }; @@ -681,7 +718,7 @@ void LyX::readUIFile(string const & name) break; default: - if (!strip(lex.getString()).empty()) + if (!rtrim(lex.getString()).empty()) lex.printError("LyX::ReadUIFile: " "Unknown menu tag: `$$Token'"); break; @@ -721,17 +758,33 @@ void LyX::readEncodingsFile(string const & name) namespace { -// Set debugging level and report result to user -void setDebuggingLevel(string const & dbgLevel) +bool is_gui = true; +string batch; + +/// return the the number of arguments consumed +typedef boost::function cmd_helper; + +int parse_dbg(string const & arg, string const &) { - lyxerr << _("Setting debug level to ") << dbgLevel << endl; - lyxerr.level(Debug::value(dbgLevel)); + if (arg.empty()) { + lyxerr << _("List of supported debug flags:") << endl; + Debug::showTags(lyxerr); + exit(0); + } +#if USE_BOOST_FORMAT + lyxerr << boost::format(_("Setting debug level to %1$s")) + % arg + << endl; +#else + lyxerr << _("Setting debug level to ") << arg << endl; +#endif + + lyxerr.level(Debug::value(arg)); Debug::showLevel(lyxerr, lyxerr.level()); + return 1; } - -// Give command line help -void commandLineHelp() +int parse_help(string const &, string const &) { lyxerr << _("Usage: lyx [ command line switches ] [ name.lyx ... ]\n" @@ -752,141 +805,125 @@ void commandLineHelp() " 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; + exit(0); + return 0; } -// Give command line version information -void commandLineVersionInfo() +int parse_version(string const &, string const &) { lyxerr << "LyX " << lyx_version << " of " << lyx_release_date << endl; lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl; lyxerr << lyx_version_info << endl; + exit(0); + return 0; } +int parse_sysdir(string const & arg, string const &) +{ + if (arg.empty()) { + lyxerr << _("Missing directory for -sysdir switch") << endl; + exit(1); + } + system_lyxdir = arg; + return 1; +} + +int parse_userdir(string const & arg, string const &) +{ + if (arg.empty()) { + lyxerr << _("Missing directory for -userdir switch") << endl; + exit(1); + } + user_lyxdir = arg; + return 1; +} + +int parse_execute(string const & arg, string const &) +{ + if (arg.empty()) { + lyxerr << _("Missing command string after --execute switch") << endl; + exit(1); + } + batch = arg; + // Argh. Setting gui to false segfaults.. + // FIXME: when ? how ? + // is_gui = false; + return 1; +} + +int parse_export(string const & type, string const &) +{ + if (type.empty()) { + lyxerr << _("Missing file type [eg latex, ps...] after " + "--export switch") << endl; + exit(1); + } + batch = "buffer-export " + type; + is_gui = false; + return 1; +} + +int parse_import(string const & type, string const & file) +{ + if (type.empty()) { + lyxerr << _("Missing file type [eg latex, ps...] after " + "--import switch") << endl; + exit(1); + } + if (file.empty()) { + lyxerr << _("Missing filename for --import") << endl; + exit(1); + } + + batch = "buffer-import " + type + ' ' + file; + return 2; +} } // namespace anon bool LyX::easyParse(int & argc, char * argv[]) { - bool gui = true; - int removeargs = 0; // used when options are read + std::map cmdmap; + + cmdmap["-dbg"] = parse_dbg; + cmdmap["-help"] = parse_help; + cmdmap["--help"] = parse_help; + cmdmap["-version"] = parse_version; + cmdmap["--version"] = parse_version; + cmdmap["-sysdir"] = parse_sysdir; + cmdmap["-userdir"] = parse_userdir; + cmdmap["-x"] = parse_execute; + cmdmap["--execute"] = parse_execute; + cmdmap["-e"] = parse_export; + cmdmap["--export"] = parse_export; + cmdmap["-i"] = parse_import; + cmdmap["--import"] = parse_import; + for (int i = 1; i < argc; ++i) { - string arg = argv[i]; - - // Check for -dbg int - if (arg == "-dbg") { - if (i + 1 < argc) { - setDebuggingLevel(argv[i + 1]); - removeargs = 2; - } else { - lyxerr << _("List of supported debug flags:") - << endl; - Debug::showTags(lyxerr); - exit(1); - } - } - // Check for "-sysdir" - else if (arg == "-sysdir") { - if (i + 1 < argc) { - system_lyxdir = argv[i + 1]; - removeargs = 2; - } else { - lyxerr << _("Missing directory for -sysdir switch!") - << endl; - exit(1); - } - } - // Check for "-userdir" - else if (arg == "-userdir") { - if (i + 1 < argc) { - user_lyxdir = argv[i + 1]; - removeargs = 2; - } else { - lyxerr << _("Missing directory for -userdir switch!") - << endl; - exit(1); - } - } - // Check for --help or -help - else if (arg == "--help" || arg == "-help") { - commandLineHelp(); - exit(0); - } - // Check for --version or -version - else if (arg == "--version" || arg == "-version") { - commandLineVersionInfo(); - exit(0); - } - // FIXME: why is this commented out ? - // Check for "-nw": No XWindows as for emacs this should - // give a LyX that could be used in a terminal window. - //else if (arg == "-nw") { - // gui = false; - //} - - // Check for "-x": Execute commands - else if (arg == "-x" || arg == "--execute") { - if (i + 1 < argc) { - batch_command = string(argv[i + 1]); - removeargs = 2; - } - else - lyxerr << _("Missing command string after -x switch!") << endl; + std::map::const_iterator it + = cmdmap.find(argv[i]); - // Argh. Setting gui to false segfaults.. - // FIXME: when ? how ? - // gui = false; - } + // don't complain if not found - may be parsed later + if (it == cmdmap.end()) + continue; - else if (arg == "-e" || arg == "--export") { - if (i + 1 < argc) { - string type(argv[i+1]); - removeargs = 2; - batch_command = "buffer-export " + type; - gui = false; - } else { - lyxerr << _("Missing file type [eg latex, " - "ps...] after ") - << arg << _(" switch!") << endl; - exit(1); - } - } - else if (arg == "-i" || arg == "--import") { - if (i + 1 < argc) { - if (!argv[i+2]) { - lyxerr << _("Missing filename for --import") << endl; - exit(1); - } - - string const file(argv[i+2]); - string const type(argv[i+1]); - removeargs = 3; - - batch_command = "buffer-import " + type + " " + file; - lyxerr << "batch_command: " - << batch_command << endl; - - } else { - lyxerr << _("Missing type [eg latex, " - "ps...] after ") - << arg << _(" switch!") << endl; - exit(1); - } - } + string arg((i + 1 < argc) ? argv[i + 1] : ""); + string arg2((i + 2 < argc) ? argv[i + 2] : ""); - if (removeargs > 0) { - // Now, remove used arguments by shifting - // the following ones removeargs places down. - argc -= removeargs; - for (int j = i; j < argc; ++j) - argv[j] = argv[j + removeargs]; - --i; // After shift, check this number again. - removeargs = 0; - } + int const remove = 1 + it->second(arg, arg2); + // Now, remove used arguments by shifting + // the following ones remove places down. + argc -= remove; + for (int j = i; j < argc; ++j) + argv[j] = argv[j + remove]; + --i; } - return gui; + batch_command = batch; + + return is_gui; }