summaryrefslogtreecommitdiffhomepage
path: root/loader
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-11-11 12:51:03 +0100
committerStanislaw Halik <sthalik@misaki.pl>2022-11-11 12:51:03 +0100
commit183f7b1dc55c9af6159dae45f5cd33078562b71e (patch)
tree4bf0d0d8905fa2bfccff1262b88c206ec2df7d67 /loader
parent9878f9774d2c1f90a4079c6d13f47ce4ef2a7fd3 (diff)
set windows utf-8 codepage on startup via loader
Diffstat (limited to 'loader')
-rw-r--r--loader/impl.hpp3
-rw-r--r--loader/init.cpp44
-rw-r--r--loader/loader-impl.cpp5
3 files changed, 49 insertions, 3 deletions
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