From be89d520d7e9ad6c574c259a10f282177fb5dd4a Mon Sep 17 00:00:00 2001 From: bfredl Date: Wed, 13 Nov 2024 13:25:10 +0100 Subject: refactor(windows)!: only support UCRT, even for mingw The newer UCRT runtime has native support for UTF-8, including forcing it as the active codepage even before `main()` is called. This means the c runtime will properly convert windows WCHAR:s into UTF-8 bytes, as early as the argv/argc params to `main()` . Whereas MSVCRT does not support this reliably and required us to use `wmain()`. Only MSVC supports using manifest files directly as source files. The solution for other Windows toolchains is to use a .rc file. --- src/nvim/CMakeLists.txt | 4 ++-- src/nvim/main.c | 15 +++------------ src/nvim/os/nvim.rc | 2 ++ 3 files changed, 7 insertions(+), 14 deletions(-) create mode 100644 src/nvim/os/nvim.rc (limited to 'src') diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index cb71144130..1b6827322d 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -120,8 +120,8 @@ elseif(MINGW) # Use POSIX compatible stdio in Mingw target_compile_definitions(main_lib INTERFACE __USE_MINGW_ANSI_STDIO) - # Enable wmain - target_link_libraries(nvim_bin PRIVATE -municode) + # wrapper for nvim.manifest + target_sources(main_lib INTERFACE ${CMAKE_CURRENT_LIST_DIR}/os/nvim.rc) elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU") target_compile_options(main_lib INTERFACE -Wno-conversion diff --git a/src/nvim/main.c b/src/nvim/main.c index 695bd4c95a..dc4969759d 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -111,6 +111,9 @@ #ifdef MSWIN # include "nvim/os/os_win_console.h" +# ifndef _UCRT +# error UCRT is the only supported C runtime on windows +# endif #endif #if defined(MSWIN) && !defined(MAKE_LIB) @@ -241,22 +244,10 @@ void early_init(mparm_T *paramp) #ifdef MAKE_LIB int nvim_main(int argc, char **argv); // silence -Wmissing-prototypes int nvim_main(int argc, char **argv) -#elif defined(MSWIN) -int wmain(int argc, wchar_t **argv_w) // multibyte args on Windows. #7060 #else int main(int argc, char **argv) #endif { -#if defined(MSWIN) && !defined(MAKE_LIB) - char **argv = xmalloc((size_t)argc * sizeof(char *)); - for (int i = 0; i < argc; i++) { - char *buf = NULL; - utf16_to_utf8(argv_w[i], -1, &buf); - assert(buf); - argv[i] = buf; - } -#endif - argv0 = argv[0]; if (!appname_is_valid()) { diff --git a/src/nvim/os/nvim.rc b/src/nvim/os/nvim.rc new file mode 100644 index 0000000000..e838c93c16 --- /dev/null +++ b/src/nvim/os/nvim.rc @@ -0,0 +1,2 @@ +#include "winuser.h" +2 RT_MANIFEST nvim.manifest -- cgit