X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fos_unix.cpp;h=9109fbb58648c0d9cb3e945446718070be939b81;hb=bf56e2c8e1afa857cd5e313c19948040e41b8227;hp=2e6f9ba309c84bc583b6b07ea1cf029f98034004;hpb=5fb0ed491c172bb3c759d1ff5325d879221287ea;p=lyx.git diff --git a/src/support/os_unix.cpp b/src/support/os_unix.cpp index 2e6f9ba309..9109fbb586 100644 --- a/src/support/os_unix.cpp +++ b/src/support/os_unix.cpp @@ -12,16 +12,24 @@ #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 #include #ifdef __APPLE__ -#include +#include +#include +#include #endif using namespace std; @@ -30,7 +38,32 @@ 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; + + // Set environment's default locale + setlocale(LC_ALL, ""); + setlocale(LC_NUMERIC, "C"); +} + + +string utf8_argv(int i) +{ + LASSERT(i < argc_, return ""); + return to_utf8(from_local8bit(argv_[i])); +} + + +void remove_internal_args(int, int) {} @@ -130,6 +163,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; @@ -148,6 +187,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('%'); @@ -178,19 +223,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 ':'; } @@ -230,41 +269,64 @@ 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/ - FSRef fileref; - OSStatus status = - FSPathMakeRef((UInt8 *) filename.c_str(), &fileref, NULL); - if (status != 0) - return false; - // this is what we would like to do but it seems that the // viewer for PDF is often quicktime... //LSRolesMask role = (mode == VIEW) ? kLSRolesViewer : kLSRolesEditor; (void)mode; LSRolesMask role = kLSRolesAll; - FSRef outAppRef; - status = LSGetApplicationForItem(&fileref, role, &outAppRef, NULL); + CFURLRef docURL = CFURLCreateFromFileSystemRepresentation( + NULL, (UInt8 *) filename.c_str(), filename.size(), false); + CFURLRef appURL; + OSStatus status = LSGetApplicationForURL(docURL, role, NULL, &appURL); if (status == kLSApplicationNotFoundErr) return false; - LSLaunchFSRefSpec inLaunchSpec; - inLaunchSpec.appRef = &outAppRef; - inLaunchSpec.numDocs = 1; - inLaunchSpec.itemRefs = &fileref; - inLaunchSpec.passThruParams = NULL; - inLaunchSpec.launchFlags = kLSLaunchDefaults; - inLaunchSpec.asyncRefCon = NULL; - status = LSOpenFromRefSpec(&inLaunchSpec, NULL); - - return status != kLSApplicationNotFoundErr; + CFURLRef docURLs[] = { docURL }; + CFArrayRef launchItems = CFArrayCreate( + NULL, + (const void**)docURLs, sizeof(docURLs) / sizeof(CFURLRef), + NULL); + LSLaunchURLSpec launchUrlSpec = { + appURL, launchItems, NULL, kLSLaunchDefaults, NULL + }; + + string const texinputs = os::latex_path_list( + replaceCurdirPath(path, lyxrc.texinputs_prefix)); + string const otherinputs = os::latex_path_list(path); + string const oldtexinputs = getEnv("TEXINPUTS"); + string const newtexinputs = ".:" + texinputs + ":" + oldtexinputs; + string const oldbibinputs = getEnv("BIBINPUTS"); + string const newbibinputs = ".:" + otherinputs + ":" + oldbibinputs; + string const oldbstinputs = getEnv("BSTINPUTS"); + string const newbstinputs = ".:" + otherinputs + ":" + oldbstinputs; + string const oldtexfonts = getEnv("TEXFONTS"); + string const newtexfonts = ".:" + otherinputs + ":" + oldtexfonts; + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) { + setEnv("TEXINPUTS", newtexinputs); + setEnv("BIBINPUTS", newbibinputs); + setEnv("BSTINPUTS", newbstinputs); + setEnv("TEXFONTS", newtexfonts); + } + status = LSOpenFromURLSpec (&launchUrlSpec, NULL); + CFRelease(launchItems); + if (!path.empty() && !lyxrc.texinputs_prefix.empty()) { + setEnv("TEXINPUTS", oldtexinputs); + setEnv("BIBINPUTS", oldbibinputs); + setEnv("BSTINPUTS", oldbstinputs); + setEnv("TEXFONTS", oldtexfonts); + } + return status == 0; #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 @@ -275,9 +337,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