Game window respects Windows theme setting
This commit is contained in:
parent
3534067801
commit
8164e5ae6f
@ -10,6 +10,11 @@
|
||||
#include "SDL2/SDL.h"
|
||||
#include "StarPlatformServices_pc.hpp"
|
||||
|
||||
#ifdef STAR_SYSTEM_WINDOWS
|
||||
#include "SDL2/SDL_syswm.h"
|
||||
#include <dwmapi.h>
|
||||
#endif
|
||||
|
||||
namespace Star {
|
||||
|
||||
Maybe<Key> keyFromSdlKeyCode(SDL_Keycode sym) {
|
||||
@ -268,11 +273,30 @@ public:
|
||||
m_sdlWindow = SDL_CreateWindow(m_windowTitle.utf8Ptr(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||
m_windowSize[0], m_windowSize[1], SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
|
||||
if (!m_sdlWindow)
|
||||
throw ApplicationException::format("Application: Could not create SDL window: {}", SDL_GetError());
|
||||
throw ApplicationException::format("Application: Could not create SDL Window: {}", SDL_GetError());
|
||||
|
||||
SDL_ShowWindow(m_sdlWindow);
|
||||
SDL_RaiseWindow(m_sdlWindow);
|
||||
|
||||
// Makes the window border black. From https://github.com/libsdl-org/SDL/commit/89948787#diff-f2ae5c36a8afc0a9a343a6664ab306da2963213e180af8cd97b12397dcbb9ae7R1478
|
||||
#ifdef STAR_SYSTEM_WINDOWS
|
||||
if (void* handle = SDL_LoadObject("dwmapi.dll")) {
|
||||
if (auto DwmSetWindowAttributeFunc = (decltype(&DwmSetWindowAttribute))SDL_LoadFunction(handle, "DwmSetWindowAttribute")) {
|
||||
SDL_SysWMinfo wmInfo{};
|
||||
SDL_VERSION(&wmInfo.version);
|
||||
SDL_GetWindowWMInfo(m_sdlWindow, &wmInfo);
|
||||
DWORD type{}, value{}, count = sizeof(value);
|
||||
LSTATUS status = RegGetValue(HKEY_CURRENT_USER,
|
||||
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"),
|
||||
TEXT("AppsUseLightTheme"),
|
||||
RRF_RT_REG_DWORD, &type, &value, &count);
|
||||
BOOL enabled = status == ERROR_SUCCESS && type == REG_DWORD && value == 0;
|
||||
DwmSetWindowAttributeFunc(wmInfo.info.win.window, DWMWA_USE_IMMERSIVE_DARK_MODE, &enabled, sizeof(enabled));
|
||||
}
|
||||
SDL_UnloadObject(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
int width;
|
||||
int height;
|
||||
SDL_GetWindowSize(m_sdlWindow, &width, &height);
|
||||
|
@ -88,15 +88,15 @@ inline Vec2F WorldCamera::centerWorldPosition() const {
|
||||
inline Vec2F WorldCamera::worldToScreen(Vec2F const& worldCoord) const {
|
||||
Vec2F wrappedCoord = m_worldGeometry.nearestTo(Vec2F(m_worldCenter), worldCoord);
|
||||
return Vec2F(
|
||||
(wrappedCoord[0] - m_worldCenter[0]) * (TilePixels * m_pixelRatio) + m_screenSize[0] / 2.0,
|
||||
(wrappedCoord[1] - m_worldCenter[1]) * (TilePixels * m_pixelRatio) + m_screenSize[1] / 2.0
|
||||
(wrappedCoord[0] - m_worldCenter[0]) * (TilePixels * m_pixelRatio) + (float)m_screenSize[0] / 2.0,
|
||||
(wrappedCoord[1] - m_worldCenter[1]) * (TilePixels * m_pixelRatio) + (float)m_screenSize[1] / 2.0
|
||||
);
|
||||
}
|
||||
|
||||
inline Vec2F WorldCamera::screenToWorld(Vec2F const& screen) const {
|
||||
return Vec2F(
|
||||
(screen[0] - m_screenSize[0] / 2.0) / (TilePixels * m_pixelRatio) + m_worldCenter[0],
|
||||
(screen[1] - m_screenSize[1] / 2.0) / (TilePixels * m_pixelRatio) + m_worldCenter[1]
|
||||
(screen[0] - (float)m_screenSize[0] / 2.0) / (TilePixels * m_pixelRatio) + m_worldCenter[0],
|
||||
(screen[1] - (float)m_screenSize[1] / 2.0) / (TilePixels * m_pixelRatio) + m_worldCenter[1]
|
||||
);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user