X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyx_main.C;h=95b1a857723c7c8e979af4f2e652596d5f9a3e7e;hb=c727c6db7f2dd7f6a727462f5d11964888d0e76e;hp=ec5d8ad1b1f1ff053903603eb82e0e63fe041473;hpb=7ce57b1b20a094c2aa5c60a99fd6874c45d4672e;p=lyx.git diff --git a/src/lyx_main.C b/src/lyx_main.C index ec5d8ad1b1..95b1a85772 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -40,6 +40,7 @@ #include "lyxsocket.h" #include "lyxtextclasslist.h" #include "MenuBackend.h" +#include "messages.h" #include "mover.h" #include "ToolbarBackend.h" @@ -49,9 +50,7 @@ #include "frontends/LyXView.h" #include "support/environment.h" -#include "support/filename.h" #include "support/filetools.h" -#include "support/fontutils.h" #include "support/lyxlib.h" #include "support/convert.h" #include "support/os.h" @@ -65,6 +64,8 @@ #include #include +#include +#include #include @@ -91,9 +92,11 @@ namespace os = support::os; namespace fs = boost::filesystem; using std::endl; +using std::for_each; +using std::map; +using std::make_pair; using std::string; using std::vector; -using std::for_each; #ifndef CXX_GLOBAL_CSTD using std::exit; @@ -147,6 +150,10 @@ struct LyX::Singletons { Singletons(): iconv(ucs4_codeset, "UTF-8") { + // Set the default User Interface language as soon as possible. + // The language used will be derived from the environment + // variables. + messages_["GUI"] = Messages(); } /// our function handler LyXFunc lyxfunc_; @@ -168,6 +175,15 @@ struct LyX::Singletons /// Files to load at start. vector files_to_load_; + + /// The messages translators. + map messages_; + + /// The file converters. + Converters converters_; + + // The system converters copy after reading lyxrc.defaults. + Converters system_converters_; }; /// @@ -295,6 +311,18 @@ kb_keymap & LyX::topLevelKeymap() } +Converters & LyX::converters() +{ + return pimpl_->converters_; +} + + +Converters & LyX::systemConverters() +{ + return pimpl_->system_converters_; +} + + IconvProcessor & LyX::iconvProcessor() { return pimpl_->iconv; @@ -308,6 +336,33 @@ kb_keymap const & LyX::topLevelKeymap() const } +Messages & LyX::getMessages(std::string const & language) +{ + map::iterator it = pimpl_->messages_.find(language); + + if (it != pimpl_->messages_.end()) + return it->second; + + std::pair::iterator, bool> result = + pimpl_->messages_.insert(std::make_pair(language, Messages(language))); + + BOOST_ASSERT(result.second); + return result.first->second; +} + + +Messages & LyX::getGuiMessages() +{ + return pimpl_->messages_["GUI"]; +} + + +void LyX::setGuiLanguage(std::string const & language) +{ + pimpl_->messages_["GUI"] = Messages(language); +} + + Buffer const * const LyX::updateInset(InsetBase const * inset) const { if (!inset) @@ -333,8 +388,9 @@ int LyX::exec(int & argc, char * argv[]) // we need to parse for "-dbg" and "-help" easyParse(argc, argv); - support::init_package(argv[0], cl_system_support, cl_user_support, - support::top_build_dir_is_one_level_up); + support::init_package(to_utf8(from_local8bit(argv[0])), + cl_system_support, cl_user_support, + support::top_build_dir_is_one_level_up); if (!use_gui) { // FIXME: create a ConsoleApplication @@ -366,24 +422,13 @@ int LyX::exec(int & argc, char * argv[]) } // Force adding of font path _before_ Application is initialized - support::addFontResources(); + support::os::addFontResources(); // Let the frontend parse and remove all arguments that it knows pimpl_->application_.reset(createApplication(argc, argv)); initGuiFont(); - // 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"))); - // Parse and remove all known arguments in the LyX singleton // Give an error for all remaining ones. int exit_status = init(argc, argv); @@ -395,13 +440,26 @@ int LyX::exec(int & argc, char * argv[]) return exit_status; } + // 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. + 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"))); + // Start the real execution loop. exit_status = pimpl_->application_->exec(); prepareExit(); // Restore original font resources after Application is destroyed. - support::restoreFontResources(); + support::os::restoreFontResources(); return exit_status; } @@ -417,21 +475,16 @@ void LyX::prepareExit() pimpl_->buffer_list_.closeAll(); // 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"), - from_utf8(package().temp_dir())); - Alert::warning(_("Unable to remove temporary directory"), msg); + if (package().temp_dir() != package().system_temp_dir()) { + lyxerr[Debug::INFO] << "Deleting tmp dir " + << package().temp_dir() << endl; + + if (!destroyDir(FileName(package().temp_dir()))) { + docstring const msg = + bformat(_("Unable to remove the temporary directory %1$s"), + from_utf8(package().temp_dir())); + Alert::warning(_("Unable to remove temporary directory"), msg); + } } if (use_gui) { @@ -480,14 +533,11 @@ int LyX::init(int & argc, char * argv[]) return EXIT_FAILURE; 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 - pimpl_->files_to_load_.push_back(fileSearch(string(), os::internal_path(argv[argi]), "lyx")); + pimpl_->files_to_load_.push_back(fileSearch(string(), + os::internal_path(to_utf8(from_local8bit(argv[argi]))), + "lyx", support::allow_unreadable)); } if (first_start) @@ -506,7 +556,6 @@ void LyX::loadFiles() if (it->empty()) continue; - Buffer * const b = newFile(it->absFilename(), string(), true); Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false); if (loadLyXFile(buf, *it)) { ErrorList const & el = buf->errorList("Parse"); @@ -773,6 +822,9 @@ bool LyX::init() if (!readRcFile("lyxrc.dist")) return false; + // Set the language defined by the distributor. + //setGuiLanguage(lyxrc.gui_language); + // Set the PATH correctly. #if !defined (USE_POSIX_PACKAGING) // Add the directory containing the LyX executable to the path @@ -804,7 +856,7 @@ bool LyX::init() system_lyxrc = lyxrc; system_formats = formats; - system_converters = converters; + pimpl_->system_converters_ = pimpl_->converters_; system_movers = movers; system_lcolor = lcolor; @@ -823,6 +875,9 @@ bool LyX::init() return false; if (use_gui) { + // Set the language defined by the user. + //setGuiLanguage(lyxrc.gui_language); + // Set up bindings pimpl_->toplevel_keymap_.reset(new kb_keymap); defaultKeyBindings(pimpl_->toplevel_keymap_.get()); @@ -842,8 +897,9 @@ bool LyX::init() if (!lyxrc.path_prefix.empty()) prependEnvPath("PATH", lyxrc.path_prefix); - if (fs::exists(lyxrc.document_path) && - fs::is_directory(lyxrc.document_path)) + FileName const document_path(lyxrc.document_path); + if (fs::exists(document_path.toFilesystemEncoding()) && + fs::is_directory(document_path.toFilesystemEncoding())) package().document_dir() = lyxrc.document_path; package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path)).absFilename(); @@ -976,11 +1032,19 @@ namespace { // return true if file does not exist or is older than configure.py. bool needsUpdate(string const & file) { - static string const configure_script = - addName(package().system_support(), "configure.py"); - string const absfile = - addName(package().user_support(), file); + // We cannot initialize configure_script directly because the package + // is not initialized yet when static objects are constructed. + static string configure_script; + static bool firstrun = true; + if (firstrun) { + configure_script = FileName(addName( + package().system_support(), + "configure.py")).toFilesystemEncoding(); + firstrun = false; + } + string const absfile = FileName(addName( + package().user_support(), file)).toFilesystemEncoding(); return (! fs::exists(absfile)) || (fs::last_write_time(configure_script) > fs::last_write_time(absfile)); @@ -992,8 +1056,9 @@ bool needsUpdate(string const & file) bool LyX::queryUserLyXDir(bool explicit_userdir) { // Does user directory exist? - if (fs::exists(package().user_support()) && - fs::is_directory(package().user_support())) { + string const user_support = + FileName(package().user_support()).toFilesystemEncoding(); + if (fs::exists(user_support) && fs::is_directory(user_support)) { first_start = false; return needsUpdate("lyxrc.defaults") @@ -1329,8 +1394,8 @@ void LyX::easyParse(int & argc, char * argv[]) if (it == cmdmap.end()) continue; - string arg((i + 1 < argc) ? argv[i + 1] : ""); - string arg2((i + 2 < argc) ? argv[i + 2] : ""); + 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()); int const remove = 1 + it->second(arg, arg2); @@ -1395,9 +1460,33 @@ kb_keymap & theTopLevelKeymap() } +Converters & theConverters() +{ + return LyX::ref().converters(); +} + + +Converters & theSystemConverters() +{ + return LyX::ref().systemConverters(); +} + + IconvProcessor & utf8ToUcs4() { return LyX::ref().iconvProcessor(); } + +Messages & getMessages(std::string const & language) +{ + return LyX::ref().getMessages(language); +} + + +Messages & getGuiMessages() +{ + return LyX::ref().getGuiMessages(); +} + } // namespace lyx