mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-07 12:32:26 +00:00
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:
parent
056a614830
commit
3fce202517
10
src/LyX.cpp
10
src/LyX.cpp
@ -273,7 +273,7 @@ int LyX::exec(int & argc, char * argv[])
|
|||||||
easyParse(argc, argv);
|
easyParse(argc, argv);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
init_package(to_utf8(from_local8bit(argv[0])),
|
init_package(os::utf8_argv(0),
|
||||||
cl_system_support, cl_user_support,
|
cl_system_support, cl_user_support,
|
||||||
top_build_dir_is_one_level_up);
|
top_build_dir_is_one_level_up);
|
||||||
} catch (ExceptionMessage const & message) {
|
} catch (ExceptionMessage const & message) {
|
||||||
@ -431,7 +431,7 @@ int LyX::init(int & argc, char * argv[])
|
|||||||
if (argv[argi][0] == '-') {
|
if (argv[argi][0] == '-') {
|
||||||
lyxerr << to_utf8(
|
lyxerr << to_utf8(
|
||||||
bformat(_("Wrong command line option `%1$s'. Exiting."),
|
bformat(_("Wrong command line option `%1$s'. Exiting."),
|
||||||
from_utf8(argv[argi]))) << endl;
|
from_utf8(os::utf8_argv(argi)))) << endl;
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -445,7 +445,7 @@ int LyX::init(int & argc, char * argv[])
|
|||||||
|
|
||||||
// Remaining arguments are assumed to be files to load.
|
// Remaining arguments are assumed to be files to load.
|
||||||
for (int argi = argc - 1; argi >= 1; --argi)
|
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) {
|
if (first_start) {
|
||||||
pimpl_->files_to_load_.push_back(
|
pimpl_->files_to_load_.push_back(
|
||||||
@ -1121,9 +1121,9 @@ void LyX::easyParse(int & argc, char * argv[])
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
string const arg =
|
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 =
|
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;
|
string batch;
|
||||||
int const remove = 1 + it->second(arg, arg2, batch);
|
int const remove = 1 + it->second(arg, arg2, batch);
|
||||||
|
@ -46,6 +46,9 @@ enum file_access {
|
|||||||
/// Do some work just once.
|
/// Do some work just once.
|
||||||
void init(int argc, char * argv[]);
|
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).
|
/// Returns the name of the NULL device (/dev/null, null).
|
||||||
std::string const & nulldev();
|
std::string const & nulldev();
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "support/os.h"
|
#include "support/os.h"
|
||||||
|
|
||||||
#include "support/FileName.h"
|
#include "support/FileName.h"
|
||||||
|
#include "support/lassert.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/debug.h"
|
#include "support/debug.h"
|
||||||
|
|
||||||
@ -45,6 +46,9 @@ namespace os {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
int argc_ = 0;
|
||||||
|
char ** argv_ = 0;
|
||||||
|
|
||||||
bool windows_style_tex_paths_ = false;
|
bool windows_style_tex_paths_ = false;
|
||||||
|
|
||||||
// In both is_posix_path() and is_windows_path() it is assumed that
|
// In both is_posix_path() and is_windows_path() it is assumed that
|
||||||
@ -202,8 +206,11 @@ BOOL terminate_handler(DWORD event)
|
|||||||
|
|
||||||
} // namespace anon
|
} // namespace anon
|
||||||
|
|
||||||
void init(int, char *[])
|
void init(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
|
argc_ = argc;
|
||||||
|
argv_ = argv;
|
||||||
|
|
||||||
// Make sure that the TEMP variable is set
|
// Make sure that the TEMP variable is set
|
||||||
// and sync the Windows environment.
|
// and sync the Windows environment.
|
||||||
setenv("TEMP", "/tmp", false);
|
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()
|
string current_root()
|
||||||
{
|
{
|
||||||
return string("/");
|
return string("/");
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "support/docstring.h"
|
#include "support/docstring.h"
|
||||||
#include "support/FileName.h"
|
#include "support/FileName.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
|
#include "support/lassert.h"
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -30,8 +31,25 @@ namespace lyx {
|
|||||||
namespace support {
|
namespace support {
|
||||||
namespace os {
|
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()
|
string current_root()
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
* \author Ruurd A. Reitsma
|
* \author Ruurd A. Reitsma
|
||||||
* \author Claus Hentschel
|
* \author Claus Hentschel
|
||||||
* \author Angus Leeming
|
* \author Angus Leeming
|
||||||
|
* \author Enrico Forestieri
|
||||||
*
|
*
|
||||||
* Full author contact details are available in file CREDITS.
|
* Full author contact details are available in file CREDITS.
|
||||||
*
|
*
|
||||||
@ -52,6 +53,11 @@
|
|||||||
#define ASSOCF_INIT_IGNOREUNKNOWN 0
|
#define ASSOCF_INIT_IGNOREUNKNOWN 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern void __wgetmainargs(int * argc, wchar_t *** argv, wchar_t *** envp,
|
||||||
|
int expand_wildcards, int * new_mode);
|
||||||
|
}
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
@ -63,6 +69,9 @@ namespace os {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
int argc_ = 0;
|
||||||
|
wchar_t ** argv_ = 0;
|
||||||
|
|
||||||
bool windows_style_tex_paths_ = true;
|
bool windows_style_tex_paths_ = true;
|
||||||
|
|
||||||
string cygdrive = "/cygdrive";
|
string cygdrive = "/cygdrive";
|
||||||
@ -80,7 +89,7 @@ BOOL terminate_handler(DWORD event)
|
|||||||
|
|
||||||
} // namespace anon
|
} // namespace anon
|
||||||
|
|
||||||
void init(int /* argc */, char * argv[])
|
void init(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
/* Note from Angus, 17 Jan 2005:
|
/* 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.
|
* 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.
|
// If Cygwin is detected, query the cygdrive prefix.
|
||||||
// The cygdrive prefix is needed for translating windows style paths
|
// The cygdrive prefix is needed for translating windows style paths
|
||||||
// to posix style paths in LaTeX files when the Cygwin teTeX is used.
|
// 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()
|
string current_root()
|
||||||
{
|
{
|
||||||
// _getdrive returns the current drive (1=A, 2=B, and so on).
|
// _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)
|
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) {
|
if (how == CREATE) {
|
||||||
HANDLE h = CreateFileW((wchar_t *) long_path.utf16(),
|
HANDLE h = CreateFileW((wchar_t *) long_path.utf16(),
|
||||||
GENERIC_WRITE, 0, NULL, CREATE_NEW,
|
GENERIC_WRITE, 0, NULL, CREATE_NEW,
|
||||||
|
Loading…
Reference in New Issue
Block a user