From 0f1d33933d264fa84b2d97668258d066da0ca01c Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Tue, 6 Jan 2015 22:40:34 +0100
Subject: [PATCH] Implement X11 dpi autodetection

---
 minetest.conf.example |  2 +-
 src/porting.cpp       | 39 +++++++++++++++++++++++++++++++++++----
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/minetest.conf.example b/minetest.conf.example
index 8570eb052..0b137c5a2 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -224,7 +224,7 @@
 #directional_colored_fog = true
 #    Delay showing tooltips, stated in milliseconds
 #tooltip_show_delay = 400
-#    Adjust dpi configuration to your screen (Desktop only) e.g. for 4k screens
+#    Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens
 #screen_dpi = 72
 #    Default timeout for cURL, stated in milliseconds.
 #    Only has an effect if compiled with cURL.
diff --git a/src/porting.cpp b/src/porting.cpp
index 025e5978c..219e1647d 100644
--- a/src/porting.cpp
+++ b/src/porting.cpp
@@ -570,17 +570,48 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
 }
 
 #ifndef SERVER
-v2u32 getWindowSize() {
+v2u32 getWindowSize()
+{
 	return device->getVideoDriver()->getScreenSize();
 }
 
-#ifndef __ANDROID__
+#ifdef XORG_USED
+float getDisplayDensity()
+{
+	const char* current_display = getenv("DISPLAY");
+
+	if (current_display != NULL) {
+			Display * x11display = XOpenDisplay(current_display);
+
+			if (x11display != NULL) {
+				/* try x direct */
+				float dpi_height =
+						floor(DisplayHeight(x11display, 0) /
+								(DisplayHeightMM(x11display, 0) * 0.039370) + 0.5);
+				float dpi_width =
+						floor(DisplayWidth(x11display, 0) /
+								(DisplayWidthMM(x11display, 0) * 0.039370) +0.5);
+
+				XCloseDisplay(x11display);
+
+				return (std::max(dpi_height,dpi_width) / 96.0);
+			}
+		}
 
-float getDisplayDensity() {
+	/* return manually specified dpi */
 	return g_settings->getFloat("screen_dpi")/96.0;
 }
 
-v2u32 getDisplaySize() {
+#else
+float getDisplayDensity()
+{
+	return g_settings->getFloat("screen_dpi")/96.0;
+}
+#endif
+
+#ifndef __ANDROID__
+v2u32 getDisplaySize()
+{
 	IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL);
 
 	core::dimension2d<u32> deskres = nulldevice->getVideoModeList()->getDesktopResolution();
-- 
GitLab