]> git.lyx.org Git - lyx.git/blobdiff - src/support/os_win32.C
hopefully fix tex2lyx linking.
[lyx.git] / src / support / os_win32.C
index 484c55786007ea93a6027199ed87e73e3d072b9f..c6624eadc4cd17c611a1acc45705d41f37ec8f46 100644 (file)
@@ -50,6 +50,9 @@
 #include <io.h>
 #include <direct.h> // _getdrive
 #include <shlobj.h>  // SHGetFolderPath
+#include <windef.h>
+#include <shellapi.h>  
+#include <shlwapi.h>
 
 // Must define SHGFP_TYPE_CURRENT for older versions of MinGW.
 #if defined(__MINGW32__)  || defined(__CYGWIN__) || defined(__CYGWIN32__)
@@ -73,7 +76,7 @@ namespace os {
 
 namespace {
 
-bool cygwin_path_fix_ = false;
+bool windows_style_tex_paths_ = true;
 
 string cygdrive = "/cygdrive";
 
@@ -132,45 +135,31 @@ void init(int /* argc */, char * argv[])
         * shell scripts failed, for mysterious reasons...
         *
         * I've chosen for now, therefore, to simply add Ruurd's original
-        * code as-is.
+        * code as-is. A wrapper program hidecmd.c has been added to 
+        * development/Win32 which hides the console window of lyx when
+        * lyx is invoked as a parameter of hidecmd.exe.
         */
-       // Close the console when run (probably)
-       // not run from command prompt
-       char WindowTitle[1024];
-       if (GetConsoleTitle(WindowTitle, sizeof(WindowTitle)) == 0) {
-               // Could not get the title, so we just leave things as they are
-               return;
-       }
-
-       if ((strcmp(WindowTitle, argv[0]) == 0) ||
-               (strcmp(WindowTitle, "LyX") == 0)) {
-               // format a "unique" newWindowTitle
-               wsprintf(WindowTitle, "%d/%d",
-                       GetTickCount(),
-                       GetCurrentProcessId());
-               // change current window title
-               SetConsoleTitle(WindowTitle);
-               // ensure window title has been updated
-               Sleep(40);
-               // look for newWindowTitle
-               HWND const hwndFound = FindWindow(NULL, WindowTitle);
-               // If found, hide it
-               if (hwndFound != NULL)
-                       ShowWindow( hwndFound, SW_HIDE);
-       }
 
        // If cygwin is detected, query the cygdrive prefix
-       cmd_ret const c = runCommand("sh -c uname");
-       if (c.first != -1 && prefixIs(c.second, "CYGWIN")) {
-               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"))
-                       (void) split(split(p.second, '\n'), cygdrive, ' ');
+       HKEY regKey;
+       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, &regKey);
+       if (retVal != ERROR_SUCCESS) {
+               retVal = RegOpenKeyEx(HKEY_CURRENT_USER,
+                               "Software\\Cygnus Solutions\\Cygwin\\mounts v2",
+                               0, KEY_QUERY_VALUE, &regKey);
+       }
+       if (retVal == ERROR_SUCCESS) {
+               retVal = RegQueryValueEx(regKey, "cygdrive prefix", NULL, NULL,
+                               (LPBYTE) buf, &bufSize);
+               RegCloseKey(regKey);
+               if ((retVal == ERROR_SUCCESS) && (bufSize <= MAX_PATH))
+                       cygdrive = buf;
        }
 }
 
@@ -257,15 +246,15 @@ string internal_path_list(string const & p)
 string latex_path(string const & p)
 {
        // We may need a posix style path or a windows style path (depending
-       // on cygwin_path_fix_), but we use always forward slashes, since it
-       // gets written into a .tex file.
+       // on windows_style_tex_paths_), but we use always forward slashes,
+       // since it gets written into a .tex file.
 
-       if (cygwin_path_fix_ && is_absolute_path(p)) {
+       if (!windows_style_tex_paths_ && is_absolute_path(p)) {
                string const drive = p.substr(0, 2);
                string const cygprefix = cygdrive + "/" + drive.substr(0, 1);
                string const cygpath = subst(subst(p, '\\', '/'), drive, cygprefix);
                lyxerr[Debug::LATEX]
-                       << "<Cygwin path correction> ["
+                       << "<Path correction for LaTeX> ["
                        << p << "]->>["
                        << cygpath << ']' << endl;
                return cygpath;
@@ -319,9 +308,9 @@ char path_separator()
 }
 
 
-void cygwin_path_fix(bool use_cygwin_paths)
+void windows_style_tex_paths(bool use_windows_paths)
 {
-       cygwin_path_fix_ = !use_cygwin_paths;
+       windows_style_tex_paths_ = use_windows_paths;
 }
 
 
@@ -389,6 +378,34 @@ string const GetFolderPath::operator()(folder_id _id) const
        return (result == 0) ? os::internal_path(folder_path) : string();
 }
 
+
+bool canAutoOpenFile(string const & ext, auto_open_mode const mode)
+{
+       if (ext.empty())
+               return false;
+
+       string const full_ext = "." + ext;
+
+       DWORD bufSize = MAX_PATH + 100;
+       TCHAR buf[MAX_PATH + 100];
+       // reference: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc
+       //                 /platform/shell/reference/shlwapi/registry/assocquerystring.asp
+       char const * action = (mode == VIEW) ? "open" : "edit";
+       return S_OK == AssocQueryString(0, ASSOCSTR_EXECUTABLE,
+               full_ext.c_str(), action, buf, &bufSize);
+}
+
+
+bool autoOpenFile(string const & filename, auto_open_mode const mode)
+{
+       // reference: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc
+       //                 /platform/shell/reference/functions/shellexecute.asp
+       char const * action = (mode == VIEW) ? "open" : "edit";
+       return reinterpret_cast<int>(ShellExecute(NULL, action,
+               filename.c_str(), NULL, NULL, 1)) > 32;
+}
+
+
 } // namespace os
 } // namespace support
 } // namespace lyx