#include "support/lassert.h"
-#include <csignal>
#include <cstdlib>
#include <vector>
using namespace std;
namespace lyx {
+
+void lyx_exit(int);
+
namespace support {
namespace os {
if (event == CTRL_CLOSE_EVENT
|| event == CTRL_LOGOFF_EVENT
|| event == CTRL_SHUTDOWN_EVENT) {
- ::raise(SIGTERM);
- // Relinquish our time slice.
- Sleep(0);
+ lyx::lyx_exit(1);
return TRUE;
}
return FALSE;
* lyx is invoked as a parameter of hidecmd.exe.
*/
- // If cygwin is detected, query the cygdrive prefix
- HKEY regKey;
+ // If Cygwin is detected, query the cygdrive prefix.
+ // The cygdrive prefix is needed for translating windows style paths
+ // to posix style paths in LaTeX files when the Cygwin teTeX is used.
+ int i;
+ HKEY hkey;
char buf[MAX_PATH];
- DWORD bufSize = sizeof(buf);
- LONG retVal;
-
- retVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- "Software\\Cygnus Solutions\\Cygwin\\mounts v2",
- 0, KEY_QUERY_VALUE, ®Key);
- if (retVal != ERROR_SUCCESS) {
- retVal = RegOpenKeyEx(HKEY_CURRENT_USER,
- "Software\\Cygnus Solutions\\Cygwin\\mounts v2",
- 0, KEY_QUERY_VALUE, ®Key);
+ DWORD bufsize = sizeof(buf);
+ LONG retval = ERROR_FILE_NOT_FOUND;
+ HKEY const mainkey[2] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };
+ char const * const subkey[2] = {
+ "Software\\Cygwin\\setup", // Cygwin 1.7
+ "Software\\Cygnus Solutions\\Cygwin\\mounts v2\\/" // Prev. ver.
+ };
+ char const * const valuename[2] = {
+ "rootdir", // Cygwin 1.7 or later
+ "native" // Previous versions
+ };
+ // Check for newer Cygwin versions first, then older ones
+ for (i = 0; i < 2 && retval != ERROR_SUCCESS; ++i) {
+ for (int k = 0; k < 2 && retval != ERROR_SUCCESS; ++k)
+ retval = RegOpenKey(mainkey[k], subkey[i], &hkey);
}
- if (retVal == ERROR_SUCCESS) {
- retVal = RegQueryValueEx(regKey, "cygdrive prefix", NULL, NULL,
- (LPBYTE) buf, &bufSize);
- RegCloseKey(regKey);
- if ((retVal == ERROR_SUCCESS) && (bufSize <= MAX_PATH))
- cygdrive = rtrim(string(buf), "/");
+ if (retval == ERROR_SUCCESS) {
+ // Query the Cygwin root directory
+ retval = RegQueryValueEx(hkey, valuename[i - 1],
+ NULL, NULL, (LPBYTE) buf, &bufsize);
+ RegCloseKey(hkey);
+ string const mount = string(buf) + "\\bin\\mount.exe";
+ if (retval == ERROR_SUCCESS && FileName(mount).exists()) {
+ cmd_ret const p =
+ runCommand(mount + " --show-cygdrive-prefix");
+ // The output of the mount command is as follows:
+ // Prefix Type Flags
+ // /cygdrive system binmode
+ // So, we use the inner split to pass the second line
+ // to the outer split which sets cygdrive with its
+ // contents until the first blank, discarding the
+ // unneeded return value.
+ if (p.first != -1 && prefixIs(p.second, "Prefix"))
+ split(split(p.second, '\n'), cygdrive, ' ');
+ }
}
// Catch shutdown events.