diff options
-rw-r--r-- | src/nvim/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/nvim/main.c | 23 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 688912eda6..e2f1f16635 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -10,6 +10,11 @@ if(USE_GCOV) endif() endif() +if(WIN32) + # tell MinGW compiler to enable wmain + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode") +endif() + set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches) set(GENERATOR_DIR ${CMAKE_CURRENT_LIST_DIR}/generators) set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto) diff --git a/src/nvim/main.c b/src/nvim/main.c index f601fd7ea3..af614762ac 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -7,6 +7,11 @@ #include <string.h> #include <stdbool.h> +#ifdef WIN32 +# include <wchar.h> +# include <winnls.h> +#endif + #include <msgpack.h> #include "nvim/ascii.h" @@ -215,10 +220,28 @@ void early_init(void) #ifdef MAKE_LIB int nvim_main(int argc, char **argv) +#elif defined WIN32 +// don't use codepage encoded arguments. see #7060 +int wmain(int argc, wchar_t **argv_w) #else int main(int argc, char **argv) #endif { +#ifdef WIN32 + char *argv[argc]; + + for (size_t i = 0; i < (size_t)argc; i++) { + // get required buffer size + size_t dest_size = (size_t)WideCharToMultiByte( + CP_UTF8, 0, argv_w[i], -1, NULL, 0, NULL, NULL); + char *buf = (char *)xmallocz(dest_size); + // convert from utf16 (widechar) utf8 (multibyte) + WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, buf, (int)dest_size, + NULL, NULL); + argv[i] = buf; + } +#endif + argv0 = argv[0]; char_u *fname = NULL; // file name from command line |