#include "lyx_main.h"
+#include "ConverterCache.h"
#include "buffer.h"
#include "buffer_funcs.h"
#include "bufferlist.h"
#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>
string cl_system_support;
string cl_user_support;
+LyX * singleton_ = 0;
void showFileError(string const & error)
{
/// The main application class private implementation.
struct LyX::Singletons
{
+ Singletons(): iconv(ucs4_codeset, "UTF-8")
+ {
+ }
/// our function handler
LyXFunc lyxfunc_;
///
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);
}
}
+IconvProcessor & LyX::iconvProcessor()
+{
+ return pimpl_->iconv;
+}
+
+
kb_keymap const & LyX::topLevelKeymap() const
{
BOOST_ASSERT(pimpl_->toplevel_keymap_.get());
}
-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"
}
-void LyX::quit(bool noask)
+void LyX::quit()
{
lyxerr[Debug::INFO] << "Running QuitLyX." << endl;
- if (use_gui) {
- if (!noask && !pimpl_->buffer_list_.quitWriteAll())
- return;
-
- // The LyXView Geometry settings are stored when LyXView::close
- // is called explicitely but a straight quit() command would not
- // guarante that. So we make sure this is done here:
- vector<int> const & view_ids = pimpl_->application_->gui().viewIds();
- for (size_t i = 0; i < view_ids.size(); ++i)
- pimpl_->application_->gui().view(view_ids[i]).saveGeometry();
-
- pimpl_->session_->writeFile();
- }
-
prepareExit();
if (use_gui) {
+ pimpl_->session_->writeFile();
pimpl_->lyx_server_.reset();
pimpl_->lyx_socket_.reset();
pimpl_->application_->exit(0);
// 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).
bind(&LyXView::loadLyXFile, view, _1, false));
}
// clear this list to save a few bytes of RAM
- pimpl_->session_->clearLastOpenedFiles();
+ pimpl_->session_->lastOpened().clear();
}
}
// 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;
}
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);
}
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;
}
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