aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2020-04-11 20:03:59 +0200
committerGitHub <noreply@github.com>2020-04-11 20:03:59 +0200
commit40df3931d882daaeee42c8de69882b9f9df5c312 (patch)
treeac8b12c279a164ea619788192494f8ff63da2060
parent5cc06e4748a82acb36310fee89e72f30b2b35a36 (diff)
downloadminetest-40df3931d882daaeee42c8de69882b9f9df5c312.tar.gz
minetest-40df3931d882daaeee42c8de69882b9f9df5c312.tar.bz2
minetest-40df3931d882daaeee42c8de69882b9f9df5c312.zip
Implement DPI scaling for Windows (#9586)
-rw-r--r--misc/minetest.exe.manifest4
-rw-r--r--misc/winresource.rc6
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/client/renderingengine.cpp77
-rw-r--r--src/constants.h5
5 files changed, 69 insertions, 25 deletions
diff --git a/misc/minetest.exe.manifest b/misc/minetest.exe.manifest
index 3c32b0f8b..18f8c85f4 100644
--- a/misc/minetest.exe.manifest
+++ b/misc/minetest.exe.manifest
@@ -8,8 +8,8 @@
</security>
</trustInfo>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
- <windowsSettings>
- <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+ <windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+ <dpiAware>true</dpiAware>
</windowsSettings>
</application>
</assembly>
diff --git a/misc/winresource.rc b/misc/winresource.rc
index e1e82581b..ffb493873 100644
--- a/misc/winresource.rc
+++ b/misc/winresource.rc
@@ -1,6 +1,8 @@
#include <windows.h>
+#include <winuser.h>
#include <commctrl.h>
#include <richedit.h>
+
#ifndef USE_CMAKE_CONFIG_H
#define USE_CMAKE_CONFIG_H
#endif
@@ -13,6 +15,10 @@
#define BUILDMODE "RUN_IN_PLACE=0"
#endif
+#ifdef __MINGW32__
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "minetest.exe.manifest"
+#endif
+
LANGUAGE 0, SUBLANG_NEUTRAL
130 ICON "minetest-icon.ico"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0ebbd628c..0b550c09c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -451,7 +451,7 @@ if(WIN32)
-i${WINRESOURCE_FILE}
-o ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS ${WINRESOURCE_FILE})
+ DEPENDS ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
SET(extra_windows_SRCS ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
else(MINGW) # Probably MSVC
set(extra_windows_SRCS ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
diff --git a/src/client/renderingengine.cpp b/src/client/renderingengine.cpp
index 8b7bbf328..eae6ca7d3 100644
--- a/src/client/renderingengine.cpp
+++ b/src/client/renderingengine.cpp
@@ -45,7 +45,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
+#endif
+#ifdef _WIN32
+#include <windows.h>
+#include <winuser.h>
#endif
#if ENABLE_GLES
@@ -318,6 +322,28 @@ void RenderingEngine::setupTopLevelXorgWindow(const std::string &name)
#endif
}
+#ifdef _WIN32
+static bool getWindowHandle(irr::video::IVideoDriver *driver, HWND &hWnd)
+{
+ const video::SExposedVideoData exposedData = driver->getExposedVideoData();
+
+ switch (driver->getDriverType()) {
+ case video::EDT_DIRECT3D8:
+ hWnd = reinterpret_cast<HWND>(exposedData.D3D8.HWnd);
+ break;
+ case video::EDT_DIRECT3D9:
+ hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd);
+ break;
+ case video::EDT_OPENGL:
+ hWnd = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd);
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+#endif
bool RenderingEngine::setWindowIcon()
{
@@ -335,22 +361,9 @@ bool RenderingEngine::setWindowIcon()
"-xorg-icon-128.png");
#endif
#elif defined(_WIN32)
- const video::SExposedVideoData exposedData = driver->getExposedVideoData();
HWND hWnd; // Window handle
-
- switch (driver->getDriverType()) {
- case video::EDT_DIRECT3D8:
- hWnd = reinterpret_cast<HWND>(exposedData.D3D8.HWnd);
- break;
- case video::EDT_DIRECT3D9:
- hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd);
- break;
- case video::EDT_OPENGL:
- hWnd = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd);
- break;
- default:
+ if (!getWindowHandle(driver, hWnd))
return false;
- }
// Load the ICON from resource file
const HICON hicon = LoadIcon(GetModuleHandle(NULL),
@@ -632,7 +645,7 @@ const char *RenderingEngine::getVideoDriverFriendlyName(irr::video::E_DRIVER_TYP
}
#ifndef __ANDROID__
-#ifdef XORG_USED
+#if defined(XORG_USED)
static float calcDisplayDensity()
{
@@ -667,12 +680,42 @@ float RenderingEngine::getDisplayDensity()
return cached_display_density;
}
-#else // XORG_USED
+#elif defined(_WIN32)
+
+
+static float calcDisplayDensity(irr::video::IVideoDriver *driver)
+{
+ HWND hWnd;
+ if (getWindowHandle(driver, hWnd)) {
+ HDC hdc = GetDC(hWnd);
+ float dpi = GetDeviceCaps(hdc, LOGPIXELSX);
+ ReleaseDC(hWnd, hdc);
+ return dpi / 96.0f;
+ }
+
+ /* return manually specified dpi */
+ return g_settings->getFloat("screen_dpi") / 96.0f;
+}
+
+float RenderingEngine::getDisplayDensity()
+{
+ static bool cached = false;
+ static float display_density;
+ if (!cached) {
+ display_density = calcDisplayDensity(get_video_driver());
+ cached = true;
+ }
+ return display_density;
+}
+
+#else
+
float RenderingEngine::getDisplayDensity()
{
return g_settings->getFloat("screen_dpi") / 96.0;
}
-#endif // XORG_USED
+
+#endif
v2u32 RenderingEngine::getDisplaySize()
{
diff --git a/src/constants.h b/src/constants.h
index 7636b38e0..0a8b22e15 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -110,10 +110,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
GUI related things
*/
-// TODO: implement dpi-based scaling for windows and remove this hack
-#if defined(_WIN32)
-#define TTF_DEFAULT_FONT_SIZE (18)
-#else
#define TTF_DEFAULT_FONT_SIZE (16)
-#endif
#define DEFAULT_FONT_SIZE (10)