X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=caa2a2b6897730040b8fa97abcefda1667b6cf0a;hb=c4320d24cd2d29c2e77958b4a8fd44f2bd587ca7;hp=960ef9528d146a792b12a26f6890b097c76d667b;hpb=18ae289343da96e5394ca9cd21cc8abd1c4bfcd6;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index 960ef9528d..caa2a2b689 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -17,6 +17,7 @@ #include "lyx_main.h" +#include "ConverterCache.h" #include "buffer.h" #include "buffer_funcs.h" #include "bufferlist.h" @@ -44,6 +45,7 @@ #include "frontends/Alert.h" #include "frontends/Application.h" +#include "frontends/Gui.h" #include "frontends/LyXView.h" #include "support/environment.h" @@ -55,6 +57,7 @@ #include "support/package.h" #include "support/path.h" #include "support/systemcall.h" +#include "support/unicode.h" #include #include @@ -62,25 +65,27 @@ #include #include -using lyx::support::addName; -using lyx::support::addPath; -using lyx::support::bformat; -using lyx::support::createDirectory; -using lyx::support::createLyXTmpDir; -using lyx::support::destroyDir; -using lyx::support::fileSearch; -using lyx::support::getEnv; -using lyx::support::i18nLibFileSearch; -using lyx::support::libFileSearch; -using lyx::support::package; -using lyx::support::prependEnvPath; -using lyx::support::rtrim; -using lyx::support::Systemcall; - -using lyx::docstring; - -namespace Alert = lyx::frontend::Alert; -namespace os = lyx::support::os; + +namespace lyx { + +using support::addName; +using support::addPath; +using support::bformat; +using support::createDirectory; +using support::createLyXTmpDir; +using support::destroyDir; +using support::FileName; +using support::fileSearch; +using support::getEnv; +using support::i18nLibFileSearch; +using support::libFileSearch; +using support::package; +using support::prependEnvPath; +using support::rtrim; +using support::Systemcall; + +namespace Alert = frontend::Alert; +namespace os = support::os; namespace fs = boost::filesystem; using std::endl; @@ -94,10 +99,6 @@ using std::signal; using std::system; #endif -/// -lyx::frontend::Application * theApp = 0; - -namespace lyx { /// are we using the GUI at all? /** @@ -105,8 +106,6 @@ namespace lyx { */ bool use_gui = true; -} // namespace lyx - namespace { @@ -115,12 +114,15 @@ namespace { string cl_system_support; string cl_user_support; +std::string geometryArg; + +LyX * singleton_ = 0; 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."), lyx::from_utf8(error))); + "Please check your installation."), from_utf8(error))); } @@ -128,11 +130,11 @@ void reconfigureUserLyXDir() { string const configure_command = package().configure_command(); - lyxerr << lyx::to_utf8(_("LyX: reconfiguring user directory")) << endl; - lyx::support::Path p(package().user_support()); + lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl; + support::Path p(package().user_support()); Systemcall one; one.startscript(Systemcall::Wait, configure_command); - lyxerr << "LyX: " << lyx::to_utf8(_("Done!")) << endl; + lyxerr << "LyX: " << to_utf8(_("Done!")) << endl; } } // namespace anon @@ -141,6 +143,9 @@ void reconfigureUserLyXDir() /// The main application class private implementation. struct LyX::Singletons { + Singletons(): iconv(ucs4_codeset, "UTF-8") + { + } /// our function handler LyXFunc lyxfunc_; /// @@ -152,45 +157,49 @@ struct LyX::Singletons /// boost::scoped_ptr lyx_socket_; /// - boost::scoped_ptr application_; + boost::scoped_ptr application_; /// lyx session, containing lastfiles, lastfilepos, and lastopened - boost::scoped_ptr session_; -}; + boost::scoped_ptr session_; + /// + IconvProcessor iconv; +}; -boost::scoped_ptr LyX::singleton_; +/// +frontend::Application * theApp() +{ + if (singleton_) + return &singleton_->application(); + else + return 0; +} -int LyX::exec(int & argc, char * argv[]) +LyX::~LyX() { - BOOST_ASSERT(!singleton_.get()); - // We must return from this before launching the gui so that - // other parts of the code can access singleton_ through - // LyX::ref and LyX::cref. - singleton_.reset(new LyX); - // Start the real execution loop. - return singleton_->priv_exec(argc, argv); } LyX & LyX::ref() { - BOOST_ASSERT(singleton_.get()); - return *singleton_.get(); + BOOST_ASSERT(singleton_); + return *singleton_; } LyX const & LyX::cref() { - BOOST_ASSERT(singleton_.get()); - return *singleton_.get(); + BOOST_ASSERT(singleton_); + return *singleton_; } LyX::LyX() - : first_start(false), geometryOption_(false) + : first_start(false) { + singleton_ = this; pimpl_.reset(new Singletons); + geometryArg.clear(); } @@ -206,14 +215,14 @@ BufferList const & LyX::bufferList() const } -lyx::Session & LyX::session() +Session & LyX::session() { BOOST_ASSERT(pimpl_->session_.get()); return *pimpl_->session_.get(); } -lyx::Session const & LyX::session() const +Session const & LyX::session() const { BOOST_ASSERT(pimpl_->session_.get()); return *pimpl_->session_.get(); @@ -260,14 +269,14 @@ LyXServerSocket const & LyX::socket() const } -lyx::frontend::Application & LyX::application() +frontend::Application & LyX::application() { BOOST_ASSERT(pimpl_->application_.get()); return *pimpl_->application_.get(); } -lyx::frontend::Application const & LyX::application() const +frontend::Application const & LyX::application() const { BOOST_ASSERT(pimpl_->application_.get()); return *pimpl_->application_.get(); @@ -281,15 +290,16 @@ kb_keymap & LyX::topLevelKeymap() } -kb_keymap const & LyX::topLevelKeymap() const +IconvProcessor & LyX::iconvProcessor() { - BOOST_ASSERT(pimpl_->toplevel_keymap_.get()); - return *pimpl_->toplevel_keymap_.get(); + return pimpl_->iconv; } -void LyX::addLyXView(LyXView * lyxview) + +kb_keymap const & LyX::topLevelKeymap() const { - views_.push_back(lyxview); + BOOST_ASSERT(pimpl_->toplevel_keymap_.get()); + return *pimpl_->toplevel_keymap_.get(); } @@ -299,10 +309,12 @@ Buffer const * const LyX::updateInset(InsetBase const * inset) const return 0; Buffer const * buffer_ptr = 0; - ViewList::const_iterator it = views_.begin(); - ViewList::const_iterator const end = views_.end(); + vector const & view_ids = pimpl_->application_->gui().viewIds(); + vector::const_iterator it = view_ids.begin(); + vector::const_iterator const end = view_ids.end(); for (; it != end; ++it) { - Buffer const * ptr = (*it)->updateInset(inset); + Buffer const * ptr = + pimpl_->application_->gui().view(*it).updateInset(inset); if (ptr) buffer_ptr = ptr; } @@ -310,58 +322,84 @@ Buffer const * const LyX::updateInset(InsetBase const * inset) const } -int LyX::priv_exec(int & argc, char * argv[]) +int LyX::exec(int & argc, char * argv[]) { // Here we need to parse the command line. At least // we need to parse for "-dbg" and "-help" easyParse(argc, argv); - lyx::support::init_package(argv[0], cl_system_support, cl_user_support, - lyx::support::top_build_dir_is_one_level_up); + support::init_package(argv[0], cl_system_support, cl_user_support, + support::top_build_dir_is_one_level_up); - vector files; - int exit_status = execBatchCommands(argc, argv, files); - - if (exit_status) - return exit_status; + vector files; - if (lyx::use_gui) { - // Force adding of font path _before_ Application is initialized - lyx::support::addFontResources(); - pimpl_->application_.reset(lyx::createApplication(argc, argv)); - initGuiFont(); - // FIXME: this global pointer should probably go. - theApp = pimpl_->application_.get(); - restoreGuiSession(files); - // Start the real execution loop. - - // 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 done, a lyx::server_mode could be created and the following two - * line would be moved out from here. - */ - pimpl_->lyx_server_.reset(new LyXServer(&pimpl_->lyxfunc_, lyxrc.lyxpipes)); - pimpl_->lyx_socket_.reset(new LyXServerSocket(&pimpl_->lyxfunc_, - lyx::support::os::internal_path(package().temp_dir() + "/lyxsocket"))); - - // handle the batch commands the user asked for - if (!batch_command.empty()) { - pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(batch_command)); + if (!use_gui) { + // FIXME: create a ConsoleApplication + int exit_status = loadFiles(argc, argv, files); + if (exit_status) { + prepareExit(); + return exit_status; } - exit_status = pimpl_->application_->start(batch_command); - // Kill the application object before exiting. This avoid crash - // on exit on Linux. - pimpl_->application_.reset(); - // Restore original font resources after Application is destroyed. - lyx::support::restoreFontResources(); + if (batch_command.empty() || pimpl_->buffer_list_.empty()) { + prepareExit(); + return EXIT_SUCCESS; + } + + BufferList::iterator begin = pimpl_->buffer_list_.begin(); + BufferList::iterator end = pimpl_->buffer_list_.end(); + + bool final_success = false; + for (BufferList::iterator I = begin; I != end; ++I) { + Buffer * buf = *I; + bool success = false; + buf->dispatch(batch_command, &success); + final_success |= success; + } + prepareExit(); + return !final_success; } - else { - // FIXME: create a ConsoleApplication - theApp = 0; + + // Force adding of font path _before_ Application is initialized + support::addFontResources(); + + // Let the frontend parse and remove all arguments that it knows + pimpl_->application_.reset(createApplication(argc, argv)); + + initGuiFont(); + + // Parse and remove all known arguments in the LyX singleton + // Give an error for all remaining ones. + int exit_status = loadFiles(argc, argv, files); + if (exit_status) { + // Kill the application object before exiting. + pimpl_->application_.reset(); + use_gui = false; + prepareExit(); + return exit_status; } + restoreGuiSession(files); + // Start the real execution loop. + + // 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. + */ + pimpl_->lyx_server_.reset(new LyXServer(&pimpl_->lyxfunc_, lyxrc.lyxpipes)); + pimpl_->lyx_socket_.reset(new LyXServerSocket(&pimpl_->lyxfunc_, + support::os::internal_path(package().temp_dir() + "/lyxsocket"))); + + exit_status = pimpl_->application_->exec(); + + prepareExit(); + + // Restore original font resources after Application is destroyed. + support::restoreFontResources(); + return exit_status; } @@ -378,15 +416,33 @@ void LyX::prepareExit() // do any other cleanup procedures now lyxerr[Debug::INFO] << "Deleting tmp dir " << package().temp_dir() << endl; + // Prevent the deletion of /tmp if LyX was called with invalid + // arguments. Does not work on windows. + // FIXME: Fix the real bug instead. + if (package().temp_dir() == "/tmp") { + lyxerr << "Not deleting /tmp." << endl; + return; + } + if (!destroyDir(package().temp_dir())) { docstring const msg = bformat(_("Unable to remove the temporary directory %1$s"), - lyx::from_utf8(package().temp_dir())); + from_utf8(package().temp_dir())); Alert::warning(_("Unable to remove temporary directory"), msg); } - pimpl_->lyx_server_.reset(); - pimpl_->lyx_socket_.reset(); + if (use_gui) { + if (pimpl_->session_) + pimpl_->session_->writeFile(); + pimpl_->session_.reset(); + pimpl_->lyx_server_.reset(); + pimpl_->lyx_socket_.reset(); + } + + // Kill the application object before exiting. This avoids crashes + // when exiting on Linux. + if (pimpl_->application_) + pimpl_->application_.reset(); } @@ -400,35 +456,16 @@ void LyX::earlyExit(int status) } -void LyX::quit(bool noask) -{ - lyxerr[Debug::INFO] << "Running QuitLyX." << endl; - - if (lyx::use_gui) { - if (!noask && !pimpl_->buffer_list_.quitWriteAll()) - return; - - pimpl_->session_->writeFile(); - } - - prepareExit(); - - if (lyx::use_gui) { - pimpl_->application_->exit(0); - } -} - - -int LyX::execBatchCommands(int & argc, char * argv[], - vector & files) +int LyX::loadFiles(int & argc, char * argv[], + vector & files) { // check for any spurious extra arguments // other than documents for (int argi = 1; argi < argc ; ++argi) { if (argv[argi][0] == '-') { - lyxerr << lyx::to_utf8( + lyxerr << to_utf8( bformat(_("Wrong command line option `%1$s'. Exiting."), - lyx::from_utf8(argv[argi]))) << endl; + from_utf8(argv[argi]))) << endl; return EXIT_FAILURE; } } @@ -440,66 +477,96 @@ int LyX::execBatchCommands(int & argc, char * argv[], if (!success) return EXIT_FAILURE; - for (int argi = argc - 1; argi >= 1; --argi) - files.push_back(os::internal_path(argv[argi])); + for (int argi = argc - 1; argi >= 1; --argi) { + // check for any remaining extra arguments other than + // document file names. These will be passed out to the + // frontend. + if (argv[argi][0] == '-') + continue; + // get absolute path of file and add ".lyx" to + // the filename if necessary + files.push_back(fileSearch(string(), os::internal_path(argv[argi]), "lyx")); + } if (first_start) files.push_back(i18nLibFileSearch("examples", "splash.lyx")); - // Execute batch commands if available - if (!batch_command.empty()) { - - lyxerr[Debug::INIT] << "About to handle -x '" - << batch_command << '\'' << endl; - - Buffer * last_loaded = 0; - - vector::const_iterator it = files.begin(); - vector::const_iterator end = files.end(); - - for (; it != end; ++it) { - // get absolute path of file and add ".lyx" to - // the filename if necessary - string s = fileSearch(string(), *it, "lyx"); - if (s.empty()) { - Buffer * const b = newFile(*it, string(), true); - if (b) - last_loaded = b; - } else { - Buffer * buf = pimpl_->buffer_list_.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 - pimpl_->buffer_list_.release(buf); - } - } + Buffer * last_loaded = 0; - // try to dispatch to last loaded buffer first - if (last_loaded) { - success = false; - if (last_loaded->dispatch(batch_command, &success)) { - prepareExit(); - return !success; + vector::const_iterator it = files.begin(); + vector::const_iterator end = files.end(); + + for (; it != end; ++it) { + if (it->empty()) { + Buffer * const b = newFile(it->absFilename(), string(), true); + if (b) + last_loaded = b; + } else { + Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false); + if (loadLyXFile(buf, *it)) { + 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 + pimpl_->buffer_list_.release(buf); } - files.clear(); // the files are already loaded } + files.clear(); // the files are already loaded + return EXIT_SUCCESS; } -void LyX::restoreGuiSession(vector const & files) +void LyX::execBatchCommands() +{ + // Execute batch commands if available + if (batch_command.empty()) + return; + + lyxerr[Debug::INIT] << "About to handle -x '" + << batch_command << '\'' << endl; + + pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(batch_command)); +} + + +void LyX::restoreGuiSession(vector const & files) { + LyXView * view = newLyXView(); + + // 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 const & lastopened = pimpl_->session_->lastOpened().getfiles(); + // 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 + pimpl_->session_->lastOpened().clear(); +} + + +LyXView * LyX::newLyXView() +{ + if (!lyx::use_gui) + return 0; + // determine windows size and position, from lyxrc and/or session // initial geometry unsigned int width = 690; unsigned int height = 510; + // default icon size, will be overwritten by stored session value + unsigned int iconSizeXY = 0; bool maximize = false; // first try lyxrc if (lyxrc.geometry_width != 0 && lyxrc.geometry_height != 0 ) { @@ -508,53 +575,43 @@ void LyX::restoreGuiSession(vector const & files) } // if lyxrc returns (0,0), then use session info else { - string val = session().loadSessionInfo("WindowWidth"); + string val = session().sessionInfo().load("WindowWidth"); if (!val.empty()) width = convert(val); - val = session().loadSessionInfo("WindowHeight"); + val = session().sessionInfo().load("WindowHeight"); if (!val.empty()) height = convert(val); - if (session().loadSessionInfo("WindowIsMaximized") == "yes") + if (session().sessionInfo().load("WindowIsMaximized") == "yes") maximize = true; + val = session().sessionInfo().load("IconSizeXY"); + if (!val.empty()) + iconSizeXY = convert(val); } + // if user wants to restore window position int posx = -1; int posy = -1; if (lyxrc.geometry_xysaved) { - string val = session().loadSessionInfo("WindowPosX"); + string val = session().sessionInfo().load("WindowPosX"); if (!val.empty()) posx = convert(val); - val = session().loadSessionInfo("WindowPosY"); + val = session().sessionInfo().load("WindowPosY"); if (!val.empty()) posy = convert(val); } - if (geometryOption_) { + if (!geometryArg.empty()) + { width = 0; height = 0; } - // create the main window - LyXView * view = &pimpl_->application_->createView(width, height, posx, posy, maximize); - ref().addLyXView(view); - // load files - for_each(files.begin(), files.end(), - bind(&LyXView::loadLyXFile, view, _1, true)); + // create the main window + LyXView * view = &pimpl_->application_->createView(width, height, posx, posy, maximize, iconSizeXY, geometryArg); - // if a file is specified, I assume that user wants to edit *that* file - if (files.empty() && lyxrc.load_session) { - vector const & lastopened = pimpl_->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 - pimpl_->session_->clearLastOpenedFiles(); + return view; } - /* Signals and Windows =================== @@ -647,7 +704,7 @@ static void error_handler(int err_sig) #else if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty()) #endif - lyx::support::abort(); + support::abort(); exit(0); } @@ -656,9 +713,9 @@ static void error_handler(int err_sig) void LyX::printError(ErrorItem const & ei) { - docstring tmp = _("LyX: ") + ei.error + lyx::char_type(':') + docstring tmp = _("LyX: ") + ei.error + char_type(':') + ei.description; - std::cerr << lyx::to_utf8(tmp) << std::endl; + std::cerr << to_utf8(tmp) << std::endl; } @@ -718,7 +775,7 @@ bool LyX::init() reconfigureUserLyXDir(); // no need for a splash when there is no GUI - if (!lyx::use_gui) { + if (!use_gui) { first_start = false; } @@ -729,6 +786,9 @@ bool LyX::init() // Query the OS to know what formats are viewed natively formats.setAutoOpen(); + // Read lyxrc.dist again to be able to override viewer auto-detection. + readRcFile("lyxrc.dist"); + system_lyxrc = lyxrc; system_formats = formats; system_converters = converters; @@ -749,7 +809,7 @@ bool LyX::init() if (!LyXSetStyle()) return false; - if (lyx::use_gui) { + if (use_gui) { // Set up bindings pimpl_->toplevel_keymap_.reset(new kb_keymap); defaultKeyBindings(pimpl_->toplevel_keymap_.get()); @@ -773,13 +833,13 @@ bool LyX::init() fs::is_directory(lyxrc.document_path)) package().document_dir() = lyxrc.document_path; - package().temp_dir() = createLyXTmpDir(lyxrc.tempdir_path); + package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path)).absFilename(); 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."), - lyx::from_utf8(lyxrc.tempdir_path))); + 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 @@ -793,7 +853,12 @@ bool LyX::init() } lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl; - pimpl_->session_.reset(new lyx::Session(lyxrc.num_lastfiles)); + pimpl_->session_.reset(new Session(lyxrc.num_lastfiles)); + + // This must happen after package initialization and after lyxrc is + // read, therefore it can't be done by a static object. + ConverterCache::init(); + return true; } @@ -858,11 +923,12 @@ void LyX::emergencyCleanup() const // a crash pimpl_->buffer_list_.emergencyWriteAll(); - if (lyx::use_gui) { - pimpl_->lyx_server_->emergencyCleanup(); - pimpl_->lyx_server_.reset(); - pimpl_->lyx_socket_.reset(); - } + if (use_gui) { + if (pimpl_->lyx_server_) + pimpl_->lyx_server_->emergencyCleanup(); + pimpl_->lyx_server_.reset(); + pimpl_->lyx_socket_.reset(); + } } @@ -932,21 +998,21 @@ bool LyX::queryUserLyXDir(bool explicit_userdir) bformat(_("You have specified a non-existent user " "LyX directory, %1$s.\n" "It is needed to keep your own configuration."), - lyx::from_utf8(package().user_support())), + from_utf8(package().user_support())), 1, 0, _("&Create directory"), _("&Exit LyX"))) { - lyxerr << lyx::to_utf8(_("No user LyX directory. Exiting.")) << endl; + lyxerr << to_utf8(_("No user LyX directory. Exiting.")) << endl; earlyExit(EXIT_FAILURE); } - lyxerr << lyx::to_utf8(bformat(_("LyX: Creating directory %1$s"), - lyx::from_utf8(package().user_support()))) + lyxerr << to_utf8(bformat(_("LyX: Creating directory %1$s"), + from_utf8(package().user_support()))) << endl; if (!createDirectory(package().user_support(), 0755)) { // Failed, so let's exit. - lyxerr << lyx::to_utf8(_("Failed to create directory. Exiting.")) + lyxerr << to_utf8(_("Failed to create directory. Exiting.")) << endl; earlyExit(EXIT_FAILURE); } @@ -959,7 +1025,7 @@ bool LyX::readRcFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "... "; - string const lyxrc_path = libFileSearch(string(), name); + FileName const lyxrc_path = libFileSearch(string(), name); if (!lyxrc_path.empty()) { lyxerr[Debug::INIT] << "Found in " << lyxrc_path << endl; @@ -1008,7 +1074,7 @@ bool LyX::readUIFile(string const & name) lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string const ui_path = libFileSearch("ui", name, "ui"); + FileName const ui_path = libFileSearch("ui", name, "ui"); if (ui_path.empty()) { lyxerr[Debug::INIT] << "Could not find " << name << endl; @@ -1066,7 +1132,7 @@ bool LyX::readLanguagesFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string const lang_path = libFileSearch(string(), name); + FileName const lang_path = libFileSearch(string(), name); if (lang_path.empty()) { showFileError(name); return false; @@ -1081,7 +1147,7 @@ bool LyX::readEncodingsFile(string const & name) { lyxerr[Debug::INIT] << "About to read " << name << "..." << endl; - string const enc_path = libFileSearch(string(), name); + FileName const enc_path = libFileSearch(string(), name); if (enc_path.empty()) { showFileError(name); return false; @@ -1101,11 +1167,11 @@ typedef boost::function cmd_helper; int parse_dbg(string const & arg, string const &) { if (arg.empty()) { - lyxerr << lyx::to_utf8(_("List of supported debug flags:")) << endl; + lyxerr << to_utf8(_("List of supported debug flags:")) << endl; Debug::showTags(lyxerr); exit(0); } - lyxerr << lyx::to_utf8(bformat(_("Setting debug level to %1$s"), lyx::from_utf8(arg))) << endl; + lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl; lyxerr.level(Debug::value(arg)); Debug::showLevel(lyxerr, lyxerr.level()); @@ -1116,7 +1182,7 @@ int parse_dbg(string const & arg, string const &) int parse_help(string const &, string const &) { lyxerr << - lyx::to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n" + 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" @@ -1152,7 +1218,7 @@ int parse_version(string const &, string const &) int parse_sysdir(string const & arg, string const &) { if (arg.empty()) { - lyxerr << lyx::to_utf8(_("Missing directory for -sysdir switch")) << endl; + lyxerr << to_utf8(_("Missing directory for -sysdir switch")) << endl; exit(1); } cl_system_support = arg; @@ -1162,7 +1228,7 @@ int parse_sysdir(string const & arg, string const &) int parse_userdir(string const & arg, string const &) { if (arg.empty()) { - lyxerr << lyx::to_utf8(_("Missing directory for -userdir switch")) << endl; + lyxerr << to_utf8(_("Missing directory for -userdir switch")) << endl; exit(1); } cl_user_support = arg; @@ -1172,7 +1238,7 @@ int parse_userdir(string const & arg, string const &) int parse_execute(string const & arg, string const &) { if (arg.empty()) { - lyxerr << lyx::to_utf8(_("Missing command string after --execute switch")) << endl; + lyxerr << to_utf8(_("Missing command string after --execute switch")) << endl; exit(1); } batch = arg; @@ -1182,24 +1248,24 @@ int parse_execute(string const & arg, string const &) int parse_export(string const & type, string const &) { if (type.empty()) { - lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after " + lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after " "--export switch")) << endl; exit(1); } batch = "buffer-export " + type; - lyx::use_gui = false; + use_gui = false; return 1; } int parse_import(string const & type, string const & file) { if (type.empty()) { - lyxerr << lyx::to_utf8(_("Missing file type [eg latex, ps...] after " + lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after " "--import switch")) << endl; exit(1); } if (file.empty()) { - lyxerr << lyx::to_utf8(_("Missing filename for --import")) << endl; + lyxerr << to_utf8(_("Missing filename for --import")) << endl; exit(1); } @@ -1207,6 +1273,19 @@ int parse_import(string const & type, string const & file) return 2; } +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 +} + + } // namespace anon @@ -1227,15 +1306,12 @@ void LyX::easyParse(int & argc, char * argv[]) cmdmap["--export"] = parse_export; cmdmap["-i"] = parse_import; cmdmap["--import"] = parse_import; + cmdmap["-geometry"] = parse_geometry; for (int i = 1; i < argc; ++i) { std::map::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; @@ -1247,16 +1323,17 @@ void LyX::easyParse(int & argc, char * argv[]) // Now, remove used arguments by shifting // the following ones remove places down. - argc -= remove; - for (int j = i; j < argc; ++j) - argv[j] = argv[j + remove]; - --i; + if (remove > 0) { + argc -= remove; + for (int j = i; j < argc; ++j) + argv[j] = argv[j + remove]; + --i; + } } batch_command = batch; } -namespace lyx { FuncStatus getStatus(FuncRequest const & action) { @@ -1269,8 +1346,6 @@ void dispatch(FuncRequest const & action) LyX::ref().lyxFunc().dispatch(action); } -} // namespace lyx - BufferList & theBufferList() { @@ -1287,7 +1362,7 @@ LyXFunc & theLyXFunc() LyXServer & theLyXServer() { // FIXME: this should not be use_gui dependent - BOOST_ASSERT(lyx::use_gui); + BOOST_ASSERT(use_gui); return LyX::ref().server(); } @@ -1295,13 +1370,21 @@ LyXServer & theLyXServer() LyXServerSocket & theLyXServerSocket() { // FIXME: this should not be use_gui dependent - BOOST_ASSERT(lyx::use_gui); + BOOST_ASSERT(use_gui); return LyX::ref().socket(); } kb_keymap & theTopLevelKeymap() { - BOOST_ASSERT(lyx::use_gui); + BOOST_ASSERT(use_gui); return LyX::ref().topLevelKeymap(); } + + +IconvProcessor & utf8ToUcs4() +{ + return LyX::ref().iconvProcessor(); +} + +} // namespace lyx