]> git.lyx.org Git - lyx.git/blobdiff - src/LyX.cpp
Update the GuiLabel view when the document is read-only. Also disable the text field.
[lyx.git] / src / LyX.cpp
index f4fdda708ffe9f18e70114f0b51b10696aaa7e7d..7b5c07636f00556e3b9fa21e5d44ecc3a9424b2c 100644 (file)
@@ -4,10 +4,10 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Alfredo Braunstein
  * Licence details can be found in the file COPYING.
  *
  * \author Alfredo Braunstein
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Jean-Marc Lasgouttes
  * \author John Levon
  * \author Jean-Marc Lasgouttes
  * \author John Levon
- * \author André Pönitz
+ * \author André Pönitz
  *
  * Full author contact details are available in file CREDITS.
  */
  *
  * Full author contact details are available in file CREDITS.
  */
 
 #include "LyX.h"
 
 
 #include "LyX.h"
 
-#include "buffer_funcs.h"
+#include "AspellChecker.h"
 #include "Buffer.h"
 #include "BufferList.h"
 #include "CmdDef.h"
 #include "Buffer.h"
 #include "BufferList.h"
 #include "CmdDef.h"
-#include "Color.h"
+#include "ColorSet.h"
 #include "ConverterCache.h"
 #include "Converter.h"
 #include "CutAndPaste.h"
 #include "Encoding.h"
 #include "ErrorList.h"
 #include "Format.h"
 #include "ConverterCache.h"
 #include "Converter.h"
 #include "CutAndPaste.h"
 #include "Encoding.h"
 #include "ErrorList.h"
 #include "Format.h"
+#include "FuncStatus.h"
+#include "HunspellChecker.h"
 #include "KeyMap.h"
 #include "Language.h"
 #include "KeyMap.h"
 #include "Language.h"
+#include "LayoutFile.h"
 #include "Lexer.h"
 #include "LyXAction.h"
 #include "LyXFunc.h"
 #include "LyXRC.h"
 #include "Lexer.h"
 #include "LyXAction.h"
 #include "LyXFunc.h"
 #include "LyXRC.h"
-#include "MenuBackend.h"
 #include "ModuleList.h"
 #include "Mover.h"
 #include "Server.h"
 #include "ServerSocket.h"
 #include "Session.h"
 #include "ModuleList.h"
 #include "Mover.h"
 #include "Server.h"
 #include "ServerSocket.h"
 #include "Session.h"
-#include "TextClassList.h"
-#include "ToolbarBackend.h"
 
 #include "frontends/alert.h"
 #include "frontends/Application.h"
 
 
 #include "frontends/alert.h"
 #include "frontends/Application.h"
 
+#include "graphics/Previews.h"
+
+#include "support/lassert.h"
 #include "support/debug.h"
 #include "support/environment.h"
 #include "support/ExceptionMessage.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/debug.h"
 #include "support/environment.h"
 #include "support/ExceptionMessage.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
-#include "support/lyxlib.h"
 #include "support/Messages.h"
 #include "support/os.h"
 #include "support/Package.h"
 #include "support/Messages.h"
 #include "support/os.h"
 #include "support/Package.h"
@@ -66,6 +68,7 @@
 #include <iostream>
 #include <csignal>
 #include <map>
 #include <iostream>
 #include <csignal>
 #include <map>
+#include <stdlib.h>
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
@@ -84,8 +87,6 @@ namespace os = support::os;
 
 bool use_gui = true;
 
 
 bool use_gui = true;
 
-bool quitting; // flag, that we are quitting the program
-
 namespace {
 
 // Filled with the command line arguments "foo" of "-sysdir foo" or
 namespace {
 
 // Filled with the command line arguments "foo" of "-sysdir foo" or
@@ -93,7 +94,7 @@ namespace {
 string cl_system_support;
 string cl_user_support;
 
 string cl_system_support;
 string cl_user_support;
 
-std::string geometryArg;
+string geometryArg;
 
 LyX * singleton_ = 0;
 
 
 LyX * singleton_ = 0;
 
@@ -110,7 +111,7 @@ void reconfigureUserLyXDir()
        string const configure_command = package().configure_command();
 
        lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl;
        string const configure_command = package().configure_command();
 
        lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl;
-       support::PathChanger p(package().user_support());
+       PathChanger p(package().user_support());
        Systemcall one;
        one.startscript(Systemcall::Wait, configure_command);
        lyxerr << "LyX: " << to_utf8(_("Done!")) << endl;
        Systemcall one;
        one.startscript(Systemcall::Wait, configure_command);
        lyxerr << "LyX: " << to_utf8(_("Done!")) << endl;
@@ -118,17 +119,23 @@ void reconfigureUserLyXDir()
 
 } // namespace anon
 
 
 } // namespace anon
 
-
 /// The main application class private implementation.
 struct LyX::Impl
 {
 /// The main application class private implementation.
 struct LyX::Impl
 {
-       Impl()
+       Impl() : spell_checker_(0), aspell_checker_(0), hunspell_checker_(0)
        {
                // Set the default User Interface language as soon as possible.
                // The language used will be derived from the environment
                // variables.
                messages_["GUI"] = Messages();
        }
        {
                // Set the default User Interface language as soon as possible.
                // The language used will be derived from the environment
                // variables.
                messages_["GUI"] = Messages();
        }
+
+       ~Impl()
+       {
+               delete aspell_checker_;
+               delete hunspell_checker_;
+       }
+
        /// our function handler
        LyXFunc lyxfunc_;
        ///
        /// our function handler
        LyXFunc lyxfunc_;
        ///
@@ -147,7 +154,7 @@ struct LyX::Impl
        boost::scoped_ptr<Session> session_;
 
        /// Files to load at start.
        boost::scoped_ptr<Session> session_;
 
        /// Files to load at start.
-       vector<FileName> files_to_load_;
+       vector<string> files_to_load_;
 
        /// The messages translators.
        map<string, Messages> messages_;
 
        /// The messages translators.
        map<string, Messages> messages_;
@@ -166,7 +173,16 @@ struct LyX::Impl
        /// has this user started lyx for the first time?
        bool first_start;
        /// the parsed command line batch command if any
        /// has this user started lyx for the first time?
        bool first_start;
        /// the parsed command line batch command if any
-       std::string batch_command;
+       vector<string> batch_commands;
+
+       ///
+       graphics::Previews preview_;
+       ///
+       SpellChecker * spell_checker_;
+       ///
+       SpellChecker * aspell_checker_;
+       ///
+       SpellChecker * hunspell_checker_;
 };
 
 ///
 };
 
 ///
@@ -181,21 +197,28 @@ frontend::Application * theApp()
 
 LyX::~LyX()
 {
 
 LyX::~LyX()
 {
+       singleton_ = 0;
        delete pimpl_;
 }
 
 
        delete pimpl_;
 }
 
 
-LyX & LyX::ref()
+void lyx_exit(int exit_code)
 {
 {
-       BOOST_ASSERT(singleton_);
-       return *singleton_;
-}
+       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
 
 
-LyX const & LyX::cref()
-{
-       BOOST_ASSERT(singleton_);
-       return *singleton_;
+       // In release mode, try to exit gracefully.
+       if (theApp())
+               theApp()->exit(exit_code);
+       else
+               exit(exit_code);
 }
 
 
 }
 
 
@@ -207,140 +230,37 @@ LyX::LyX()
 }
 
 
 }
 
 
-BufferList & LyX::bufferList()
-{
-       return pimpl_->buffer_list_;
-}
-
-
-BufferList const & LyX::bufferList() const
-{
-       return pimpl_->buffer_list_;
-}
-
-
-Session & LyX::session()
-{
-       BOOST_ASSERT(pimpl_->session_.get());
-       return *pimpl_->session_.get();
-}
-
-
-Session const & LyX::session() const
-{
-       BOOST_ASSERT(pimpl_->session_.get());
-       return *pimpl_->session_.get();
-}
-
-
-LyXFunc & LyX::lyxFunc()
-{
-       return pimpl_->lyxfunc_;
-}
-
-
-LyXFunc const & LyX::lyxFunc() const
-{
-       return pimpl_->lyxfunc_;
-}
-
-
-Server & LyX::server()
-{
-       BOOST_ASSERT(pimpl_->lyx_server_.get());
-       return *pimpl_->lyx_server_.get();
-}
-
-
-Server const & LyX::server() const
-{
-       BOOST_ASSERT(pimpl_->lyx_server_.get());
-       return *pimpl_->lyx_server_.get();
-}
-
-
-ServerSocket & LyX::socket()
-{
-       BOOST_ASSERT(pimpl_->lyx_socket_.get());
-       return *pimpl_->lyx_socket_.get();
-}
-
-
-ServerSocket const & LyX::socket() const
-{
-       BOOST_ASSERT(pimpl_->lyx_socket_.get());
-       return *pimpl_->lyx_socket_.get();
-}
-
-
-frontend::Application & LyX::application()
-{
-       BOOST_ASSERT(pimpl_->application_.get());
-       return *pimpl_->application_.get();
-}
-
-
-frontend::Application const & LyX::application() const
-{
-       BOOST_ASSERT(pimpl_->application_.get());
-       return *pimpl_->application_.get();
-}
-
-
-KeyMap & LyX::topLevelKeymap()
-{
-       return pimpl_->toplevel_keymap_;
-}
-
-
-CmdDef & LyX::topLevelCmdDef()
-{
-       return pimpl_->toplevel_cmddef_;
-}
-
-
-Converters & LyX::converters()
-{
-       return pimpl_->converters_;
-}
-
-
-Converters & LyX::systemConverters()
-{
-       return pimpl_->system_converters_;
-}
-
-
-KeyMap const & LyX::topLevelKeymap() const
-{
-       return pimpl_->toplevel_keymap_;
-}
-
-
-Messages & LyX::getMessages(std::string const & language)
+Messages & LyX::messages(string const & language)
 {
        map<string, Messages>::iterator it = pimpl_->messages_.find(language);
 
        if (it != pimpl_->messages_.end())
                return it->second;
 
 {
        map<string, Messages>::iterator it = pimpl_->messages_.find(language);
 
        if (it != pimpl_->messages_.end())
                return it->second;
 
-       std::pair<map<string, Messages>::iterator, bool> result =
-                       pimpl_->messages_.insert(std::make_pair(language, Messages(language)));
+       pair<map<string, Messages>::iterator, bool> result =
+                       pimpl_->messages_.insert(make_pair(language, Messages(language)));
 
 
-       BOOST_ASSERT(result.second);
+       LASSERT(result.second, /**/);
        return result.first->second;
 }
 
 
        return result.first->second;
 }
 
 
-Messages & LyX::getGuiMessages()
+void setRcGuiLanguage()
 {
 {
-       return pimpl_->messages_["GUI"];
-}
-
-
-void LyX::setGuiLanguage(std::string const & language)
-{
-       pimpl_->messages_["GUI"] = Messages(language);
+       LASSERT(singleton_, /**/);
+       if (lyxrc.gui_language == "auto")
+               return;
+       Language const * language = languages.getLanguage(lyxrc.gui_language);
+       if (language) {
+               LYXERR(Debug::LOCALE, "Setting LANGUAGE to " << language->code());
+               if (!setEnv("LANGUAGE", language->code()))
+                       LYXERR(Debug::LOCALE, "\t... failed!");
+       }
+       LYXERR(Debug::LOCALE, "Setting LC_ALL to en_US");
+       if (!setEnv("LC_ALL", "en_US"))
+               LYXERR(Debug::LOCALE, "\t... failed!");
+       Messages::init();
+       singleton_->pimpl_->messages_["GUI"] = Messages();
 }
 
 
 }
 
 
@@ -351,14 +271,14 @@ int LyX::exec(int & argc, char * argv[])
        easyParse(argc, argv);
 
        try {
        easyParse(argc, argv);
 
        try {
-               support::init_package(to_utf8(from_local8bit(argv[0])),
+               init_package(to_utf8(from_local8bit(argv[0])),
                              cl_system_support, cl_user_support,
                              cl_system_support, cl_user_support,
-                             support::top_build_dir_is_one_level_up);
-       } catch (support::ExceptionMessage const & message) {
-               if (message.type_ == support::ErrorException) {
+                             top_build_dir_is_one_level_up);
+       } catch (ExceptionMessage const & message) {
+               if (message.type_ == ErrorException) {
                        Alert::error(message.title_, message.details_);
                        Alert::error(message.title_, message.details_);
-                       exit(1);
-               } else if (message.type_ == support::WarningException) {
+                       lyx_exit(1);
+               } else if (message.type_ == WarningException) {
                        Alert::warning(message.title_, message.details_);
                }
        }
                        Alert::warning(message.title_, message.details_);
                }
        }
@@ -375,11 +295,12 @@ int LyX::exec(int & argc, char * argv[])
                        return exit_status;
                }
 
                        return exit_status;
                }
 
-               loadFiles();
+               // this is correct, since return values are inverted.
+               exit_status = !loadFiles();
 
 
-               if (pimpl_->batch_command.empty() || pimpl_->buffer_list_.empty()) {
+               if (pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) {
                        prepareExit();
                        prepareExit();
-                       return EXIT_SUCCESS;
+                       return exit_status;
                }
 
                BufferList::iterator begin = pimpl_->buffer_list_.begin();
                }
 
                BufferList::iterator begin = pimpl_->buffer_list_.begin();
@@ -389,9 +310,14 @@ int LyX::exec(int & argc, char * argv[])
                        Buffer * buf = *I;
                        if (buf != buf->masterBuffer())
                                continue;
                        Buffer * buf = *I;
                        if (buf != buf->masterBuffer())
                                continue;
-                       bool success = false;
-                       buf->dispatch(pimpl_->batch_command, &success);
-                       final_success |= success;
+                       vector<string>::const_iterator bcit  = pimpl_->batch_commands.begin();
+                       vector<string>::const_iterator bcend = pimpl_->batch_commands.end();
+                       DispatchResult dr;
+                       for (; bcit != bcend; bcit++) {
+                               LYXERR(Debug::ACTION, "Buffer::dispatch: cmd: " << *bcit);
+                               buf->dispatch(*bcit, dr);
+                               final_success |= !dr.error();
+                       }
                }
                prepareExit();
                return !final_success;
                }
                prepareExit();
                return !final_success;
@@ -400,6 +326,10 @@ int LyX::exec(int & argc, char * argv[])
        // Let the frontend parse and remove all arguments that it knows
        pimpl_->application_.reset(createApplication(argc, argv));
 
        // Let the frontend parse and remove all arguments that it knows
        pimpl_->application_.reset(createApplication(argc, argv));
 
+       // Reestablish our defaults, as Qt overwrites them
+       // after createApplication()
+       locale_init();
+
        // Parse and remove all known arguments in the LyX singleton
        // Give an error for all remaining ones.
        int exit_status = init(argc, argv);
        // Parse and remove all known arguments in the LyX singleton
        // Give an error for all remaining ones.
        int exit_status = init(argc, argv);
@@ -410,7 +340,7 @@ int LyX::exec(int & argc, char * argv[])
                prepareExit();
                return exit_status;
        }
                prepareExit();
                return exit_status;
        }
-
        // FIXME
        /* Create a CoreApplication class that will provide the main event loop
        * and the socket callback registering. With Qt4, only QtCore
        // FIXME
        /* Create a CoreApplication class that will provide the main event loop
        * and the socket callback registering. With Qt4, only QtCore
@@ -439,9 +369,8 @@ void LyX::prepareExit()
        cap::clearCutStack();
        cap::clearSelection();
 
        cap::clearCutStack();
        cap::clearSelection();
 
-       // Set a flag that we do quitting from the program,
-       // so no refreshes are necessary.
-       quitting = true;
+       // Write the index file of the converter cache
+       ConverterCache::get().writeIndex();
 
        // close buffers first
        pimpl_->buffer_list_.closeAll();
 
        // close buffers first
        pimpl_->buffer_list_.closeAll();
@@ -457,14 +386,21 @@ void LyX::prepareExit()
 
        // do any other cleanup procedures now
        if (package().temp_dir() != package().system_temp_dir()) {
 
        // do any other cleanup procedures now
        if (package().temp_dir() != package().system_temp_dir()) {
-               LYXERR(Debug::INFO, "Deleting tmp dir "
-                                   << package().temp_dir().absFilename());
-
-               if (!package().temp_dir().destroyDirectory()) {
+               string const abs_tmpdir = package().temp_dir().absFilename();
+               if (!contains(package().temp_dir().absFilename(), "lyx_tmpdir")) {
                        docstring const msg =
                        docstring const msg =
-                               bformat(_("Unable to remove the temporary directory %1$s"),
-                               from_utf8(package().temp_dir().absFilename()));
-                       Alert::warning(_("Unable to remove temporary directory"), msg);
+                               bformat(_("%1$s does not appear like a LyX created temporary directory."),
+                               from_utf8(abs_tmpdir));
+                       Alert::warning(_("Cannot remove temporary directory"), msg);
+               } else {
+                       LYXERR(Debug::INFO, "Deleting tmp dir "
+                               << package().temp_dir().absFilename());
+                       if (!package().temp_dir().destroyDirectory()) {
+                               docstring const msg =
+                                       bformat(_("Unable to remove the temporary directory %1$s"),
+                                       from_utf8(package().temp_dir().absFilename()));
+                               Alert::warning(_("Unable to remove temporary directory"), msg);
+                       }
                }
        }
 
                }
        }
 
@@ -477,7 +413,7 @@ void LyX::prepareExit()
 
 void LyX::earlyExit(int status)
 {
 
 void LyX::earlyExit(int status)
 {
-       BOOST_ASSERT(pimpl_->application_.get());
+       LASSERT(pimpl_->application_.get(), /**/);
        // LyX::pimpl_::application_ is not initialised at this
        // point so it's safe to just exit after some cleanup.
        prepareExit();
        // LyX::pimpl_::application_ is not initialised at this
        // point so it's safe to just exit after some cleanup.
        prepareExit();
@@ -505,72 +441,75 @@ int LyX::init(int & argc, char * argv[])
        if (!success)
                return EXIT_FAILURE;
 
        if (!success)
                return EXIT_FAILURE;
 
-       for (int argi = argc - 1; argi >= 1; --argi) {
-               // get absolute path of file and add ".lyx" to
-               // the filename if necessary
-               pimpl_->files_to_load_.push_back(fileSearch(string(),
-                       os::internal_path(to_utf8(from_local8bit(argv[argi]))),
-                       "lyx", support::allow_unreadable));
-       }
+       // 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])));
 
 
-       if (first_start)
-               pimpl_->files_to_load_.push_back(i18nLibFileSearch("examples", "splash.lyx"));
+       if (first_start) {
+               pimpl_->files_to_load_.push_back(
+                       i18nLibFileSearch("examples", "splash.lyx").absFilename());
+       }
 
        return EXIT_SUCCESS;
 }
 
 
 
        return EXIT_SUCCESS;
 }
 
 
-void LyX::addFileToLoad(FileName const & fname)
-{
-       vector<FileName>::const_iterator cit = std::find(
-               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);
-}
-
-
-void LyX::loadFiles()
+bool LyX::loadFiles()
 {
 {
-       vector<FileName>::const_iterator it = pimpl_->files_to_load_.begin();
-       vector<FileName>::const_iterator end = pimpl_->files_to_load_.end();
+       LASSERT(!use_gui, /**/);
+       bool success = true;
+       vector<string>::const_iterator it = pimpl_->files_to_load_.begin();
+       vector<string>::const_iterator end = pimpl_->files_to_load_.end();
 
        for (; it != end; ++it) {
 
        for (; it != end; ++it) {
-               if (it->empty())
+               // 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())
                        continue;
 
                        continue;
 
-               Buffer * buf = pimpl_->buffer_list_.newBuffer(it->absFilename(), false);
-               if (buf->loadLyXFile(*it)) {
+               Buffer * buf = pimpl_->buffer_list_.newBuffer(fname.absFilename(), false);
+               if (buf->loadLyXFile(fname)) {
                        ErrorList const & el = buf->errorList("Parse");
                        if (!el.empty())
                                for_each(el.begin(), el.end(),
                                boost::bind(&LyX::printError, this, _1));
                }
                        ErrorList const & el = buf->errorList("Parse");
                        if (!el.empty())
                                for_each(el.begin(), el.end(),
                                boost::bind(&LyX::printError, this, _1));
                }
-               else
+               else {
                        pimpl_->buffer_list_.release(buf);
                        pimpl_->buffer_list_.release(buf);
+                       success = false;
+               }
        }
        }
+       return success;
+}
+
+
+void execBatchCommands()
+{
+       LASSERT(singleton_, /**/);
+       singleton_->execCommands();
 }
 
 
 }
 
 
-void LyX::execBatchCommands()
+void LyX::execCommands()
 {
        // The advantage of doing this here is that the event loop
        // is already started. So any need for interaction will be
        // aknowledged.
 {
        // The advantage of doing this here is that the event loop
        // is already started. So any need for interaction will be
        // aknowledged.
-       restoreGuiSession();
 
        // if reconfiguration is needed.
 
        // if reconfiguration is needed.
-       if (textclasslist.empty()) {
-           switch (Alert::prompt(
-                   _("No textclass is found"),
-                   _("LyX cannot continue because no textclass is found. "
-                     "You can either reconfigure normally, or reconfigure using "
-                     "default textclasses, or quit LyX."),
-                   0, 2,
-                   _("&Reconfigure"),
-                   _("&Use Default"),
-                   _("&Exit LyX")))
+       while (LayoutFileList::get().empty()) {
+               switch (Alert::prompt(
+                       _("No textclass is found"),
+                       _("LyX cannot continue because no textclass is found. "
+                               "You can either reconfigure normally, or reconfigure using "
+                               "default textclasses, or quit LyX."),
+                       0, 2,
+                       _("&Reconfigure"),
+                       _("&Use Default"),
+                       _("&Exit LyX")))
                {
                case 0:
                        // regular reconfigure
                {
                case 0:
                        // regular reconfigure
@@ -581,62 +520,40 @@ void LyX::execBatchCommands()
                        pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE,
                                " --without-latex-config"));
                        break;
                        pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE,
                                " --without-latex-config"));
                        break;
+               default:
+                       pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT));
+                       return;
                }
                }
-               pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_LYX_QUIT));
-               return;
        }
        
        }
        
-       // 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));
-}
-
-
-void LyX::restoreGuiSession()
-{
-       // create the main window
+       // create the first main window
        pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg));
 
        pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_WINDOW_NEW, geometryArg));
 
-       // if there is no valid class list, do not load any file. 
-       if (textclasslist.empty())
-               return;
-
-       // if some files were specified at command-line we assume that the
-       // user wants to edit *these* files and not to restore the session.
        if (!pimpl_->files_to_load_.empty()) {
        if (!pimpl_->files_to_load_.empty()) {
-               for_each(pimpl_->files_to_load_.begin(),
-                       pimpl_->files_to_load_.end(),
-                       bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, true));
+               // 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]));
+               }
                // clear this list to save a few bytes of RAM
                pimpl_->files_to_load_.clear();
                // clear this list to save a few bytes of RAM
                pimpl_->files_to_load_.clear();
-               pimpl_->session_->lastOpened().clear();
-
-       } else if (lyxrc.load_session) {
-               vector<FileName> const & lastopened = pimpl_->session_->lastOpened().getfiles();
-               // do not add to the lastfile list since these files are restored from
-               // last session, and should be already there (regular files), or should
-               // not be added at all (help files).
-               for_each(lastopened.begin(), lastopened.end(),
-                       bind(&LyXFunc::loadAndViewFile, pimpl_->lyxfunc_, _1, false));
+       } else
+               pimpl_->application_->restoreGuiSession();
 
 
-               // clear this list to save a few bytes of RAM
-               pimpl_->session_->lastOpened().clear();
-       }
+       // Execute batch commands if available
+       if (pimpl_->batch_commands.empty())
+               return;
 
 
-       BufferList::iterator I = pimpl_->buffer_list_.begin();
-       BufferList::iterator end = pimpl_->buffer_list_.end();
-       for (; I != end; ++I) {
-               Buffer * buf = *I;
-               if (buf != buf->masterBuffer())
-                       continue;
-               updateLabels(*buf);
+       vector<string>::const_iterator bcit  = pimpl_->batch_commands.begin();
+       vector<string>::const_iterator bcend = pimpl_->batch_commands.end();
+       for (; bcit != bcend; bcit++) {
+               LYXERR(Debug::INIT, "About to handle -x '" << *bcit << '\'');
+               pimpl_->lyxfunc_.dispatch(lyxaction.lookupFunc(*bcit));
        }
 }
 
        }
 }
 
+
 /*
 Signals and Windows
 ===================
 /*
 Signals and Windows
 ===================
@@ -644,7 +561,7 @@ The SIGHUP signal does not exist on Windows and does not need to be handled.
 
 Windows handles SIGFPE and SIGSEGV signals as expected.
 
 
 Windows handles SIGFPE and SIGSEGV signals as expected.
 
-Cntl+C interrupts (mapped to SIGINT by Windows' POSIX compatability layer)
+Ctrl+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.
 
 cause a new thread to be spawned. This may well result in unexpected
 behaviour by the single-threaded LyX.
 
@@ -679,7 +596,7 @@ static void error_handler(int err_sig)
 
        // We have received a signal indicating a fatal error, so
        // try and save the data ASAP.
 
        // We have received a signal indicating a fatal error, so
        // try and save the data ASAP.
-       LyX::cref().emergencyCleanup();
+       emergencyCleanup();
 
        // These lyxerr calls may or may not work:
 
 
        // These lyxerr calls may or may not work:
 
@@ -729,7 +646,7 @@ static void error_handler(int err_sig)
 #else
        if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty())
 #endif
 #else
        if (err_sig == SIGSEGV || !getEnv("LYXDEBUG").empty())
 #endif
-               support::abort();
+               abort();
        exit(0);
 }
 
        exit(0);
 }
 
@@ -740,7 +657,7 @@ void LyX::printError(ErrorItem const & ei)
 {
        docstring tmp = _("LyX: ") + ei.error + char_type(':')
                + ei.description;
 {
        docstring tmp = _("LyX: ") + ei.error + char_type(':')
                + ei.description;
-       std::cerr << to_utf8(tmp) << std::endl;
+       cerr << to_utf8(tmp) << endl;
 }
 
 
 }
 
 
@@ -776,7 +693,7 @@ bool LyX::init()
                return false;
 
        // Set the language defined by the distributor.
                return false;
 
        // Set the language defined by the distributor.
-       //setGuiLanguage(lyxrc.gui_language);
+       setRcGuiLanguage();
 
        // Set the PATH correctly.
 #if !defined (USE_POSIX_PACKAGING)
 
        // Set the PATH correctly.
 #if !defined (USE_POSIX_PACKAGING)
@@ -807,6 +724,9 @@ bool LyX::init()
        // Read lyxrc.dist again to be able to override viewer auto-detection.
        readRcFile("lyxrc.dist");
 
        // Read lyxrc.dist again to be able to override viewer auto-detection.
        readRcFile("lyxrc.dist");
 
+       // Set again the language defined by the distributor.
+       setRcGuiLanguage();
+
        system_lyxrc = lyxrc;
        system_formats = formats;
        pimpl_->system_converters_ = pimpl_->converters_;
        system_lyxrc = lyxrc;
        system_formats = formats;
        pimpl_->system_converters_ = pimpl_->converters_;
@@ -822,20 +742,20 @@ bool LyX::init()
        if (!readLanguagesFile("languages"))
                return false;
 
        if (!readLanguagesFile("languages"))
                return false;
 
+       // Set the language defined by the user.
+       setRcGuiLanguage();
+
        // Load the layouts
        LYXERR(Debug::INIT, "Reading layouts...");
        if (!LyXSetStyle())
                return false;
        //...and the modules
        // Load the layouts
        LYXERR(Debug::INIT, "Reading layouts...");
        if (!LyXSetStyle())
                return false;
        //...and the modules
-       moduleList.load();
+       theModuleList.read();
 
        // read keymap and ui files in batch mode as well
        // because InsetInfo needs to know these to produce
        // the correct output
 
 
        // read keymap and ui files in batch mode as well
        // because InsetInfo needs to know these to produce
        // the correct output
 
-       // Set the language defined by the user.
-       //setGuiLanguage(lyxrc.gui_language);
-
        // Set up command definitions
        pimpl_->toplevel_cmddef_.read(lyxrc.def_file);
 
        // Set up command definitions
        pimpl_->toplevel_cmddef_.read(lyxrc.def_file);
 
@@ -843,13 +763,7 @@ bool LyX::init()
        pimpl_->toplevel_keymap_.read("site");
        pimpl_->toplevel_keymap_.read(lyxrc.bind_file);
        // load user bind file user.bind
        pimpl_->toplevel_keymap_.read("site");
        pimpl_->toplevel_keymap_.read(lyxrc.bind_file);
        // load user bind file user.bind
-       pimpl_->toplevel_keymap_.read("user");
-
-       pimpl_->lyxfunc_.initKeySequences(&pimpl_->toplevel_keymap_);
-
-       // Read menus
-       if (!readUIFile(lyxrc.ui_file))
-               return false;
+       pimpl_->toplevel_keymap_.read("user", 0, KeyMap::MissingOK);
 
        if (lyxerr.debugging(Debug::LYXRC))
                lyxrc.print();
 
        if (lyxerr.debugging(Debug::LYXRC))
                lyxrc.print();
@@ -862,12 +776,12 @@ bool LyX::init()
        if (document_path.exists() && document_path.isDirectory())
                package().document_dir() = document_path;
 
        if (document_path.exists() && document_path.isDirectory())
                package().document_dir() = document_path;
 
-       package().temp_dir() = createLyXTmpDir(FileName(lyxrc.tempdir_path));
+       package().set_temp_dir(createLyXTmpDir(FileName(lyxrc.tempdir_path)));
        if (package().temp_dir().empty()) {
                Alert::error(_("Could not create temporary directory"),
                             bformat(_("Could not create a temporary directory in\n"
        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."),
+                                                      "\"%1$s\"\n"
+                                                          "Make sure that this path exists and is writable and try again."),
                                     from_utf8(lyxrc.tempdir_path)));
                // createLyXTmpDir() tries sufficiently hard to create a
                // usable temp dir, so the probability to come here is
                                     from_utf8(lyxrc.tempdir_path)));
                // createLyXTmpDir() tries sufficiently hard to create a
                // usable temp dir, so the probability to come here is
@@ -886,54 +800,28 @@ bool LyX::init()
        // This must happen after package initialization and after lyxrc is
        // read, therefore it can't be done by a static object.
        ConverterCache::init();
        // 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;
 }
 
 
        return true;
 }
 
 
-void LyX::emergencyCleanup() const
+void emergencyCleanup()
 {
        // what to do about tmpfiles is non-obvious. we would
        // like to delete any we find, but our lyxdir might
        // contain documents etc. which might be helpful on
        // a crash
 
 {
        // 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
 
-       pimpl_->buffer_list_.emergencyWriteAll();
+       singleton_->pimpl_->buffer_list_.emergencyWriteAll();
        if (use_gui) {
        if (use_gui) {
-               if (pimpl_->lyx_server_)
-                       pimpl_->lyx_server_->emergencyCleanup();
-               pimpl_->lyx_server_.reset();
-               pimpl_->lyx_socket_.reset();
+               if (singleton_->pimpl_->lyx_server_)
+                       singleton_->pimpl_->lyx_server_->emergencyCleanup();
+               singleton_->pimpl_->lyx_server_.reset();
+               singleton_->pimpl_->lyx_socket_.reset();
        }
 }
 
 
        }
 }
 
 
-void LyX::deadKeyBindings(KeyMap * kbmap)
-{
-       // bindKeyings for transparent handling of deadkeys
-       // The keysyms are gotten from XFree86 X11R6
-       kbmap->bind("~C-~S-~M-dead_acute", FuncRequest(LFUN_ACCENT_ACUTE));
-       kbmap->bind("~C-~S-~M-dead_breve", FuncRequest(LFUN_ACCENT_BREVE));
-       kbmap->bind("~C-~S-~M-dead_caron", FuncRequest(LFUN_ACCENT_CARON));
-       kbmap->bind("~C-~S-~M-dead_cedilla", FuncRequest(LFUN_ACCENT_CEDILLA));
-       kbmap->bind("~C-~S-~M-dead_abovering", FuncRequest(LFUN_ACCENT_CIRCLE));
-       kbmap->bind("~C-~S-~M-dead_circumflex", FuncRequest(LFUN_ACCENT_CIRCUMFLEX));
-       kbmap->bind("~C-~S-~M-dead_abovedot", FuncRequest(LFUN_ACCENT_DOT));
-       kbmap->bind("~C-~S-~M-dead_grave", FuncRequest(LFUN_ACCENT_GRAVE));
-       kbmap->bind("~C-~S-~M-dead_doubleacute", FuncRequest(LFUN_ACCENT_HUNGARIAN_UMLAUT));
-       kbmap->bind("~C-~S-~M-dead_macron", FuncRequest(LFUN_ACCENT_MACRON));
-       // nothing with this name
-       // kbmap->bind("~C-~S-~M-dead_special_caron", LFUN_ACCENT_SPECIAL_CARON);
-       kbmap->bind("~C-~S-~M-dead_tilde", FuncRequest(LFUN_ACCENT_TILDE));
-       kbmap->bind("~C-~S-~M-dead_diaeresis", FuncRequest(LFUN_ACCENT_UMLAUT));
-       // nothing with this name either...
-       //kbmap->bind("~C-~S-~M-dead_underbar", FuncRequest(LFUN_ACCENT_UNDERBAR));
-       kbmap->bind("~C-~S-~M-dead_belowdot", FuncRequest(LFUN_ACCENT_UNDERDOT));
-       kbmap->bind("~C-~S-~M-dead_tie", FuncRequest(LFUN_ACCENT_TIE));
-       kbmap->bind("~C-~S-~M-dead_ogonek",FuncRequest(LFUN_ACCENT_OGONEK));
-}
-
-
 // return true if file does not exist or is older than configure.py.
 static bool needsUpdate(string const & file)
 {
 // return true if file does not exist or is older than configure.py.
 static bool needsUpdate(string const & file)
 {
@@ -1017,100 +905,6 @@ bool LyX::readRcFile(string const & name)
        return true;
 }
 
        return true;
 }
 
-
-// Read the ui file `name'
-bool LyX::readUIFile(string const & name, bool include)
-{
-       enum Uitags {
-               ui_menuset = 1,
-               ui_toolbars,
-               ui_toolbarset,
-               ui_include,
-               ui_last
-       };
-
-       struct keyword_item uitags[ui_last - 1] = {
-               { "include", ui_include },
-               { "menuset", ui_menuset },
-               { "toolbars", ui_toolbars },
-               { "toolbarset", ui_toolbarset }
-       };
-
-       // Ensure that a file is read only once (prevents include loops)
-       static std::list<string> uifiles;
-       std::list<string>::const_iterator it  = uifiles.begin();
-       std::list<string>::const_iterator end = uifiles.end();
-       it = std::find(it, end, name);
-       if (it != end) {
-               LYXERR(Debug::INIT, "UI file '" << name << "' has been read already. "
-                                   << "Is this an include loop?");
-               return false;
-       }
-
-       LYXERR(Debug::INIT, "About to read " << name << "...");
-
-
-       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");
-
-       if (ui_path.empty()) {
-               LYXERR(Debug::INIT, "Could not find " << name);
-               showFileError(name);
-               return false;
-       }
-
-       uifiles.push_back(name);
-
-       LYXERR(Debug::INIT, "Found " << name << " in " << ui_path);
-       Lexer lex(uitags, ui_last - 1);
-       lex.setFile(ui_path);
-       if (!lex.isOK()) {
-               lyxerr << "Unable to set LyXLeX for ui file: " << ui_path
-                      << endl;
-       }
-
-       if (lyxerr.debugging(Debug::PARSER))
-               lex.printTable(lyxerr);
-
-       while (lex.isOK()) {
-               switch (lex.lex()) {
-               case ui_include: {
-                       lex.next(true);
-                       string const file = lex.getString();
-                       if (!readUIFile(file, true))
-                               return false;
-                       break;
-               }
-               case ui_menuset:
-                       menubackend.read(lex);
-                       break;
-
-               case ui_toolbarset:
-                       toolbarbackend.readToolbars(lex);
-                       break;
-
-               case ui_toolbars:
-                       toolbarbackend.readToolbarSettings(lex);
-                       break;
-
-               default:
-                       if (!rtrim(lex.getString()).empty())
-                               lex.printError("LyX::ReadUIFile: "
-                                              "Unknown menu tag: `$$Token'");
-                       break;
-               }
-       }
-       return true;
-}
-
-
 // Read the languages file `name'
 bool LyX::readLanguagesFile(string const & name)
 {
 // Read the languages file `name'
 bool LyX::readLanguagesFile(string const & name)
 {
@@ -1151,12 +945,10 @@ bool LyX::readEncodingsFile(string const & enc_name,
 
 namespace {
 
 
 namespace {
 
-string batch;
-
 /// return the the number of arguments consumed
 /// return the the number of arguments consumed
-typedef boost::function<int(string const &, string const &)> cmd_helper;
+typedef boost::function<int(string const &, string const &, string &)> cmd_helper;
 
 
-int parse_dbg(string const & arg, string const &)
+int parse_dbg(string const & arg, string const &, string &)
 {
        if (arg.empty()) {
                lyxerr << to_utf8(_("List of supported debug flags:")) << endl;
 {
        if (arg.empty()) {
                lyxerr << to_utf8(_("List of supported debug flags:")) << endl;
@@ -1165,13 +957,13 @@ int parse_dbg(string const & arg, string const &)
        }
        lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl;
 
        }
        lyxerr << to_utf8(bformat(_("Setting debug level to %1$s"), from_utf8(arg))) << endl;
 
-       lyxerr.level(Debug::value(arg));
+       lyxerr.setLevel(Debug::value(arg));
        Debug::showLevel(lyxerr, lyxerr.level());
        return 1;
 }
 
 
        Debug::showLevel(lyxerr, lyxerr.level());
        return 1;
 }
 
 
-int parse_help(string const &, string const &)
+int parse_help(string const &, string const &, string &)
 {
        lyxerr <<
                to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
 {
        lyxerr <<
                to_utf8(_("Usage: lyx [ command line switches ] [ name.lyx ... ]\n"
@@ -1189,9 +981,11 @@ int parse_help(string const &, string const &)
                  "                  where fmt is the export format of choice.\n"
                  "                  Look on Tools->Preferences->File formats->Format\n"
                  "                  to get an idea which parameters should be passed.\n"
                  "                  where fmt is the export format of choice.\n"
                  "                  Look on Tools->Preferences->File formats->Format\n"
                  "                  to get an idea which parameters should be passed.\n"
+                 "                  Note that the order of -e and -x switches matters.\n"
                  "\t-i [--import] fmt file.xxx\n"
                  "                  where fmt is the import format of choice\n"
                  "                  and file.xxx is the file to be imported.\n"
                  "\t-i [--import] fmt file.xxx\n"
                  "                  where fmt is the import format of choice\n"
                  "                  and file.xxx is the file to be imported.\n"
+                 "\t--batch         execute commands and exit\n"
                  "\t-version        summarize version and build info\n"
                               "Check the LyX man page for more details.")) << endl;
        exit(0);
                  "\t-version        summarize version and build info\n"
                               "Check the LyX man page for more details.")) << endl;
        exit(0);
@@ -1199,7 +993,7 @@ int parse_help(string const &, string const &)
 }
 
 
 }
 
 
-int parse_version(string const &, string const &)
+int parse_version(string const &, string const &, string &)
 {
        lyxerr << "LyX " << lyx_version
               << " (" << lyx_release_date << ")" << endl;
 {
        lyxerr << "LyX " << lyx_version
               << " (" << lyx_release_date << ")" << endl;
@@ -1211,7 +1005,7 @@ int parse_version(string const &, string const &)
 }
 
 
 }
 
 
-int parse_sysdir(string const & arg, string const &)
+int parse_sysdir(string const & arg, string const &, string &)
 {
        if (arg.empty()) {
                Alert::error(_("No system directory"),
 {
        if (arg.empty()) {
                Alert::error(_("No system directory"),
@@ -1223,7 +1017,7 @@ int parse_sysdir(string const & arg, string const &)
 }
 
 
 }
 
 
-int parse_userdir(string const & arg, string const &)
+int parse_userdir(string const & arg, string const &, string &)
 {
        if (arg.empty()) {
                Alert::error(_("No user directory"),
 {
        if (arg.empty()) {
                Alert::error(_("No user directory"),
@@ -1235,7 +1029,7 @@ int parse_userdir(string const & arg, string const &)
 }
 
 
 }
 
 
-int parse_execute(string const & arg, string const &)
+int parse_execute(string const & arg, string const &, string & batch)
 {
        if (arg.empty()) {
                Alert::error(_("Incomplete command"),
 {
        if (arg.empty()) {
                Alert::error(_("Incomplete command"),
@@ -1247,7 +1041,7 @@ int parse_execute(string const & arg, string const &)
 }
 
 
 }
 
 
-int parse_export(string const & type, string const &)
+int parse_export(string const & type, string const &, string & batch)
 {
        if (type.empty()) {
                lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
 {
        if (type.empty()) {
                lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
@@ -1260,7 +1054,7 @@ int parse_export(string const & type, string const &)
 }
 
 
 }
 
 
-int parse_import(string const & type, string const & file)
+int parse_import(string const & type, string const & file, string & batch)
 {
        if (type.empty()) {
                lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
 {
        if (type.empty()) {
                lyxerr << to_utf8(_("Missing file type [eg latex, ps...] after "
@@ -1277,16 +1071,19 @@ int parse_import(string const & type, string const & file)
 }
 
 
 }
 
 
-int parse_geometry(string const & arg1, string const &)
+int parse_geometry(string const & arg1, string const &, string &)
 {
        geometryArg = arg1;
 {
        geometryArg = arg1;
-#if defined(_WIN32) || (defined(__CYGWIN__) && defined(X_DISPLAY_MISSING))
-       // remove also the arg
-       return 1;
-#else
-       // don't remove "-geometry"
+       // don't remove "-geometry", it will be pruned out later in the
+       // frontend if need be.
        return -1;
        return -1;
-#endif
+}
+
+
+int parse_batch(string const &, string const &, string &) 
+{
+       use_gui = false;
+       return 0;
 }
 
 
 }
 
 
@@ -1295,7 +1092,7 @@ int parse_geometry(string const & arg1, string const &)
 
 void LyX::easyParse(int & argc, char * argv[])
 {
 
 void LyX::easyParse(int & argc, char * argv[])
 {
-       std::map<string, cmd_helper> cmdmap;
+       map<string, cmd_helper> cmdmap;
 
        cmdmap["-dbg"] = parse_dbg;
        cmdmap["-help"] = parse_help;
 
        cmdmap["-dbg"] = parse_dbg;
        cmdmap["-help"] = parse_help;
@@ -1311,9 +1108,10 @@ void LyX::easyParse(int & argc, char * argv[])
        cmdmap["-i"] = parse_import;
        cmdmap["--import"] = parse_import;
        cmdmap["-geometry"] = parse_geometry;
        cmdmap["-i"] = parse_import;
        cmdmap["--import"] = parse_import;
        cmdmap["-geometry"] = parse_geometry;
+       cmdmap["--batch"] = parse_batch;
 
        for (int i = 1; i < argc; ++i) {
 
        for (int i = 1; i < argc; ++i) {
-               std::map<string, cmd_helper>::const_iterator it
+               map<string, cmd_helper>::const_iterator it
                        = cmdmap.find(argv[i]);
 
                // don't complain if not found - may be parsed later
                        = cmdmap.find(argv[i]);
 
                // don't complain if not found - may be parsed later
@@ -1325,7 +1123,10 @@ void LyX::easyParse(int & argc, char * argv[])
                string const arg2 =
                        (i + 2 < argc) ? to_utf8(from_local8bit(argv[i + 2])) : string();
 
                string const arg2 =
                        (i + 2 < argc) ? to_utf8(from_local8bit(argv[i + 2])) : string();
 
-               int const remove = 1 + it->second(arg, arg2);
+               string batch;
+               int const remove = 1 + it->second(arg, arg2, batch);
+               if (!batch.empty())
+                       pimpl_->batch_commands.push_back(batch);
 
                // Now, remove used arguments by shifting
                // the following ones remove places down.
 
                // Now, remove used arguments by shifting
                // the following ones remove places down.
@@ -1336,102 +1137,166 @@ void LyX::easyParse(int & argc, char * argv[])
                        --i;
                }
        }
                        --i;
                }
        }
-
-       pimpl_->batch_command = batch;
 }
 
 
 FuncStatus getStatus(FuncRequest const & action)
 {
 }
 
 
 FuncStatus getStatus(FuncRequest const & action)
 {
-       return LyX::ref().lyxFunc().getStatus(action);
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->lyxfunc_.getStatus(action);
 }
 
 
 void dispatch(FuncRequest const & action)
 {
 }
 
 
 void dispatch(FuncRequest const & action)
 {
-       LyX::ref().lyxFunc().dispatch(action);
+       LASSERT(singleton_, /**/);
+       singleton_->pimpl_->lyxfunc_.dispatch(action);
 }
 
 
 BufferList & theBufferList()
 {
 }
 
 
 BufferList & theBufferList()
 {
-       return LyX::ref().bufferList();
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->buffer_list_;
 }
 
 
 LyXFunc & theLyXFunc()
 {
 }
 
 
 LyXFunc & theLyXFunc()
 {
-       return LyX::ref().lyxFunc();
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->lyxfunc_;
 }
 
 
 Server & theServer()
 {
        // FIXME: this should not be use_gui dependent
 }
 
 
 Server & theServer()
 {
        // FIXME: this should not be use_gui dependent
-       BOOST_ASSERT(use_gui);
-       return LyX::ref().server();
+       LASSERT(use_gui, /**/);
+       LASSERT(singleton_, /**/);
+       return *singleton_->pimpl_->lyx_server_.get();
 }
 
 
 ServerSocket & theServerSocket()
 {
        // FIXME: this should not be use_gui dependent
 }
 
 
 ServerSocket & theServerSocket()
 {
        // FIXME: this should not be use_gui dependent
-       BOOST_ASSERT(use_gui);
-       return LyX::ref().socket();
+       LASSERT(use_gui, /**/);
+       LASSERT(singleton_, /**/);
+       return *singleton_->pimpl_->lyx_socket_.get();
 }
 
 
 KeyMap & theTopLevelKeymap()
 {
 }
 
 
 KeyMap & theTopLevelKeymap()
 {
-       return LyX::ref().topLevelKeymap();
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->toplevel_keymap_;
 }
 
 
 Converters & theConverters()
 {
 }
 
 
 Converters & theConverters()
 {
-       return  LyX::ref().converters();
+       LASSERT(singleton_, /**/);
+       return  singleton_->pimpl_->converters_;
 }
 
 
 Converters & theSystemConverters()
 {
 }
 
 
 Converters & theSystemConverters()
 {
-       return  LyX::ref().systemConverters();
+       LASSERT(singleton_, /**/);
+       return  singleton_->pimpl_->system_converters_;
 }
 
 
 Movers & theMovers()
 {
 }
 
 
 Movers & theMovers()
 {
-       return  LyX::ref().pimpl_->movers_;
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->movers_;
 }
 
 
 }
 
 
-Mover const & getMover(std::string  const & fmt)
+Mover const & getMover(string  const & fmt)
 {
 {
-       return  LyX::ref().pimpl_->movers_(fmt);
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->movers_(fmt);
 }
 
 
 }
 
 
-void setMover(std::string const & fmt, std::string const & command)
+void setMover(string const & fmt, string const & command)
 {
 {
-       LyX::ref().pimpl_->movers_.set(fmt, command);
+       LASSERT(singleton_, /**/);
+       singleton_->pimpl_->movers_.set(fmt, command);
 }
 
 
 Movers & theSystemMovers()
 {
 }
 
 
 Movers & theSystemMovers()
 {
-       return  LyX::ref().pimpl_->system_movers_;
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->system_movers_;
 }
 
 
 }
 
 
-Messages & getMessages(std::string const & language)
+Messages & getMessages(string const & language)
 {
 {
-       return LyX::ref().getMessages(language);
+       LASSERT(singleton_, /**/);
+       return singleton_->messages(language);
 }
 
 
 Messages & getGuiMessages()
 {
 }
 
 
 Messages & getGuiMessages()
 {
-       return LyX::ref().getGuiMessages();
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->messages_["GUI"];
+}
+
+
+graphics::Previews & thePreviews()
+{
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->preview_;
+}
+
+
+Session & theSession()
+{
+       LASSERT(singleton_, /**/);
+       return *singleton_->pimpl_->session_.get();
+}
+
+
+CmdDef & theTopLevelCmdDef()
+{
+       LASSERT(singleton_, /**/);
+       return singleton_->pimpl_->toplevel_cmddef_;
+}
+
+
+SpellChecker * theSpellChecker()
+{
+       if (!singleton_->pimpl_->spell_checker_)
+               setSpellChecker();
+       return singleton_->pimpl_->spell_checker_;
+}
+
+
+void setSpellChecker()
+{
+#if defined(USE_ASPELL)
+       if (lyxrc.spellchecker == "aspell") {
+               if (!singleton_->pimpl_->aspell_checker_)
+                       singleton_->pimpl_->aspell_checker_ = new AspellChecker();
+               singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->aspell_checker_;
+               return;
+       }
+#endif
+#if defined(USE_HUNSPELL)
+       if (lyxrc.spellchecker == "hunspell") {
+               if (!singleton_->pimpl_->hunspell_checker_)
+                       singleton_->pimpl_->hunspell_checker_ = new HunspellChecker();
+               singleton_->pimpl_->spell_checker_ = singleton_->pimpl_->hunspell_checker_;
+               return;
+       }
+#endif
+       singleton_->pimpl_->spell_checker_ = 0;
 }
 
 } // namespace lyx
 }
 
 } // namespace lyx