#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 <iostream>
#include <csignal>
+#include <vector>
namespace lyx {
///
IconvProcessor iconv;
+
+ /// Files to load at start.
+ vector<FileName> files_to_load_;
};
///
support::init_package(argv[0], cl_system_support, cl_user_support,
support::top_build_dir_is_one_level_up);
- vector<FileName> files;
-
if (!use_gui) {
// FIXME: create a ConsoleApplication
- int exit_status = loadFiles(argc, argv, files);
+ int exit_status = init(argc, argv);
if (exit_status) {
prepareExit();
return exit_status;
}
+ loadFiles();
+
if (batch_command.empty() || pimpl_->buffer_list_.empty()) {
prepareExit();
return EXIT_SUCCESS;
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
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);
+ if (exit_status) {
+ // Kill the application object before exiting.
+ pimpl_->application_.reset();
+ use_gui = false;
+ prepareExit();
+ return exit_status;
+ }
+
+ // Start the real execution loop.
exit_status = pimpl_->application_->exec();
prepareExit();
}
-int LyX::loadFiles(int & argc, char * argv[],
- vector<FileName> & files)
+int LyX::init(int & argc, char * argv[])
{
// check for any spurious extra arguments
// other than documents
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"));
+ pimpl_->files_to_load_.push_back(fileSearch(string(), os::internal_path(argv[argi]), "lyx"));
}
if (first_start)
- files.push_back(i18nLibFileSearch("examples", "splash.lyx"));
+ pimpl_->files_to_load_.push_back(i18nLibFileSearch("examples", "splash.lyx"));
- Buffer * last_loaded = 0;
+ return EXIT_SUCCESS;
+}
- vector<FileName>::const_iterator it = files.begin();
- vector<FileName>::const_iterator end = files.end();
+
+void LyX::loadFiles()
+{
+ vector<FileName>::const_iterator it = pimpl_->files_to_load_.begin();
+ vector<FileName>::const_iterator end = pimpl_->files_to_load_.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);
+ 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");
+ 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
-
- return EXIT_SUCCESS;
}
void LyX::execBatchCommands()
{
+ // The advantage of doing this here is that the event loop
+ // is already started. So any need for interaction will be
+ // aknowledged.
+ restoreGuiSession();
+
// Execute batch commands if available
if (batch_command.empty())
return;
}
-void LyX::restoreGuiSession(vector<FileName> const & files)
+void LyX::restoreGuiSession()
{
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<FileName> 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));
+ // 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()) {
+ for_each(pimpl_->files_to_load_.begin(),
+ pimpl_->files_to_load_.end(),
+ bind(&LyXView::loadLyXFile, view, _1, true));
+ // clear this list to save a few bytes of RAM
+ pimpl_->files_to_load_.clear();
+ pimpl_->session_->lastOpened().clear();
+ return;
}
+
+ if (!lyxrc.load_session)
+ return;
+
+ 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(&LyXView::loadLyXFile, view, _1, false));
+
// clear this list to save a few bytes of RAM
pimpl_->session_->lastOpened().clear();
}
#ifndef LYX_MAIN_H
#define LYX_MAIN_H
-#include "support/filename.h"
-
#include <boost/scoped_ptr.hpp>
#include <boost/utility.hpp>
#include <string>
-#include <vector>
namespace lyx {
LyX();
~LyX();
- /**
- * Execute LyX. The startup sequence is as follows:
- * -# LyX::exec()
- * -# LyX::priv_exec()
- * -# lyx::createApplication()
- * Step 3 is omitted if no gui is wanted. We need lyx::createApplication()
- * only to create the QApplication object in the qt frontend. All
- * attempts with static and dynamically allocated QApplication
- * objects lead either to harmless error messages on exit
- * ("Mutex destroy failure") or crashes (OS X).
- */
+ /// Execute LyX.
int exec(int & argc, char * argv[]);
static LyX & ref();
/// Early exit during the initialisation process.
void earlyExit(int status);
- /// Initialise LyX and load files if asked.
+ /// Initialise LyX and fills-in the vector of files to be loaded.
/**
- \param files is filled in with the command-line file names.
\return exit code failure if any.
*/
- int loadFiles(int & argc, char * argv[],
- std::vector<support::FileName> & files);
+ int init(int & argc, char * argv[]);
+
+ /// Load files passed at command-line.
+ /**
+ This method is used only in non-GUI mode.
+ */
+ void loadFiles();
- /// Create a View and restore GUI Session.
- void restoreGuiSession(std::vector<support::FileName> const & files);
+ /// Create a View, load files and restore GUI Session.
+ void restoreGuiSession();
/// Initialize RC font for the GUI.
void initGuiFont();