X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=ecb5e296634089d5907f8b0e8e22e7bd8b6a2acf;hb=98c966c64594611e469313314abd1e59524adb4a;hp=0197a8a4b38eb4bd1e0b4133817e91dc53df74c0;hpb=b1fb4b15f27655c71fe817778b11829bd546110c;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index 0197a8a4b3..ecb5e29663 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -1,39 +1,33 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 The LyX Team. * * ====================================================== */ #include - -#include -#include +#include #ifdef __GNUG__ #pragma implementation #endif -#include "version.h" #include "lyx_main.h" #include "lyx_gui.h" #include "LyXView.h" #include "lyxfunc.h" -#include "lyx_gui_misc.h" #include "lyxrc.h" -#include "support/path.h" -#include "support/filetools.h" #include "buffer.h" #include "bufferlist.h" #include "debug.h" -#include "support/FileInfo.h" #include "lastfiles.h" #include "intl.h" #include "lyxserver.h" -#include "layout.h" +//#include "layout.h" +#include "lyxtextclasslist.h" #include "gettext.h" #include "kbmap.h" #include "MenuBackend.h" @@ -42,8 +36,18 @@ #include "encoding.h" #include "converter.h" #include "language.h" + +#include "frontends/Alert.h" +#include "frontends/GUIRunTime.h" + +#include "support/path.h" +#include "support/filetools.h" +#include "support/FileInfo.h" #include "support/os.h" +#include +#include + using std::endl; #ifndef CXX_GLOBAL_CSTD @@ -61,7 +65,7 @@ string user_lyxdir; // Default $HOME/.lyx // Should this be kept global? Asger says Yes. DebugStream lyxerr; -LastFiles * lastfiles; +boost::scoped_ptr lastfiles; // This is the global bufferlist object BufferList bufferlist; @@ -76,10 +80,6 @@ boost::scoped_ptr toplevel_keymap; LyX::LyX(int * argc, char * argv[]) { - // Prevent crash with --help - lyxGUI = 0; - lastfiles = 0; - // Here we need to parse the command line. At least // we need to parse for "-dbg" and "-help" bool gui = easyParse(argc, argv); @@ -87,11 +87,11 @@ LyX::LyX(int * argc, char * argv[]) // Global bindings (this must be done as early as possible.) (Lgb) 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. lyxerr[Debug::INIT] << "Initializing LyXGUI..." << endl; - lyxGUI = new LyXGUI(this, argc, argv, gui); + lyxGUI.reset(new LyXGUI(this, argc, argv, gui)); lyxerr[Debug::INIT] << "Initializing LyXGUI...done" << endl; // Now the GUI and LyX have taken care of their arguments, so @@ -105,7 +105,7 @@ LyX::LyX(int * argc, char * argv[]) exit(0); } } - + // Initialization of LyX (reads lyxrc and more) lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl; init(gui); @@ -114,7 +114,7 @@ LyX::LyX(int * argc, char * argv[]) lyxGUI->init(); // Load the files specified in the command line. - if ((*argc) == 2) + if ((*argc) == 2) lyxerr[Debug::INFO] << "Opening document..." << endl; else if ((*argc) > 2) lyxerr[Debug::INFO] << "Opening documents..." << endl; @@ -157,7 +157,7 @@ LyX::LyX(int * argc, char * argv[]) // try to dispatch to last loaded buffer first bool dispatched = last_loaded->dispatch(batch_command); - // if this was successful, return. + // if this was successful, return. // Maybe we could do something more clever than aborting... if (dispatched) { lyxerr << "We are done!" << endl; @@ -167,11 +167,11 @@ 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()->verboseDispatch(batch_command, false); // fall through... } - + // Let the ball begin... lyxGUI->runTime(); } @@ -180,12 +180,55 @@ LyX::LyX(int * argc, char * argv[]) // A destructor is always necessary (asierra-970604) LyX::~LyX() { - delete lastfiles; - delete lyxGUI; } -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. " + "Please read the bug-reporting instructions " + "in Help->Introduction and send us a bug report, " + "if necessary. 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); + + LyX::emergencyCleanup(); + + lyxerr << "Bye." << endl; + if (err_sig!= SIGHUP && + (!GetEnv("LYXDEBUG").empty() || err_sig == SIGSEGV)) + lyx::abort(); + exit(0); +} + +} + void LyX::init(bool gui) { @@ -200,10 +243,9 @@ void LyX::init(bool gui) // Determine path of binary // - string fullbinpath; string binpath = os::binpath(); string binname = os::binname(); - fullbinpath = binpath; + string fullbinname = MakeAbsPath(binname, binpath); if (binpath.empty()) { lyxerr << _("Warning: could not determine path of binary.") @@ -211,6 +253,7 @@ void LyX::init(bool gui) << _("If you have problems, try starting LyX with an absolute path.") << endl; } + lyxerr[Debug::INIT] << "Name of binary: " << binname << endl; lyxerr[Debug::INIT] << "Path of binary: " << binpath << endl; // @@ -238,36 +281,40 @@ void LyX::init(bool gui) // LYX_DIR_11x environment variable string const lyxdir = GetEnvPath("LYX_DIR_11x"); - + if (!lyxdir.empty()) { lyxerr[Debug::INIT] << "LYX_DIR_11x: " << lyxdir << endl; searchpath += lyxdir + ';'; } - // /TOP_SRCDIR/lib - build_lyxdir = MakeAbsPath("../lib", binpath); - if (!FileSearch(build_lyxdir, "lyxrc.defaults").empty()) { - searchpath += MakeAbsPath(AddPath(TOP_SRCDIR, "lib"), - binpath) + ';'; - lyxerr[Debug::INIT] << "Checking whether LyX is run in " - "place... yes" << endl; - } else { - lyxerr[Debug::INIT] - << "Checking whether LyX is run in place... no" - << endl; - build_lyxdir.erase(); + string fullbinpath = binpath; + FileInfo file(fullbinname, true); + if (file.isLink()) { + lyxerr[Debug::INIT] << "binary is a link" << endl; + string link; + if (LyXReadLink(fullbinname, link)) { + // Path of binary/../share/name of binary/ + searchpath += NormalizePath(AddPath(binpath, + "../share/") + + OnlyFilename(binname)); + searchpath += ';'; + fullbinpath = link; + binpath = MakeAbsPath(OnlyPath(fullbinpath)); + } } - bool followlink; + bool followlink; do { - // Path of binary/../share/name of binary/ - searchpath += NormalizePath(AddPath(binpath, "../share/") + + // Path of binary/../share/name of binary/ + searchpath += NormalizePath(AddPath(binpath, "../share/") + OnlyFilename(binname)) + ';'; - // Follow Symlinks + // Follow Symlinks FileInfo file(fullbinpath, true); followlink = file.isLink(); if (followlink) { + lyxerr << " directory " << fullbinpath + << " is a link" << endl; string link; if (LyXReadLink(fullbinpath, link)) { fullbinpath = link; @@ -279,6 +326,20 @@ void LyX::init(bool gui) } } while (followlink); + // /TOP_SRCDIR/lib + build_lyxdir = MakeAbsPath("../lib", binpath); + if (!FileSearch(build_lyxdir, "lyxrc.defaults").empty()) { + searchpath += MakeAbsPath(AddPath(TOP_SRCDIR, "lib"), + binpath) + ';'; + lyxerr[Debug::INIT] << "Checking whether LyX is run in " + "place... yes" << endl; + } else { + lyxerr[Debug::INIT] + << "Checking whether LyX is run in place... no" + << endl; + build_lyxdir.erase(); + } + // Hardcoded dir searchpath += LYX_DIR; @@ -300,7 +361,7 @@ void LyX::init(bool gui) if (system_lyxdir != NormalizePath(lyxdir)) { lyxerr <<_("LYX_DIR_11x environment variable no good.") << '\n' - << _("System directory set to: ") + << _("System directory set to: ") << system_lyxdir << endl; path_shown = true; } @@ -320,7 +381,7 @@ void LyX::init(bool gui) << "Giving up." << endl; exit(1); } - lyxerr << _("Using built-in default ") + lyxerr << _("Using built-in default ") << LYX_DIR << _(" but expect problems.") << endl; } else { @@ -329,16 +390,15 @@ void LyX::init(bool gui) 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; + << system_lyxdir << '\'' << endl; // // Determine user lyx-dir // - + // Directories are searched in this order: // 1) -userdir command line parameter // 2) LYX_USERDIR_11x environment variable @@ -358,7 +418,7 @@ void LyX::init(bool gui) explicit_userdir = false; } - lyxerr[Debug::INIT] << "User LyX directory: '" + lyxerr[Debug::INIT] << "User LyX directory: '" << user_lyxdir << '\'' << endl; // Check that user LyX directory is ok. We don't do that if @@ -368,30 +428,30 @@ void LyX::init(bool gui) } else { first_start = false; } - + // // Shine up lyxrc defaults // // Default template path: system_dir/templates - if (lyxrc.template_path.empty()){ + if (lyxrc.template_path.empty()) { lyxrc.template_path = AddPath(system_lyxdir, "templates"); } - + // Default lastfiles file: $HOME/.lyx/lastfiles - if (lyxrc.lastfiles.empty()){ + if (lyxrc.lastfiles.empty()) { lyxrc.lastfiles = AddName(user_lyxdir, "lastfiles"); } // Disable gui when either lyxrc or easyparse says so if (!gui) lyxrc.use_gui = false; - - // Calculate screen dpi as average of x-DPI and y-DPI: + + // Calculate screen dpi as average of x-DPI and y-DPI: if (lyxrc.use_gui) { - lyxrc.dpi = getScreenDPI(); + lyxrc.dpi = GUIRunTime::getScreenDPI(); lyxerr[Debug::INIT] << "DPI setting detected to be " - << lyxrc.dpi + 0.5 << endl; + << lyxrc.dpi + 0.5 << endl; } else { lyxrc.dpi = 1; // I hope this is safe } @@ -428,7 +488,7 @@ void LyX::init(bool gui) readUIFile(lyxrc.ui_file); // Bind the X dead keys to the corresponding LyX functions if - // necessary. + // necessary. if (lyxrc.override_x_deadkeys) deadKeyBindings(toplevel_keymap.get()); @@ -436,7 +496,7 @@ void LyX::init(bool gui) lyxrc.print(); } - // Create temp directory + // Create temp directory os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path)); system_tempdir = os::getTmpDir(); if (lyxerr.debugging(Debug::INIT)) { @@ -445,10 +505,10 @@ void LyX::init(bool gui) // load the lastfiles mini-database lyxerr[Debug::INIT] << "Reading lastfiles `" - << lyxrc.lastfiles << "'..." << endl; - lastfiles = new LastFiles(lyxrc.lastfiles, - lyxrc.check_lastfiles, - lyxrc.num_lastfiles); + << lyxrc.lastfiles << "'..." << endl; + lastfiles.reset(new LastFiles(lyxrc.lastfiles, + lyxrc.check_lastfiles, + lyxrc.num_lastfiles)); // start up the lyxserver. (is this a bit early?) (Lgb) // 0.12 this will be way to early, we need the GUI to be initialized @@ -464,21 +524,25 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) kbmap->bind("Left", LFUN_LEFT); kbmap->bind("Up", LFUN_UP); 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); kbmap->bind("Prior", LFUN_PRIOR); kbmap->bind("Next", LFUN_NEXT); - + kbmap->bind("Return", LFUN_BREAKPARAGRAPH); //kbmap->bind("~C-~S-~M-nobreakspace", LFUN_PROTECTEDSPACE); - + kbmap->bind("Delete", LFUN_DELETE); kbmap->bind("BackSpace", LFUN_BACKSPACE); - + + // sub- and superscript -MV + kbmap->bind("~S-underscore", LFUN_SUBSCRIPT); + kbmap->bind("~S-asciicircum", LFUN_SUPERSCRIPT); + // kbmap->bindings to enable the use of the numeric keypad // e.g. Num Lock set //kbmap->bind("KP_0", LFUN_SELFINSERT); @@ -505,13 +569,26 @@ void LyX::defaultKeyBindings(kb_keymap * kbmap) 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("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 } +void LyX::emergencyCleanup() +{ + // what to do about tmpfiles is non-obvious. we would + // like to delete any we find, but our lyxdir might + // contain documents etc. which might be helpful on + // a crash + + bufferlist.emergencyWriteAll(); + if (lyxserver) + lyxserver->emergencyCleanup(); +} + + // LyX can optionally take over the handling of deadkeys void LyX::deadKeyBindings(kb_keymap * kbmap) { @@ -551,11 +628,11 @@ void LyX::queryUserLyXDir(bool explicit_userdir) } else { first_start = !explicit_userdir; } - + // 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."), + !Alert::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; @@ -588,22 +665,22 @@ void LyX::queryUserLyXDir(bool explicit_userdir) bool LyX::readRcFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - + string const lyxrc_path = LibFileSearch(string(), name); - if (!lyxrc_path.empty()){ - lyxerr[Debug::INIT] << "Found " << name + if (!lyxrc_path.empty()) { + lyxerr[Debug::INIT] << "Found " << name << " in " << lyxrc_path << endl; - if (lyxrc.read(lyxrc_path) < 0) { - WriteAlert(_("LyX Warning!"), + if (lyxrc.read(lyxrc_path) < 0) { + Alert::alert(_("LyX Warning!"), _("Error while reading ") + lyxrc_path + ".", _("Using built-in defaults.")); return false; } return true; } else { - lyxerr[Debug::INIT] << "Could not find " << name << endl; + lyxerr[Debug::INIT] << "Could not find " << name << endl; } - + return false; } @@ -623,15 +700,15 @@ void LyX::readUIFile(string const & name) }; lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - + string const ui_path = LibFileSearch("ui", name, "ui"); if (ui_path.empty()) { - lyxerr[Debug::INIT] << "Could not find " << name << endl; + 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); @@ -640,13 +717,13 @@ void LyX::readUIFile(string const & name) 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: + case ui_menuset: menubackend.read(lex); break; @@ -655,7 +732,7 @@ void LyX::readUIFile(string const & name) break; default: - if(!strip(lex.getString()).empty()) + if (!strip(lex.getString()).empty()) lex.printError("LyX::ReadUIFile: " "Unknown menu tag: `$$Token'"); break; @@ -707,7 +784,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" @@ -715,9 +791,9 @@ void commandLineHelp() "\t-userdir dir try to set user directory to dir\n" "\t-sysdir dir try to set system directory to dir\n" "\t-geometry WxH+X+Y set geometry of the main window\n" - "\t-dbg feature[,feature]...\n" - " select the features to debug.\n" - " Type `lyx -dbg' to see the list of features\n" + "\t-dbg feature[,feature]...\n" + " select the features to debug.\n" + " Type `lyx -dbg' to see the list of features\n" "\t-x [--execute] command\n" " where command is a lyx command.\n" "\t-e [--export] fmt\n" @@ -725,9 +801,21 @@ 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_date << endl; + lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl; + + lyxerr << lyx_version_info << endl; +} + + } // namespace anon @@ -749,14 +837,14 @@ bool LyX::easyParse(int * argc, char * argv[]) Debug::showTags(lyxerr); exit(0); } - } + } // 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!") + lyxerr << _("Missing directory for -sysdir switch!") << endl; exit(0); } @@ -776,7 +864,12 @@ bool LyX::easyParse(int * argc, char * argv[]) else if (arg == "--help" || arg == "-help") { 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") { @@ -809,10 +902,10 @@ bool LyX::easyParse(int * argc, char * argv[]) } else if (arg == "-i" || arg == "--import") { if (i + 1 < *argc) { - string type(argv[i+1]); - string file(argv[i+2]); + string const type(argv[i+1]); + string const file(argv[i+2]); removeargs = 3; - + batch_command = "buffer-import " + type + " " + file; lyxerr << "batch_command: " << batch_command << endl; @@ -837,46 +930,3 @@ bool LyX::easyParse(int * argc, char * argv[]) return gui; } - - -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); -}