mirror of
https://github.com/love2d/love.git
synced 2026-08-16 00:02:12 +02:00
LOVE arguments now work with Unicode in Windows.
This commit is contained in:
@@ -62,4 +62,8 @@
|
||||
# define LOVE_EXPORT
|
||||
#endif
|
||||
|
||||
#if defined(LOVE_WINDOWS)
|
||||
# define LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
#endif
|
||||
|
||||
#endif // LOVE_CONFIG_H
|
||||
|
||||
+59
-5
@@ -24,6 +24,10 @@
|
||||
#include <common/runtime.h>
|
||||
#include <common/MemoryData.h>
|
||||
|
||||
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
#include <windows.h>
|
||||
#endif // #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
|
||||
#ifdef LOVE_BUILD_EXE
|
||||
|
||||
// SDL
|
||||
@@ -120,10 +124,56 @@ extern "C" LOVE_EXPORT int luaopen_love(lua_State * L)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
|
||||
void get_utf8_arguments(int & argc, char **& argv)
|
||||
{
|
||||
LPWSTR cmd = GetCommandLineW();
|
||||
|
||||
if(!cmd)
|
||||
return;
|
||||
|
||||
LPWSTR * argv_w = CommandLineToArgvW(cmd, &argc);
|
||||
|
||||
argv = new char*[argc];
|
||||
|
||||
for(int i = 0; i<argc; ++i)
|
||||
{
|
||||
// Size of wide char buffer (plus one for trailing '\0').
|
||||
size_t wide_len = wcslen(argv_w[i])+1;
|
||||
|
||||
// Get size in UTF-8.
|
||||
int utf8_size = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], 0, 0, 0);
|
||||
|
||||
argv[i] = new char[utf8_size];
|
||||
|
||||
// Convert to UTF-8.
|
||||
int ok = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], utf8_size, 0, 0);
|
||||
|
||||
int len = strlen(argv[i]);
|
||||
|
||||
if(!ok)
|
||||
printf("Warning: could not convert to UTF8.\n");
|
||||
}
|
||||
|
||||
LocalFree(argv_w);
|
||||
}
|
||||
|
||||
#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
|
||||
#ifdef LOVE_BUILD_EXE
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
|
||||
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
int hack_argc = 0;
|
||||
char ** hack_argv = 0;
|
||||
get_utf8_arguments(hack_argc, hack_argv);
|
||||
argc = hack_argc;
|
||||
argv = hack_argv;
|
||||
#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
|
||||
// Oh, you just want the version? Okay!
|
||||
if(argc > 1 && strcmp(argv[1],"--version") == 0) {
|
||||
printf("This is LOVE %s (%s), the unquestionably awesome 2D game engine.\n", love::VERSION_STR, love::VERSION_CODENAME);
|
||||
@@ -166,11 +216,15 @@ int main(int argc, char ** argv)
|
||||
|
||||
lua_close(L);
|
||||
|
||||
#if defined(LOVE_DEBUG) && defined(LOVE_WINDOWS)
|
||||
printf("(press key)\n");
|
||||
getchar();
|
||||
#endif
|
||||
printf("Done. This was: %s (%s)\n", love::VERSION_STR, love::VERSION_CODENAME);
|
||||
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
if(hack_argv)
|
||||
{
|
||||
for(int i = 0; i<hack_argc; ++i)
|
||||
delete [] hack_argv[i];
|
||||
delete [] hack_argv;
|
||||
}
|
||||
#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user