X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=795c4360dbe12e578a4ea823c626461cddeaf839;hb=f360c39690150b6ff9116ff56c39c3a0e0a92fd2;hp=e0bd0a65de48e500a8eaacfb36eef3d3743bdd13;hpb=a3a1d06f723e7412d92a5b3fbee0ac944934d6ef;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index e0bd0a65de..795c4360db 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -4,7 +4,7 @@ * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. + * Copyright 1995-2001 The LyX Team. * * ====================================================== */ @@ -18,6 +18,7 @@ #endif #include "version.h" +#include #include "lyx_main.h" #include "lyx_gui.h" #include "LyXView.h" @@ -26,6 +27,7 @@ #include "lyxrc.h" #include "support/path.h" #include "support/filetools.h" +#include "buffer.h" #include "bufferlist.h" #include "debug.h" #include "support/FileInfo.h" @@ -41,9 +43,14 @@ #include "encoding.h" #include "converter.h" #include "language.h" +#include "support/os.h" using std::endl; +#ifndef CXX_GLOBAL_CSTD +using std::signal; +#endif + extern void LoadLyXFile(string const &); extern void QuitLyX(); @@ -102,7 +109,7 @@ LyX::LyX(int * argc, char * argv[]) // Initialization of LyX (reads lyxrc and more) lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl; - init(argc, argv, gui); + init(gui); lyxerr[Debug::INIT] << "Initializing LyX::init...done" << endl; lyxGUI->init(); @@ -123,7 +130,8 @@ LyX::LyX(int * argc, char * argv[]) } if (first_start) { - string splash = i18nLibFileSearch("examples", "splash.lyx"); + string const splash = + i18nLibFileSearch("examples", "splash.lyx"); lyxerr[Debug::INIT] << "Opening splash document " << splash << "..." << endl; Buffer * loadb = bufferlist.loadLyXFile(splash); @@ -148,7 +156,7 @@ LyX::LyX(int * argc, char * argv[]) last_loaded = bufferlist.newFile("tmpfile", string()); // try to dispatch to last loaded buffer first - bool dispatched = last_loaded->Dispatch(batch_command); + bool dispatched = last_loaded->dispatch(batch_command); // if this was successful, return. // Maybe we could do something more clever than aborting... @@ -160,7 +168,7 @@ LyX::LyX(int * argc, char * argv[]) // otherwise, let the GUI handle the batch command lyxGUI->regBuf(last_loaded); - lyxGUI->getLyXView()->getLyXFunc()->Dispatch(batch_command); + lyxGUI->getLyXView()->getLyXFunc()->dispatch(batch_command); // fall through... } @@ -178,9 +186,54 @@ LyX::~LyX() } -extern "C" void error_handler(int err_sig); +extern "C" { + +static +void error_handler(int err_sig) +{ + switch (err_sig) { + case SIGHUP: + lyxerr << "\nlyx: SIGHUP signal caught" << endl; + break; + case SIGINT: + // no comments + break; + case SIGFPE: + lyxerr << "\nlyx: SIGFPE signal caught" << endl; + break; + case SIGSEGV: + lyxerr << "\nlyx: SIGSEGV signal caught" << endl; + lyxerr << + "Sorry, you have found a bug in LyX." + " If possible, please read 'Known bugs'\n" + "under the Help menu and then send us " + "a full bug report. Thanks!" << endl; + break; + case SIGTERM: + // no comments + break; + } + + // Deinstall the signal handlers + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGFPE, SIG_DFL); + signal(SIGSEGV, SIG_DFL); + signal(SIGTERM, SIG_DFL); + + bufferlist.emergencyWriteAll(); + + lyxerr << "Bye." << endl; + if (err_sig!= SIGHUP && + (!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV)) + lyx::abort(); + exit(0); +} + +} + -void LyX::init(int */*argc*/, char **argv, bool gui) +void LyX::init(bool gui) { // Install the signal handlers signal(SIGHUP, error_handler); @@ -194,27 +247,9 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // string fullbinpath; - string binpath = subst(argv[0], '\\', '/'); - string binname = OnlyFilename(argv[0]); - // Sorry for system specific code. (SMiyata) - if (suffixIs(binname, ".exe")) - binname.erase(binname.length()-4, string::npos); - - binpath = ExpandPath(binpath); // This expands ./ and ~/ - - if (!AbsolutePath(binpath)) { - string binsearchpath = GetEnvPath("PATH"); - // This will make "src/lyx" work always :-) - binsearchpath += ";."; - binpath = FileOpenSearch(binsearchpath, argv[0]); - } - + string binpath = os::binpath(); + string binname = os::binname(); fullbinpath = binpath; - binpath = MakeAbsPath(OnlyPath(binpath)); - - // In case we are running in place and compiled with shared libraries - if (suffixIs(binpath, "/.libs/")) - binpath.erase(binpath.length()-6, string::npos); if (binpath.empty()) { lyxerr << _("Warning: could not determine path of binary.") @@ -248,7 +283,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) searchpath= MakeAbsPath(system_lyxdir) + ';'; // LYX_DIR_11x environment variable - string lyxdir = GetEnvPath("LYX_DIR_11x"); + string const lyxdir = GetEnvPath("LYX_DIR_11x"); if (!lyxdir.empty()) { lyxerr[Debug::INIT] << "LYX_DIR_11x: " << lyxdir << endl; @@ -269,7 +304,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) build_lyxdir.erase(); } - bool FollowLink; + bool followlink; do { // Path of binary/../share/name of binary/ searchpath += NormalizePath(AddPath(binpath, "../share/") + @@ -277,18 +312,18 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // Follow Symlinks FileInfo file(fullbinpath, true); - FollowLink = file.isLink(); - if (FollowLink) { - string Link; - if (LyXReadLink(fullbinpath, Link)) { - fullbinpath = Link; + followlink = file.isLink(); + if (followlink) { + string link; + if (LyXReadLink(fullbinpath, link)) { + fullbinpath = link; binpath = MakeAbsPath(OnlyPath(fullbinpath)); } else { - FollowLink = false; + followlink = false; } } - } while (FollowLink); + } while (followlink); // Hardcoded dir searchpath += LYX_DIR; @@ -298,7 +333,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) << searchpath << endl; string const filename = "chkconfig.ltx"; - string temp = FileOpenSearch(searchpath, filename, string()); + string const temp = FileOpenSearch(searchpath, filename, string()); system_lyxdir = OnlyPath(temp); // Reduce "path/../path" stuff out of system directory @@ -324,12 +359,19 @@ void LyX::init(int */*argc*/, char **argv, bool gui) <<_("set the environment variable LYX_DIR_11x to the " "LyX system directory ") << _("containing the file `chkconfig.ltx'.") << endl; - if (!path_shown) + if (!path_shown) { + FileInfo fi(LYX_DIR); + if (!fi.exist()) { + lyxerr << "Couldn't even find the default LYX_DIR." << endl + << "Giving up." << endl; + exit(1); + } lyxerr << _("Using built-in default ") << LYX_DIR << _(" but expect problems.") << endl; - else + } else { lyxerr << _("Expect problems.") << endl; + } system_lyxdir = LYX_DIR; path_shown = true; } @@ -367,11 +409,12 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // Check that user LyX directory is ok. We don't do that if // running in batch mode. - if (gui) + if (gui) { queryUserLyXDir(explicit_userdir); - else + } else { first_start = false; - + } + // // Shine up lyxrc defaults // @@ -403,7 +446,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // Read configuration files // - ReadRcFile("lyxrc.defaults"); + readRcFile("lyxrc.defaults"); system_lyxrc = lyxrc; system_formats = formats; system_converters = converters; @@ -411,13 +454,13 @@ void LyX::init(int */*argc*/, char **argv, bool gui) // If there is a preferences file we read that instead // of the old lyxrc file. - if (!ReadRcFile("preferences")) - ReadRcFile("lyxrc"); + if (!readRcFile("preferences")) + readRcFile("lyxrc"); // Read encodings - ReadEncodingsFile("encodings"); + readEncodingsFile("encodings"); // Read languages - ReadLangugesFile("languages"); + readLanguagesFile("languages"); // Load the layouts lyxerr[Debug::INIT] << "Reading layouts..." << endl; @@ -428,7 +471,7 @@ void LyX::init(int */*argc*/, char **argv, bool gui) lyxrc.readBindFileIfNeeded(); // Read menus - ReadUIFile(lyxrc.ui_file); + readUIFile(lyxrc.ui_file); // Bind the X dead keys to the corresponding LyX functions if // necessary. @@ -440,7 +483,8 @@ void LyX::init(int */*argc*/, char **argv, bool gui) } // Create temp directory - system_tempdir = CreateLyXTmpDir(lyxrc.tempdir_path); + os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path)); + system_tempdir = os::getTmpDir(); if (lyxerr.debugging(Debug::INIT)) { lyxerr << "LyX tmp dir: `" << system_tempdir << '\'' << endl; } @@ -476,34 +520,37 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) kbmap->bind("Next", LFUN_NEXT); kbmap->bind("Return", LFUN_BREAKPARAGRAPH); - kbmap->bind("~C-~S-~M-nobreakspace", LFUN_PROTECTEDSPACE); + //kbmap->bind("~C-~S-~M-nobreakspace", LFUN_PROTECTEDSPACE); kbmap->bind("Delete", LFUN_DELETE); kbmap->bind("BackSpace", LFUN_BACKSPACE); // kbmap->bindings to enable the use of the numeric keypad // e.g. Num Lock set - kbmap->bind("KP_0", LFUN_SELFINSERT); - kbmap->bind("KP_Decimal", LFUN_SELFINSERT); - kbmap->bind("KP_Enter", LFUN_SELFINSERT); - kbmap->bind("KP_1", LFUN_SELFINSERT); - kbmap->bind("KP_2", LFUN_SELFINSERT); - kbmap->bind("KP_3", LFUN_SELFINSERT); - kbmap->bind("KP_4", LFUN_SELFINSERT); - kbmap->bind("KP_5", LFUN_SELFINSERT); - kbmap->bind("KP_6", LFUN_SELFINSERT); - kbmap->bind("KP_Add", LFUN_SELFINSERT); - kbmap->bind("KP_7", LFUN_SELFINSERT); - kbmap->bind("KP_8", LFUN_SELFINSERT); - kbmap->bind("KP_9", LFUN_SELFINSERT); - kbmap->bind("KP_Divide", LFUN_SELFINSERT); - kbmap->bind("KP_Multiply", LFUN_SELFINSERT); - kbmap->bind("KP_Subtract", LFUN_SELFINSERT); - - /* Most self-insert keys are handled in the 'default:' section of - * WorkAreaKeyPress - so we don't have to define them all. - * However keys explicit decleared as self-insert are - * handled seperatly (LFUN_SELFINSERT.) Lgb. */ + //kbmap->bind("KP_0", LFUN_SELFINSERT); + //kbmap->bind("KP_Decimal", LFUN_SELFINSERT); + kbmap->bind("KP_Enter", LFUN_BREAKPARAGRAPH); + //kbmap->bind("KP_1", LFUN_SELFINSERT); + //kbmap->bind("KP_2", LFUN_SELFINSERT); + //kbmap->bind("KP_3", LFUN_SELFINSERT); + //kbmap->bind("KP_4", LFUN_SELFINSERT); + //kbmap->bind("KP_5", LFUN_SELFINSERT); + //kbmap->bind("KP_6", LFUN_SELFINSERT); + //kbmap->bind("KP_Add", LFUN_SELFINSERT); + //kbmap->bind("KP_7", LFUN_SELFINSERT); + //kbmap->bind("KP_8", LFUN_SELFINSERT); + //kbmap->bind("KP_9", LFUN_SELFINSERT); + //kbmap->bind("KP_Divide", LFUN_SELFINSERT); + //kbmap->bind("KP_Multiply", LFUN_SELFINSERT); + //kbmap->bind("KP_Subtract", LFUN_SELFINSERT); + kbmap->bind("KP_Right", LFUN_RIGHT); + kbmap->bind("KP_Left", LFUN_LEFT); + kbmap->bind("KP_Up", LFUN_UP); + kbmap->bind("KP_Down", LFUN_DOWN); + kbmap->bind("KP_Home", LFUN_HOME); + kbmap->bind("KP_End", LFUN_END); + kbmap->bind("KP_Prior", LFUN_PRIOR); + kbmap->bind("KP_Next", LFUN_NEXT); kbmap->bind("C-Tab", LFUN_TABINSERT); // ale970515 kbmap->bind("S-Tab", LFUN_SHIFT_TAB); // jug20000522 @@ -548,15 +595,13 @@ void LyX::queryUserLyXDir(bool explicit_userdir) first_start = false; return; } else { - first_start = true; + first_start = !explicit_userdir; } - // Nope - // Different wording if the user specifically requested a directory - if (!AskQuestion( explicit_userdir - ? _("You have specified an invalid LyX directory.") - : _("You don't have a personal LyX directory.") , - + // If the user specified explicitely a directory, ask whether + // to create it (otherwise, always create it) + if (explicit_userdir && + !AskQuestion(_("You have specified an invalid LyX directory."), _("It is needed to keep your own configuration."), _("Should I try to set it up for you (recommended)?"))) { lyxerr << _("Running without personal LyX directory.") << endl; @@ -586,29 +631,31 @@ void LyX::queryUserLyXDir(bool explicit_userdir) // Read the rc file `name' -bool LyX::ReadRcFile(string const & name) +bool LyX::readRcFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string lyxrc_path = LibFileSearch(string(), name); + string const lyxrc_path = LibFileSearch(string(), name); if (!lyxrc_path.empty()){ lyxerr[Debug::INIT] << "Found " << name << " in " << lyxrc_path << endl; if (lyxrc.read(lyxrc_path) < 0) { WriteAlert(_("LyX Warning!"), - _("Error while reading ")+lyxrc_path+".", + _("Error while reading ") + lyxrc_path + ".", _("Using built-in defaults.")); return false; } return true; - } else + } else { lyxerr[Debug::INIT] << "Could not find " << name << endl; + } + return false; } // Read the ui file `name' -void LyX::ReadUIFile(string const & name) +void LyX::readUIFile(string const & name) { enum Uitags { ui_menuset = 1, @@ -623,7 +670,7 @@ void LyX::ReadUIFile(string const & name) lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string ui_path = LibFileSearch("ui", name, "ui"); + string const ui_path = LibFileSearch("ui", name, "ui"); if (ui_path.empty()) { lyxerr[Debug::INIT] << "Could not find " << name << endl; @@ -635,7 +682,7 @@ void LyX::ReadUIFile(string const & name) << " in " << ui_path << endl; LyXLex lex(uitags, ui_last - 1); lex.setFile(ui_path); - if (!lex.IsOK()) { + if (!lex.isOK()) { lyxerr << "Unable to set LyXLeX for ui file: " << ui_path << endl; } @@ -643,7 +690,7 @@ void LyX::ReadUIFile(string const & name) if (lyxerr.debugging(Debug::PARSER)) lex.printTable(lyxerr); - while (lex.IsOK()) { + while (lex.isOK()) { switch (lex.lex()) { case ui_menuset: menubackend.read(lex); @@ -654,8 +701,9 @@ void LyX::ReadUIFile(string const & name) break; default: - lex.printError("LyX::ReadUFile: " - "Unknown menu tag: `$$Token'"); + if(!strip(lex.getString()).empty()) + lex.printError("LyX::ReadUIFile: " + "Unknown menu tag: `$$Token'"); break; } } @@ -663,11 +711,11 @@ void LyX::ReadUIFile(string const & name) // Read the languages file `name' -void LyX::ReadLangugesFile(string const & name) +void LyX::readLanguagesFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string lang_path = LibFileSearch(string(), name); + string const lang_path = LibFileSearch(string(), name); if (lang_path.empty()) { lyxerr[Debug::INIT] << "Could not find " << name << endl; languages.setDefaults(); @@ -678,11 +726,11 @@ void LyX::ReadLangugesFile(string const & name) // Read the encodings file `name' -void LyX::ReadEncodingsFile(string const & name) +void LyX::readEncodingsFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string enc_path = LibFileSearch(string(), name); + string const enc_path = LibFileSearch(string(), name); if (enc_path.empty()) { lyxerr[Debug::INIT] << "Could not find " << name << endl; return; @@ -705,7 +753,6 @@ void setDebuggingLevel(string const & dbgLevel) // Give command line help void commandLineHelp() { - lyxerr << "LyX " LYX_VERSION << " of " LYX_RELEASE << endl; lyxerr << _("Usage: lyx [ command line switches ] [ name.lyx ... ]\n" "Command line switches (case sensitive):\n" @@ -723,9 +770,20 @@ void commandLineHelp() "\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" + "\t-version summarize version and build info\n" "Check the LyX man page for more details.") << endl; } +// Give command line version information +void commandLineVersionInfo() +{ + lyxerr << "LyX " LYX_VERSION << " of " LYX_RELEASE << endl; + lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl; + + lyxerr << version_info << endl; +} + + } // namespace anon @@ -775,6 +833,11 @@ bool LyX::easyParse(int * argc, char * argv[]) commandLineHelp(); exit(0); } + // Check for --version or -version + else if (arg == "--version" || arg == "-version") { + commandLineVersionInfo(); + exit(0); + } // 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") { @@ -837,44 +900,3 @@ bool LyX::easyParse(int * argc, char * argv[]) } -extern "C" -void error_handler(int err_sig) -{ - switch (err_sig) { - case SIGHUP: - lyxerr << "\nlyx: SIGHUP signal caught" << endl; - break; - case SIGINT: - // no comments - break; - case SIGFPE: - lyxerr << "\nlyx: SIGFPE signal caught" << endl; - break; - case SIGSEGV: - lyxerr << "\nlyx: SIGSEGV signal caught" << endl; - lyxerr << - "Sorry, you have found a bug in LyX." - " If possible, please read 'Known bugs'\n" - "under the Help menu and then send us " - "a full bug report. Thanks!" << endl; - break; - case SIGTERM: - // no comments - break; - } - - // Deinstall the signal handlers - signal(SIGHUP, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGFPE, SIG_DFL); - signal(SIGSEGV, SIG_DFL); - signal(SIGTERM, SIG_DFL); - - bufferlist.emergencyWriteAll(); - - lyxerr << "Bye." << endl; - if (err_sig!= SIGHUP && - (!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV)) - lyx::abort(); - exit(0); -}