#include "FuncStatus.h"
#include "HunspellChecker.h"
#include "KeyMap.h"
+#include "Language.h"
#include "LaTeXFonts.h"
#include "LayoutFile.h"
#include "Lexer.h"
using namespace std;
using namespace lyx::support;
+#if defined (USE_MACOSX_PACKAGING)
+#include <crt_externs.h>
+#endif
+
namespace lyx {
namespace Alert = frontend::Alert;
// FIXME
/* Create a CoreApplication class that will provide the main event loop
- * and the socket callback registering. With Qt4, only QtCore
+ * and the socket callback registering. With Qt, only QtCore
* library would be needed.
* When this is done, a server_mode could be created and the following two
* line would be moved out from here.
if (!msg.empty()) {
lyxerr << "\nlyx: " << msg << endl;
// try to make a GUI message
- Alert::error(_("LyX crashed!"), msg);
+ Alert::error(_("LyX crashed!"), msg, true);
}
// Deinstall the signal handlers
cerr << to_utf8(tmp) << endl;
}
+#if defined (USE_MACOSX_PACKAGING)
+namespace {
+ // Unexposed--extract an environment variable name from its NAME=VALUE
+ // representation
+ std::string varname(const char* line)
+ {
+ size_t nameLen = strcspn(line, "=");
+ if (nameLen == strlen(line)) {
+ return std::string();
+ } else {
+ return std::string(line, nameLen);
+ }
+ }
+}
+
+void cleanDuplicateEnvVars()
+{
+ std::set<std::string> seen;
+ std::set<std::string> dupes;
+
+ // Create a list of the environment variables that appear more than once
+ for (char **read = *_NSGetEnviron(); *read; read++) {
+ std::string name = varname(*read);
+ if (name.size() == 0) {
+ continue;
+ }
+ if (seen.find(name) != seen.end()) {
+ dupes.insert(name);
+ } else {
+ seen.insert(name);
+ }
+ }
+
+ // Loop over the list of duplicated variables
+ for (std::set<std::string>::iterator dupe = dupes.begin(); dupe != dupes.end(); dupe++) {
+ const char *name = (*dupe).c_str();
+ char *val = getenv(name);
+ if (val != NULL) {
+ LYXERR(Debug::INIT, "Duplicate environment variable: " << name);
+ // unsetenv removes *all* instances of the variable from the environment
+ unsetenv(name);
+
+ // replace with the value from getenv (in practice appears to be the
+ // first value in the list)
+ setenv(name, val, 0);
+ }
+ }
+}
+#endif
bool LyX::init()
{
signal(SIGTERM, error_handler);
// SIGPIPE can be safely ignored.
+#if defined (USE_MACOSX_PACKAGING)
+ cleanDuplicateEnvVars();
+#endif
+
lyxrc.tempdir_path = package().temp_dir().absFileName();
lyxrc.document_path = package().document_dir().absFileName();
if (!setEnv("LyXDir", lyx_dir))
LYXERR(Debug::INIT, "\t... failed!");
+ if (package().explicit_user_support() && getEnv(LYX_USERDIR_VER).empty()) {
+ // -userdir was given on the command line.
+ // Make it available to child processes, otherwise tex2lyx
+ // would not find all layout files, and other converters might
+ // use it as well.
+ string const user_dir = package().user_support().absFileName();
+ LYXERR(Debug::INIT, "Setting " LYX_USERDIR_VER "... to \""
+ << user_dir << '"');
+ if (!setEnv(LYX_USERDIR_VER, user_dir))
+ LYXERR(Debug::INIT, "\t... failed!");
+ }
+
//
// Read configuration files
//
lyxrc.print();
os::windows_style_tex_paths(lyxrc.windows_style_tex_paths);
+ // Prepend path prefix a second time to take the user preferences into a account
if (!lyxrc.path_prefix.empty())
prependEnvPath("PATH", replaceEnvironmentPath(lyxrc.path_prefix));
{
cout << "LyX " << lyx_version
<< " (" << lyx_release_date << ")" << endl;
+ 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(__DATE__), from_ascii(__TIME__))) << endl;
-
+ from_ascii(lyx_build_date), from_ascii(lyx_build_time))) << endl;
cout << lyx_version_info << endl;
exit(0);
return 0;