From 3fce202517109a26e90a08759b82f8e6c2ae8903 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Thu, 25 Feb 2010 00:20:31 +0000 Subject: [PATCH] On Windows, allow loading documents with non-ascii chars in their path also from command line and from explorer windows. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33561 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/LyX.cpp | 10 +++++----- src/support/os.h | 3 +++ src/support/os_cygwin.cpp | 16 +++++++++++++++- src/support/os_unix.cpp | 22 ++++++++++++++++++++-- src/support/os_win32.cpp | 27 +++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/LyX.cpp b/src/LyX.cpp index 184c4f9f45..f835166302 100644 --- a/src/LyX.cpp +++ b/src/LyX.cpp @@ -273,7 +273,7 @@ int LyX::exec(int & argc, char * argv[]) easyParse(argc, argv); try { - init_package(to_utf8(from_local8bit(argv[0])), + init_package(os::utf8_argv(0), cl_system_support, cl_user_support, top_build_dir_is_one_level_up); } catch (ExceptionMessage const & message) { @@ -431,7 +431,7 @@ int LyX::init(int & argc, char * argv[]) if (argv[argi][0] == '-') { lyxerr << to_utf8( bformat(_("Wrong command line option `%1$s'. Exiting."), - from_utf8(argv[argi]))) << endl; + from_utf8(os::utf8_argv(argi)))) << endl; return EXIT_FAILURE; } } @@ -445,7 +445,7 @@ int LyX::init(int & argc, char * argv[]) // Remaining arguments are assumed to be files to load. for (int argi = argc - 1; argi >= 1; --argi) - pimpl_->files_to_load_.push_back(to_utf8(from_local8bit(argv[argi]))); + pimpl_->files_to_load_.push_back(os::utf8_argv(argi)); if (first_start) { pimpl_->files_to_load_.push_back( @@ -1121,9 +1121,9 @@ void LyX::easyParse(int & argc, char * argv[]) continue; string const arg = - (i + 1 < argc) ? to_utf8(from_local8bit(argv[i + 1])) : string(); + (i + 1 < argc) ? os::utf8_argv(i + 1) : string(); string const arg2 = - (i + 2 < argc) ? to_utf8(from_local8bit(argv[i + 2])) : string(); + (i + 2 < argc) ? os::utf8_argv(i + 2) : string(); string batch; int const remove = 1 + it->second(arg, arg2, batch); diff --git a/src/support/os.h b/src/support/os.h index c87526bb89..56f923d4ad 100644 --- a/src/support/os.h +++ b/src/support/os.h @@ -46,6 +46,9 @@ enum file_access { /// Do some work just once. void init(int argc, char * argv[]); +/// Returns the i-th program argument in utf8 encoding. +std::string utf8_argv(int i); + /// Returns the name of the NULL device (/dev/null, null). std::string const & nulldev(); diff --git a/src/support/os_cygwin.cpp b/src/support/os_cygwin.cpp index 4a38a6d105..19d6e339ba 100644 --- a/src/support/os_cygwin.cpp +++ b/src/support/os_cygwin.cpp @@ -18,6 +18,7 @@ #include "support/os.h" #include "support/FileName.h" +#include "support/lassert.h" #include "support/lstrings.h" #include "support/debug.h" @@ -45,6 +46,9 @@ namespace os { namespace { +int argc_ = 0; +char ** argv_ = 0; + bool windows_style_tex_paths_ = false; // In both is_posix_path() and is_windows_path() it is assumed that @@ -202,8 +206,11 @@ BOOL terminate_handler(DWORD event) } // namespace anon -void init(int, char *[]) +void init(int argc, char * argv[]) { + argc_ = argc; + argv_ = argv; + // Make sure that the TEMP variable is set // and sync the Windows environment. setenv("TEMP", "/tmp", false); @@ -214,6 +221,13 @@ void init(int, char *[]) } +string utf8_argv(int i) +{ + LASSERT(i < argc_, /**/); + return to_utf8(from_local8bit(argv_[i])); +} + + string current_root() { return string("/"); diff --git a/src/support/os_unix.cpp b/src/support/os_unix.cpp index 7116864301..e2893db52f 100644 --- a/src/support/os_unix.cpp +++ b/src/support/os_unix.cpp @@ -16,6 +16,7 @@ #include "support/docstring.h" #include "support/FileName.h" #include "support/lstrings.h" +#include "support/lassert.h" #include #include @@ -30,8 +31,25 @@ 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 to_utf8(from_local8bit(argv_[i])); +} string current_root() diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp index 60c5915d09..a8ffaa5477 100644 --- a/src/support/os_win32.cpp +++ b/src/support/os_win32.cpp @@ -6,6 +6,7 @@ * \author Ruurd A. Reitsma * \author Claus Hentschel * \author Angus Leeming + * \author Enrico Forestieri * * Full author contact details are available in file CREDITS. * @@ -52,6 +53,11 @@ #define ASSOCF_INIT_IGNOREUNKNOWN 0 #endif +extern "C" { +extern void __wgetmainargs(int * argc, wchar_t *** argv, wchar_t *** envp, + int expand_wildcards, int * new_mode); +} + using namespace std; namespace lyx { @@ -63,6 +69,9 @@ namespace os { namespace { +int argc_ = 0; +wchar_t ** argv_ = 0; + bool windows_style_tex_paths_ = true; string cygdrive = "/cygdrive"; @@ -80,7 +89,7 @@ BOOL terminate_handler(DWORD event) } // namespace anon -void init(int /* argc */, char * argv[]) +void init(int argc, char * argv[]) { /* Note from Angus, 17 Jan 2005: * @@ -138,6 +147,13 @@ void init(int /* argc */, char * argv[]) * lyx is invoked as a parameter of hidecmd.exe. */ + + // Get the wide program arguments array + wchar_t ** envp = 0; + int newmode = 0; + __wgetmainargs(&argc_, &argv_, &envp, -1, &newmode); + LASSERT(argc == argc_, /**/); + // If Cygwin is detected, query the cygdrive prefix. // The cygdrive prefix is needed for translating windows style paths // to posix style paths in LaTeX files when the Cygwin teTeX is used. @@ -186,6 +202,13 @@ void init(int /* argc */, char * argv[]) } +string utf8_argv(int i) +{ + LASSERT(i < argc_, /**/); + return fromqstr(QString::fromWCharArray(argv_[i])); +} + + string current_root() { // _getdrive returns the current drive (1=A, 2=B, and so on). @@ -282,7 +305,7 @@ static QString const get_long_path(QString const & short_path) static QString const get_short_path(QString const & long_path, file_access how) { - // CreateFileW and GetShortPathNameW needs the path in utf16 encoding. + // CreateFileW and GetShortPathNameW need the path in utf16 encoding. if (how == CREATE) { HANDLE h = CreateFileW((wchar_t *) long_path.utf16(), GENERIC_WRITE, 0, NULL, CREATE_NEW, -- 2.39.2