]> git.lyx.org Git - lyx.git/blobdiff - src/support/os_cygwin.C
hopefully fix tex2lyx linking.
[lyx.git] / src / support / os_cygwin.C
index e169f10e29e357e814340f012a2751fd21a86fcc..fafbaccf5cbe86fd1e5b56f4a41d884190c8b59a 100644 (file)
@@ -21,6 +21,9 @@
 
 #include <windows.h>
 #include <io.h>
+#include <windef.h>
+#include <shellapi.h>  
+#include <shlwapi.h>
 
 #include <sys/cygwin.h>
 
@@ -34,39 +37,9 @@ namespace lyx {
 namespace support {
 namespace os {
 
-void os::init(int, char *[])
-{}
-
-
-string current_root()
-{
-       return string("/");
-}
-
-
-string::size_type common_path(string const & p1, string const & p2)
-{
-       string::size_type i = 0;
-       string::size_type       p1_len = p1.length();
-       string::size_type       p2_len = p2.length();
-       while (i < p1_len && i < p2_len && uppercase(p1[i]) == uppercase(p2[i]))
-               ++i;
-       if ((i < p1_len && i < p2_len)
-           || (i < p1_len && p1[i] != '/' && i == p2_len)
-           || (i < p2_len && p2[i] != '/' && i == p1_len))
-       {
-               if (i)
-                       --i;     // here was the last match
-               while (i && p1[i] != '/')
-                       --i;
-       }
-       return i;
-}
-
-
 namespace {
 
-bool cygwin_path_fix_ = false;
+bool windows_style_tex_paths_ = false;
 
 // In both is_posix_path() and is_windows_path() it is assumed that
 // a valid posix or pseudo-windows path is passed. They simply tell
@@ -82,14 +55,13 @@ bool is_posix_path(string const & p)
 
 bool is_windows_path(string const & p)
 {
-       return p.empty() ||
-               (!contains(p, '\\') && (p.length() <= 1 || p[1] == ':'));
+       return p.empty() || (!contains(p, '\\') && p[0] != '/');
 }
 
 
 enum PathStyle {
-    posix,
-    windows
+       posix,
+       windows
 };
 
 
@@ -114,6 +86,9 @@ string convert_path(string const & p, PathStyle const & target)
 
 string convert_path_list(string const & p, PathStyle const & target)
 {
+       if (p.empty())
+               return p;
+
        char const * const pc = p.c_str();
        PathStyle const actual = cygwin_posix_path_list_p(pc) ? posix : windows;
 
@@ -141,11 +116,83 @@ string convert_path_list(string const & p, PathStyle const & target)
 
 } // namespace anon
 
+void os::init(int, char *[])
+{
+       // Copy cygwin environment variables to the Windows environment
+       // if they're not already there.
+
+       char **envp = environ;
+       char curval[2];
+       string var;
+       string val;
+       bool temp_seen = false;
+
+       while (envp && *envp) {
+               val = split(*envp++, var, '=');
+
+               if (var == "TEMP")
+                       temp_seen = true;
+               
+               if (GetEnvironmentVariable(var.c_str(), curval, 2) == 0
+                               && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
+                       /* Convert to Windows style where necessary */
+                       if (var == "PATH" || var == "LD_LIBRARY_PATH") {
+                               string const winpathlist =
+                                   convert_path_list(val, PathStyle(windows));
+                               if (!winpathlist.empty()) {
+                                       SetEnvironmentVariable(var.c_str(),
+                                               winpathlist.c_str());
+                               }
+                       } else if (var == "HOME" || var == "TMPDIR" ||
+                                       var == "TMP" || var == "TEMP") {
+                               string const winpath =
+                                       convert_path(val, PathStyle(windows));
+                               SetEnvironmentVariable(var.c_str(), winpath.c_str());
+                       } else {
+                               SetEnvironmentVariable(var.c_str(), val.c_str());
+                       }
+               }
+       }
+       if (!temp_seen) {
+               string const winpath = convert_path("/tmp", PathStyle(windows));
+               SetEnvironmentVariable("TEMP", winpath.c_str());
+       }
+}
+
+
+string current_root()
+{
+       return string("/");
+}
+
+
+string::size_type common_path(string const & p1, string const & p2)
+{
+       string::size_type i = 0;
+       string::size_type       p1_len = p1.length();
+       string::size_type       p2_len = p2.length();
+       while (i < p1_len && i < p2_len && uppercase(p1[i]) == uppercase(p2[i]))
+               ++i;
+       if ((i < p1_len && i < p2_len)
+           || (i < p1_len && p1[i] != '/' && i == p2_len)
+           || (i < p2_len && p2[i] != '/' && i == p1_len))
+       {
+               if (i)
+                       --i;     // here was the last match
+               while (i && p1[i] != '/')
+                       --i;
+       }
+       return i;
+}
+
 
 string external_path(string const & p)
 {
-       return convert_path(p, cygwin_path_fix_ ? PathStyle(windows)
-                                               : PathStyle(posix));
+#ifdef X_DISPLAY_MISSING
+       return convert_path(p, PathStyle(windows));
+#else
+       return convert_path(p, PathStyle(posix));
+#endif
 }
 
 
@@ -157,8 +204,11 @@ string internal_path(string const & p)
 
 string external_path_list(string const & p)
 {
-       return convert_path_list(p, cygwin_path_fix_ ? PathStyle(windows)
-                                                    : PathStyle(posix));
+#ifdef X_DISPLAY_MISSING
+       return convert_path_list(p, PathStyle(windows));
+#else
+       return convert_path_list(p, PathStyle(posix));
+#endif
 }
 
 
@@ -171,13 +221,13 @@ 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 dos_path = convert_path(p, PathStyle(windows));
                lyxerr[Debug::LATEX]
-                       << "<Cygwin path correction> ["
+                       << "<Path correction for LaTeX> ["
                        << p << "]->>["
                        << dos_path << ']' << endl;
                return dos_path;
@@ -226,11 +276,40 @@ 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;
 }
 
+
+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
+       string const win_path = convert_path(filename, PathStyle(windows));
+       char const * action = (mode == VIEW) ? "open" : "edit";
+       return reinterpret_cast<int>(ShellExecute(NULL, action,
+               win_path.c_str(), NULL, NULL, 1)) > 32;
+}
+
+
 } // namespace os
 } // namespace support
 } // namespace lyx