| @@ -16,19 +16,106 @@ | |||||
| #include "DistrhoUIPrivateData.hpp" | #include "DistrhoUIPrivateData.hpp" | ||||
| #include "src/WindowPrivateData.hpp" | #include "src/WindowPrivateData.hpp" | ||||
| #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| # if defined(DISTRHO_OS_HAIKU) | |||||
| # elif defined(DISTRHO_OS_MAC) | |||||
| # define Point CocoaPoint | |||||
| # define Size CocoaSize | |||||
| # import <Cocoa/Cocoa.h> | |||||
| # undef Point | |||||
| # undef Size | |||||
| # elif defined(DISTRHO_OS_WINDOWS) | |||||
| # define WIN32_LEAN_AND_MEAN | |||||
| # include <windows.h> | |||||
| # else | |||||
| # include <X11/Xresource.h> | |||||
| # endif | |||||
| #else | |||||
| # include "src/TopLevelWidgetPrivateData.hpp" | # include "src/TopLevelWidgetPrivateData.hpp" | ||||
| #endif | #endif | ||||
| START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static data, see DistrhoUIInternal.hpp */ | * Static data, see DistrhoUIInternal.hpp */ | ||||
| #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||||
| uintptr_t g_nextWindowId = 0; | uintptr_t g_nextWindowId = 0; | ||||
| double g_nextScaleFactor = 1.0; | double g_nextScaleFactor = 1.0; | ||||
| const char* g_nextBundlePath = nullptr; | const char* g_nextBundlePath = nullptr; | ||||
| /* ------------------------------------------------------------------------------------------------------------ | |||||
| * get global scale factor */ | |||||
| static double getDesktopScaleFactor() | |||||
| { | |||||
| // allow custom scale for testing | |||||
| if (const char* const scale = getenv("DPF_SCALE_FACTOR")) | |||||
| return std::max(1.0, std::atof(scale)); | |||||
| #if defined(DISTRHO_OS_MAC) | |||||
| return [NSScreen mainScreen].backingScaleFactor; | |||||
| #elif defined(DISTRHO_OS_WINDOWS) | |||||
| if (const HMODULE Shcore = LoadLibraryA("Shcore.dll")) | |||||
| { | |||||
| typedef HRESULT(WINAPI* PFN_GetProcessDpiAwareness)(HANDLE, DWORD*); | |||||
| typedef HRESULT(WINAPI* PFN_GetScaleFactorForMonitor)(HMONITOR, DWORD*); | |||||
| const PFN_GetProcessDpiAwareness GetProcessDpiAwareness | |||||
| = (PFN_GetProcessDpiAwareness)GetProcAddress(Shcore, "GetProcessDpiAwareness"); | |||||
| const PFN_GetScaleFactorForMonitor GetScaleFactorForMonitor | |||||
| = (PFN_GetScaleFactorForMonitor)GetProcAddress(Shcore, "GetScaleFactorForMonitor"); | |||||
| DWORD dpiAware = 0; | |||||
| if (GetProcessDpiAwareness && GetScaleFactorForMonitor | |||||
| && GetProcessDpiAwareness(NULL, &dpiAware) == 0 && dpiAware != 0) | |||||
| { | |||||
| // TODO replace with something else | |||||
| const HMONITOR hMon = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); | |||||
| DWORD scaleFactor = 0; | |||||
| if (GetScaleFactorForMonitor(hMon, &scaleFactor) == 0 && scaleFactor != 0) | |||||
| { | |||||
| FreeLibrary(Shcore); | |||||
| return static_cast<double>(scaleFactor) / 100.0; | |||||
| } | |||||
| } | |||||
| FreeLibrary(Shcore); | |||||
| } | |||||
| #elif defined(HAVE_X11) | |||||
| ::Display* const display = XOpenDisplay(nullptr); | |||||
| DISTRHO_SAFE_ASSERT_RETURN(display != nullptr, 1.0); | |||||
| XrmInitialize(); | |||||
| if (char* const rms = XResourceManagerString(view->world->impl->display)) | |||||
| { | |||||
| if (const XrmDatabase sdb = XrmGetStringDatabase(rms)) | |||||
| { | |||||
| char* type = nullptr; | |||||
| XrmValue ret; | |||||
| if (XrmGetResource(sdb, "Xft.dpi", "String", &type, &ret) | |||||
| && ret.addr != nullptr | |||||
| && type != nullptr | |||||
| && std::strncmp("String", type, 6) == 0) | |||||
| { | |||||
| if (const double dpi = std::atof(ret.addr)) | |||||
| { | |||||
| XCloseDisplay(display); | |||||
| return dpi / 96; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| XCloseDisplay(display); | |||||
| #endif | |||||
| return 1.0; | |||||
| } | |||||
| #endif | #endif | ||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| @@ -50,7 +137,7 @@ UI::PrivateData::createNextWindow(UI* const ui, const uint width, const uint hei | |||||
| ewData.parentWindowHandle = pData->winId; | ewData.parentWindowHandle = pData->winId; | ||||
| ewData.width = width; | ewData.width = width; | ||||
| ewData.height = height; | ewData.height = height; | ||||
| ewData.scaleFactor = pData->scaleFactor; | |||||
| ewData.scaleFactor = pData->scaleFactor != 0.0 ? pData->scaleFactor : getDesktopScaleFactor(); | |||||
| ewData.title = DISTRHO_PLUGIN_NAME; | ewData.title = DISTRHO_PLUGIN_NAME; | ||||
| ewData.isStandalone = DISTRHO_UI_IS_STANDALONE; | ewData.isStandalone = DISTRHO_UI_IS_STANDALONE; | ||||
| return ewData; | return ewData; | ||||