diff options
-rw-r--r-- | editor/CMakeLists.txt | 4 | ||||
-rw-r--r-- | loader/impl.hpp | 3 | ||||
-rw-r--r-- | loader/init.cpp | 44 | ||||
-rw-r--r-- | loader/loader-impl.cpp | 5 | ||||
-rw-r--r-- | src/loader.hpp | 1 | ||||
-rw-r--r-- | test/CMakeLists.txt | 1 |
6 files changed, 55 insertions, 3 deletions
diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 19895603..b420aa9c 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -9,6 +9,10 @@ else() set_property(SOURCE "${res}" APPEND PROPERTY COMPILE_OPTIONS "-w") endif() +if(WIN32) + link_libraries(ntdll) +endif() + link_libraries(MagnumIntegration::ImGui fmt::fmt) add_executable(${self} "${sources}" "${res}") diff --git a/loader/impl.hpp b/loader/impl.hpp index 75ca0392..2c26c863 100644 --- a/loader/impl.hpp +++ b/loader/impl.hpp @@ -1,11 +1,12 @@ #pragma once -#include <Corrade/Containers/StringView.h> +namespace Corrade::Containers { template<typename T> class BasicStringView; using StringView = BasicStringView<const char>; } namespace floormat::Serialize { struct anim; } namespace floormat::loader_detail { bool chdir(StringView pathname); Serialize::anim deserialize_anim(StringView filename); +void system_init(); } // namespace floormat::loader_detail diff --git a/loader/init.cpp b/loader/init.cpp new file mode 100644 index 00000000..d6a447e0 --- /dev/null +++ b/loader/init.cpp @@ -0,0 +1,44 @@ +#include "impl.hpp" +#ifdef _WIN32 +#include <windows.h> +extern "C" __declspec(dllimport) long WINAPI RtlGetVersion (PRTL_OSVERSIONINFOEXW); +#ifdef _MSC_VER +#pragma comment(lib, "ntdll.lib") +#endif +#endif + +namespace floormat::loader_detail { + +#ifdef _WIN32 +static bool check_windows_build_number(unsigned major, unsigned minor, unsigned build) +{ + if (RTL_OSVERSIONINFOEXW rovi = {.dwOSVersionInfoSize = sizeof(rovi)}; !RtlGetVersion(&rovi)) + return rovi.dwMajorVersion > major || + rovi.dwMajorVersion == major && rovi.dwMinorVersion > minor || + rovi.dwMajorVersion == major && rovi.dwMinorVersion == minor && rovi.dwBuildNumber >= build; + else + return false; +} +#endif + +static void system_init_() +{ +#ifdef _WIN32 + if (check_windows_build_number(10, 0, 17035)) + { + (void)::SetConsoleOutputCP(CP_UTF8); + (void)::SetConsoleCP(CP_UTF8); + } +#endif +} + +void system_init() +{ + static bool once = false; + if (once) + return; + once = true; + system_init_(); +} + +} // namespace floormat::loader_detail diff --git a/loader/loader-impl.cpp b/loader/loader-impl.cpp index 4b52ea58..6f50d304 100644 --- a/loader/loader-impl.cpp +++ b/loader/loader-impl.cpp @@ -181,18 +181,19 @@ void loader_impl::set_application_working_directory() loader_impl::loader_impl() { + loader_detail::system_init(); set_application_working_directory(); } loader_impl::~loader_impl() = default; -static loader_& make_default_loader() +loader_& loader_::default_loader() noexcept { static loader_impl loader_singleton{}; return loader_singleton; } // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -loader_& loader = make_default_loader(); +loader_& loader = loader_::default_loader(); } // namespace floormat diff --git a/src/loader.hpp b/src/loader.hpp index 6beaf60e..32158675 100644 --- a/src/loader.hpp +++ b/src/loader.hpp @@ -20,6 +20,7 @@ struct loader_ virtual ArrayView<String> anim_atlas_list() = 0; virtual std::shared_ptr<struct anim_atlas> anim_atlas(StringView name) = 0; static void destroy(); + static loader_& default_loader() noexcept; loader_(const loader_&) = delete; loader_& operator=(const loader_&) = delete; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index eefe72f8..71b9ed93 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -10,6 +10,7 @@ if(APPLE) link_libraries(Magnum::WindowlessCglApplication) elseif(WIN32) link_libraries(Magnum::WindowlessWglApplication) + link_libraries(ntdll) else() link_libraries(Magnum::WindowlessGlxApplication) endif() |