X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fos_unix.cpp;h=b85bdb20cd4788ec8dfbeeb762983db100404c52;hb=19024f725533b3dcdeddc318119e1379eb2c6837;hp=976fcf75e86a34c277a69e71abb682acd9211605;hpb=6d1d27eb90eecae74f7f04071189d2ad577fdad0;p=lyx.git diff --git a/src/support/os_unix.cpp b/src/support/os_unix.cpp index 976fcf75e8..b85bdb20cd 100644 --- a/src/support/os_unix.cpp +++ b/src/support/os_unix.cpp @@ -12,16 +12,21 @@ #include +#include "LyXRC.h" + #include "support/os.h" #include "support/docstring.h" +#include "support/environment.h" #include "support/FileName.h" +#include "support/filetools.h" #include "support/lstrings.h" +#include "support/lassert.h" #include #include #ifdef __APPLE__ -#include +#include #endif using namespace std; @@ -30,7 +35,28 @@ namespace lyx { namespace support { namespace os { -void init(int, char *[]) +namespace { + +int argc_ = 0; +char ** argv_ = 0; + +} // namespace anon + +void init(int argc, char * argv[]) +{ + argc_ = argc; + argv_ = argv; +} + + +string utf8_argv(int i) +{ + LASSERT(i < argc_, return ""); + return to_utf8(from_local8bit(argv_[i])); +} + + +void remove_internal_args(int, int) {} @@ -70,9 +96,7 @@ docstring::size_type common_path(docstring const & p1, docstring const & p2) --i; // here was the last match while (i && p1[i] != '/') --i; - } else - --i; - + } return i; } @@ -80,8 +104,7 @@ docstring::size_type common_path(docstring const & p1, docstring const & p2) bool path_prefix_is(string const & path, string const & pre) { #ifdef __APPLE__ - string tmp = path; - return path_prefix_is(tmp, pre, CASE_UNCHANGED); + return path_prefix_is(const_cast(path), pre, CASE_UNCHANGED); #else return prefixIs(path, pre); #endif @@ -93,13 +116,23 @@ bool path_prefix_is(string & path, string const & pre, path_case how) #ifdef __APPLE__ docstring const p1 = from_utf8(path); docstring const p2 = from_utf8(pre); - docstring::size_type i = common_path(p1, p2); + docstring::size_type const p1_len = p1.length(); + docstring::size_type const p2_len = p2.length(); + docstring::size_type common_len = common_path(p1, p2); - if (i + 1 != p2.length()) + if (p2[p2_len - 1] == '/' && p1_len != p2_len) + ++common_len; + + if (common_len != p2_len) return false; - if (!prefixIs(path, pre) && how == CASE_ADJUSTED) - path = to_utf8(p2 + p1.substr(i + 1, p1.length() - i + 1)); + if (how == CASE_ADJUSTED && !prefixIs(path, pre)) { + if (p1_len < common_len) + path = to_utf8(p2.substr(0, p1_len)); + else + path = to_utf8(p2 + p1.substr(common_len, + p1_len - common_len)); + } return true; #else @@ -123,6 +156,12 @@ string internal_path(string const & p) } +string safe_internal_path(string const & p, file_access) +{ + return p; +} + + string external_path_list(string const & p) { return p; @@ -141,6 +180,12 @@ string latex_path(string const & p) } +string latex_path_list(string const & p) +{ + return p; +} + + bool is_valid_strftime(string const & p) { string::size_type pos = p.find_first_of('%'); @@ -171,19 +216,13 @@ string const & nulldev() } -bool is_terminal(io_channel channel) -{ - return isatty(channel); -} - - shell_type shell() { return UNIX; } -char path_separator() +char path_separator(path_type) { return ':'; } @@ -223,7 +262,8 @@ 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) { #ifdef __APPLE__ // Reference: http://developer.apple.com/documentation/Carbon/Reference/LaunchServicesReference/ @@ -244,6 +284,13 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode) if (status == kLSApplicationNotFoundErr) return false; + string const texinputs = os::latex_path_list( + replaceCurdirPath(path, lyxrc.texinputs_prefix)); + string const oldval = getEnv("TEXINPUTS"); + string const newval = ".:" + texinputs + ":" + oldval; + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) + setEnv("TEXINPUTS", newval); + LSLaunchFSRefSpec inLaunchSpec; inLaunchSpec.appRef = &outAppRef; inLaunchSpec.numDocs = 1; @@ -253,11 +300,15 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode) inLaunchSpec.asyncRefCon = NULL; status = LSOpenFromRefSpec(&inLaunchSpec, NULL); + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) + setEnv("TEXINPUTS", oldval); + return status != kLSApplicationNotFoundErr; #else // silence compiler warnings (void)filename; (void)mode; + (void)path; // currently, no default viewer is tried for non-windows system // support for KDE/Gnome/Macintosh may be added later @@ -268,9 +319,16 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode) string real_path(string const & path) { +#ifdef HAVE_DEF_PATH_MAX char rpath[PATH_MAX + 1]; char * result = realpath(path.c_str(), rpath); - return FileName::fromFilesystemEncoding(result ? rpath : path).absFilename(); + return FileName::fromFilesystemEncoding(result ? rpath : path).absFileName(); +#else + char * result = realpath(path.c_str(), NULL); + string ret = FileName::fromFilesystemEncoding(result ? result : path).absFileName(); + free(result); + return ret; +#endif } } // namespace os