diff --git a/dgl/Makefile b/dgl/Makefile index fe372d1b..45f75f5b 100644 --- a/dgl/Makefile +++ b/dgl/Makefile @@ -9,7 +9,7 @@ include ../Makefile.base.mk # --------------------------------------------------------------------------------------------------------------------- BUILD_C_FLAGS += $(DGL_FLAGS) -I. -Isrc -BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc -Isrc/pugl-upstream -DDONT_SET_USING_DGL_NAMESPACE -Wno-unused-parameter +BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc -Isrc/pugl-upstream/include -DDONT_SET_USING_DGL_NAMESPACE -Wno-unused-parameter LINK_FLAGS += $(DGL_LIBS) # TODO fix these after pugl-upstream is done diff --git a/dgl/Window.hpp b/dgl/Window.hpp index 6de780f5..7f4e16e8 100644 --- a/dgl/Window.hpp +++ b/dgl/Window.hpp @@ -21,6 +21,7 @@ #ifdef DISTRHO_DEFINES_H_INCLUDED START_NAMESPACE_DISTRHO +class UI; class UIExporter; END_NAMESPACE_DISTRHO #endif @@ -145,6 +146,7 @@ private: friend class Widget; friend class StandaloneWindow; #ifdef DISTRHO_DEFINES_H_INCLUDED + friend class DISTRHO_NAMESPACE::UI; friend class DISTRHO_NAMESPACE::UIExporter; #endif diff --git a/dgl/src/ApplicationPrivateData.hpp b/dgl/src/ApplicationPrivateData.hpp index 05b23c0c..477f5bb6 100644 --- a/dgl/src/ApplicationPrivateData.hpp +++ b/dgl/src/ApplicationPrivateData.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2020 Filipe Coelho + * Copyright (C) 2012-2021 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -20,7 +20,7 @@ #include "../Application.hpp" #include "../Window.hpp" -#include "pugl-upstream/pugl/pugl.h" +#include "pugl-upstream/include/pugl/pugl.h" #include diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp index cc506757..7b2d6d6c 100644 --- a/dgl/src/WindowPrivateData.cpp +++ b/dgl/src/WindowPrivateData.cpp @@ -26,25 +26,25 @@ #endif extern "C" { -#include "pugl-upstream/pugl/detail/implementation.c" +#include "pugl-upstream/src/implementation.c" } #if defined(DISTRHO_OS_HAIKU) # define DGL_DEBUG_EVENTS -# include "pugl-upstream/pugl/detail/haiku.cpp" +# include "pugl-upstream/src/haiku.cpp" #elif defined(DISTRHO_OS_MAC) # define PuglWindow DISTRHO_JOIN_MACRO(PuglWindow, DGL_NAMESPACE) # define PuglOpenGLView DISTRHO_JOIN_MACRO(PuglOpenGLView, DGL_NAMESPACE) -# include "pugl-upstream/pugl/detail/mac.m" +# include "pugl-upstream/src/mac.m" #elif defined(DISTRHO_OS_WINDOWS) -# include "ppugl-upstream/pugl/detail/win.c" +# include "ppugl-upstream/src/win.c" # undef max # undef min #else # include # include extern "C" { -# include "pugl-upstream/pugl/detail/x11.c" +# include "pugl-upstream/src/x11.c" } #endif @@ -75,6 +75,10 @@ void DGL::Window::PrivateData::Fallback::onReshape(const uint width, const uint glViewport(0, 0, static_cast(width), static_cast(height)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); +#else + // unused + (void)width; + (void)height; #endif } diff --git a/dgl/src/WindowPrivateData.hpp b/dgl/src/WindowPrivateData.hpp index f2dc1899..c917ffe2 100644 --- a/dgl/src/WindowPrivateData.hpp +++ b/dgl/src/WindowPrivateData.hpp @@ -20,7 +20,7 @@ #include "../Window.hpp" #include "ApplicationPrivateData.hpp" -#include "pugl-upstream/pugl/pugl.h" +#include "pugl-upstream/include/pugl/pugl.h" #include @@ -77,6 +77,10 @@ struct Window::PrivateData { { } +#ifdef DISTRHO_DEFINES_H_INCLUDED + friend class DISTRHO_NAMESPACE::UI; +#endif + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) }; diff --git a/distrho/src/DistrhoPluginChecks.h b/distrho/src/DistrhoPluginChecks.h index 69033dee..7bc5dd67 100644 --- a/distrho/src/DistrhoPluginChecks.h +++ b/distrho/src/DistrhoPluginChecks.h @@ -161,6 +161,14 @@ # define DISTRHO_PLUGIN_HAS_UI 0 #endif +// ----------------------------------------------------------------------- +// Prevent users from messing about with DPF internals + +#ifdef DISTRHO_UI_IS_STANDALONE +# error DISTRHO_UI_IS_STANDALONE must not be defined +#endif + + // ----------------------------------------------------------------------- #endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp index a99892d9..59393472 100644 --- a/distrho/src/DistrhoPluginJack.cpp +++ b/distrho/src/DistrhoPluginJack.cpp @@ -17,6 +17,7 @@ #include "DistrhoPluginInternal.hpp" #if DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_UI_IS_STANDALONE true # include "DistrhoUIInternal.hpp" #else # include "../extra/Sleep.hpp" diff --git a/distrho/src/DistrhoUI.cpp b/distrho/src/DistrhoUI.cpp index bda5eb4c..7bb52475 100644 --- a/distrho/src/DistrhoUI.cpp +++ b/distrho/src/DistrhoUI.cpp @@ -14,7 +14,8 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "DistrhoUIInternal.hpp" +#include "DistrhoUIPrivateData.hpp" +#include "src/WindowPrivateData.hpp" #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI # include "src/WidgetPrivateData.hpp" #endif @@ -22,7 +23,7 @@ START_NAMESPACE_DISTRHO /* ------------------------------------------------------------------------------------------------------------ - * Static data, see DistrhoUIInternal.hpp */ + * Static data, see DistrhoUIInternal.hpp and DistrhoUIPrivateData.hpp */ double d_lastUiSampleRate = 0.0; void* d_lastUiDspPtr = nullptr; @@ -34,6 +35,36 @@ uintptr_t g_nextWindowId = 0; Window* d_lastUiWindow = nullptr; #endif +// ----------------------------------------------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI +static inline +UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const double scaleFactor, const char* const bundlePath) +{ + d_lastUiDspPtr = dspPtr; + g_nextWindowId = winId; + g_nextScaleFactor = scaleFactor; + g_nextBundlePath = bundlePath; + UI* const ret = createUI(); + d_lastUiDspPtr = nullptr; + g_nextWindowId = 0; + g_nextScaleFactor = 1.0; + g_nextBundlePath = nullptr; + return ret; +} +#else +static inline +UI* createUiWrapper(void* const dspPtr, Window* const window) +{ + d_lastUiDspPtr = dspPtr; + d_lastUiWindow = window; + UI* const ret = createUI(); + d_lastUiDspPtr = nullptr; + d_lastUiWindow = nullptr; + return ret; +} +#endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI + /* ------------------------------------------------------------------------------------------------------------ * UI */ @@ -157,7 +188,7 @@ uintptr_t UI::getNextWindowId() noexcept return g_nextWindowId; } # endif -#endif +#endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI /* ------------------------------------------------------------------------------------------------------------ * DSP/Plugin Callbacks (optional) */ @@ -176,20 +207,7 @@ void UI::uiFileBrowserSelected(const char*) void UI::uiReshape(uint width, uint height) { -#ifdef DGL_OPENGL - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0.0, static_cast(width), static_cast(height), 0.0, 0.0, 1.0); - glViewport(0, 0, static_cast(width), static_cast(height)); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -#else - // unused - (void)width; - (void)height; -#endif + Window::PrivateData::Fallback::onReshape(width, height); } /* ------------------------------------------------------------------------------------------------------------ diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp index 80fc4257..25c066bd 100644 --- a/distrho/src/DistrhoUIInternal.hpp +++ b/distrho/src/DistrhoUIInternal.hpp @@ -17,7 +17,7 @@ #ifndef DISTRHO_UI_INTERNAL_HPP_INCLUDED #define DISTRHO_UI_INTERNAL_HPP_INCLUDED -#include "../DistrhoUI.hpp" +#include "DistrhoUIPrivateData.hpp" #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI # include "../extra/Sleep.hpp" @@ -46,153 +46,17 @@ extern Window* d_lastUiWindow; #endif // ----------------------------------------------------------------------- -// UI callbacks -typedef void (*editParamFunc) (void* ptr, uint32_t rindex, bool started); -typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); -typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); -typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); -typedef void (*setSizeFunc) (void* ptr, uint width, uint height); -typedef bool (*fileRequestFunc) (void* ptr, const char* key); - -// ----------------------------------------------------------------------- -// UI private data - -struct UI::PrivateData { - // DSP - double sampleRate; - uint32_t parameterOffset; -#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS - void* dspPtr; -#endif - - // UI - bool automaticallyScale; - bool resizeInProgress; - uint minWidth; - uint minHeight; - uint bgColor; - uint fgColor; - - // Callbacks - void* callbacksPtr; - editParamFunc editParamCallbackFunc; - setParamFunc setParamCallbackFunc; - setStateFunc setStateCallbackFunc; - sendNoteFunc sendNoteCallbackFunc; - setSizeFunc setSizeCallbackFunc; - fileRequestFunc fileRequestCallbackFunc; - - PrivateData() noexcept - : sampleRate(d_lastUiSampleRate), - parameterOffset(0), -#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS - dspPtr(d_lastUiDspPtr), -#endif - automaticallyScale(false), - resizeInProgress(false), - minWidth(0), - minHeight(0), - bgColor(0), - fgColor(0), - callbacksPtr(nullptr), - editParamCallbackFunc(nullptr), - setParamCallbackFunc(nullptr), - setStateCallbackFunc(nullptr), - sendNoteCallbackFunc(nullptr), - setSizeCallbackFunc(nullptr), - fileRequestCallbackFunc(nullptr) - { - DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); - -#if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) - parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; -# if DISTRHO_PLUGIN_WANT_LATENCY - parameterOffset += 1; -# endif -#endif - -#ifdef DISTRHO_PLUGIN_TARGET_LV2 -# if (DISTRHO_PLUGIN_IS_SYNTH || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) - parameterOffset += 1; -# if DISTRHO_PLUGIN_WANT_STATE - parameterOffset += 1; -# endif -# endif +#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI +UI* createUiWrapper(void* dspPtr, uintptr_t winId, double scaleFactor, const char* bundlePath); +#else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI +UI* createUiWrapper(void* dspPtr, Window* window); #endif - } - - void editParamCallback(const uint32_t rindex, const bool started) - { - if (editParamCallbackFunc != nullptr) - editParamCallbackFunc(callbacksPtr, rindex, started); - } - - void setParamCallback(const uint32_t rindex, const float value) - { - if (setParamCallbackFunc != nullptr) - setParamCallbackFunc(callbacksPtr, rindex, value); - } - - void setStateCallback(const char* const key, const char* const value) - { - if (setStateCallbackFunc != nullptr) - setStateCallbackFunc(callbacksPtr, key, value); - } - - void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) - { - if (sendNoteCallbackFunc != nullptr) - sendNoteCallbackFunc(callbacksPtr, channel, note, velocity); - } - - void setSizeCallback(const uint width, const uint height) - { - if (setSizeCallbackFunc != nullptr) - setSizeCallbackFunc(callbacksPtr, width, height); - } - - bool fileRequestCallback(const char* key) - { - if (fileRequestCallbackFunc != nullptr) - return fileRequestCallbackFunc(callbacksPtr, key); - - // TODO use old style DPF dialog here - - return false; - } -}; // ----------------------------------------------------------------------- // Plugin Window, needed to take care of resize properly -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -static inline -UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const double scaleFactor, const char* const bundlePath) -{ - d_lastUiDspPtr = dspPtr; - g_nextWindowId = winId; - g_nextScaleFactor = scaleFactor; - g_nextBundlePath = bundlePath; - UI* const ret = createUI(); - d_lastUiDspPtr = nullptr; - g_nextWindowId = 0; - g_nextScaleFactor = 1.0; - g_nextBundlePath = nullptr; - return ret; -} -#else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI -static inline -UI* createUiWrapper(void* const dspPtr, Window* const window) -{ - d_lastUiDspPtr = dspPtr; - d_lastUiWindow = window; - UI* const ret = createUI(); - d_lastUiDspPtr = nullptr; - d_lastUiWindow = nullptr; - return ret; -} - +#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI class UIExporterWindow : public Window { public: @@ -284,7 +148,7 @@ public: #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI : fUI(createUiWrapper(dspPtr, winId, scaleFactor, bundlePath)), #else - : glApp(), + : glApp(DISTRHO_UI_IS_STANDALONE), glWindow(glApp, winId, scaleFactor, dspPtr), fChangingSize(false), fUI(glWindow.getUI()), diff --git a/distrho/src/DistrhoUIPrivateData.hpp b/distrho/src/DistrhoUIPrivateData.hpp new file mode 100644 index 00000000..be90aef2 --- /dev/null +++ b/distrho/src/DistrhoUIPrivateData.hpp @@ -0,0 +1,152 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2020 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED +#define DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED + +#include "../DistrhoUI.hpp" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// Static data, see DistrhoUI.cpp + +extern double d_lastUiSampleRate; +extern void* d_lastUiDspPtr; + +// ----------------------------------------------------------------------- +// UI callbacks + +typedef void (*editParamFunc) (void* ptr, uint32_t rindex, bool started); +typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); +typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); +typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); +typedef void (*setSizeFunc) (void* ptr, uint width, uint height); +typedef bool (*fileRequestFunc) (void* ptr, const char* key); + +// ----------------------------------------------------------------------- +// UI private data + +struct UI::PrivateData { + // DSP + double sampleRate; + uint32_t parameterOffset; +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + void* dspPtr; +#endif + + // UI + bool automaticallyScale; + bool resizeInProgress; + uint minWidth; + uint minHeight; + uint bgColor; + uint fgColor; + + // Callbacks + void* callbacksPtr; + editParamFunc editParamCallbackFunc; + setParamFunc setParamCallbackFunc; + setStateFunc setStateCallbackFunc; + sendNoteFunc sendNoteCallbackFunc; + setSizeFunc setSizeCallbackFunc; + fileRequestFunc fileRequestCallbackFunc; + + PrivateData() noexcept + : sampleRate(d_lastUiSampleRate), + parameterOffset(0), +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + dspPtr(d_lastUiDspPtr), +#endif + automaticallyScale(false), + resizeInProgress(false), + minWidth(0), + minHeight(0), + bgColor(0), + fgColor(0), + callbacksPtr(nullptr), + editParamCallbackFunc(nullptr), + setParamCallbackFunc(nullptr), + setStateCallbackFunc(nullptr), + sendNoteCallbackFunc(nullptr), + setSizeCallbackFunc(nullptr), + fileRequestCallbackFunc(nullptr) + { + DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); + +#if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) + parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; +# if DISTRHO_PLUGIN_WANT_LATENCY + parameterOffset += 1; +# endif +#endif + +#ifdef DISTRHO_PLUGIN_TARGET_LV2 +# if (DISTRHO_PLUGIN_IS_SYNTH || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) + parameterOffset += 1; +# if DISTRHO_PLUGIN_WANT_STATE + parameterOffset += 1; +# endif +# endif +#endif + } + + void editParamCallback(const uint32_t rindex, const bool started) + { + if (editParamCallbackFunc != nullptr) + editParamCallbackFunc(callbacksPtr, rindex, started); + } + + void setParamCallback(const uint32_t rindex, const float value) + { + if (setParamCallbackFunc != nullptr) + setParamCallbackFunc(callbacksPtr, rindex, value); + } + + void setStateCallback(const char* const key, const char* const value) + { + if (setStateCallbackFunc != nullptr) + setStateCallbackFunc(callbacksPtr, key, value); + } + + void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + if (sendNoteCallbackFunc != nullptr) + sendNoteCallbackFunc(callbacksPtr, channel, note, velocity); + } + + void setSizeCallback(const uint width, const uint height) + { + if (setSizeCallbackFunc != nullptr) + setSizeCallbackFunc(callbacksPtr, width, height); + } + + bool fileRequestCallback(const char* key) + { + if (fileRequestCallbackFunc != nullptr) + return fileRequestCallbackFunc(callbacksPtr, key); + + // TODO use old style DPF dialog here + + return false; + } +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED