]> git.lyx.org Git - lyx.git/blobdiff - src/support/os_win32.cpp
Fixup commit 50060053
[lyx.git] / src / support / os_win32.cpp
index dd5f0e594d71cd9fa18fa1adc04dd0710c2d209e..a6e5da7c5ad060b40f5b0c6b32ba4d99f4367d67 100644 (file)
 
 #include <config.h>
 
+#include "LyXRC.h"
+
 #include "support/os.h"
 #include "support/os_win32.h"
 
 #include "support/debug.h"
+#include "support/environment.h"
 #include "support/FileName.h"
 #include "support/gettext.h"
 #include "support/filetools.h"
 #include <stdio.h>
 #endif
 
-
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+#else
 extern "C" {
 extern void __wgetmainargs(int * argc, wchar_t *** argv, wchar_t *** envp,
                           int expand_wildcards, int * new_mode);
 }
+#endif
 
 using namespace std;
 
@@ -154,10 +159,14 @@ void init(int argc, char * argv[])
 
 
        // Get the wide program arguments array
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+       argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_);
+#else
        wchar_t ** envp = 0;
        int newmode = 0;
        __wgetmainargs(&argc_, &argv_, &envp, -1, &newmode);
-       LASSERT(argc == argc_, /**/);
+#endif
+       LATTEST(argc == argc_);
 
        // If Cygwin is detected, query the cygdrive prefix.
        // The cygdrive prefix is needed for translating windows style paths
@@ -209,7 +218,7 @@ void init(int argc, char * argv[])
 
 string utf8_argv(int i)
 {
-       LASSERT(i < argc_, /**/);
+       LASSERT(i < argc_, return "");
        return fromqstr(QString::fromWCharArray(argv_[i]));
 }
 
@@ -309,7 +318,7 @@ static QString const get_long_path(QString const & short_path)
                long_path.resize(result);
                result = GetLongPathNameW((wchar_t *) short_path.utf16(),
                                         &long_path[0], long_path.size());
-               LASSERT(result <= long_path.size(), /**/);
+               LATTEST(result <= long_path.size());
        }
 
        return (result == 0) ? short_path : QString::fromWCharArray(&long_path[0]);
@@ -336,7 +345,7 @@ static QString const get_short_path(QString const & long_path, file_access how)
                short_path.resize(result);
                result = GetShortPathNameW((wchar_t *) long_path.utf16(),
                                         &short_path[0], short_path.size());
-               LASSERT(result <= short_path.size(), /**/);
+               LATTEST(result <= short_path.size());
        }
 
        return (result == 0) ? long_path : QString::fromWCharArray(&short_path[0]);
@@ -385,6 +394,38 @@ string latex_path(string const & p)
 }
 
 
+string latex_path_list(string const & p)
+{
+       if (p.empty())
+               return p;
+
+       // We may need a posix style path or a windows style path (depending
+       // on windows_style_tex_paths_), but we use always forward slashes,
+       // since this is standard for all tex engines.
+
+       if (!windows_style_tex_paths_) {
+               string pathlist;
+               for (size_t i = 0, k = 0; i != string::npos; k = i) {
+                       i = p.find(';', i);
+                       string path = subst(p.substr(k, i - k), '\\', '/');
+                       if (FileName::isAbsolute(path)) {
+                               string const drive = path.substr(0, 2);
+                               string const cygprefix = cygdrive + "/"
+                                                       + drive.substr(0, 1);
+                               path = subst(path, drive, cygprefix);
+                       }
+                       pathlist += path;
+                       if (i != string::npos) {
+                               pathlist += ':';
+                               ++i;
+                       }
+               }
+               return pathlist;
+       }
+       return subst(p, '\\', '/');
+}
+
+
 bool is_valid_strftime(string const & p)
 {
        string::size_type pos = p.find_first_of('%');
@@ -423,8 +464,11 @@ shell_type shell()
 }
 
 
-char path_separator()
+char path_separator(path_type type)
 {
+       if (type == TEXENGINE)
+               return windows_style_tex_paths_ ? ';' : ':';
+
        return ';';
 }
 
@@ -476,7 +520,7 @@ string const GetFolderPath::operator()(folder_id _id) const
                id = CSIDL_APPDATA;
                break;
        default:
-               LASSERT(false, /**/);
+               LASSERT(false, return string());
        }
        HRESULT const result = (folder_path_func_)(0, id, 0,
                                                   SHGFP_TYPE_CURRENT,
@@ -501,12 +545,40 @@ bool canAutoOpenFile(string const & ext, auto_open_mode const mode)
 }
 
 
-bool autoOpenFile(string const & filename, auto_open_mode const mode)
+bool autoOpenFile(string const & filename, auto_open_mode const mode,
+                 string const & path)
 {
+       string const texinputs = os::latex_path_list(
+                       replaceCurdirPath(path, lyxrc.texinputs_prefix));
+       string const otherinputs = os::latex_path_list(path);
+       string const sep = windows_style_tex_paths_ ? ";" : ":";
+       string const oldtexinputs = getEnv("TEXINPUTS");
+       string const newtexinputs = "." + sep + texinputs + sep + oldtexinputs;
+       string const oldbibinputs = getEnv("BIBINPUTS");
+       string const newbibinputs = "." + sep + otherinputs + sep + oldbibinputs;
+       string const oldbstinputs = getEnv("BSTINPUTS");
+       string const newbstinputs = "." + sep + otherinputs + sep + oldbstinputs;
+       string const oldtexfonts = getEnv("TEXFONTS");
+       string const newtexfonts = "." + sep + otherinputs + sep + oldtexfonts;
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", newtexinputs);
+               setEnv("BIBINPUTS", newbibinputs);
+               setEnv("BSTINPUTS", newbstinputs);
+               setEnv("TEXFONTS", newtexfonts);
+       }
+
        // reference: http://msdn.microsoft.com/en-us/library/bb762153.aspx
        char const * action = (mode == VIEW) ? "open" : "edit";
-       return reinterpret_cast<int>(ShellExecute(NULL, action,
+       bool success = reinterpret_cast<intptr_t>(ShellExecute(NULL, action,
                to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32;
+
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", oldtexinputs);
+               setEnv("BIBINPUTS", oldbibinputs);
+               setEnv("BSTINPUTS", oldbstinputs);
+               setEnv("TEXFONTS", oldtexfonts);
+       }
+       return success;
 }