22#ifdef DISTRHO_PROPER_CPP11_SUPPORT
28#if DISTRHO_UI_FILE_BROWSER && !defined(DISTRHO_OS_MAC)
29# define DISTRHO_PUGL_NAMESPACE_MACRO_HELPER(NS, SEP, FUNCTION) NS ## SEP ## FUNCTION
30# define DISTRHO_PUGL_NAMESPACE_MACRO(NS, FUNCTION) DISTRHO_PUGL_NAMESPACE_MACRO_HELPER(NS, _, FUNCTION)
31# define x_fib_add_recent DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_add_recent)
32# define x_fib_cfg_buttons DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_cfg_buttons)
33# define x_fib_cfg_filter_callback DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_cfg_filter_callback)
34# define x_fib_close DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_close)
35# define x_fib_configure DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_configure)
36# define x_fib_filename DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_filename)
37# define x_fib_free_recent DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_free_recent)
38# define x_fib_handle_events DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_handle_events)
39# define x_fib_load_recent DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_load_recent)
40# define x_fib_recent_at DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_recent_at)
41# define x_fib_recent_count DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_recent_count)
42# define x_fib_recent_file DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_recent_file)
43# define x_fib_save_recent DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_save_recent)
44# define x_fib_show DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_show)
45# define x_fib_status DISTRHO_PUGL_NAMESPACE_MACRO(plugin, x_fib_status)
46# define DISTRHO_FILE_BROWSER_DIALOG_HPP_INCLUDED
47# define FILE_BROWSER_DIALOG_NAMESPACE DISTRHO_NAMESPACE
48# define FILE_BROWSER_DIALOG_DISTRHO_NAMESPACE
50# include "../extra/FileBrowserDialogImpl.hpp"
52# include "../extra/FileBrowserDialogImpl.cpp"
55#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
56# if defined(DISTRHO_OS_WINDOWS)
59# elif defined(HAVE_X11)
60# include <X11/Xresource.h>
63# include "src/TopLevelWidgetPrivateData.hpp"
64# include "src/WindowPrivateData.hpp"
67#include "DistrhoUIPrivateData.hpp"
75#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
76uintptr_t g_nextWindowId = 0;
77double g_nextScaleFactor = 1.0;
80#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
85double getDesktopScaleFactor(uintptr_t parentWindowHandle);
87static double getDesktopScaleFactor(
const uintptr_t parentWindowHandle)
90 if (
const char*
const scale =
getenv(
"DPF_SCALE_FACTOR"))
91 return std::max(1.0, std::atof(scale));
93#if defined(DISTRHO_OS_WINDOWS)
94 if (
const HMODULE Shcore = LoadLibraryA(
"Shcore.dll"))
99# if defined(__GNUC__) && (__GNUC__ >= 9)
100# pragma GCC diagnostic push
101# pragma GCC diagnostic ignored "-Wcast-function-type"
107# if defined(__GNUC__) && (__GNUC__ >= 9)
108# pragma GCC diagnostic pop
112 DWORD scaleFactor = 100;
113 if (GetProcessDpiAwareness && GetScaleFactorForMonitor
114 && GetProcessDpiAwareness(
nullptr, &dpiAware) == 0 && dpiAware != 0)
116 const HMONITOR hMon = parentWindowHandle != 0
117 ? MonitorFromWindow((
HWND)parentWindowHandle, MONITOR_DEFAULTTOPRIMARY)
118 : MonitorFromPoint(
POINT{0,0}, MONITOR_DEFAULTTOPRIMARY);
119 GetScaleFactorForMonitor(hMon, &scaleFactor);
123 return static_cast<double>(scaleFactor) / 100.0;
125#elif defined(HAVE_X11)
126 ::Display*
const display = XOpenDisplay(
nullptr);
132 if (
char*
const rms = XResourceManagerString(display))
134 if (
const XrmDatabase db = XrmGetStringDatabase(rms))
136 char*
type =
nullptr;
139 if (XrmGetResource(db,
"Xft.dpi",
"Xft.Dpi", &
type, &
value)
141 && std::strcmp(
type,
"String") == 0
142 &&
value.addr !=
nullptr)
145 const double xftDpi = std::strtod(
value.addr, &end);
146 if (xftDpi > 0.0 && xftDpi < HUGE_VAL)
150 XrmDestroyDatabase(db);
154 XCloseDisplay(display);
161 (
void)parentWindowHandle;
170UI::PrivateData* UI::PrivateData::s_nextPrivateData =
nullptr;
172#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
173ExternalWindow::PrivateData
179 UI::PrivateData*
const pData = s_nextPrivateData;
180#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
182 ExternalWindow::PrivateData ewData;
183 ewData.parentWindowHandle = pData->winId;
184 ewData.width =
width;
186 ewData.scaleFactor = pData->scaleFactor != 0.0 ? pData->scaleFactor : getDesktopScaleFactor(pData->winId);
188 ewData.isStandalone = DISTRHO_UI_IS_STANDALONE;
194 if (pData->callbacksPtr ==
nullptr)
195 pData->window->setIgnoreIdleCallbacks();
197 return pData->window.getObject();
204UI::UI(
const uint width,
const uint height,
const bool automaticallyScaleAndSetAsMinimumSize)
205 : UIWidget(UI::PrivateData::createNextWindow(this,
width,
height)),
206 uiData(UI::PrivateData::s_nextPrivateData)
208#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
213 if (automaticallyScaleAndSetAsMinimumSize)
214 setGeometryConstraints(
width,
height,
true,
true,
true);
218 (
void)automaticallyScaleAndSetAsMinimumSize;
231#if DISTRHO_UI_USER_RESIZABLE
232# if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
235 return uiData->window->isResizable();
244 return uiData->bgColor;
249 return uiData->fgColor;
254 return uiData->sampleRate;
259 return uiData->bundlePath;
262void UI::editParameter(
uint32_t index,
bool started)
264 uiData->editParamCallback(index + uiData->parameterOffset, started);
269 uiData->setParamCallback(index + uiData->parameterOffset,
value);
272#if DISTRHO_PLUGIN_WANT_STATE
273void UI::setState(
const char*
key,
const char*
value)
275 uiData->setStateCallback(
key,
value);
279#if DISTRHO_PLUGIN_WANT_STATE
280bool UI::requestStateFile(
const char*
key)
282 return uiData->fileRequestCallback(
key);
286#if DISTRHO_PLUGIN_WANT_MIDI_INPUT
289 uiData->sendNoteCallback(channel, note, velocity);
293#if DISTRHO_UI_FILE_BROWSER
294bool UI::openFileBrowser(
const FileBrowserOptions& options)
296 return getWindow().openFileBrowser((DGL_NAMESPACE::FileBrowserOptions&)options);
300#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
306 return uiData->dspPtr;
310#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
314const char* UI::getNextBundlePath()
noexcept
319double UI::getNextScaleFactor()
noexcept
321 return g_nextScaleFactor;
324# if DISTRHO_PLUGIN_HAS_EMBED_UI
325uintptr_t UI::getNextWindowId()
noexcept
327 return g_nextWindowId;
335void UI::sampleRateChanged(
double)
342void UI::uiScaleFactorChanged(
double)
346#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
347std::vector<DGL_NAMESPACE::ClipboardDataOffer> UI::getClipboardDataOfferTypes()
349 return uiData->window->getClipboardDataOfferTypes();
354 std::vector<DGL_NAMESPACE::ClipboardDataOffer> offers(uiData->window->getClipboardDataOfferTypes());
356 for (std::vector<DGL_NAMESPACE::ClipboardDataOffer>::iterator it=offers.begin(), end=offers.end(); it != end;++it)
358 const DGL_NAMESPACE::ClipboardDataOffer offer = *it;
359 if (std::strcmp(offer.type,
"text/plain") == 0)
366void UI::uiFocus(
bool, DGL_NAMESPACE::CrossingMode)
373 pData->fallbackOnResize();
377#if DISTRHO_UI_FILE_BROWSER
378void UI::uiFileBrowserSelected(
const char*)
386#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
394void UI::onResize(
const ResizeEvent& ev)
396 UIWidget::onResize(ev);
398#ifndef DISTRHO_PLUGIN_TARGET_VST3
399 if (uiData->initializing)
411# ifdef DISTRHO_PLUGIN_TARGET_VST3
412 if (uiData->initializing)
unsigned int uint
Definition CarlaDefines.h:327
class MasterUI * ui
Definition Connection.cpp:39
#define noexcept
Definition DistrhoDefines.h:72
#define END_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:191
#define DISTRHO_SAFE_ASSERT_RETURN(cond, ret)
Definition DistrhoDefines.h:112
#define START_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:190
START_NAMESPACE_DISTRHO const char * g_nextBundlePath
Definition DistrhoUI.cpp:74
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition ui_launcher.cpp:41
#define DISTRHO_PLUGIN_NAME
Definition DistrhoPluginInfo.h:21
static PuglViewHint int value
Definition pugl.h:1708
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
Definition swell-types.h:218
signed int HRESULT
Definition swell-types.h:181
void * HMONITOR
Definition swell-types.h:1443
unsigned int DWORD
Definition swell-types.h:164
#define WINAPI
Definition swell-types.h:631
void * HANDLE
Definition swell-types.h:212
struct HWND__ * HWND
Definition swell-types.h:210
BOOL FreeLibrary(HINSTANCE hInst)
Definition swell.cpp:924
void * GetProcAddress(HINSTANCE hInst, const char *procName)
Definition swell.cpp:902
ZCONST char * key
Definition crypt.c:587
#define void
Definition unzip.h:396
HRESULT(WINAPI * PFN_GetScaleFactorForMonitor)(HMONITOR, DWORD *)
Definition win.c:40
HRESULT(WINAPI * PFN_GetProcessDpiAwareness)(HANDLE, DWORD *)
Definition win.c:39
#define const
Definition zconf.h:137