#include "lyxfunc.h"
#include "lyxlex.h"
#include "lyxrc.h"
-#include "lyxtextclasslist.h"
#include "lyxserver.h"
+#include "lyxtextclasslist.h"
#include "MenuBackend.h"
#include "mover.h"
#include "ToolbarBackend.h"
-#include "mathed/math_inset.h"
-
#include "frontends/Alert.h"
+#include "frontends/Application.h"
#include "frontends/lyx_gui.h"
#include "frontends/LyXView.h"
#include "support/environment.h"
#include "support/filetools.h"
+#include "support/fontutils.h"
#include "support/lyxlib.h"
#include "support/convert.h"
#include "support/os.h"
using lyx::support::i18nLibFileSearch;
using lyx::support::libFileSearch;
using lyx::support::package;
-using lyx::support::Path;
using lyx::support::prependEnvPath;
-using lyx::support::quoteName;
using lyx::support::rtrim;
using lyx::support::Systemcall;
+using lyx::docstring;
+
namespace os = lyx::support::os;
namespace fs = boost::filesystem;
using std::endl;
using std::string;
using std::vector;
+using std::for_each;
#ifndef CXX_GLOBAL_CSTD
using std::exit;
#endif
-extern LyXServer * lyxserver;
-
-// This is the global bufferlist object
-BufferList bufferlist;
-
// convenient to have it here.
boost::scoped_ptr<kb_keymap> toplevel_keymap;
// FIXME: We should not directly call exit(), since it only
// guarantees a return to the system, no application cleanup.
// This may cause troubles with not executed destructors.
- if (lyx_gui::use_gui)
- lyx_gui::exit(status);
+ if (lyx_gui::use_gui) {
+ theApp->exit(status);
+ // Restore original font resources after Application is destroyed.
+ lyx::support::restoreFontResources();
+ }
+
exit(status);
}
void showFileError(string const & error)
{
Alert::warning(_("Could not read configuration file"),
- bformat(_("Error while reading the configuration file\n%1$s.\n"
- "Please check your installation."), error));
- lyx_exit(EXIT_FAILURE);
+ bformat(_("Error while reading the configuration file\n%1$s.\n"
+ "Please check your installation."), lyx::from_utf8(error)));
}
{
string const configure_command = package().configure_command();
- lyxerr << _("LyX: reconfiguring user directory") << endl;
- Path p(package().user_support());
+ lyxerr << lyx::to_utf8(_("LyX: reconfiguring user directory")) << endl;
+ lyx::support::Path p(package().user_support());
Systemcall one;
one.startscript(Systemcall::Wait, configure_command);
- lyxerr << "LyX: " << _("Done!") << endl;
+ lyxerr << "LyX: " << lyx::to_utf8(_("Done!")) << endl;
}
} // namespace anon
boost::scoped_ptr<LyX> LyX::singleton_;
-void LyX::exec(int & argc, char * argv[])
+int LyX::exec(int & argc, char * argv[])
{
BOOST_ASSERT(!singleton_.get());
// We must return from this before launching the gui so that
// LyX::ref and LyX::cref.
singleton_.reset(new LyX);
// Start the real execution loop.
- singleton_->priv_exec(argc, argv);
+ return singleton_->priv_exec(argc, argv);
}
LyX::LyX()
- : first_start(false)
+ : first_start(false), geometryOption_(false)
{}
}
-void LyX::addLyXView(boost::shared_ptr<LyXView> const & lyxview)
+void LyX::addLyXView(LyXView * lyxview)
{
views_.push_back(lyxview);
}
}
-void LyX::priv_exec(int & argc, char * argv[])
+int LyX::priv_exec(int & argc, char * argv[])
{
// Here we need to parse the command line. At least
// we need to parse for "-dbg" and "-help"
lyx::support::top_build_dir_is_one_level_up);
// Start the real execution loop.
- if (lyx_gui::use_gui)
- lyx_gui::exec(argc, argv);
+ if (lyx_gui::use_gui) {
+ // Force adding of font path _before_ Application is initialized
+ lyx::support::addFontResources();
+ return lyx_gui::exec(argc, argv);
+ }
else
- exec2(argc, argv);
+ return exec2(argc, argv);
}
-void LyX::exec2(int & argc, char * argv[])
+int LyX::exec2(int & argc, char * argv[])
{
// check for any spurious extra arguments
// other than documents
for (int argi = 1; argi < argc ; ++argi) {
if (argv[argi][0] == '-') {
- lyxerr << bformat(_("Wrong command line option `%1$s'. Exiting."),
- argv[argi]) << endl;
- exit(1);
+ lyxerr << lyx::to_utf8(
+ bformat(_("Wrong command line option `%1$s'. Exiting."),
+ lyx::from_utf8(argv[argi]))) << endl;
+ return EXIT_FAILURE;
}
}
// Initialization of LyX (reads lyxrc and more)
lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl;
- init();
+ bool const success = init();
lyxerr[Debug::INIT] << "Initializing LyX::init...done" << endl;
-
- if (lyx_gui::use_gui)
- lyx_gui::parse_lyxrc();
+ if (!success)
+ return EXIT_FAILURE;
vector<string> files;
if (first_start)
files.push_back(i18nLibFileSearch("examples", "splash.lyx"));
- // if a file is specified, I assume that user wants to edit *that* file
- if (files.empty() && lyxrc.load_session) {
- vector<string> const & lastopened = session_->lastOpenedFiles();
- files.insert(files.end(), lastopened.begin(), lastopened.end() );
- }
- // clear this list to save a few bytes of RAM
- session_->clearLastOpenedFiles();
-
// Execute batch commands if available
if (!batch_command.empty()) {
// the filename if necessary
string s = fileSearch(string(), *it, "lyx");
if (s.empty()) {
- last_loaded = newFile(*it, string(), true);
+ Buffer * const b = newFile(*it, string(), true);
+ if (b)
+ last_loaded = b;
} else {
- Buffer * buf = bufferlist.newBuffer(s, false);
- buf->error.connect(boost::bind(&LyX::printError, this, _1));
- if (loadLyXFile(buf, s))
+ Buffer * buf = theApp->bufferList().newBuffer(s, false);
+ if (loadLyXFile(buf, s)) {
last_loaded = buf;
+ ErrorList const & el = buf->errorList("Parse");
+ if (!el.empty())
+ for_each(el.begin(), el.end(),
+ boost::bind(&LyX::printError, this, _1));
+ }
else
- bufferlist.release(buf);
+ theApp->bufferList().release(buf);
}
}
bool success = false;
if (last_loaded->dispatch(batch_command, &success)) {
quitLyX(false);
- lyx_exit(!success);
+ return !success;
}
}
files.clear(); // the files are already loaded
// initial geometry
unsigned int width = 690;
unsigned int height = 510;
- bool isMax = false;
+ bool maximize = false;
// first try lyxrc
if (lyxrc.geometry_width != 0 && lyxrc.geometry_height != 0 ) {
width = lyxrc.geometry_width;
if (!val.empty())
height = convert<unsigned int>(val);
if (session().loadSessionInfo("WindowIsMaximized") == "yes")
- isMax = true;
+ maximize = true;
}
// if user wants to restore window position
int posx = -1;
if (!val.empty())
posy = convert<int>(val);
}
- lyx_gui::start(batch_command, files, width, height, posx, posy, isMax);
+
+ if (geometryOption_) {
+ width = 0;
+ height = 0;
+ }
+ // create the main window
+ LyXView * view = &theApp->createView(width, height, posx, posy, maximize);
+ ref().addLyXView(view);
+
+ // load files
+ for_each(files.begin(), files.end(),
+ bind(&LyXView::loadLyXFile, view, _1, true));
+
+ // if a file is specified, I assume that user wants to edit *that* file
+ if (files.empty() && lyxrc.load_session) {
+ vector<string> const & lastopened = session_->lastOpenedFiles();
+ // do not add to the lastfile list since these files are restored from
+ // last seesion, and should be already there (regular files), or should
+ // not be added at all (help files).
+ for_each(lastopened.begin(), lastopened.end(),
+ bind(&LyXView::loadLyXFile, view, _1, false));
+ }
+ // clear this list to save a few bytes of RAM
+ session_->clearLastOpenedFiles();
+
+ return theApp->start(batch_command);
} else {
// Something went wrong above
quitLyX(false);
- lyx_exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
}
void LyX::printError(ErrorItem const & ei)
{
- std::cerr << _("LyX: ") << ei.error
- << ':' << ei.description << std::endl;
-
+ docstring tmp = _("LyX: ") + ei.error + lyx::char_type(':')
+ + ei.description;
+ std::cerr << lyx::to_utf8(tmp) << std::endl;
}
-void LyX::init()
+bool LyX::init()
{
#ifdef SIGHUP
signal(SIGHUP, error_handler);
}
if (lyxrc.roman_font_name.empty())
- lyxrc.roman_font_name = lyx_gui::roman_font_name();
+ lyxrc.roman_font_name =
+ lyx_gui::use_gui? theApp->romanFontName(): "serif";
+
if (lyxrc.sans_font_name.empty())
- lyxrc.sans_font_name = lyx_gui::sans_font_name();
+ lyxrc.sans_font_name =
+ lyx_gui::use_gui? theApp->sansFontName(): "sans";
+
if (lyxrc.typewriter_font_name.empty())
- lyxrc.typewriter_font_name = lyx_gui::typewriter_font_name();
+ lyxrc.typewriter_font_name =
+ lyx_gui::use_gui? theApp->typewriterFontName(): "monospace";
//
// Read configuration files
//
// This one may have been distributed along with LyX.
- readRcFile("lyxrc.dist");
+ if (!readRcFile("lyxrc.dist"))
+ return false;
// Set the PATH correctly.
#if !defined (USE_POSIX_PACKAGING)
if (!lyxrc.path_prefix.empty())
prependEnvPath("PATH", lyxrc.path_prefix);
- // Check that user LyX directory is ok. We don't do that if
- // running in batch mode.
- if (lyx_gui::use_gui) {
- if (queryUserLyXDir(package().explicit_user_support()))
- reconfigureUserLyXDir();
- } else {
+ // Check that user LyX directory is ok.
+ if (queryUserLyXDir(package().explicit_user_support()))
+ reconfigureUserLyXDir();
+
+ // no need for a splash when there is no GUI
+ if (!lyx_gui::use_gui) {
first_start = false;
}
// This one is generated in user_support directory by lib/configure.py.
- readRcFile("lyxrc.defaults");
+ if (!readRcFile("lyxrc.defaults"))
+ return false;
// Query the OS to know what formats are viewed natively
formats.setAutoOpen();
system_lcolor = lcolor;
// This one is edited through the preferences dialog.
- readRcFile("preferences");
+ if (!readRcFile("preferences"))
+ return false;
- readEncodingsFile("encodings");
- readLanguagesFile("languages");
+ if (!readEncodingsFile("encodings"))
+ return false;
+ if (!readLanguagesFile("languages"))
+ return false;
// Load the layouts
lyxerr[Debug::INIT] << "Reading layouts..." << endl;
- LyXSetStyle();
+ if (!LyXSetStyle())
+ return false;
if (lyx_gui::use_gui) {
// Set up bindings
toplevel_keymap->read(lyxrc.bind_file);
// Read menus
- readUIFile(lyxrc.ui_file);
+ if (!readUIFile(lyxrc.ui_file))
+ return false;
}
if (lyxerr.debugging(Debug::LYXRC))
lyxrc.print();
- os::cygwin_path_fix(lyxrc.cygwin_path_fix);
+ os::windows_style_tex_paths(lyxrc.windows_style_tex_paths);
if (!lyxrc.path_prefix.empty())
prependEnvPath("PATH", lyxrc.path_prefix);
if (package().temp_dir().empty()) {
Alert::error(_("Could not create temporary directory"),
bformat(_("Could not create a temporary directory in\n"
- "%1$s. Make sure that this\n"
- "path exists and is writable and try again."),
- lyxrc.tempdir_path));
+ "%1$s. Make sure that this\n"
+ "path exists and is writable and try again."),
+ lyx::from_utf8(lyxrc.tempdir_path)));
// 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.
- lyx_exit(EXIT_FAILURE);
+ return false;
}
if (lyxerr.debugging(Debug::INIT)) {
lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl;
session_.reset(new lyx::Session(lyxrc.num_lastfiles));
+ return true;
}
// contain documents etc. which might be helpful on
// a crash
- bufferlist.emergencyWriteAll();
- if (lyxserver)
- lyxserver->emergencyCleanup();
+ theApp->bufferList().emergencyWriteAll();
+ theApp->server().emergencyCleanup();
}
addName(package().user_support(), file);
return (! fs::exists(absfile))
- || (fs::last_write_time(configure_script)
+ || (fs::last_write_time(configure_script)
> fs::last_write_time(absfile));
}
if (fs::exists(package().user_support()) &&
fs::is_directory(package().user_support())) {
first_start = false;
-
- return needsUpdate("lyxrc.defaults")
- || needsUpdate("textclass.lst")
+
+ return needsUpdate("lyxrc.defaults")
+ || needsUpdate("textclass.lst")
|| needsUpdate("packages.lst");
}
Alert::prompt(
_("Missing user LyX directory"),
bformat(_("You have specified a non-existent user "
- "LyX directory, %1$s.\n"
- "It is needed to keep your own configuration."),
- package().user_support()),
+ "LyX directory, %1$s.\n"
+ "It is needed to keep your own configuration."),
+ lyx::from_utf8(package().user_support())),
1, 0,
_("&Create directory"),
_("&Exit LyX"))) {
- lyxerr << _("No user LyX directory. Exiting.") << endl;
+ lyxerr << lyx::to_utf8(_("No user LyX directory. Exiting.")) << endl;
lyx_exit(EXIT_FAILURE);
}
- lyxerr << bformat(_("LyX: Creating directory %1$s"),
- package().user_support())
+ lyxerr << lyx::to_utf8(bformat(_("LyX: Creating directory %1$s"),
+ lyx::from_utf8(package().user_support())))
<< endl;
if (!createDirectory(package().user_support(), 0755)) {
// Failed, so let's exit.
- lyxerr << _("Failed to create directory. Exiting.")
+ lyxerr << lyx::to_utf8(_("Failed to create directory. Exiting."))
<< endl;
lyx_exit(EXIT_FAILURE);
}
}
-void LyX::readRcFile(string const & name)
+bool LyX::readRcFile(string const & name)
{
lyxerr[Debug::INIT] << "About to read " << name << "... ";
lyxerr[Debug::INIT] << "Found in " << lyxrc_path << endl;
- if (lyxrc.read(lyxrc_path) < 0)
+ if (lyxrc.read(lyxrc_path) < 0) {
showFileError(name);
+ return false;
+ }
} else
lyxerr[Debug::INIT] << "Not found." << lyxrc_path << endl;
+ return true;
}
// Read the ui file `name'
-void LyX::readUIFile(string const & name)
+bool LyX::readUIFile(string const & name)
{
enum Uitags {
ui_menuset = 1,
<< "' has been read already. "
<< "Is this an include loop?"
<< endl;
- return;
+ return false;
}
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
if (ui_path.empty()) {
lyxerr[Debug::INIT] << "Could not find " << name << endl;
showFileError(name);
- return;
+ return false;
}
uifiles.push_back(name);
case ui_include: {
lex.next(true);
string const file = lex.getString();
- readUIFile(file);
+ if (!readUIFile(file))
+ return false;
break;
}
case ui_menuset:
break;
}
}
+ return true;
}
// Read the languages file `name'
-void LyX::readLanguagesFile(string const & name)
+bool LyX::readLanguagesFile(string const & name)
{
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
string const lang_path = libFileSearch(string(), name);
if (lang_path.empty()) {
showFileError(name);
- return;
+ return false;
}
languages.read(lang_path);
+ return true;
}
// Read the encodings file `name'
-void LyX::readEncodingsFile(string const & name)
+bool LyX::readEncodingsFile(string const & name)
{
lyxerr[Debug::INIT] << "About to read " << name << "..." << endl;
string const enc_path = libFileSearch(string(), name);
if (enc_path.empty()) {
showFileError(name);
- return;
+ return false;
}
encodings.read(enc_path);
+ return true;
}
int parse_dbg(string const & arg, string const &)
{
if (arg.empty()) {
- lyxerr << _("List of supported debug flags:") << endl;
+ lyxerr << lyx::to_utf8(_("List of supported debug flags:")) << endl;
Debug::showTags(lyxerr);
exit(0);
}
- lyxerr << bformat(_("Setting debug level to %1$s"), arg) << endl;
+ lyxerr << lyx::to_utf8(bformat(_("Setting debug level to %1$s"), lyx::from_utf8(arg))) << endl;
lyxerr.level(Debug::value(arg));
Debug::showLevel(lyxerr, lyxerr.level());
int parse_help(string const &, string const &)
{
lyxerr <<
- _("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
+ lyx::to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
"Command line switches (case sensitive):\n"
"\t-help summarize LyX usage\n"
"\t-userdir dir set user directory to dir\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;
+ "Check the LyX man page for more details.")) << endl;
exit(0);
return 0;
}
int parse_version(string const &, string const &)
{
lyxerr << "LyX " << lyx_version
- << " of " << lyx_release_date << endl;
+ << " (" << lyx_release_date << ")" << endl;
lyxerr << "Built on " << __DATE__ << ", " << __TIME__ << endl;
lyxerr << lyx_version_info << endl;
int parse_sysdir(string const & arg, string const &)
{
if (arg.empty()) {
- lyxerr << _("Missing directory for -sysdir switch") << endl;
+ lyxerr << lyx::to_utf8(_("Missing directory for -sysdir switch")) << endl;
exit(1);
}
cl_system_support = arg;
int parse_userdir(string const & arg, string const &)
{
if (arg.empty()) {
- lyxerr << _("Missing directory for -userdir switch") << endl;
+ lyxerr << lyx::to_utf8(_("Missing directory for -userdir switch")) << endl;
exit(1);
}
cl_user_support = arg;
int parse_execute(string const & arg, string const &)
{
if (arg.empty()) {
- lyxerr << _("Missing command string after --execute switch") << endl;
+ lyxerr << lyx::to_utf8(_("Missing command string after --execute switch")) << endl;
exit(1);
}
batch = arg;
int parse_export(string const & type, string const &)
{
if (type.empty()) {
- lyxerr << _("Missing file type [eg latex, ps...] after "
- "--export switch") << endl;
+ lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after "
+ "--export switch")) << endl;
exit(1);
}
batch = "buffer-export " + type;
int parse_import(string const & type, string const & file)
{
if (type.empty()) {
- lyxerr << _("Missing file type [eg latex, ps...] after "
- "--import switch") << endl;
+ lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after "
+ "--import switch")) << endl;
exit(1);
}
if (file.empty()) {
- lyxerr << _("Missing filename for --import") << endl;
+ lyxerr << lyx::to_utf8(_("Missing filename for --import")) << endl;
exit(1);
}
std::map<string, cmd_helper>::const_iterator it
= cmdmap.find(argv[i]);
+ // check for X11 -geometry option
+ if (lyx::support::compare(argv[i], "-geometry") == 0)
+ geometryOption_ = true;
+
// don't complain if not found - may be parsed later
if (it == cmdmap.end())
continue;