X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fos_win32.cpp;h=b58397d202640cc5cac395f913e7c4c8c1b421d1;hb=892e237fe1c5d7574b08d017070262239465f70b;hp=5577221689d3841b634959080ade3766c0282a62;hpb=0f8929d5d12d0687674df037a68ba231e67aac8b;p=lyx.git diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp index 5577221689..b58397d202 100644 --- a/src/support/os_win32.cpp +++ b/src/support/os_win32.cpp @@ -15,10 +15,13 @@ #include +#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" @@ -53,6 +56,11 @@ #define ASSOCF_INIT_IGNOREUNKNOWN 0 #endif +#if defined(__MINGW32__) +#include +#endif + + extern "C" { extern void __wgetmainargs(int * argc, wchar_t *** argv, wchar_t *** envp, int expand_wildcards, int * new_mode); @@ -380,6 +388,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('%'); @@ -412,34 +452,17 @@ string const & nulldev() } -bool is_terminal(io_channel channel) -{ - switch (channel) { - case STDIN: - if (GetStdHandle(STD_INPUT_HANDLE) == NULL) - return false; - break; - case STDOUT: - if (GetStdHandle(STD_OUTPUT_HANDLE) == NULL) - return false; - break; - case STDERR: - if (GetStdHandle(STD_ERROR_HANDLE) == NULL) - return false; - break; - } - return true; -} - - shell_type shell() { return CMD_EXE; } -char path_separator() +char path_separator(path_type type) { + if (type == TEXENGINE) + return windows_style_tex_paths_ ? ';' : ':'; + return ';'; } @@ -516,12 +539,25 @@ 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 sep = windows_style_tex_paths_ ? ";" : ":"; + string const oldval = getEnv("TEXINPUTS"); + string const newval = "." + sep + texinputs + sep + oldval; + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) + setEnv("TEXINPUTS", newval); + // reference: http://msdn.microsoft.com/en-us/library/bb762153.aspx char const * action = (mode == VIEW) ? "open" : "edit"; - return reinterpret_cast(ShellExecute(NULL, action, + bool success = reinterpret_cast(ShellExecute(NULL, action, to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32; + + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) + setEnv("TEXINPUTS", oldval); + return success; } @@ -618,7 +654,7 @@ string real_path(string const & path) CloseHandle(hmap); CloseHandle(hpath); string const retpath = subst(string(realpath), '\\', '/'); - return FileName::fromFilesystemEncoding(retpath).absFilename(); + return FileName::fromFilesystemEncoding(retpath).absFileName(); } } // namespace os