From c364a6527a83d22bdd79e77286d0b53b0b624746 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 16 Mar 2019 19:37:42 -0700 Subject: [PATCH] Windows: Fix passing Unicode filenames (fixes #1359) --- CMakeLists.txt | 2 ++ include/mgba-util/common.h | 6 +++++- src/platform/qt/main.cpp | 18 ++++++++++++++++++ src/platform/sdl/main.c | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2649f9f35..2628c3e83 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,6 +226,8 @@ endif() if(WIN32) set(WIN32_VERSION "${LIB_VERSION_MAJOR},${LIB_VERSION_MINOR},${LIB_VERSION_PATCH}") add_definitions(-D_WIN32_WINNT=0x0600) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -municode") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -municode") list(APPEND OS_LIB ws2_32 shlwapi) list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/vfs-w32.c) file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/*.c) diff --git a/include/mgba-util/common.h b/include/mgba-util/common.h index 0c20b03ae..c3ce5be12 100644 --- a/include/mgba-util/common.h +++ b/include/mgba-util/common.h @@ -34,12 +34,16 @@ CXX_GUARD_START // WinSock2 gets very angry if it's included too late #include #endif + +#if defined(_MSC_VER) || defined(__cplusplus) +#define restrict __restrict +#endif + #ifdef _MSC_VER #include #include typedef intptr_t ssize_t; #define PATH_MAX MAX_PATH -#define restrict __restrict #define strcasecmp _stricmp #define strncasecmp _strnicmp #define ftruncate _chsize diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index ec6a1b9e8..e3a958038 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -104,3 +104,21 @@ int main(int argc, char* argv[]) { return application.exec(); } + +#ifdef _WIN32 +#include +#include + +extern "C" +int wmain(int argc, wchar_t* argv[]) { + std::vector argv8; + for (int i = 0; i < argc; ++i) { + argv8.push_back(utf16to8(reinterpret_cast(argv[i]), wcslen(argv[i]) * 2)); + } + int ret = main(argc, argv8.data()); + for (char* ptr : argv8) { + free(ptr); + } + return ret; +} +#endif diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index dd20b0397..0da0698b9 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -179,6 +179,24 @@ int main(int argc, char** argv) { return ret; } +#ifdef _WIN32 +#include + +int wmain(int argc, wchar_t** argv) { + char** argv8 = malloc(sizeof(char*) * argc); + int i; + for (i = 0; i < argc; ++i) { + argv8[i] = utf16to8((uint16_t*) argv[i], wcslen(argv[i]) * 2); + } + int ret = main(argc, argv8); + for (i = 0; i < argc; ++i) { + free(argv8[i]); + } + free(argv8); + return ret; +} +#endif + int mSDLRun(struct mSDLRenderer* renderer, struct mArguments* args) { struct mCoreThread thread = { .core = renderer->core