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
This commit is contained in:
Enrico Forestieri 2010-02-25 00:20:31 +00:00
parent 056a614830
commit 3fce202517
5 changed files with 68 additions and 10 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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("/");

View File

@ -16,6 +16,7 @@
#include "support/docstring.h"
#include "support/FileName.h"
#include "support/lstrings.h"
#include "support/lassert.h"
#include <limits.h>
#include <stdlib.h>
@ -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()

View File

@ -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,