X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=82dd64cbf9db6d70c1117adda9ca69a613d5f5c1;hb=916ae4222d5218ad7d5c2d5b989ed95437eb3491;hp=b9b1700a1222cacfc812008d7813687ad0e395c5;hpb=2ebbccc2121b42be2ce52811847f280616258090;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index b9b1700a12..82dd64cbf9 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -13,6 +13,10 @@ #include #include +#ifdef __GNUG__ +#pragma implementation +#endif + #include "version.h" #include "lyx_main.h" #include "lyx_gui.h" @@ -31,10 +35,16 @@ #include "layout.h" #include "gettext.h" #include "kbmap.h" +#include "MenuBackend.h" +#include "ToolbarDefaults.h" +#include "lyxlex.h" +#include "encoding.h" +#include "converter.h" using std::endl; extern void LoadLyXFile(string const &); +extern void QuitLyX(); string system_lyxdir; string build_lyxdir; @@ -54,7 +64,7 @@ LyXServer * lyxserver = 0; bool finished = false; // flag, that we are quitting the program // convenient to have it here. -kb_keymap * toplevel_keymap; +boost::scoped_ptr toplevel_keymap; LyX::LyX(int * argc, char * argv[]) @@ -68,8 +78,8 @@ LyX::LyX(int * argc, char * argv[]) bool gui = easyParse(argc, argv); // Global bindings (this must be done as early as possible.) (Lgb) - toplevel_keymap = new kb_keymap; - defaultKeyBindings(toplevel_keymap); + toplevel_keymap.reset(new kb_keymap); + defaultKeyBindings(toplevel_keymap.get()); // Make the GUI object, and let it take care of the // command line arguments that concerns it. @@ -89,8 +99,6 @@ LyX::LyX(int * argc, char * argv[]) } } - - // Initialization of LyX (reads lyxrc and more) lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl; init(argc, argv, gui); @@ -131,7 +139,8 @@ LyX::LyX(int * argc, char * argv[]) // Execute batch commands if available if (!batch_command.empty()) { - lyxerr << "About to handle -x '" << batch_command << "'" << endl; + lyxerr << "About to handle -x '" + << batch_command << "'" << endl; // no buffer loaded, create one if (!last_loaded) @@ -144,6 +153,7 @@ LyX::LyX(int * argc, char * argv[]) // Maybe we could do something more clever than aborting... if (dispatched) { lyxerr << "We are done!" << endl; + QuitLyX(); return; } @@ -308,10 +318,10 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // Warn the user if we couldn't find "chkconfig.ltx" if (system_lyxdir == "./") { - lyxerr <<_("LyX Warning! Couldn't determine system directory.") - <<_("Try the '-sysdir' command line parameter or") + lyxerr <<_("LyX Warning! Couldn't determine system directory. ") + <<_("Try the '-sysdir' command line parameter or ") <<_("set the environment variable LYX_DIR_11x to the " - "LyX system directory") + "LyX system directory ") << _("containing the file `chkconfig.ltx'.") << endl; if (!path_shown) lyxerr << _("Using built-in default ") @@ -341,10 +351,10 @@ void LyX::init(int */*argc*/, char **argv, bool gui) bool explicit_userdir = true; if (user_lyxdir.empty()) { - // LYX_USERDIR_11x environment variable + // LYX_USERDIR_11x environment variable user_lyxdir = GetEnvPath("LYX_USERDIR_11x"); - // default behaviour + // default behaviour if (user_lyxdir.empty()) user_lyxdir = AddPath(GetEnvPath("HOME"), string(".") + PACKAGE); @@ -354,15 +364,12 @@ void LyX::init(int */*argc*/, char **argv, bool gui) lyxerr[Debug::INIT] << "User LyX directory: '" << user_lyxdir << '\'' << endl; - // Check that user LyX directory is ok. - queryUserLyXDir(explicit_userdir); - - // - // Load the layouts first - // - - lyxerr[Debug::INIT] << "Reading layouts..." << endl; - LyXSetStyle(); + // Check that user LyX directory is ok. We don't do that if + // running in batch mode. + if (gui) + queryUserLyXDir(explicit_userdir); + else + first_start = false; // // Shine up lyxrc defaults @@ -396,18 +403,36 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // ReadRcFile("lyxrc.defaults"); - ReadRcFile("lyxrc"); + system_lyxrc = lyxrc; + system_formats = formats; + system_converters = converters; + system_lcolor = lcolor; + + // If there is a preferences file we read that instead + // of the old lyxrc file. + if (!ReadRcFile("preferences")) + ReadRcFile("lyxrc"); + + // Read encodings + ReadEncodingsFile("encodings"); + // Read languages + ReadLangugesFile("languages"); + + // Load the layouts + lyxerr[Debug::INIT] << "Reading layouts..." << endl; + LyXSetStyle(); // Ensure that we have really read a bind file, so that LyX is // usable. - if (!lyxrc.hasBindFile) - lyxrc.ReadBindFile(); + lyxrc.readBindFileIfNeeded(); + // 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); + deadKeyBindings(toplevel_keymap.get()); if (lyxerr.debugging(Debug::LYXRC)) { lyxrc.print(); @@ -432,6 +457,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // lyxserver = new LyXServer; } + // These are the default bindings known to LyX void LyX::defaultKeyBindings(kb_keymap * kbmap) { @@ -441,6 +467,7 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) kbmap->bind("Down", LFUN_DOWN); kbmap->bind("Tab", LFUN_TAB); + kbmap->bind("ISO_Left_Tab", LFUN_TAB); // jbl 2001-23-02 kbmap->bind("Home", LFUN_HOME); kbmap->bind("End", LFUN_END); @@ -479,8 +506,10 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) kbmap->bind("C-Tab", LFUN_TABINSERT); // ale970515 kbmap->bind("S-Tab", LFUN_SHIFT_TAB); // jug20000522 + kbmap->bind("S-ISO_Left_Tab", LFUN_SHIFT_TAB); // jbl 2001-23-02 } + // LyX can optionally take over the handling of deadkeys void LyX::deadKeyBindings(kb_keymap * kbmap) { @@ -508,7 +537,6 @@ 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) @@ -551,13 +579,13 @@ void LyX::queryUserLyXDir(bool explicit_userdir) // Run configure in user lyx directory Path p(user_lyxdir); - system(AddName(system_lyxdir, "configure").c_str()); + ::system(AddName(system_lyxdir, "configure").c_str()); lyxerr << "LyX: " << _("Done!") << endl; } // Read the rc file `name' -void LyX::ReadRcFile(string const & name) +bool LyX::ReadRcFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; @@ -569,13 +597,101 @@ void LyX::ReadRcFile(string const & name) WriteAlert(_("LyX Warning!"), _("Error while reading ")+lyxrc_path+".", _("Using built-in defaults.")); + return false; } + return true; } else lyxerr[Debug::INIT] << "Could not find " << name << endl; + return false; +} + + +// Read the ui file `name' +void LyX::ReadUIFile(string const & name) +{ + enum Uitags { + ui_menuset = 1, + ui_toolbar, + ui_last + }; + + struct keyword_item uitags[ui_last-1] = { + { "menuset", ui_menuset }, + { "toolbar", ui_toolbar } + }; + + lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; + + string ui_path = LibFileSearch("ui", name, "ui"); + + if (ui_path.empty()) { + lyxerr[Debug::INIT] << "Could not find " << name << endl; + menubackend.defaults(); + return; + } + + lyxerr[Debug::INIT] << "Found " << name + << " in " << ui_path << endl; + LyXLex lex(uitags, ui_last - 1); + lex.setFile(ui_path); + if (!lex.IsOK()) { + lyxerr << "Unable to set LyXLeX for ui file: " << ui_path + << endl; + } + + if (lyxerr.debugging(Debug::PARSER)) + lex.printTable(lyxerr); + + while (lex.IsOK()) { + switch (lex.lex()) { + case ui_menuset: + menubackend.read(lex); + break; + + case ui_toolbar: + toolbardefaults.read(lex); + break; + + default: + lex.printError("LyX::ReadUFile: " + "Unknown menu tag: `$$Token'"); + break; + } + } +} + + +// Read the languages file `name' +void LyX::ReadLangugesFile(string const & name) +{ + lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; + + string lang_path = LibFileSearch(string(), name); + if (lang_path.empty()) { + lyxerr[Debug::INIT] << "Could not find " << name << endl; + languages.setDefaults(); + return; + } + languages.read(lang_path); +} + + +// Read the encodings file `name' +void LyX::ReadEncodingsFile(string const & name) +{ + lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; + + string enc_path = LibFileSearch(string(), name); + if (enc_path.empty()) { + lyxerr[Debug::INIT] << "Could not find " << name << endl; + return; + } + encodings.read(enc_path); } // Set debugging level and report result to user +static void setDebuggingLevel(string const & dbgLevel) { lyxerr << _("Setting debug level to ") << dbgLevel << endl; @@ -585,6 +701,7 @@ void setDebuggingLevel(string const & dbgLevel) // Give command line help +static void commandLineHelp() { lyxerr << "LyX " LYX_VERSION << " of " LYX_RELEASE << endl; @@ -598,14 +715,22 @@ void commandLineHelp() "\t-dbg feature[,feature]...\n" " select the features to debug.\n" " Type `lyx -dbg' to see the list of features\n" - "Check the LyX man page for more options.") << endl; + "\t-x [--execute] command\n" + " where command is a lyx command.\n" + "\t-e [--export] fmt\n" + " where fmt is the export format of choice.\n" + "\t-i [--import] fmt file.xxx\n" + " where fmt is the import format of choice\n" + " and file.xxx is the file to be imported.\n" + "Check the LyX man page for more details.") << endl; } + bool LyX::easyParse(int * argc, char * argv[]) { bool gui = true; int removeargs = 0; // used when options are read - for(int i = 1; i < *argc; ++i) { + for (int i = 1; i < *argc; ++i) { string arg = argv[i]; // Check for -dbg int @@ -670,28 +795,14 @@ bool LyX::easyParse(int * argc, char * argv[]) if (i + 1 < *argc) { string type(argv[i+1]); removeargs = 2; - - if (type == "tex") - type = "latex"; - else if (type == "ps") - type = "postscript"; - else if (type == "text" || type == "txt") - type = "ascii"; - - if (type == "latex" || type == "postscript" - || type == "linuxdoc" || type == "docbook" - || type == "ascii" || type == "html") - batch_command = "buffer-export " + type; - else - lyxerr << _("Unknown file type '") - << type << _("' after ") - << arg << _(" switch!") << endl; + batch_command = "buffer-export " + type; + gui = false; } else lyxerr << _("Missing file type [eg latex, " "ps...] after ") << arg << _(" switch!") << endl; } - else if (arg == "--import") { + else if (arg == "-i" || arg == "--import") { if (i + 1 < *argc) { string type(argv[i+1]); string file(argv[i+2]); @@ -759,7 +870,7 @@ void error_handler(int err_sig) bufferlist.emergencyWriteAll(); lyxerr << "Bye." << endl; - if(err_sig!= SIGHUP && + if (err_sig!= SIGHUP && (!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV)) lyx::abort(); exit(0);