From 0f1d33933d264fa84b2d97668258d066da0ca01c Mon Sep 17 00:00:00 2001 From: sapier 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 8570eb05..0b137c5a 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 025e5978..219e1647 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"); -float getDisplayDensity() { + 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); + } + } + + /* 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 deskres = nulldevice->getVideoModeList()->getDesktopResolution();