DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit a61cb185b6dccc76e50f6402d3105ba19e2a6ce4
parent 6bbe8e8a751d8a80dac7b2b30bbd23b9de97fe20
Author: falkTX <falktx@falktx.com>
Date:   Fri,  3 Sep 2021 21:52:30 +0100

Correct external ui scale factor code

Diffstat:
MMakefile.plugins.mk | 2--
Mdistrho/DistrhoUI_macOS.mm | 23+++++++++++++++++++++++
Mdistrho/src/DistrhoUI.cpp | 32++++++++++++++++----------------
3 files changed, 39 insertions(+), 18 deletions(-)

diff --git a/Makefile.plugins.mk b/Makefile.plugins.mk @@ -89,11 +89,9 @@ endif OBJS_DSP = $(FILES_DSP:%=$(BUILD_DIR)/%.o) OBJS_UI = $(FILES_UI:%=$(BUILD_DIR)/%.o) -ifneq ($(UI_TYPE),external) ifeq ($(MACOS),true) OBJS_UI += $(BUILD_DIR)/DistrhoUI_macOS_$(NAME).mm.o endif -endif # --------------------------------------------------------------------------------------------------------------------- # Set plugin binary file targets diff --git a/distrho/DistrhoUI_macOS.mm b/distrho/DistrhoUI_macOS.mm @@ -19,6 +19,28 @@ #endif #include "src/DistrhoPluginChecks.h" +#include "src/DistrhoDefines.h" + +#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#import <Cocoa/Cocoa.h> +#include <algorithm> +#include <cmath> + +START_NAMESPACE_DISTRHO +double getDesktopScaleFactor(const uintptr_t parentWindowHandle) +{ + // allow custom scale for testing + if (const char* const scale = getenv("DPF_SCALE_FACTOR")) + return std::max(1.0, std::atof(scale)); + + if (NSView* const parentView = (NSView*)parentWindowHandle) + if (NSWindow* const parentWindow = [parentView window]) + return [parentWindow screen].backingScaleFactor; + + return [NSScreen mainScreen].backingScaleFactor; +} +END_NAMESPACE_DISTRHO +#else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI #include "../dgl/Base.hpp" #define DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(DGL_NS, SEP, PUGL_NS, INTERFACE) DGL_NS ## SEP ## PUGL_NS ## SEP ## INTERFACE @@ -33,3 +55,4 @@ #define PuglWrapperView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PUGL_NAMESPACE, WrapperView) #import "src/pugl.mm" +#endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp @@ -17,17 +17,10 @@ #include "DistrhoUIPrivateData.hpp" #include "src/WindowPrivateData.hpp" #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) +# if defined(DISTRHO_OS_WINDOWS) # define WIN32_LEAN_AND_MEAN # include <windows.h> -# else +# elif defined(HAVE_X11) # include <X11/Xresource.h> # endif #else @@ -47,15 +40,16 @@ const char* g_nextBundlePath = nullptr; /* ------------------------------------------------------------------------------------------------------------ * get global scale factor */ -static double getDesktopScaleFactor() +#ifdef DISTRHO_OS_MAC +double getDesktopScaleFactor(uintptr_t parentWindowHandle); +#else +static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) { // 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 defined(DISTRHO_OS_WINDOWS) if (const HMODULE Shcore = LoadLibraryA("Shcore.dll")) { typedef HRESULT(WINAPI* PFN_GetProcessDpiAwareness)(HANDLE, DWORD*); @@ -70,8 +64,10 @@ static double getDesktopScaleFactor() if (GetProcessDpiAwareness && GetScaleFactorForMonitor && GetProcessDpiAwareness(NULL, &dpiAware) == 0 && dpiAware != 0) { - // TODO replace with something else - const HMONITOR hMon = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); + const HMONITOR hMon = parentWindowHandle != 0 + ? MonitorFromWindow((HWND)parentWindowHandle, MONITOR_DEFAULTTOPRIMARY) + /* TODO replace with something else for parent-less */ + : MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); DWORD scaleFactor = 0; if (GetScaleFactorForMonitor(hMon, &scaleFactor) == 0 && scaleFactor != 0) @@ -114,7 +110,11 @@ static double getDesktopScaleFactor() #endif return 1.0; + + // might be unused + (void)parentWindowHandle; } +#endif // !DISTRHO_OS_MAC #endif @@ -137,7 +137,7 @@ UI::PrivateData::createNextWindow(UI* const ui, const uint width, const uint hei ewData.parentWindowHandle = pData->winId; ewData.width = width; ewData.height = height; - ewData.scaleFactor = pData->scaleFactor != 0.0 ? pData->scaleFactor : getDesktopScaleFactor(); + ewData.scaleFactor = pData->scaleFactor != 0.0 ? pData->scaleFactor : getDesktopScaleFactor(pData->winId); ewData.title = DISTRHO_PLUGIN_NAME; ewData.isStandalone = DISTRHO_UI_IS_STANDALONE; return ewData;