2002-06-12 03:16:41 +00:00
|
|
|
|
/**
|
2007-04-26 04:41:58 +00:00
|
|
|
|
* \file LyX.cpp
|
2003-08-23 00:17:00 +00:00
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
2002-03-21 17:27:08 +00:00
|
|
|
|
*
|
2003-08-23 00:17:00 +00:00
|
|
|
|
* \author Alfredo Braunstein
|
2003-07-04 08:23:23 +00:00
|
|
|
|
* \author Lars Gullik Bj<EFBFBD>nnes
|
2003-08-23 00:17:00 +00:00
|
|
|
|
* \author Jean-Marc Lasgouttes
|
|
|
|
|
* \author John Levon
|
|
|
|
|
* \author Andr<EFBFBD> P<EFBFBD>nitz
|
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
2002-06-12 03:16:41 +00:00
|
|
|
|
*/
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
|
|
#include <config.h>
|
2001-12-28 13:26:54 +00:00
|
|
|
|
#include <version.h>
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "LyX.h"
|
2002-06-24 20:28:12 +00:00
|
|
|
|
|
2008-03-07 03:53:21 +00:00
|
|
|
|
#include "LayoutFile.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "Buffer.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "BufferList.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "CmdDef.h"
|
|
|
|
|
#include "Color.h"
|
|
|
|
|
#include "ConverterCache.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "Converter.h"
|
2007-09-15 17:24:08 +00:00
|
|
|
|
#include "CutAndPaste.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "Encoding.h"
|
|
|
|
|
#include "ErrorList.h"
|
|
|
|
|
#include "Format.h"
|
2008-03-06 21:50:27 +00:00
|
|
|
|
#include "FuncStatus.h"
|
2007-04-27 08:05:58 +00:00
|
|
|
|
#include "KeyMap.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "Language.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "Lexer.h"
|
2006-10-19 07:20:32 +00:00
|
|
|
|
#include "LyXAction.h"
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "LyXFunc.h"
|
|
|
|
|
#include "LyXRC.h"
|
This is one of a series of patches that will merge the layout modules development in personal/branches/rgheck back into the tree.
Design goal: Allow the use of layout "modules", which are to LaTeX packages as layout files are to LaTeX document classes. Thus, one could have a module that defined certain character styles, environments, commands, or what have you, and include it in various documents, each of which uses a different document class, without having to modify the layout files themselves. For example, a theorems.module could be used with article.layout to provide support for theorem-type environments, without having to modify article.layout itself, and the same module could be used with book.layout, etc.
This patch adds the backend. The ModuleList class holds a list of the available modules, which are retrieved from lyxmodules.lst, itself generated by configure.py. There are two LFUNs available: modules-clear and module-add, which do the obvious thing; you can test by typing these into the minibuffer, along with the name of one of the available modules: URL (a CharStyle), Endnote (a Custom Inset), and---with the spaces---End To Foot (View>LaTeX and look at the user preamble), which are themselves in lib/layouts. There are some others, too, that allow theorems to be added to classes like article and book.
The GUI will come next.
Issues: (i) The configure.py script could be improved. It'd be nice, for example, if it tested for the presence of the LaTeX packages a particular module needs. But this would mean re-working the LaTeX script, and I don't know how to do that. Note that at present, the packages are ignored. This will change shortly. (ii) I've used std::string in LyXModule, following what seemed to be a precedent in TextClass. If some of these should be docstrings, please let me know, and I'll change them. (iii) There is at present no distinction between LaTeX and DocBook modules. Should there be? That is: Should there be modules that are available when the document class is a LaTeX class and others that are available only when it is DocBook? Or should there just be one set of modules? Each module can of course indicate for what it is suitable in its description.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19893 a592a061-630c-0410-9148-cb99ea01b6c8
2007-08-29 17:59:49 +00:00
|
|
|
|
#include "ModuleList.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "Mover.h"
|
2007-04-29 16:22:46 +00:00
|
|
|
|
#include "Server.h"
|
|
|
|
|
#include "ServerSocket.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "Session.h"
|
2003-09-04 03:54:04 +00:00
|
|
|
|
#include "ToolbarBackend.h"
|
2001-12-28 13:26:54 +00:00
|
|
|
|
|
2007-04-28 20:44:46 +00:00
|
|
|
|
#include "frontends/alert.h"
|
2006-09-22 12:34:13 +00:00
|
|
|
|
#include "frontends/Application.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2008-04-10 21:49:34 +00:00
|
|
|
|
#include "support/assert.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "support/debug.h"
|
2005-02-15 13:45:41 +00:00
|
|
|
|
#include "support/environment.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "support/ExceptionMessage.h"
|
2003-09-04 03:54:04 +00:00
|
|
|
|
#include "support/filetools.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "support/gettext.h"
|
2007-11-13 23:50:28 +00:00
|
|
|
|
#include "support/lstrings.h"
|
2007-11-29 07:04:28 +00:00
|
|
|
|
#include "support/Messages.h"
|
2003-09-04 03:54:04 +00:00
|
|
|
|
#include "support/os.h"
|
Rename files in src/support, step one.
src/support/package.h src/support/Package.h Package
src/support/package.C.in src/support/Package.C.in Package
src/support/path.h src/support/Path.h Path
src/support/fs_extras.h src/support/fs_extras.h NOCLASSES
src/support/RandomAccessList.h src/support/RandomAccessList.h RandomAccessList
src/support/lyxmanip.h src/support/lyxmanip.h NOCLASSES
src/support/rename.C src/support/rename.cpp NOCLASSES
src/support/abort.C src/support/abort.cpp NOCLASSES
src/support/lyxlib.h src/support/lyxlib.h NOCLASSES
src/support/ExceptionMessage.h src/support/ExceptionMessage.h ExceptionMessage
src/support/copy.C src/support/copy.cpp NOCLASSES
src/support/limited_stack.h src/support/limited_stack.h limited_stack
src/support/filefilterlist.C src/support/FileFilterList.cpp ['FileFilterList', 'Filter']
src/support/cow_ptr.h src/support/cow_ptr.h cow_ptr
src/support/os_unix.C src/support/os_unix.cpp NOCLASSES
src/support/socktools.h src/support/socktools.h NOCLASSES
src/support/forkedcontr.h src/support/ForkedcallsController.h ForkedcallsController
src/support/os.h src/support/os.h NOCLASSES
src/support/FileMonitor.h src/support/FileMonitor.h FileMonitor
src/support/copied_ptr.h src/support/copied_ptr.h copied_ptr
src/support/translator.h src/support/Translator.h Translator
src/support/filetools.C src/support/filetools.cpp NOCLASSES
src/support/unlink.C src/support/unlink.cpp NOCLASSES
src/support/os_win32.C src/support/os_win32.cpp GetFolderPath
src/support/lstrings.C src/support/lstrings.cpp NOCLASSES
src/support/qstring_helpers.C src/support/qstring_helpers.cpp NOCLASSES
src/support/getcwd.C src/support/getcwd.cpp NOCLASSES
src/support/systemcall.C src/support/Systemcall.cpp Systemcall
src/support/lyxalgo.h src/support/lyxalgo.h NOCLASSES
src/support/filefilterlist.h src/support/FileFilterList.h ['FileFilterList', 'Filter']
src/support/unicode.C src/support/unicode.cpp IconvProcessor
src/support/userinfo.C src/support/userinfo.cpp NOCLASSES
src/support/lyxtime.C src/support/lyxtime.cpp NOCLASSES
src/support/kill.C src/support/kill.cpp NOCLASSES
src/support/docstring.C src/support/docstring.cpp to_local8bit_failure
src/support/os_cygwin.C src/support/os_cygwin.cpp NOCLASSES
src/support/lyxsum.C src/support/lyxsum.cpp NOCLASSES
src/support/environment.C src/support/environment.cpp NOCLASSES
src/support/filetools.h src/support/filetools.h NOCLASSES
src/support/textutils.C src/support/textutils.cpp NOCLASSES
src/support/mkdir.C src/support/mkdir.cpp NOCLASSES
src/support/forkedcall.C src/support/Forkedcall.cpp ['ForkedProcess', 'Forkedcall']
src/support/tempname.C src/support/tempname.cpp NOCLASSES
src/support/os_win32.h src/support/os_win32.h GetFolderPath
src/support/types.h src/support/types.h NOCLASSES
src/support/lstrings.h src/support/lstrings.h NOCLASSES
src/support/forkedcallqueue.C src/support/ForkedCallQueue.cpp ForkedCallQueue
src/support/qstring_helpers.h src/support/qstring_helpers.h NOCLASSES
src/support/convert.C src/support/convert.cpp NOCLASSES
src/support/filename.C src/support/FileName.cpp ['FileName', 'DocFileName']
src/support/tests/convert.C src/support/tests/convert.cpp NOCLASSES
src/support/tests/filetools.C src/support/tests/filetools.cpp NOCLASSES
src/support/tests/lstrings.C src/support/tests/lstrings.cpp NOCLASSES
src/support/tests/boost.C src/support/tests/boost.cpp NOCLASSES
src/support/docstream.C src/support/docstream.cpp ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/std_istream.h src/support/std_istream.h NOCLASSES
src/support/systemcall.h src/support/Systemcall.h Systemcall
src/support/chdir.C src/support/chdir.cpp NOCLASSES
src/support/std_ostream.h src/support/std_ostream.h NOCLASSES
src/support/unicode.h src/support/unicode.h IconvProcessor
src/support/path.C src/support/Path.cpp Path
src/support/fs_extras.C src/support/fs_extras.cpp NOCLASSES
src/support/userinfo.h src/support/userinfo.h NOCLASSES
src/support/lyxtime.h src/support/lyxtime.h NOCLASSES
src/support/docstring.h src/support/docstring.h to_local8bit_failure
src/support/debugstream.h src/support/debugstream.h basic_debugstream
src/support/environment.h src/support/environment.h NOCLASSES
src/support/textutils.h src/support/textutils.h NOCLASSES
src/support/forkedcall.h src/support/Forkedcall.h ['ForkedProcess', 'Forkedcall']
src/support/socktools.C src/support/socktools.cpp NOCLASSES
src/support/forkedcallqueue.h src/support/ForkedCallQueue.h ForkedCallQueue
src/support/forkedcontr.C src/support/ForkedcallsController.cpp ForkedcallsController
src/support/os.C src/support/os.cpp NOCLASSES
src/support/convert.h src/support/convert.h NOCLASSES
src/support/filename.h src/support/FileName.h ['FileName', 'DocFileName']
src/support/docstream.h src/support/docstream.h ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream']
src/support/FileMonitor.C src/support/FileMonitor.cpp FileMonitor
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18024 a592a061-630c-0410-9148-cb99ea01b6c8
2007-04-26 05:12:52 +00:00
|
|
|
|
#include "support/Package.h"
|
|
|
|
|
#include "support/Path.h"
|
|
|
|
|
#include "support/Systemcall.h"
|
2003-09-04 03:54:04 +00:00
|
|
|
|
|
2003-06-20 23:03:43 +00:00
|
|
|
|
#include <boost/bind.hpp>
|
2007-11-07 20:14:30 +00:00
|
|
|
|
#include <boost/scoped_ptr.hpp>
|
2002-08-07 23:43:38 +00:00
|
|
|
|
|
2007-05-04 17:20:53 +00:00
|
|
|
|
#include <algorithm>
|
2003-06-20 23:03:43 +00:00
|
|
|
|
#include <iostream>
|
2003-09-07 21:25:37 +00:00
|
|
|
|
#include <csignal>
|
2007-01-14 10:37:14 +00:00
|
|
|
|
#include <map>
|
2007-12-16 11:46:34 +00:00
|
|
|
|
#include <stdlib.h>
|
2007-01-14 10:37:14 +00:00
|
|
|
|
#include <string>
|
2006-12-04 16:54:32 +00:00
|
|
|
|
#include <vector>
|
2001-12-28 13:26:54 +00:00
|
|
|
|
|
2007-12-12 10:16:00 +00:00
|
|
|
|
using namespace std;
|
2007-12-12 18:57:56 +00:00
|
|
|
|
using namespace lyx::support;
|
2007-08-14 09:54:59 +00:00
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
namespace lyx {
|
|
|
|
|
|
|
|
|
|
namespace Alert = frontend::Alert;
|
|
|
|
|
namespace os = support::os;
|
2004-12-15 19:35:43 +00:00
|
|
|
|
|
2001-05-02 10:47:07 +00:00
|
|
|
|
|
2006-10-12 14:10:13 +00:00
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
// Are we using the GUI at all? We default to true and this is changed
|
|
|
|
|
// to false when the export feature is used.
|
|
|
|
|
|
2006-10-12 14:10:13 +00:00
|
|
|
|
bool use_gui = true;
|
|
|
|
|
|
2003-04-02 18:08:05 +00:00
|
|
|
|
namespace {
|
|
|
|
|
|
2005-01-10 19:17:43 +00:00
|
|
|
|
// Filled with the command line arguments "foo" of "-sysdir foo" or
|
|
|
|
|
// "-userdir foo".
|
|
|
|
|
string cl_system_support;
|
|
|
|
|
string cl_user_support;
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
string geometryArg;
|
2006-11-29 16:45:38 +00:00
|
|
|
|
|
2006-11-18 17:47:12 +00:00
|
|
|
|
LyX * singleton_ = 0;
|
2005-01-10 19:17:43 +00:00
|
|
|
|
|
2003-04-02 18:08:05 +00:00
|
|
|
|
void showFileError(string const & error)
|
|
|
|
|
{
|
2006-09-11 08:54:10 +00:00
|
|
|
|
Alert::warning(_("Could not read configuration file"),
|
|
|
|
|
bformat(_("Error while reading the configuration file\n%1$s.\n"
|
2006-10-21 00:16:43 +00:00
|
|
|
|
"Please check your installation."), from_utf8(error)));
|
2003-04-02 18:08:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2005-01-16 21:01:41 +00:00
|
|
|
|
|
|
|
|
|
void reconfigureUserLyXDir()
|
|
|
|
|
{
|
2006-04-22 11:58:02 +00:00
|
|
|
|
string const configure_command = package().configure_command();
|
2005-01-16 21:01:41 +00:00
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl;
|
2007-12-12 19:57:42 +00:00
|
|
|
|
PathChanger p(package().user_support());
|
2006-05-09 15:41:42 +00:00
|
|
|
|
Systemcall one;
|
|
|
|
|
one.startscript(Systemcall::Wait, configure_command);
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << "LyX: " << to_utf8(_("Done!")) << endl;
|
2005-01-16 21:01:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-10-14 21:30:23 +00:00
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
|
|
|
2006-10-19 07:20:32 +00:00
|
|
|
|
/// The main application class private implementation.
|
2007-11-14 21:36:01 +00:00
|
|
|
|
struct LyX::Impl
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2007-11-14 21:36:01 +00:00
|
|
|
|
Impl()
|
2006-11-18 17:47:12 +00:00
|
|
|
|
{
|
2007-01-17 13:18:16 +00:00
|
|
|
|
// Set the default User Interface language as soon as possible.
|
|
|
|
|
// The language used will be derived from the environment
|
|
|
|
|
// variables.
|
|
|
|
|
messages_["GUI"] = Messages();
|
2006-11-18 17:47:12 +00:00
|
|
|
|
}
|
2006-10-19 07:20:32 +00:00
|
|
|
|
/// our function handler
|
|
|
|
|
LyXFunc lyxfunc_;
|
|
|
|
|
///
|
|
|
|
|
BufferList buffer_list_;
|
|
|
|
|
///
|
2007-11-29 07:41:23 +00:00
|
|
|
|
KeyMap toplevel_keymap_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
///
|
2007-11-29 07:41:23 +00:00
|
|
|
|
CmdDef toplevel_cmddef_;
|
2007-10-20 23:27:03 +00:00
|
|
|
|
///
|
2007-04-29 16:22:46 +00:00
|
|
|
|
boost::scoped_ptr<Server> lyx_server_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
///
|
2007-04-29 16:22:46 +00:00
|
|
|
|
boost::scoped_ptr<ServerSocket> lyx_socket_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
///
|
2006-10-21 00:16:43 +00:00
|
|
|
|
boost::scoped_ptr<frontend::Application> application_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
/// lyx session, containing lastfiles, lastfilepos, and lastopened
|
2006-10-21 00:16:43 +00:00
|
|
|
|
boost::scoped_ptr<Session> session_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
/// Files to load at start.
|
2008-02-06 23:02:57 +00:00
|
|
|
|
vector<string> files_to_load_;
|
2007-01-14 10:37:14 +00:00
|
|
|
|
|
2007-01-17 13:18:16 +00:00
|
|
|
|
/// The messages translators.
|
2007-01-14 10:37:14 +00:00
|
|
|
|
map<string, Messages> messages_;
|
2007-01-17 13:18:16 +00:00
|
|
|
|
|
|
|
|
|
/// The file converters.
|
|
|
|
|
Converters converters_;
|
|
|
|
|
|
|
|
|
|
// The system converters copy after reading lyxrc.defaults.
|
|
|
|
|
Converters system_converters_;
|
2007-05-28 22:27:45 +00:00
|
|
|
|
|
2007-01-18 08:42:53 +00:00
|
|
|
|
///
|
|
|
|
|
Movers movers_;
|
|
|
|
|
///
|
|
|
|
|
Movers system_movers_;
|
2007-11-14 21:36:01 +00:00
|
|
|
|
|
|
|
|
|
/// has this user started lyx for the first time?
|
|
|
|
|
bool first_start;
|
|
|
|
|
/// the parsed command line batch command if any
|
2007-12-12 19:28:07 +00:00
|
|
|
|
string batch_command;
|
2006-11-18 17:47:12 +00:00
|
|
|
|
};
|
2006-10-19 07:20:32 +00:00
|
|
|
|
|
2006-11-30 00:04:51 +00:00
|
|
|
|
///
|
|
|
|
|
frontend::Application * theApp()
|
|
|
|
|
{
|
|
|
|
|
if (singleton_)
|
2007-01-23 12:38:20 +00:00
|
|
|
|
return singleton_->pimpl_->application_.get();
|
2006-11-30 00:04:51 +00:00
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2003-10-14 21:30:23 +00:00
|
|
|
|
|
2006-11-17 15:24:26 +00:00
|
|
|
|
LyX::~LyX()
|
|
|
|
|
{
|
2007-11-07 20:14:30 +00:00
|
|
|
|
delete pimpl_;
|
2006-11-17 15:24:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-12-16 11:34:29 +00:00
|
|
|
|
|
|
|
|
|
void LyX::exit(int exit_code) const
|
|
|
|
|
{
|
|
|
|
|
if (exit_code)
|
|
|
|
|
// Something wrong happened so better save everything, just in
|
|
|
|
|
// case.
|
|
|
|
|
emergencyCleanup();
|
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
|
// Properly crash in debug mode in order to get a useful backtrace.
|
|
|
|
|
abort();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// In release mode, try to exit gracefully.
|
|
|
|
|
if (theApp())
|
|
|
|
|
theApp()->exit(exit_code);
|
|
|
|
|
else
|
|
|
|
|
exit(exit_code);
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-19 07:20:32 +00:00
|
|
|
|
|
2003-10-14 21:30:23 +00:00
|
|
|
|
LyX & LyX::ref()
|
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(singleton_, /**/);
|
2006-11-18 17:47:12 +00:00
|
|
|
|
return *singleton_;
|
2003-10-14 21:30:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LyX const & LyX::cref()
|
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(singleton_, /**/);
|
2006-11-18 17:47:12 +00:00
|
|
|
|
return *singleton_;
|
2003-10-14 21:30:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LyX::LyX()
|
2006-11-29 16:45:38 +00:00
|
|
|
|
: first_start(false)
|
2006-10-11 22:30:31 +00:00
|
|
|
|
{
|
2006-11-18 17:47:12 +00:00
|
|
|
|
singleton_ = this;
|
2007-11-14 21:36:01 +00:00
|
|
|
|
pimpl_ = new Impl;
|
2006-10-11 22:30:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BufferList & LyX::bufferList()
|
|
|
|
|
{
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return pimpl_->buffer_list_;
|
2006-10-11 22:30:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BufferList const & LyX::bufferList() const
|
|
|
|
|
{
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return pimpl_->buffer_list_;
|
2006-10-11 22:30:31 +00:00
|
|
|
|
}
|
2003-10-14 21:30:23 +00:00
|
|
|
|
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
Session & LyX::session()
|
2003-10-14 21:30:23 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->session_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->session_.get();
|
2003-10-14 21:30:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
Session const & LyX::session() const
|
2003-10-14 21:30:23 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->session_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->session_.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LyXFunc & LyX::lyxFunc()
|
|
|
|
|
{
|
|
|
|
|
return pimpl_->lyxfunc_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LyXFunc const & LyX::lyxFunc() const
|
|
|
|
|
{
|
|
|
|
|
return pimpl_->lyxfunc_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 16:22:46 +00:00
|
|
|
|
Server & LyX::server()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->lyx_server_.get(), /**/);
|
2007-05-28 22:27:45 +00:00
|
|
|
|
return *pimpl_->lyx_server_.get();
|
2006-10-19 07:20:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-05-28 22:27:45 +00:00
|
|
|
|
Server const & LyX::server() const
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->lyx_server_.get(), /**/);
|
2007-05-28 22:27:45 +00:00
|
|
|
|
return *pimpl_->lyx_server_.get();
|
2006-10-19 07:20:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 16:22:46 +00:00
|
|
|
|
ServerSocket & LyX::socket()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->lyx_socket_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->lyx_socket_.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 16:22:46 +00:00
|
|
|
|
ServerSocket const & LyX::socket() const
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->lyx_socket_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->lyx_socket_.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
frontend::Application & LyX::application()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->application_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->application_.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
frontend::Application const & LyX::application() const
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->application_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return *pimpl_->application_.get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-10-20 23:27:03 +00:00
|
|
|
|
CmdDef & LyX::topLevelCmdDef()
|
|
|
|
|
{
|
2007-11-29 07:41:23 +00:00
|
|
|
|
return pimpl_->toplevel_cmddef_;
|
2007-10-20 23:27:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-01-17 13:18:16 +00:00
|
|
|
|
Converters & LyX::converters()
|
|
|
|
|
{
|
|
|
|
|
return pimpl_->converters_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Converters & LyX::systemConverters()
|
|
|
|
|
{
|
|
|
|
|
return pimpl_->system_converters_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
Messages & LyX::getMessages(string const & language)
|
2007-01-14 10:37:14 +00:00
|
|
|
|
{
|
|
|
|
|
map<string, Messages>::iterator it = pimpl_->messages_.find(language);
|
|
|
|
|
|
|
|
|
|
if (it != pimpl_->messages_.end())
|
|
|
|
|
return it->second;
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
pair<map<string, Messages>::iterator, bool> result =
|
|
|
|
|
pimpl_->messages_.insert(make_pair(language, Messages(language)));
|
2007-01-14 10:37:14 +00:00
|
|
|
|
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(result.second, /**/);
|
2007-01-14 10:37:14 +00:00
|
|
|
|
return result.first->second;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Messages & LyX::getGuiMessages()
|
|
|
|
|
{
|
|
|
|
|
return pimpl_->messages_["GUI"];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
void LyX::setGuiLanguage(string const & language)
|
2007-01-14 10:37:14 +00:00
|
|
|
|
{
|
|
|
|
|
pimpl_->messages_["GUI"] = Messages(language);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-11-18 17:47:12 +00:00
|
|
|
|
int LyX::exec(int & argc, char * argv[])
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
|
|
|
|
// Here we need to parse the command line. At least
|
|
|
|
|
// we need to parse for "-dbg" and "-help"
|
2006-10-12 14:10:13 +00:00
|
|
|
|
easyParse(argc, argv);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-10-03 11:00:18 +00:00
|
|
|
|
try {
|
2007-12-12 19:57:42 +00:00
|
|
|
|
init_package(to_utf8(from_local8bit(argv[0])),
|
2007-05-28 22:27:45 +00:00
|
|
|
|
cl_system_support, cl_user_support,
|
2007-12-12 19:57:42 +00:00
|
|
|
|
top_build_dir_is_one_level_up);
|
|
|
|
|
} catch (ExceptionMessage const & message) {
|
|
|
|
|
if (message.type_ == ErrorException) {
|
2007-01-24 15:49:20 +00:00
|
|
|
|
Alert::error(message.title_, message.details_);
|
|
|
|
|
exit(1);
|
2007-12-12 19:57:42 +00:00
|
|
|
|
} else if (message.type_ == WarningException) {
|
2007-01-24 15:49:20 +00:00
|
|
|
|
Alert::warning(message.title_, message.details_);
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-01-10 19:17:43 +00:00
|
|
|
|
|
2007-08-07 22:24:47 +00:00
|
|
|
|
// Reinit the messages machinery in case package() knows
|
|
|
|
|
// something interesting about the locale directory.
|
|
|
|
|
Messages::init();
|
|
|
|
|
|
2006-11-24 11:18:56 +00:00
|
|
|
|
if (!use_gui) {
|
|
|
|
|
// FIXME: create a ConsoleApplication
|
2006-12-04 16:54:32 +00:00
|
|
|
|
int exit_status = init(argc, argv);
|
2006-11-26 15:47:45 +00:00
|
|
|
|
if (exit_status) {
|
|
|
|
|
prepareExit();
|
2006-11-26 02:18:32 +00:00
|
|
|
|
return exit_status;
|
2006-11-26 15:47:45 +00:00
|
|
|
|
}
|
2006-11-26 16:39:39 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
loadFiles();
|
|
|
|
|
|
2007-11-14 21:36:01 +00:00
|
|
|
|
if (pimpl_->batch_command.empty() || pimpl_->buffer_list_.empty()) {
|
2006-11-26 15:47:45 +00:00
|
|
|
|
prepareExit();
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-26 16:39:39 +00:00
|
|
|
|
BufferList::iterator begin = pimpl_->buffer_list_.begin();
|
|
|
|
|
|
|
|
|
|
bool final_success = false;
|
2007-08-21 07:33:46 +00:00
|
|
|
|
for (BufferList::iterator I = begin; I != pimpl_->buffer_list_.end(); ++I) {
|
2006-11-26 16:39:39 +00:00
|
|
|
|
Buffer * buf = *I;
|
2007-10-20 10:03:45 +00:00
|
|
|
|
if (buf != buf->masterBuffer())
|
2007-08-21 07:33:46 +00:00
|
|
|
|
continue;
|
2006-11-26 16:39:39 +00:00
|
|
|
|
bool success = false;
|
2007-11-14 21:36:01 +00:00
|
|
|
|
buf->dispatch(pimpl_->batch_command, &success);
|
2007-05-28 22:27:45 +00:00
|
|
|
|
final_success |= success;
|
2006-11-26 16:39:39 +00:00
|
|
|
|
}
|
2006-11-26 15:47:45 +00:00
|
|
|
|
prepareExit();
|
2006-11-26 16:39:39 +00:00
|
|
|
|
return !final_success;
|
2006-11-24 11:18:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Let the frontend parse and remove all arguments that it knows
|
|
|
|
|
pimpl_->application_.reset(createApplication(argc, argv));
|
2006-11-26 02:18:32 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
// Parse and remove all known arguments in the LyX singleton
|
|
|
|
|
// Give an error for all remaining ones.
|
|
|
|
|
int exit_status = init(argc, argv);
|
|
|
|
|
if (exit_status) {
|
|
|
|
|
// Kill the application object before exiting.
|
|
|
|
|
pimpl_->application_.reset();
|
|
|
|
|
use_gui = false;
|
|
|
|
|
prepareExit();
|
|
|
|
|
return exit_status;
|
|
|
|
|
}
|
|
|
|
|
|
2006-12-13 05:29:19 +00:00
|
|
|
|
// FIXME
|
|
|
|
|
/* Create a CoreApplication class that will provide the main event loop
|
|
|
|
|
* and the socket callback registering. With Qt4, only QtCore
|
|
|
|
|
* library would be needed.
|
|
|
|
|
* When this is done, a server_mode could be created and the following two
|
|
|
|
|
* line would be moved out from here.
|
|
|
|
|
*/
|
|
|
|
|
// Note: socket callback must be registered after init(argc, argv)
|
|
|
|
|
// such that package().temp_dir() is properly initialized.
|
2007-04-29 16:22:46 +00:00
|
|
|
|
pimpl_->lyx_server_.reset(new Server(&pimpl_->lyxfunc_, lyxrc.lyxpipes));
|
2007-05-28 22:27:45 +00:00
|
|
|
|
pimpl_->lyx_socket_.reset(new ServerSocket(&pimpl_->lyxfunc_,
|
2007-04-06 17:38:11 +00:00
|
|
|
|
FileName(package().temp_dir().absFilename() + "/lyxsocket")));
|
2006-12-13 05:29:19 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
// Start the real execution loop.
|
2006-11-26 02:18:32 +00:00
|
|
|
|
exit_status = pimpl_->application_->exec();
|
2007-05-28 22:27:45 +00:00
|
|
|
|
|
2006-12-02 17:39:31 +00:00
|
|
|
|
prepareExit();
|
2006-11-29 21:57:46 +00:00
|
|
|
|
|
2006-10-17 08:36:04 +00:00
|
|
|
|
return exit_status;
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-13 19:45:10 +00:00
|
|
|
|
|
2006-10-17 08:36:04 +00:00
|
|
|
|
void LyX::prepareExit()
|
|
|
|
|
{
|
2007-09-15 17:24:08 +00:00
|
|
|
|
// Clear the clipboard and selection stack:
|
|
|
|
|
cap::clearCutStack();
|
|
|
|
|
cap::clearSelection();
|
|
|
|
|
|
2006-10-17 08:36:04 +00:00
|
|
|
|
// close buffers first
|
2006-10-19 07:20:32 +00:00
|
|
|
|
pimpl_->buffer_list_.closeAll();
|
2006-10-17 08:36:04 +00:00
|
|
|
|
|
2007-12-06 18:52:17 +00:00
|
|
|
|
// register session changes and shutdown server and socket
|
|
|
|
|
if (use_gui) {
|
|
|
|
|
if (pimpl_->session_)
|
|
|
|
|
pimpl_->session_->writeFile();
|
|
|
|
|
pimpl_->session_.reset();
|
|
|
|
|
pimpl_->lyx_server_.reset();
|
|
|
|
|
pimpl_->lyx_socket_.reset();
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-17 08:36:04 +00:00
|
|
|
|
// do any other cleanup procedures now
|
2006-12-17 21:52:40 +00:00
|
|
|
|
if (package().temp_dir() != package().system_temp_dir()) {
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INFO, "Deleting tmp dir "
|
|
|
|
|
<< package().temp_dir().absFilename());
|
2006-12-13 05:29:19 +00:00
|
|
|
|
|
2007-10-20 17:35:27 +00:00
|
|
|
|
if (!package().temp_dir().destroyDirectory()) {
|
2006-12-13 05:29:19 +00:00
|
|
|
|
docstring const msg =
|
|
|
|
|
bformat(_("Unable to remove the temporary directory %1$s"),
|
2007-04-06 13:09:54 +00:00
|
|
|
|
from_utf8(package().temp_dir().absFilename()));
|
2006-12-13 05:29:19 +00:00
|
|
|
|
Alert::warning(_("Unable to remove temporary directory"), msg);
|
|
|
|
|
}
|
2006-10-17 08:36:04 +00:00
|
|
|
|
}
|
2006-12-02 17:39:31 +00:00
|
|
|
|
|
2006-12-02 21:27:31 +00:00
|
|
|
|
// Kill the application object before exiting. This avoids crashes
|
|
|
|
|
// when exiting on Linux.
|
2006-12-02 17:39:31 +00:00
|
|
|
|
if (pimpl_->application_)
|
|
|
|
|
pimpl_->application_.reset();
|
2006-06-07 20:08:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2006-10-17 08:36:04 +00:00
|
|
|
|
void LyX::earlyExit(int status)
|
|
|
|
|
{
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(pimpl_->application_.get(), /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
// LyX::pimpl_::application_ is not initialised at this
|
2006-10-17 08:36:04 +00:00
|
|
|
|
// point so it's safe to just exit after some cleanup.
|
|
|
|
|
prepareExit();
|
|
|
|
|
exit(status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
int LyX::init(int & argc, char * argv[])
|
2006-06-07 20:08:37 +00:00
|
|
|
|
{
|
2006-11-24 11:18:56 +00:00
|
|
|
|
// check for any spurious extra arguments
|
|
|
|
|
// other than documents
|
|
|
|
|
for (int argi = 1; argi < argc ; ++argi) {
|
|
|
|
|
if (argv[argi][0] == '-') {
|
|
|
|
|
lyxerr << to_utf8(
|
|
|
|
|
bformat(_("Wrong command line option `%1$s'. Exiting."),
|
|
|
|
|
from_utf8(argv[argi]))) << endl;
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
// Initialization of LyX (reads lyxrc and more)
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Initializing LyX::init...");
|
2006-10-17 08:36:04 +00:00
|
|
|
|
bool success = init();
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Initializing LyX::init...done");
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (!success)
|
|
|
|
|
return EXIT_FAILURE;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
// Remaining arguments are assumed to be files to load.
|
|
|
|
|
for (int argi = argc - 1; argi >= 1; --argi)
|
|
|
|
|
pimpl_->files_to_load_.push_back(to_utf8(from_local8bit(argv[argi])));
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
if (first_start) {
|
|
|
|
|
pimpl_->files_to_load_.push_back(
|
|
|
|
|
i18nLibFileSearch("examples", "splash.lyx").absFilename());
|
|
|
|
|
}
|
2002-06-24 20:28:12 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
|
}
|
2006-11-26 02:18:32 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
void LyX::addFileToLoad(string const & fname)
|
2007-05-04 17:20:53 +00:00
|
|
|
|
{
|
2008-02-06 23:02:57 +00:00
|
|
|
|
vector<string>::const_iterator cit = find(
|
2007-05-04 17:20:53 +00:00
|
|
|
|
pimpl_->files_to_load_.begin(), pimpl_->files_to_load_.end(),
|
|
|
|
|
fname);
|
|
|
|
|
|
|
|
|
|
if (cit == pimpl_->files_to_load_.end())
|
|
|
|
|
pimpl_->files_to_load_.push_back(fname);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
void LyX::loadFiles()
|
|
|
|
|
{
|
2008-02-06 23:02:57 +00:00
|
|
|
|
vector<string>::const_iterator it = pimpl_->files_to_load_.begin();
|
|
|
|
|
vector<string>::const_iterator end = pimpl_->files_to_load_.end();
|
2002-08-06 14:40:13 +00:00
|
|
|
|
|
2006-11-26 02:18:32 +00:00
|
|
|
|
for (; it != end; ++it) {
|
2008-02-06 23:02:57 +00:00
|
|
|
|
// get absolute path of file and add ".lyx" to
|
|
|
|
|
// the filename if necessary
|
|
|
|
|
FileName fname = fileSearch(string(), os::internal_path(*it), "lyx",
|
|
|
|
|
may_not_exist);
|
|
|
|
|
|
|
|
|
|
if (fname.empty())
|
2006-12-04 16:54:32 +00:00
|
|
|
|
continue;
|
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFilename(), false);
|
|
|
|
|
if (buf->loadLyXFile(fname)) {
|
2006-12-04 16:54:32 +00:00
|
|
|
|
ErrorList const & el = buf->errorList("Parse");
|
|
|
|
|
if (!el.empty())
|
|
|
|
|
for_each(el.begin(), el.end(),
|
|
|
|
|
boost::bind(&LyX::printError, this, _1));
|
2003-09-09 18:27:24 +00:00
|
|
|
|
}
|
2006-12-04 16:54:32 +00:00
|
|
|
|
else
|
|
|
|
|
pimpl_->buffer_list_.release(buf);
|
1999-12-10 00:07:59 +00:00
|
|
|
|
}
|
2006-10-17 08:36:04 +00:00
|
|
|
|
}
|
2006-06-21 10:30:32 +00:00
|
|
|
|
|
|
|
|
|
|
2006-11-26 02:18:32 +00:00
|
|
|
|
void LyX::execBatchCommands()
|
|
|
|
|
{
|
2006-12-04 16:54:32 +00:00
|
|
|
|
// The advantage of doing this here is that the event loop
|
|
|
|
|
// is already started. So any need for interaction will be
|
|
|
|
|
// aknowledged.
|
|
|
|
|
|
2007-09-26 19:36:09 +00:00
|
|
|
|
// if reconfiguration is needed.
|
2008-03-07 03:53:21 +00:00
|
|
|
|
while (LayoutFileList::get().empty()) {
|
2007-09-26 19:36:09 +00:00
|
|
|
|
switch (Alert::prompt(
|
|
|
|
|
_("No textclass is found"),
|
2007-09-27 01:05:20 +00:00
|
|
|
|
_("LyX cannot continue because no textclass is found. "
|
2007-09-26 19:36:09 +00:00
|
|
|
|
"You can either reconfigure normally, or reconfigure using "
|
2007-09-27 06:30:12 +00:00
|
|
|
|
"default textclasses, or quit LyX."),
|
2007-09-26 19:36:09 +00:00
|
|
|
|
0, 2,
|
|
|
|
|
_("&Reconfigure"),
|
|
|
|
|
_("&Use Default"),
|
|
|
|
|
_("&Exit LyX")))
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
// regular reconfigure
|
|
|
|
|
pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE, ""));
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
// reconfigure --without-latex-config
|
|
|
|
|
pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE,
|
|
|
|
|
" --without-latex-config"));
|
|
|
|
|
break;
|
2008-02-06 23:02:57 +00:00
|
|
|
|
default:
|
|
|
|
|
pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT));
|
|
|
|
|
return;
|
2007-09-26 19:36:09 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
// create the first main window
|
2007-11-24 08:51:11 +00:00
|
|
|
|
pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg));
|
2006-10-21 09:45:11 +00:00
|
|
|
|
|
2006-12-04 16:54:32 +00:00
|
|
|
|
if (!pimpl_->files_to_load_.empty()) {
|
2008-02-06 23:02:57 +00:00
|
|
|
|
// if some files were specified at command-line we assume that the
|
|
|
|
|
// user wants to edit *these* files and not to restore the session.
|
|
|
|
|
for (size_t i = 0; i != pimpl_->files_to_load_.size(); ++i) {
|
|
|
|
|
pimpl_->lyxfunc_.dispatch(
|
|
|
|
|
FuncRequest(LFUN_FILE_OPEN, pimpl_->files_to_load_[i]));
|
|
|
|
|
}
|
2006-12-04 16:54:32 +00:00
|
|
|
|
// clear this list to save a few bytes of RAM
|
|
|
|
|
pimpl_->files_to_load_.clear();
|
2007-08-21 07:33:46 +00:00
|
|
|
|
}
|
2008-02-06 23:02:57 +00:00
|
|
|
|
else
|
|
|
|
|
pimpl_->application_->restoreGuiSession();
|
2007-08-21 07:33:46 +00:00
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
// Execute batch commands if available
|
|
|
|
|
if (pimpl_->batch_command.empty())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
LYXERR(Debug::INIT, "About to handle -x '" << pimpl_->batch_command << '\'');
|
|
|
|
|
|
|
|
|
|
pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(pimpl_->batch_command));
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2008-02-06 23:02:57 +00:00
|
|
|
|
|
2005-01-19 14:17:36 +00:00
|
|
|
|
/*
|
|
|
|
|
Signals and Windows
|
|
|
|
|
===================
|
|
|
|
|
The SIGHUP signal does not exist on Windows and does not need to be handled.
|
|
|
|
|
|
|
|
|
|
Windows handles SIGFPE and SIGSEGV signals as expected.
|
|
|
|
|
|
|
|
|
|
Cntl+C interrupts (mapped to SIGINT by Windows' POSIX compatability layer)
|
|
|
|
|
cause a new thread to be spawned. This may well result in unexpected
|
|
|
|
|
behaviour by the single-threaded LyX.
|
|
|
|
|
|
|
|
|
|
SIGTERM signals will come only from another process actually sending
|
|
|
|
|
that signal using 'raise' in Windows' POSIX compatability layer. It will
|
|
|
|
|
not come from the general "terminate process" methods that everyone
|
|
|
|
|
actually uses (and which can't be trapped). Killing an app 'politely' on
|
|
|
|
|
Windows involves first sending a WM_CLOSE message, something that is
|
|
|
|
|
caught already by the Qt frontend.
|
|
|
|
|
|
|
|
|
|
For more information see:
|
|
|
|
|
|
|
|
|
|
http://aspn.activestate.com/ASPN/Mail/Message/ActiveTcl/2034055
|
|
|
|
|
...signals are mostly useless on Windows for a variety of reasons that are
|
|
|
|
|
Windows specific...
|
|
|
|
|
|
|
|
|
|
'UNIX Application Migration Guide, Chapter 9'
|
|
|
|
|
http://msdn.microsoft.com/library/en-us/dnucmg/html/UCMGch09.asp
|
|
|
|
|
|
|
|
|
|
'How To Terminate an Application "Cleanly" in Win32'
|
|
|
|
|
http://support.microsoft.com/default.aspx?scid=kb;en-us;178893
|
|
|
|
|
*/
|
2001-09-09 22:02:19 +00:00
|
|
|
|
extern "C" {
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
static void error_handler(int err_sig)
|
2001-09-09 22:02:19 +00:00
|
|
|
|
{
|
2004-03-22 13:09:59 +00:00
|
|
|
|
// Throw away any signals other than the first one received.
|
|
|
|
|
static sig_atomic_t handling_error = false;
|
|
|
|
|
if (handling_error)
|
|
|
|
|
return;
|
|
|
|
|
handling_error = true;
|
|
|
|
|
|
|
|
|
|
// We have received a signal indicating a fatal error, so
|
|
|
|
|
// try and save the data ASAP.
|
|
|
|
|
LyX::cref().emergencyCleanup();
|
|
|
|
|
|
|
|
|
|
// These lyxerr calls may or may not work:
|
|
|
|
|
|
|
|
|
|
// Signals are asynchronous, so the main program may be in a very
|
|
|
|
|
// fragile state when a signal is processed and thus while a signal
|
|
|
|
|
// handler function executes.
|
|
|
|
|
// In general, therefore, we should avoid performing any
|
|
|
|
|
// I/O operations or calling most library and system functions from
|
|
|
|
|
// signal handlers.
|
|
|
|
|
|
|
|
|
|
// This shouldn't matter here, however, as we've already invoked
|
|
|
|
|
// emergencyCleanup.
|
2001-09-09 22:02:19 +00:00
|
|
|
|
switch (err_sig) {
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#ifdef SIGHUP
|
2001-09-09 22:02:19 +00:00
|
|
|
|
case SIGHUP:
|
2004-03-22 13:09:59 +00:00
|
|
|
|
lyxerr << "\nlyx: SIGHUP signal caught\nBye." << endl;
|
2001-09-09 22:02:19 +00:00
|
|
|
|
break;
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#endif
|
2001-09-09 22:02:19 +00:00
|
|
|
|
case SIGFPE:
|
2004-03-22 13:09:59 +00:00
|
|
|
|
lyxerr << "\nlyx: SIGFPE signal caught\nBye." << endl;
|
2001-09-09 22:02:19 +00:00
|
|
|
|
break;
|
|
|
|
|
case SIGSEGV:
|
2004-03-22 13:09:59 +00:00
|
|
|
|
lyxerr << "\nlyx: SIGSEGV signal caught\n"
|
2006-04-05 23:56:29 +00:00
|
|
|
|
"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 !\nBye." << endl;
|
2001-09-09 22:02:19 +00:00
|
|
|
|
break;
|
2004-03-22 13:09:59 +00:00
|
|
|
|
case SIGINT:
|
2001-09-09 22:02:19 +00:00
|
|
|
|
case SIGTERM:
|
|
|
|
|
// no comments
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2001-09-09 22:02:19 +00:00
|
|
|
|
// Deinstall the signal handlers
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#ifdef SIGHUP
|
2001-09-09 22:02:19 +00:00
|
|
|
|
signal(SIGHUP, SIG_DFL);
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#endif
|
2001-09-09 22:02:19 +00:00
|
|
|
|
signal(SIGINT, SIG_DFL);
|
|
|
|
|
signal(SIGFPE, SIG_DFL);
|
|
|
|
|
signal(SIGSEGV, SIG_DFL);
|
|
|
|
|
signal(SIGTERM, SIG_DFL);
|
|
|
|
|
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#ifdef SIGHUP
|
2004-03-22 13:09:59 +00:00
|
|
|
|
if (err_sig == SIGSEGV ||
|
2005-02-15 13:45:41 +00:00
|
|
|
|
(err_sig != SIGHUP && !getEnv("LYXDEBUG").empty()))
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#else
|
2005-02-15 13:45:41 +00:00
|
|
|
|
if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty())
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#endif
|
2007-12-16 11:34:29 +00:00
|
|
|
|
abort();
|
2001-09-09 22:02:19 +00:00
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2003-06-20 23:03:43 +00:00
|
|
|
|
void LyX::printError(ErrorItem const & ei)
|
|
|
|
|
{
|
2006-10-21 00:16:43 +00:00
|
|
|
|
docstring tmp = _("LyX: ") + ei.error + char_type(':')
|
2006-09-11 08:54:10 +00:00
|
|
|
|
+ ei.description;
|
2007-12-12 19:28:07 +00:00
|
|
|
|
cerr << to_utf8(tmp) << endl;
|
2003-06-20 23:03:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-07-05 17:01:26 +00:00
|
|
|
|
bool LyX::init()
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#ifdef SIGHUP
|
2000-05-21 18:40:10 +00:00
|
|
|
|
signal(SIGHUP, error_handler);
|
2005-01-19 14:17:36 +00:00
|
|
|
|
#endif
|
2000-05-21 18:40:10 +00:00
|
|
|
|
signal(SIGFPE, error_handler);
|
|
|
|
|
signal(SIGSEGV, error_handler);
|
|
|
|
|
signal(SIGINT, error_handler);
|
|
|
|
|
signal(SIGTERM, error_handler);
|
2004-03-22 13:09:59 +00:00
|
|
|
|
// SIGPIPE can be safely ignored.
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-04-06 13:09:54 +00:00
|
|
|
|
lyxrc.tempdir_path = package().temp_dir().absFilename();
|
|
|
|
|
lyxrc.document_path = package().document_dir().absFilename();
|
2005-01-12 10:30:46 +00:00
|
|
|
|
|
2007-11-25 18:26:58 +00:00
|
|
|
|
if (lyxrc.example_path.empty()) {
|
|
|
|
|
lyxrc.example_path = addPath(package().system_support().absFilename(),
|
|
|
|
|
"examples");
|
|
|
|
|
}
|
2001-12-28 13:26:54 +00:00
|
|
|
|
if (lyxrc.template_path.empty()) {
|
2007-04-06 13:09:54 +00:00
|
|
|
|
lyxrc.template_path = addPath(package().system_support().absFilename(),
|
2005-01-10 19:17:43 +00:00
|
|
|
|
"templates");
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
//
|
|
|
|
|
// Read configuration files
|
|
|
|
|
//
|
|
|
|
|
|
2006-05-02 12:53:48 +00:00
|
|
|
|
// This one may have been distributed along with LyX.
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (!readRcFile("lyxrc.dist"))
|
|
|
|
|
return false;
|
2006-05-09 15:41:42 +00:00
|
|
|
|
|
2007-01-17 13:18:16 +00:00
|
|
|
|
// Set the language defined by the distributor.
|
|
|
|
|
//setGuiLanguage(lyxrc.gui_language);
|
2007-01-14 11:31:30 +00:00
|
|
|
|
|
2006-05-09 15:41:42 +00:00
|
|
|
|
// Set the PATH correctly.
|
|
|
|
|
#if !defined (USE_POSIX_PACKAGING)
|
|
|
|
|
// Add the directory containing the LyX executable to the path
|
|
|
|
|
// so that LyX can find things like tex2lyx.
|
|
|
|
|
if (package().build_support().empty())
|
2007-04-06 13:09:54 +00:00
|
|
|
|
prependEnvPath("PATH", package().binary_dir().absFilename());
|
2006-05-09 15:41:42 +00:00
|
|
|
|
#endif
|
|
|
|
|
if (!lyxrc.path_prefix.empty())
|
|
|
|
|
prependEnvPath("PATH", lyxrc.path_prefix);
|
|
|
|
|
|
2006-09-09 15:27:44 +00:00
|
|
|
|
// Check that user LyX directory is ok.
|
2006-08-11 22:11:33 +00:00
|
|
|
|
if (queryUserLyXDir(package().explicit_user_support()))
|
|
|
|
|
reconfigureUserLyXDir();
|
|
|
|
|
|
|
|
|
|
// no need for a splash when there is no GUI
|
2006-10-21 00:16:43 +00:00
|
|
|
|
if (!use_gui) {
|
2006-05-09 15:41:42 +00:00
|
|
|
|
first_start = false;
|
|
|
|
|
}
|
|
|
|
|
|
2006-05-02 12:53:48 +00:00
|
|
|
|
// This one is generated in user_support directory by lib/configure.py.
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (!readRcFile("lyxrc.defaults"))
|
|
|
|
|
return false;
|
2006-05-02 12:53:48 +00:00
|
|
|
|
|
2006-05-17 22:13:33 +00:00
|
|
|
|
// Query the OS to know what formats are viewed natively
|
|
|
|
|
formats.setAutoOpen();
|
|
|
|
|
|
2006-10-23 18:01:31 +00:00
|
|
|
|
// Read lyxrc.dist again to be able to override viewer auto-detection.
|
|
|
|
|
readRcFile("lyxrc.dist");
|
|
|
|
|
|
2000-10-10 14:17:33 +00:00
|
|
|
|
system_lyxrc = lyxrc;
|
2000-11-06 11:20:22 +00:00
|
|
|
|
system_formats = formats;
|
2007-01-17 13:18:16 +00:00
|
|
|
|
pimpl_->system_converters_ = pimpl_->converters_;
|
2007-01-18 08:42:53 +00:00
|
|
|
|
pimpl_->system_movers_ = pimpl_->movers_;
|
2000-11-15 18:02:45 +00:00
|
|
|
|
system_lcolor = lcolor;
|
2000-11-06 11:20:22 +00:00
|
|
|
|
|
2006-05-02 12:53:48 +00:00
|
|
|
|
// This one is edited through the preferences dialog.
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (!readRcFile("preferences"))
|
|
|
|
|
return false;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
Add machinery to output arbitrary unicode characters with LaTeX commands
read from a text file.
* src/encoding.[Ch]
(Encoding::latexChar): New, output a character to LaTeX
(Encoding::validate): New, add needed preamble stuff for a character
(Encodings::read): Read new unicodesymbols file
(Encodings::isCombiningChar): New, is a character a combining char?
* src/paragraph_pimpl.C
(isEncoding): Delete, no longer needed
(getEncoding): New, get the real encoding of a font
(Paragraph::Pimpl::latexSurrogatePair): New, output a surrogate pair
to LaTeX
(Paragraph::Pimpl::simpleTeXBlanks): Use latexSurrogatePair if needed
(Paragraph::Pimpl::simpleTeXSpecialChars): Ditto, and replace several
hardcoded characters with a call of encoding.latexChar()
(Paragraph::Pimpl::validate): replace several hardcoded characters
with a call of encoding.validate()
* src/support/debugstream.h
(basic_debugstream::disable): New, disable the stream completely
(basic_debugstream::enable): New, reenable the stream
* src/lyx_main.[Ch]: Adjust to changes above
* src/paragraph.C: Ditto
* lib/unicodesymbols: New file with UCS4 -> LaTeX command mapping.
It is far from complete yet, but contains most accents on latin
characters.
* lib/Makefile.am: add lib/unicodesymbols
* development/scons/scons_manifest.py: ditto
* development/tools/unicodesymbols.py: Helper script to update
lib/unicodesymbols with new symbols
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16920 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-28 21:27:45 +00:00
|
|
|
|
if (!readEncodingsFile("encodings", "unicodesymbols"))
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
|
|
|
|
if (!readLanguagesFile("languages"))
|
|
|
|
|
return false;
|
2000-10-10 12:36:36 +00:00
|
|
|
|
|
|
|
|
|
// Load the layouts
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Reading layouts...");
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (!LyXSetStyle())
|
|
|
|
|
return false;
|
This is one of a series of patches that will merge the layout modules development in personal/branches/rgheck back into the tree.
Design goal: Allow the use of layout "modules", which are to LaTeX packages as layout files are to LaTeX document classes. Thus, one could have a module that defined certain character styles, environments, commands, or what have you, and include it in various documents, each of which uses a different document class, without having to modify the layout files themselves. For example, a theorems.module could be used with article.layout to provide support for theorem-type environments, without having to modify article.layout itself, and the same module could be used with book.layout, etc.
This patch adds the backend. The ModuleList class holds a list of the available modules, which are retrieved from lyxmodules.lst, itself generated by configure.py. There are two LFUNs available: modules-clear and module-add, which do the obvious thing; you can test by typing these into the minibuffer, along with the name of one of the available modules: URL (a CharStyle), Endnote (a Custom Inset), and---with the spaces---End To Foot (View>LaTeX and look at the user preamble), which are themselves in lib/layouts. There are some others, too, that allow theorems to be added to classes like article and book.
The GUI will come next.
Issues: (i) The configure.py script could be improved. It'd be nice, for example, if it tested for the presence of the LaTeX packages a particular module needs. But this would mean re-working the LaTeX script, and I don't know how to do that. Note that at present, the packages are ignored. This will change shortly. (ii) I've used std::string in LyXModule, following what seemed to be a precedent in TextClass. If some of these should be docstrings, please let me know, and I'll change them. (iii) There is at present no distinction between LaTeX and DocBook modules. Should there be? That is: Should there be modules that are available when the document class is a LaTeX class and others that are available only when it is DocBook? Or should there just be one set of modules? Each module can of course indicate for what it is suitable in its description.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19893 a592a061-630c-0410-9148-cb99ea01b6c8
2007-08-29 17:59:49 +00:00
|
|
|
|
//...and the modules
|
|
|
|
|
moduleList.load();
|
2000-10-10 12:36:36 +00:00
|
|
|
|
|
2007-10-11 15:27:24 +00:00
|
|
|
|
// read keymap and ui files in batch mode as well
|
|
|
|
|
// because InsetInfo needs to know these to produce
|
|
|
|
|
// the correct output
|
2007-01-17 13:18:16 +00:00
|
|
|
|
|
2007-10-11 15:27:24 +00:00
|
|
|
|
// Set the language defined by the user.
|
|
|
|
|
//setGuiLanguage(lyxrc.gui_language);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
|
2007-10-20 23:27:03 +00:00
|
|
|
|
// Set up command definitions
|
2007-11-29 07:41:23 +00:00
|
|
|
|
pimpl_->toplevel_cmddef_.read(lyxrc.def_file);
|
2007-10-20 23:27:03 +00:00
|
|
|
|
|
2007-10-11 15:27:24 +00:00
|
|
|
|
// Set up bindings
|
2007-11-29 07:41:23 +00:00
|
|
|
|
pimpl_->toplevel_keymap_.read("site");
|
|
|
|
|
pimpl_->toplevel_keymap_.read(lyxrc.bind_file);
|
2007-10-20 20:50:56 +00:00
|
|
|
|
// load user bind file user.bind
|
2007-11-29 07:41:23 +00:00
|
|
|
|
pimpl_->toplevel_keymap_.read("user");
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-11-29 07:41:23 +00:00
|
|
|
|
pimpl_->lyxfunc_.initKeySequences(&pimpl_->toplevel_keymap_);
|
2007-10-11 15:27:24 +00:00
|
|
|
|
|
|
|
|
|
// Read menus
|
2008-02-07 08:57:12 +00:00
|
|
|
|
if (use_gui && !readUIFile(lyxrc.ui_file))
|
2007-10-11 15:27:24 +00:00
|
|
|
|
return false;
|
2000-05-10 11:50:11 +00:00
|
|
|
|
|
2003-04-02 18:08:05 +00:00
|
|
|
|
if (lyxerr.debugging(Debug::LYXRC))
|
2000-03-12 10:35:05 +00:00
|
|
|
|
lyxrc.print();
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2006-06-27 10:51:24 +00:00
|
|
|
|
os::windows_style_tex_paths(lyxrc.windows_style_tex_paths);
|
2005-02-13 17:12:34 +00:00
|
|
|
|
if (!lyxrc.path_prefix.empty())
|
|
|
|
|
prependEnvPath("PATH", lyxrc.path_prefix);
|
2005-01-16 21:01:41 +00:00
|
|
|
|
|
2006-12-05 12:57:01 +00:00
|
|
|
|
FileName const document_path(lyxrc.document_path);
|
2007-10-18 21:10:35 +00:00
|
|
|
|
if (document_path.exists() && document_path.isDirectory())
|
2007-04-06 13:09:54 +00:00
|
|
|
|
package().document_dir() = document_path;
|
2005-01-10 19:17:43 +00:00
|
|
|
|
|
2007-04-06 13:09:54 +00:00
|
|
|
|
package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path));
|
2005-01-10 19:17:43 +00:00
|
|
|
|
if (package().temp_dir().empty()) {
|
2006-09-11 08:54:10 +00:00
|
|
|
|
Alert::error(_("Could not create temporary directory"),
|
|
|
|
|
bformat(_("Could not create a temporary directory in\n"
|
2006-09-09 15:27:44 +00:00
|
|
|
|
"%1$s. Make sure that this\n"
|
2006-09-11 08:54:10 +00:00
|
|
|
|
"path exists and is writable and try again."),
|
2006-10-21 00:16:43 +00:00
|
|
|
|
from_utf8(lyxrc.tempdir_path)));
|
2004-02-25 12:00:53 +00:00
|
|
|
|
// 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.
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2004-02-25 12:00:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "LyX tmp dir: `"
|
|
|
|
|
<< package().temp_dir().absFilename() << '\'');
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Reading session information '.lyx/session'...");
|
2006-10-21 00:16:43 +00:00
|
|
|
|
pimpl_->session_.reset(new Session(lyxrc.num_lastfiles));
|
2006-11-13 10:27:57 +00:00
|
|
|
|
|
|
|
|
|
// This must happen after package initialization and after lyxrc is
|
|
|
|
|
// read, therefore it can't be done by a static object.
|
|
|
|
|
ConverterCache::init();
|
2008-03-14 23:25:11 +00:00
|
|
|
|
|
|
|
|
|
// init the global menubar on Mac. This must be done after the session
|
|
|
|
|
// was recovered to know the "last files".
|
|
|
|
|
if (use_gui)
|
|
|
|
|
theApp()->initGlobalMenu();
|
|
|
|
|
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return true;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2000-10-11 21:06:43 +00:00
|
|
|
|
|
2003-10-14 21:30:23 +00:00
|
|
|
|
void LyX::emergencyCleanup() const
|
2001-10-19 15:13:49 +00:00
|
|
|
|
{
|
|
|
|
|
// 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
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2006-10-19 07:20:32 +00:00
|
|
|
|
pimpl_->buffer_list_.emergencyWriteAll();
|
2006-10-21 00:16:43 +00:00
|
|
|
|
if (use_gui) {
|
2006-11-29 21:27:54 +00:00
|
|
|
|
if (pimpl_->lyx_server_)
|
|
|
|
|
pimpl_->lyx_server_->emergencyCleanup();
|
2006-10-20 09:56:28 +00:00
|
|
|
|
pimpl_->lyx_server_.reset();
|
|
|
|
|
pimpl_->lyx_socket_.reset();
|
|
|
|
|
}
|
2001-10-19 15:13:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2006-05-09 15:41:42 +00:00
|
|
|
|
// return true if file does not exist or is older than configure.py.
|
2007-10-18 21:10:35 +00:00
|
|
|
|
static bool needsUpdate(string const & file)
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
2006-12-05 12:57:01 +00:00
|
|
|
|
// We cannot initialize configure_script directly because the package
|
|
|
|
|
// is not initialized yet when static objects are constructed.
|
2007-10-18 21:10:35 +00:00
|
|
|
|
static FileName configure_script;
|
2006-12-05 12:57:01 +00:00
|
|
|
|
static bool firstrun = true;
|
|
|
|
|
if (firstrun) {
|
2007-10-18 21:10:35 +00:00
|
|
|
|
configure_script =
|
|
|
|
|
FileName(addName(package().system_support().absFilename(),
|
|
|
|
|
"configure.py"));
|
2006-12-05 12:57:01 +00:00
|
|
|
|
firstrun = false;
|
|
|
|
|
}
|
2006-05-09 15:41:42 +00:00
|
|
|
|
|
2007-10-18 21:10:35 +00:00
|
|
|
|
FileName absfile =
|
|
|
|
|
FileName(addName(package().user_support().absFilename(), file));
|
|
|
|
|
return !absfile.exists()
|
|
|
|
|
|| configure_script.lastModified() > absfile.lastModified();
|
2006-05-09 15:41:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-10-07 13:31:37 +00:00
|
|
|
|
|
2006-05-09 15:41:42 +00:00
|
|
|
|
bool LyX::queryUserLyXDir(bool explicit_userdir)
|
|
|
|
|
{
|
1999-09-27 18:44:28 +00:00
|
|
|
|
// Does user directory exist?
|
2007-10-18 21:10:35 +00:00
|
|
|
|
FileName const sup = package().user_support();
|
|
|
|
|
if (sup.exists() && sup.isDirectory()) {
|
1999-09-27 18:44:28 +00:00
|
|
|
|
first_start = false;
|
2006-09-09 15:27:44 +00:00
|
|
|
|
|
|
|
|
|
return needsUpdate("lyxrc.defaults")
|
This is one of a series of patches that will merge the layout modules development in personal/branches/rgheck back into the tree.
Design goal: Allow the use of layout "modules", which are to LaTeX packages as layout files are to LaTeX document classes. Thus, one could have a module that defined certain character styles, environments, commands, or what have you, and include it in various documents, each of which uses a different document class, without having to modify the layout files themselves. For example, a theorems.module could be used with article.layout to provide support for theorem-type environments, without having to modify article.layout itself, and the same module could be used with book.layout, etc.
This patch adds the backend. The ModuleList class holds a list of the available modules, which are retrieved from lyxmodules.lst, itself generated by configure.py. There are two LFUNs available: modules-clear and module-add, which do the obvious thing; you can test by typing these into the minibuffer, along with the name of one of the available modules: URL (a CharStyle), Endnote (a Custom Inset), and---with the spaces---End To Foot (View>LaTeX and look at the user preamble), which are themselves in lib/layouts. There are some others, too, that allow theorems to be added to classes like article and book.
The GUI will come next.
Issues: (i) The configure.py script could be improved. It'd be nice, for example, if it tested for the presence of the LaTeX packages a particular module needs. But this would mean re-working the LaTeX script, and I don't know how to do that. Note that at present, the packages are ignored. This will change shortly. (ii) I've used std::string in LyXModule, following what seemed to be a precedent in TextClass. If some of these should be docstrings, please let me know, and I'll change them. (iii) There is at present no distinction between LaTeX and DocBook modules. Should there be? That is: Should there be modules that are available when the document class is a LaTeX class and others that are available only when it is DocBook? Or should there just be one set of modules? Each module can of course indicate for what it is suitable in its description.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19893 a592a061-630c-0410-9148-cb99ea01b6c8
2007-08-29 17:59:49 +00:00
|
|
|
|
|| needsUpdate("lyxmodules.lst")
|
2006-09-09 15:27:44 +00:00
|
|
|
|
|| needsUpdate("textclass.lst")
|
2006-05-09 15:41:42 +00:00
|
|
|
|
|| needsUpdate("packages.lst");
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
2002-08-11 16:27:10 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
first_start = !explicit_userdir;
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2005-01-10 19:17:43 +00:00
|
|
|
|
// If the user specified explicitly a directory, ask whether
|
|
|
|
|
// to create it. If the user says "no", then exit.
|
|
|
|
|
if (explicit_userdir &&
|
2005-03-18 16:17:05 +00:00
|
|
|
|
Alert::prompt(
|
2006-09-11 08:54:10 +00:00
|
|
|
|
_("Missing user LyX directory"),
|
|
|
|
|
bformat(_("You have specified a non-existent user "
|
2006-09-09 15:27:44 +00:00
|
|
|
|
"LyX directory, %1$s.\n"
|
2006-09-11 08:54:10 +00:00
|
|
|
|
"It is needed to keep your own configuration."),
|
2007-04-06 13:09:54 +00:00
|
|
|
|
from_utf8(package().user_support().absFilename())),
|
2005-01-10 19:17:43 +00:00
|
|
|
|
1, 0,
|
2006-09-11 08:54:10 +00:00
|
|
|
|
_("&Create directory"),
|
|
|
|
|
_("&Exit LyX"))) {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("No user LyX directory. Exiting.")) << endl;
|
2006-10-17 08:36:04 +00:00
|
|
|
|
earlyExit(EXIT_FAILURE);
|
2005-01-10 19:17:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(bformat(_("LyX: Creating directory %1$s"),
|
2007-10-18 21:10:35 +00:00
|
|
|
|
from_utf8(sup.absFilename()))) << endl;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
2007-10-20 17:35:27 +00:00
|
|
|
|
if (!sup.createDirectory(0755)) {
|
2005-01-10 19:17:43 +00:00
|
|
|
|
// Failed, so let's exit.
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("Failed to create directory. Exiting."))
|
2005-01-10 19:17:43 +00:00
|
|
|
|
<< endl;
|
2006-10-17 08:36:04 +00:00
|
|
|
|
earlyExit(EXIT_FAILURE);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2006-05-09 15:41:42 +00:00
|
|
|
|
return true;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-07-05 17:01:26 +00:00
|
|
|
|
bool LyX::readRcFile(string const & name)
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "About to read " << name << "... ");
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2006-11-26 21:30:39 +00:00
|
|
|
|
FileName const lyxrc_path = libFileSearch(string(), name);
|
2002-02-16 15:59:55 +00:00
|
|
|
|
if (!lyxrc_path.empty()) {
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Found in " << lyxrc_path);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
if (lyxrc.read(lyxrc_path) < 0) {
|
2006-05-02 12:53:48 +00:00
|
|
|
|
showFileError(name);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2007-11-15 20:04:51 +00:00
|
|
|
|
} else {
|
|
|
|
|
LYXERR(Debug::INIT, "Not found." << lyxrc_path);
|
|
|
|
|
}
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return true;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-07-24 13:53:19 +00:00
|
|
|
|
// Read the ui file `name'
|
2007-01-19 14:30:30 +00:00
|
|
|
|
bool LyX::readUIFile(string const & name, bool include)
|
2000-07-24 13:53:19 +00:00
|
|
|
|
{
|
2008-04-02 23:06:22 +00:00
|
|
|
|
enum {
|
2000-07-24 13:53:19 +00:00
|
|
|
|
ui_menuset = 1,
|
2003-06-11 19:21:46 +00:00
|
|
|
|
ui_toolbars,
|
2007-04-19 19:43:15 +00:00
|
|
|
|
ui_toolbarset,
|
2003-04-15 02:28:53 +00:00
|
|
|
|
ui_include,
|
2000-07-24 13:53:19 +00:00
|
|
|
|
ui_last
|
|
|
|
|
};
|
|
|
|
|
|
2008-04-03 20:55:09 +00:00
|
|
|
|
LexerKeyword uitags[] = {
|
2003-04-15 02:28:53 +00:00
|
|
|
|
{ "include", ui_include },
|
2000-07-24 13:53:19 +00:00
|
|
|
|
{ "menuset", ui_menuset },
|
2007-04-19 19:43:15 +00:00
|
|
|
|
{ "toolbars", ui_toolbars },
|
|
|
|
|
{ "toolbarset", ui_toolbarset }
|
2000-07-24 13:53:19 +00:00
|
|
|
|
};
|
|
|
|
|
|
2003-04-15 02:28:53 +00:00
|
|
|
|
// Ensure that a file is read only once (prevents include loops)
|
2007-12-12 19:28:07 +00:00
|
|
|
|
static list<string> uifiles;
|
|
|
|
|
list<string>::const_iterator it = uifiles.begin();
|
|
|
|
|
list<string>::const_iterator end = uifiles.end();
|
|
|
|
|
it = find(it, end, name);
|
2003-04-15 02:28:53 +00:00
|
|
|
|
if (it != end) {
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "UI file '" << name << "' has been read already. "
|
|
|
|
|
<< "Is this an include loop?");
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2003-04-15 02:28:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "About to read " << name << "...");
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2007-05-28 22:27:45 +00:00
|
|
|
|
|
2007-01-19 14:30:30 +00:00
|
|
|
|
FileName ui_path;
|
|
|
|
|
if (include) {
|
|
|
|
|
ui_path = libFileSearch("ui", name, "inc");
|
|
|
|
|
if (ui_path.empty())
|
|
|
|
|
ui_path = libFileSearch("ui",
|
|
|
|
|
changeExtension(name, "inc"));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
ui_path = libFileSearch("ui", name, "ui");
|
2007-05-28 22:27:45 +00:00
|
|
|
|
|
2000-07-24 13:53:19 +00:00
|
|
|
|
if (ui_path.empty()) {
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Could not find " << name);
|
2003-04-02 18:08:05 +00:00
|
|
|
|
showFileError(name);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2000-07-24 13:53:19 +00:00
|
|
|
|
}
|
2007-01-19 14:30:30 +00:00
|
|
|
|
|
2003-04-15 02:28:53 +00:00
|
|
|
|
uifiles.push_back(name);
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "Found " << name << " in " << ui_path);
|
2008-04-02 23:06:22 +00:00
|
|
|
|
Lexer lex(uitags);
|
2000-07-24 13:53:19 +00:00
|
|
|
|
lex.setFile(ui_path);
|
2001-08-07 07:36:56 +00:00
|
|
|
|
if (!lex.isOK()) {
|
2000-07-24 21:49:58 +00:00
|
|
|
|
lyxerr << "Unable to set LyXLeX for ui file: " << ui_path
|
|
|
|
|
<< endl;
|
|
|
|
|
}
|
2002-03-21 17:27:08 +00:00
|
|
|
|
|
2000-07-24 13:53:19 +00:00
|
|
|
|
if (lyxerr.debugging(Debug::PARSER))
|
|
|
|
|
lex.printTable(lyxerr);
|
|
|
|
|
|
2001-08-07 07:36:56 +00:00
|
|
|
|
while (lex.isOK()) {
|
2000-11-04 10:00:12 +00:00
|
|
|
|
switch (lex.lex()) {
|
2003-04-15 02:28:53 +00:00
|
|
|
|
case ui_include: {
|
|
|
|
|
lex.next(true);
|
|
|
|
|
string const file = lex.getString();
|
2007-01-19 14:30:30 +00:00
|
|
|
|
if (!readUIFile(file, true))
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2003-04-15 02:28:53 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2002-03-21 17:27:08 +00:00
|
|
|
|
case ui_menuset:
|
2008-03-06 21:50:27 +00:00
|
|
|
|
theApp()->readMenus(lex);
|
2000-07-24 13:53:19 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2007-04-19 19:43:15 +00:00
|
|
|
|
case ui_toolbarset:
|
|
|
|
|
toolbarbackend.readToolbars(lex);
|
2000-07-24 13:53:19 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2003-06-11 19:21:46 +00:00
|
|
|
|
case ui_toolbars:
|
2007-04-19 19:43:15 +00:00
|
|
|
|
toolbarbackend.readToolbarSettings(lex);
|
2003-06-11 19:21:46 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2000-07-24 13:53:19 +00:00
|
|
|
|
default:
|
2002-07-28 22:50:13 +00:00
|
|
|
|
if (!rtrim(lex.getString()).empty())
|
2001-05-03 15:38:24 +00:00
|
|
|
|
lex.printError("LyX::ReadUIFile: "
|
|
|
|
|
"Unknown menu tag: `$$Token'");
|
2000-07-24 13:53:19 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return true;
|
2000-07-24 13:53:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-10-10 12:36:36 +00:00
|
|
|
|
// Read the languages file `name'
|
2006-07-05 17:01:26 +00:00
|
|
|
|
bool LyX::readLanguagesFile(string const & name)
|
2000-10-10 12:36:36 +00:00
|
|
|
|
{
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "About to read " << name << "...");
|
2000-10-10 12:36:36 +00:00
|
|
|
|
|
2006-11-26 21:30:39 +00:00
|
|
|
|
FileName const lang_path = libFileSearch(string(), name);
|
2000-10-10 12:36:36 +00:00
|
|
|
|
if (lang_path.empty()) {
|
2003-04-02 18:08:05 +00:00
|
|
|
|
showFileError(name);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2000-10-10 12:36:36 +00:00
|
|
|
|
}
|
|
|
|
|
languages.read(lang_path);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return true;
|
2000-10-10 12:36:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Read the encodings file `name'
|
Add machinery to output arbitrary unicode characters with LaTeX commands
read from a text file.
* src/encoding.[Ch]
(Encoding::latexChar): New, output a character to LaTeX
(Encoding::validate): New, add needed preamble stuff for a character
(Encodings::read): Read new unicodesymbols file
(Encodings::isCombiningChar): New, is a character a combining char?
* src/paragraph_pimpl.C
(isEncoding): Delete, no longer needed
(getEncoding): New, get the real encoding of a font
(Paragraph::Pimpl::latexSurrogatePair): New, output a surrogate pair
to LaTeX
(Paragraph::Pimpl::simpleTeXBlanks): Use latexSurrogatePair if needed
(Paragraph::Pimpl::simpleTeXSpecialChars): Ditto, and replace several
hardcoded characters with a call of encoding.latexChar()
(Paragraph::Pimpl::validate): replace several hardcoded characters
with a call of encoding.validate()
* src/support/debugstream.h
(basic_debugstream::disable): New, disable the stream completely
(basic_debugstream::enable): New, reenable the stream
* src/lyx_main.[Ch]: Adjust to changes above
* src/paragraph.C: Ditto
* lib/unicodesymbols: New file with UCS4 -> LaTeX command mapping.
It is far from complete yet, but contains most accents on latin
characters.
* lib/Makefile.am: add lib/unicodesymbols
* development/scons/scons_manifest.py: ditto
* development/tools/unicodesymbols.py: Helper script to update
lib/unicodesymbols with new symbols
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16920 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-28 21:27:45 +00:00
|
|
|
|
bool LyX::readEncodingsFile(string const & enc_name,
|
2007-05-28 22:27:45 +00:00
|
|
|
|
string const & symbols_name)
|
2000-10-10 12:36:36 +00:00
|
|
|
|
{
|
2007-11-15 20:04:51 +00:00
|
|
|
|
LYXERR(Debug::INIT, "About to read " << enc_name << " and "
|
|
|
|
|
<< symbols_name << "...");
|
2000-10-10 12:36:36 +00:00
|
|
|
|
|
Add machinery to output arbitrary unicode characters with LaTeX commands
read from a text file.
* src/encoding.[Ch]
(Encoding::latexChar): New, output a character to LaTeX
(Encoding::validate): New, add needed preamble stuff for a character
(Encodings::read): Read new unicodesymbols file
(Encodings::isCombiningChar): New, is a character a combining char?
* src/paragraph_pimpl.C
(isEncoding): Delete, no longer needed
(getEncoding): New, get the real encoding of a font
(Paragraph::Pimpl::latexSurrogatePair): New, output a surrogate pair
to LaTeX
(Paragraph::Pimpl::simpleTeXBlanks): Use latexSurrogatePair if needed
(Paragraph::Pimpl::simpleTeXSpecialChars): Ditto, and replace several
hardcoded characters with a call of encoding.latexChar()
(Paragraph::Pimpl::validate): replace several hardcoded characters
with a call of encoding.validate()
* src/support/debugstream.h
(basic_debugstream::disable): New, disable the stream completely
(basic_debugstream::enable): New, reenable the stream
* src/lyx_main.[Ch]: Adjust to changes above
* src/paragraph.C: Ditto
* lib/unicodesymbols: New file with UCS4 -> LaTeX command mapping.
It is far from complete yet, but contains most accents on latin
characters.
* lib/Makefile.am: add lib/unicodesymbols
* development/scons/scons_manifest.py: ditto
* development/tools/unicodesymbols.py: Helper script to update
lib/unicodesymbols with new symbols
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16920 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-28 21:27:45 +00:00
|
|
|
|
FileName const symbols_path = libFileSearch(string(), symbols_name);
|
|
|
|
|
if (symbols_path.empty()) {
|
|
|
|
|
showFileError(symbols_name);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FileName const enc_path = libFileSearch(string(), enc_name);
|
2000-10-10 12:36:36 +00:00
|
|
|
|
if (enc_path.empty()) {
|
Add machinery to output arbitrary unicode characters with LaTeX commands
read from a text file.
* src/encoding.[Ch]
(Encoding::latexChar): New, output a character to LaTeX
(Encoding::validate): New, add needed preamble stuff for a character
(Encodings::read): Read new unicodesymbols file
(Encodings::isCombiningChar): New, is a character a combining char?
* src/paragraph_pimpl.C
(isEncoding): Delete, no longer needed
(getEncoding): New, get the real encoding of a font
(Paragraph::Pimpl::latexSurrogatePair): New, output a surrogate pair
to LaTeX
(Paragraph::Pimpl::simpleTeXBlanks): Use latexSurrogatePair if needed
(Paragraph::Pimpl::simpleTeXSpecialChars): Ditto, and replace several
hardcoded characters with a call of encoding.latexChar()
(Paragraph::Pimpl::validate): replace several hardcoded characters
with a call of encoding.validate()
* src/support/debugstream.h
(basic_debugstream::disable): New, disable the stream completely
(basic_debugstream::enable): New, reenable the stream
* src/lyx_main.[Ch]: Adjust to changes above
* src/paragraph.C: Ditto
* lib/unicodesymbols: New file with UCS4 -> LaTeX command mapping.
It is far from complete yet, but contains most accents on latin
characters.
* lib/Makefile.am: add lib/unicodesymbols
* development/scons/scons_manifest.py: ditto
* development/tools/unicodesymbols.py: Helper script to update
lib/unicodesymbols with new symbols
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16920 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-28 21:27:45 +00:00
|
|
|
|
showFileError(enc_name);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return false;
|
2000-10-10 12:36:36 +00:00
|
|
|
|
}
|
Add machinery to output arbitrary unicode characters with LaTeX commands
read from a text file.
* src/encoding.[Ch]
(Encoding::latexChar): New, output a character to LaTeX
(Encoding::validate): New, add needed preamble stuff for a character
(Encodings::read): Read new unicodesymbols file
(Encodings::isCombiningChar): New, is a character a combining char?
* src/paragraph_pimpl.C
(isEncoding): Delete, no longer needed
(getEncoding): New, get the real encoding of a font
(Paragraph::Pimpl::latexSurrogatePair): New, output a surrogate pair
to LaTeX
(Paragraph::Pimpl::simpleTeXBlanks): Use latexSurrogatePair if needed
(Paragraph::Pimpl::simpleTeXSpecialChars): Ditto, and replace several
hardcoded characters with a call of encoding.latexChar()
(Paragraph::Pimpl::validate): replace several hardcoded characters
with a call of encoding.validate()
* src/support/debugstream.h
(basic_debugstream::disable): New, disable the stream completely
(basic_debugstream::enable): New, reenable the stream
* src/lyx_main.[Ch]: Adjust to changes above
* src/paragraph.C: Ditto
* lib/unicodesymbols: New file with UCS4 -> LaTeX command mapping.
It is far from complete yet, but contains most accents on latin
characters.
* lib/Makefile.am: add lib/unicodesymbols
* development/scons/scons_manifest.py: ditto
* development/tools/unicodesymbols.py: Helper script to update
lib/unicodesymbols with new symbols
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16920 a592a061-630c-0410-9148-cb99ea01b6c8
2007-01-28 21:27:45 +00:00
|
|
|
|
encodings.read(enc_path, symbols_path);
|
2006-07-05 17:01:26 +00:00
|
|
|
|
return true;
|
2000-10-10 12:36:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-03-20 01:22:46 +00:00
|
|
|
|
namespace {
|
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
string batch;
|
|
|
|
|
|
|
|
|
|
/// return the the number of arguments consumed
|
2002-11-21 18:33:09 +00:00
|
|
|
|
typedef boost::function<int(string const &, string const &)> cmd_helper;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
|
|
|
|
|
int parse_dbg(string const & arg, string const &)
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
2002-08-07 23:43:38 +00:00
|
|
|
|
if (arg.empty()) {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("List of supported debug flags:")) << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
Debug::showTags(lyxerr);
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl;
|
2002-11-24 15:20:31 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
lyxerr.level(Debug::value(arg));
|
1999-12-13 15:31:52 +00:00
|
|
|
|
Debug::showLevel(lyxerr, lyxerr.level());
|
2002-08-07 23:43:38 +00:00
|
|
|
|
return 1;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-05-13 09:48:57 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_help(string const &, string const &)
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
1999-10-07 18:44:17 +00:00
|
|
|
|
lyxerr <<
|
2006-10-21 00:16:43 +00:00
|
|
|
|
to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
|
1999-10-07 18:44:17 +00:00
|
|
|
|
"Command line switches (case sensitive):\n"
|
2000-07-04 20:32:37 +00:00
|
|
|
|
"\t-help summarize LyX usage\n"
|
2006-04-01 13:23:24 +00:00
|
|
|
|
"\t-userdir dir set user directory to dir\n"
|
|
|
|
|
"\t-sysdir dir set system directory to dir\n"
|
2000-07-05 20:16:38 +00:00
|
|
|
|
"\t-geometry WxH+X+Y set geometry of the main window\n"
|
2002-03-21 17:27:08 +00:00
|
|
|
|
"\t-dbg feature[,feature]...\n"
|
|
|
|
|
" select the features to debug.\n"
|
|
|
|
|
" Type `lyx -dbg' to see the list of features\n"
|
2000-11-30 18:11:54 +00:00
|
|
|
|
"\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"
|
2007-11-15 12:14:39 +00:00
|
|
|
|
" Look on Tools->Preferences->File formats->Format\n"
|
|
|
|
|
" to get an idea which parameters should be passed.\n"
|
2000-11-30 18:11:54 +00:00
|
|
|
|
"\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"
|
2001-09-11 13:13:03 +00:00
|
|
|
|
"\t-version summarize version and build info\n"
|
2006-09-09 15:27:44 +00:00
|
|
|
|
"Check the LyX man page for more details.")) << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(0);
|
|
|
|
|
return 0;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_version(string const &, string const &)
|
2001-09-11 13:13:03 +00:00
|
|
|
|
{
|
2001-10-03 15:49:32 +00:00
|
|
|
|
lyxerr << "LyX " << lyx_version
|
2006-08-16 21:54:55 +00:00
|
|
|
|
<< " (" << lyx_release_date << ")" << endl;
|
2001-09-11 13:13:03 +00:00
|
|
|
|
lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl;
|
|
|
|
|
|
2001-10-03 15:49:32 +00:00
|
|
|
|
lyxerr << lyx_version_info << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(0);
|
|
|
|
|
return 0;
|
2001-09-11 13:13:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_sysdir(string const & arg, string const &)
|
|
|
|
|
{
|
|
|
|
|
if (arg.empty()) {
|
2007-01-23 12:38:20 +00:00
|
|
|
|
Alert::error(_("No system directory"),
|
|
|
|
|
_("Missing directory for -sysdir switch"));
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
2005-01-10 19:17:43 +00:00
|
|
|
|
cl_system_support = arg;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_userdir(string const & arg, string const &)
|
|
|
|
|
{
|
|
|
|
|
if (arg.empty()) {
|
2007-01-23 12:38:20 +00:00
|
|
|
|
Alert::error(_("No user directory"),
|
|
|
|
|
_("Missing directory for -userdir switch"));
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
2005-01-10 19:17:43 +00:00
|
|
|
|
cl_user_support = arg;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_execute(string const & arg, string const &)
|
|
|
|
|
{
|
|
|
|
|
if (arg.empty()) {
|
2007-01-23 12:38:20 +00:00
|
|
|
|
Alert::error(_("Incomplete command"),
|
|
|
|
|
_("Missing command string after --execute switch"));
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
batch = arg;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_export(string const & type, string const &)
|
|
|
|
|
{
|
|
|
|
|
if (type.empty()) {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
|
2006-09-09 15:27:44 +00:00
|
|
|
|
"--export switch")) << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
batch = "buffer-export " + type;
|
2006-10-21 00:16:43 +00:00
|
|
|
|
use_gui = false;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int parse_import(string const & type, string const & file)
|
|
|
|
|
{
|
|
|
|
|
if (type.empty()) {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
|
2006-09-09 15:27:44 +00:00
|
|
|
|
"--import switch")) << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
if (file.empty()) {
|
2006-10-21 00:16:43 +00:00
|
|
|
|
lyxerr << to_utf8(_("Missing filename for --import")) << endl;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
2002-11-27 10:30:28 +00:00
|
|
|
|
batch = "buffer-import " + type + ' ' + file;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
return 2;
|
|
|
|
|
}
|
2001-09-11 13:13:03 +00:00
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
|
2006-11-29 16:45:38 +00:00
|
|
|
|
int parse_geometry(string const & arg1, string const &)
|
|
|
|
|
{
|
|
|
|
|
geometryArg = arg1;
|
|
|
|
|
#if defined(_WIN32) || (defined(__CYGWIN__) && defined(X_DISPLAY_MISSING))
|
|
|
|
|
// remove also the arg
|
|
|
|
|
return 1;
|
|
|
|
|
#else
|
|
|
|
|
// don't remove "-geometry"
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-03-20 01:22:46 +00:00
|
|
|
|
} // namespace anon
|
|
|
|
|
|
2000-10-11 21:06:43 +00:00
|
|
|
|
|
2006-10-12 14:10:13 +00:00
|
|
|
|
void LyX::easyParse(int & argc, char * argv[])
|
1999-09-27 18:44:28 +00:00
|
|
|
|
{
|
2007-12-12 19:28:07 +00:00
|
|
|
|
map<string, cmd_helper> cmdmap;
|
2002-08-07 23:43:38 +00:00
|
|
|
|
|
|
|
|
|
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;
|
2006-11-29 16:45:38 +00:00
|
|
|
|
cmdmap["-geometry"] = parse_geometry;
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
for (int i = 1; i < argc; ++i) {
|
2007-12-12 19:28:07 +00:00
|
|
|
|
map<string, cmd_helper>::const_iterator it
|
2002-08-07 23:43:38 +00:00
|
|
|
|
= cmdmap.find(argv[i]);
|
2000-05-29 15:29:50 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
// don't complain if not found - may be parsed later
|
|
|
|
|
if (it == cmdmap.end())
|
|
|
|
|
continue;
|
2000-05-29 15:29:50 +00:00
|
|
|
|
|
2007-11-07 20:14:30 +00:00
|
|
|
|
string const arg =
|
|
|
|
|
(i + 1 < argc) ? to_utf8(from_local8bit(argv[i + 1])) : string();
|
|
|
|
|
string const arg2 =
|
|
|
|
|
(i + 2 < argc) ? to_utf8(from_local8bit(argv[i + 2])) : string();
|
2002-08-11 16:27:10 +00:00
|
|
|
|
|
2002-08-07 23:43:38 +00:00
|
|
|
|
int const remove = 1 + it->second(arg, arg2);
|
|
|
|
|
|
|
|
|
|
// Now, remove used arguments by shifting
|
|
|
|
|
// the following ones remove places down.
|
2006-11-29 19:44:13 +00:00
|
|
|
|
if (remove > 0) {
|
|
|
|
|
argc -= remove;
|
|
|
|
|
for (int j = i; j < argc; ++j)
|
|
|
|
|
argv[j] = argv[j + remove];
|
|
|
|
|
--i;
|
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
2000-04-28 11:18:04 +00:00
|
|
|
|
|
2007-11-14 21:36:01 +00:00
|
|
|
|
pimpl_->batch_command = batch;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
}
|
2006-10-19 07:20:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FuncStatus getStatus(FuncRequest const & action)
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().lyxFunc().getStatus(action);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void dispatch(FuncRequest const & action)
|
|
|
|
|
{
|
|
|
|
|
LyX::ref().lyxFunc().dispatch(action);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BufferList & theBufferList()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().bufferList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LyXFunc & theLyXFunc()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().lyxFunc();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 16:22:46 +00:00
|
|
|
|
Server & theServer()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
|
|
|
|
// FIXME: this should not be use_gui dependent
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(use_gui, /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return LyX::ref().server();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-29 16:22:46 +00:00
|
|
|
|
ServerSocket & theServerSocket()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
|
|
|
|
// FIXME: this should not be use_gui dependent
|
2008-04-10 21:49:34 +00:00
|
|
|
|
LASSERT(use_gui, /**/);
|
2006-10-19 07:20:32 +00:00
|
|
|
|
return LyX::ref().socket();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-04-27 08:05:58 +00:00
|
|
|
|
KeyMap & theTopLevelKeymap()
|
2006-10-19 07:20:32 +00:00
|
|
|
|
{
|
2008-03-22 09:32:38 +00:00
|
|
|
|
return LyX::ref().pimpl_->toplevel_keymap_;
|
2006-10-19 07:20:32 +00:00
|
|
|
|
}
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
2006-11-18 17:47:12 +00:00
|
|
|
|
|
2007-01-17 13:18:16 +00:00
|
|
|
|
Converters & theConverters()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().converters();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Converters & theSystemConverters()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().systemConverters();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-01-18 08:42:53 +00:00
|
|
|
|
Movers & theMovers()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().pimpl_->movers_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
Mover const & getMover(string const & fmt)
|
2007-01-18 08:42:53 +00:00
|
|
|
|
{
|
|
|
|
|
return LyX::ref().pimpl_->movers_(fmt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
void setMover(string const & fmt, string const & command)
|
2007-01-18 08:42:53 +00:00
|
|
|
|
{
|
|
|
|
|
LyX::ref().pimpl_->movers_.set(fmt, command);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Movers & theSystemMovers()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().pimpl_->system_movers_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
|
Messages & getMessages(string const & language)
|
2007-01-14 10:37:14 +00:00
|
|
|
|
{
|
|
|
|
|
return LyX::ref().getMessages(language);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Messages & getGuiMessages()
|
|
|
|
|
{
|
|
|
|
|
return LyX::ref().getGuiMessages();
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
} // namespace lyx
|