]> git.lyx.org Git - lyx.git/blobdiff - src/lyx_main.C
hopefully fix tex2lyx linking.
[lyx.git] / src / lyx_main.C
index cec8e6314dd913ed4b544de566b4d1a2770f4815..aab365784227cdb7de034661181b7bdbde76b7d9 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "lyx_main.h"
 
+#include "ConverterCache.h"
 #include "buffer.h"
 #include "buffer_funcs.h"
 #include "bufferlist.h"
@@ -56,6 +57,7 @@
 #include "support/package.h"
 #include "support/path.h"
 #include "support/systemcall.h"
+#include "support/unicode.h"
 
 #include <boost/bind.hpp>
 #include <boost/filesystem/operations.hpp>
@@ -113,6 +115,7 @@ namespace {
 string cl_system_support;
 string cl_user_support;
 
+LyX * singleton_ = 0;
 
 void showFileError(string const & error)
 {
@@ -139,6 +142,9 @@ void reconfigureUserLyXDir()
 /// The main application class private implementation.
 struct LyX::Singletons 
 {
+       Singletons(): iconv(ucs4_codeset, "UTF-8")
+       {
+       }
        /// our function handler
        LyXFunc lyxfunc_;
        ///
@@ -153,41 +159,42 @@ struct LyX::Singletons
        boost::scoped_ptr<frontend::Application> application_;
        /// lyx session, containing lastfiles, lastfilepos, and lastopened
        boost::scoped_ptr<Session> session_;
-};
-
 
-boost::scoped_ptr<LyX> LyX::singleton_;
+       ///
+       IconvProcessor iconv;
+};
 
 
-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);
+       // Static data are not treated in the same way at all on the Mac (and
+       // the LyX singleton has static methods). This is the reason why the
+       // exit command on the Mac bypasses our dispatch machinery altogether.
+       // On Linux and Windows we won't pass a second time through quit()
+       // because quitting will already be set to true.
+       if (!quitting)
+               quit();
 }
 
 
 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)
 {
+       singleton_ = this;
        pimpl_.reset(new Singletons);
 }
 
@@ -279,6 +286,12 @@ kb_keymap & LyX::topLevelKeymap()
 }
 
 
+IconvProcessor & LyX::iconvProcessor()
+{
+       return pimpl_->iconv;
+}
+
+
 kb_keymap const & LyX::topLevelKeymap() const
 {
        BOOST_ASSERT(pimpl_->toplevel_keymap_.get());
@@ -305,7 +318,7 @@ 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"
@@ -493,7 +506,7 @@ void LyX::restoreGuiSession(vector<string> const & files)
 
        // if a file is specified, I assume that user wants to edit *that* file
        if (files.empty() && lyxrc.load_session) {
-               vector<string> const & lastopened = pimpl_->session_->lastOpenedFiles();
+               vector<string> 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).
@@ -501,7 +514,7 @@ void LyX::restoreGuiSession(vector<string> const & files)
                        bind(&LyXView::loadLyXFile, view, _1, false));
        }
        // clear this list to save a few bytes of RAM
-       pimpl_->session_->clearLastOpenedFiles();
+       pimpl_->session_->lastOpened().clear();
 }
 
 
@@ -522,13 +535,13 @@ LyXView * LyX::newLyXView()
        }
        // 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<unsigned int>(val);
-               val = session().loadSessionInfo("WindowHeight");
+               val = session().sessionInfo().load("WindowHeight");
                if (!val.empty())
                        height = convert<unsigned int>(val);
-               if (session().loadSessionInfo("WindowIsMaximized") == "yes")
+               if (session().sessionInfo().load("WindowIsMaximized") == "yes")
                        maximize = true;
        }
 
@@ -536,10 +549,10 @@ LyXView * LyX::newLyXView()
        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<int>(val);
-               val = session().loadSessionInfo("WindowPosY");
+               val = session().sessionInfo().load("WindowPosY");
                if (!val.empty())
                        posy = convert<int>(val);
        }
@@ -796,6 +809,11 @@ bool LyX::init()
 
        lyxerr[Debug::INIT] << "Reading session information '.lyx/session'..." << endl;
        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;
 }
 
@@ -1305,16 +1323,10 @@ kb_keymap & theTopLevelKeymap()
        return LyX::ref().topLevelKeymap();
 }
 
-} // namespace lyx
 
-
-namespace boost {
-
-void assertion_failed(char const* a, char const* b, char const* c, long d)
+IconvProcessor & utf8ToUcs4()
 {
-       lyx::lyxerr << "Assertion failed: " << a << ' ' << b << ' ' << c << ' '
-               << d << '\n';
+       return LyX::ref().iconvProcessor();
 }
 
-} // boost
-
+} // namespace lyx