#include "frontends/alert.h"
#include "frontends/Application.h"
+#include "support/ConsoleApplication.h"
#include "support/lassert.h"
#include "support/debug.h"
#include "support/environment.h"
#include "support/Messages.h"
#include "support/os.h"
#include "support/Package.h"
-#include "support/PathChanger.h"
-#include "support/Systemcall.h"
#include "support/bind.h"
#include <boost/scoped_ptr.hpp>
"Please check your installation."), from_utf8(error)));
}
-
-void reconfigureUserLyXDir()
-{
- string const configure_command = package().configure_command();
-
- lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl;
- PathChanger p(package().user_support());
- Systemcall one;
- one.startscript(Systemcall::Wait, configure_command);
- lyxerr << "LyX: " << to_utf8(_("Done!")) << endl;
-}
-
} // namespace anon
/// The main application class private implementation.
///
Movers system_movers_;
- /// has this user started lyx for the first time?
- bool first_start;
/// the parsed command line batch command if any
vector<string> batch_commands;
};
+/// The main application class for console mode
+class LyXConsoleApp : public ConsoleApplication
+{
+public:
+ LyXConsoleApp(LyX * lyx, int & argc, char * argv[])
+ : ConsoleApplication(lyx_package, argc, argv), lyx_(lyx),
+ argc_(argc), argv_(argv)
+ {
+ }
+ void doExec()
+ {
+ int const exit_status = lyx_->execWithoutGui(argc_, argv_);
+ exit(exit_status);
+ }
+private:
+ LyX * lyx_;
+ int & argc_;
+ char ** argv_;
+};
+
+
///
frontend::Application * theApp()
{
setLocale();
if (!use_gui) {
- // FIXME: create a ConsoleApplication
- int exit_status = init(argc, argv);
- if (exit_status) {
- prepareExit();
- return exit_status;
- }
+ LyXConsoleApp app(this, argc, argv);
- // this is correct, since return values are inverted.
- exit_status = !loadFiles();
+ // Reestablish our defaults, as Qt overwrites them
+ // after creating app
+ setLocale();//???
- if (pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) {
- prepareExit();
- return exit_status;
- }
-
- BufferList::iterator begin = pimpl_->buffer_list_.begin();
-
- bool final_success = false;
- for (BufferList::iterator I = begin; I != pimpl_->buffer_list_.end(); ++I) {
- Buffer * buf = *I;
- if (buf != buf->masterBuffer())
- continue;
- 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;
+ return app.exec();
}
// Let the frontend parse and remove all arguments that it knows
}
+int LyX::execWithoutGui(int & argc, char * argv[])
+{
+ int exit_status = init(argc, argv);
+ if (exit_status) {
+ prepareExit();
+ return exit_status;
+ }
+
+ // this is correct, since return values are inverted.
+ exit_status = !loadFiles();
+
+ if (pimpl_->batch_commands.empty() || pimpl_->buffer_list_.empty()) {
+ prepareExit();
+ return exit_status;
+ }
+
+ BufferList::iterator begin = pimpl_->buffer_list_.begin();
+
+ bool final_success = false;
+ for (BufferList::iterator I = begin; I != pimpl_->buffer_list_.end(); ++I) {
+ Buffer * buf = *I;
+ if (buf != buf->masterBuffer())
+ continue;
+ 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;
+}
+
+
bool LyX::loadFiles()
{
LATTEST(!use_gui);
}
}
}
-
+
void cleanDuplicateEnvVars()
{
std::set<std::string> seen;
}
// Loop over the list of duplicated variables
- for (std::set<std::string>::iterator dupe = dupes.begin(); dupe != dupes.end(); dupe++) {
+ std::set<std::string>::iterator dupe = dupes.begin();
+ std::set<std::string>::iterator const dend = dupes.end();
+ for (; dupe != dend; ++dupe) {
const char *name = (*dupe).c_str();
char *val = getenv(name);
if (val != NULL) {
// Check that user LyX directory is ok.
{
- string const lock_file = package().user_support().absFileName() + ".lyx_configure_lock";
+ string const lock_file = package().getConfigureLockName();
int fd = fileLock(lock_file.c_str());
if (queryUserLyXDir(package().explicit_user_support())) {
- reconfigureUserLyXDir();
+ package().reconfigureUserLyXDir("");
}
fileUnlock(fd, lock_file.c_str());
}
}
-// return true if file does not exist or is older than configure.py.
-static bool needsUpdate(string const & file)
-{
- // We cannot initialize configure_script directly because the package
- // is not initialized yet when static objects are constructed.
- static FileName configure_script;
- static bool firstrun = true;
- if (firstrun) {
- configure_script =
- FileName(addName(package().system_support().absFileName(),
- "configure.py"));
- firstrun = false;
- }
-
- FileName absfile =
- FileName(addName(package().user_support().absFileName(), file));
- return !absfile.exists()
- || configure_script.lastModified() > absfile.lastModified();
-}
-
-
bool LyX::queryUserLyXDir(bool explicit_userdir)
{
// Does user directory exist?
if (sup.exists() && sup.isDirectory()) {
first_start = false;
- return needsUpdate("lyxrc.defaults")
- || needsUpdate("lyxmodules.lst")
- || needsUpdate("textclass.lst")
- || needsUpdate("packages.lst");
+ return configFileNeedsUpdate("lyxrc.defaults")
+ || configFileNeedsUpdate("lyxmodules.lst")
+ || configFileNeedsUpdate("textclass.lst")
+ || configFileNeedsUpdate("packages.lst");
}
first_start = !explicit_userdir;
if (string(lyx_git_commit_hash) != "none")
cout << to_utf8(_(" Git commit hash "))
<< string(lyx_git_commit_hash).substr(0,8) << endl;
- cout << to_utf8(bformat(_("Built on %1$s[[date]], %2$s[[time]]"),
- from_ascii(lyx_build_date), from_ascii(lyx_build_time))) << endl;
cout << lyx_version_info << endl;
exit(0);
return 0;