summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--editor/CMakeLists.txt4
-rw-r--r--loader/impl.hpp3
-rw-r--r--loader/init.cpp44
-rw-r--r--loader/loader-impl.cpp5
-rw-r--r--src/loader.hpp1
-rw-r--r--test/CMakeLists.txt1
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()