From 3b1e5d698a3f435e4b508ff3d6d27e7c7ec32f5d Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 1 May 2021 23:25:12 +0100 Subject: [PATCH] Start Window related tests; comment out all code Signed-off-by: falkTX --- dgl/Makefile | 6 +- dgl/Window.hpp | 110 +++++---- dgl/src/ApplicationPrivateData.cpp | 14 +- dgl/src/ApplicationPrivateData.hpp | 2 +- dgl/src/Window.cpp | 32 +-- dgl/src/WindowPrivateData.cpp | 356 +++++++++++++++++++++++++++-- dgl/src/WindowPrivateData.hpp | 307 +++---------------------- dgl/src/pugl.cpp | 23 ++ dgl/src/pugl.hpp | 1 + tests/Makefile | 53 ++++- tests/Point.cpp | 8 + tests/Window.cpp | 49 ++++ 12 files changed, 589 insertions(+), 372 deletions(-) create mode 100644 tests/Window.cpp diff --git a/dgl/Makefile b/dgl/Makefile index a76490a45..e75d88d40 100644 --- a/dgl/Makefile +++ b/dgl/Makefile @@ -25,9 +25,9 @@ BUILD_CXX_FLAGS += -Wno-missing-field-initializers -Wno-extra -Wno-narrowing OBJS_common = \ ../build/dgl/Application.cpp.o \ - ../build/dgl/ApplicationPrivateData.cpp.o -# ../build/dgl/Color.cpp.o \ -# ../build/dgl/Geometry.cpp.o \ + ../build/dgl/ApplicationPrivateData.cpp.o \ + ../build/dgl/Color.cpp.o \ + ../build/dgl/Geometry.cpp.o # ../build/dgl/ImageBase.cpp.o \ # ../build/dgl/Resources.cpp.o\ # ../build/dgl/StandaloneWindow.cpp.o \ diff --git a/dgl/Window.hpp b/dgl/Window.hpp index 44eda0c69..d297c16ca 100644 --- a/dgl/Window.hpp +++ b/dgl/Window.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 @@ -19,29 +19,59 @@ #include "Geometry.hpp" -#ifdef DISTRHO_DEFINES_H_INCLUDED -START_NAMESPACE_DISTRHO -class UI; -class UIExporter; -END_NAMESPACE_DISTRHO -#endif - START_NAMESPACE_DGL // ----------------------------------------------------------------------- class Application; -class Widget; -class StandaloneWindow; + +class Window +{ +public: + explicit Window(Application& app); + explicit Window(Application& app, uintptr_t parentWindowHandle, double scaling, bool resizable); + virtual ~Window(); + + void close(); + + /** + Get the "native" window handle. + Returned value depends on the platform: + - HaikuOS: This is a pointer to a `BView`. + - MacOS: This is a pointer to an `NSView*`. + - Windows: This is a `HWND`. + - Everything else: This is an [X11] `Window`. + */ + uintptr_t getNativeWindowHandle() const noexcept; + +private: + struct PrivateData; + PrivateData* const pData; + friend class Application; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Window); +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL /* TODO * add focusEvent with CrossingMode arg * add eventcrossing/enter-leave event */ -class Window -{ -public: +// class StandaloneWindow; +// class Widget; + +// #ifdef DISTRHO_DEFINES_H_INCLUDED +// START_NAMESPACE_DISTRHO +// class UI; +// class UIExporter; +// END_NAMESPACE_DISTRHO +// #endif + +#if 0 #ifndef DGL_FILE_BROWSER_DISABLED /** File browser options. @@ -81,14 +111,10 @@ class Window }; #endif // DGL_FILE_BROWSER_DISABLED - explicit Window(Application& app); - explicit Window(Window& transientParentWindow); - explicit Window(Application& app, uintptr_t parentWindowHandle, double scaling, bool resizable); - virtual ~Window(); + static Window& withTransientParentWindow(Window& transientParentWindow); void show(); void hide(); - void close(); void exec(bool lockWait = false); void focus(); @@ -129,21 +155,12 @@ class Window Application& getApp() const noexcept; #endif - /** - Get the "native" window handle. - Returned value depends on the platform: - - HaikuOS: This is a pointer to a `BView`. - - MacOS: This is a pointer to an `NSView*`. - - Windows: This is a `HWND`. - - Everything else: This is an [X11] `Window`. - */ - uintptr_t getNativeWindowHandle() const noexcept; - const GraphicsContext& getGraphicsContext() const noexcept; void addIdleCallback(IdleCallback* const callback); void removeIdleCallback(IdleCallback* const callback); + protected: virtual void onDisplayBefore(); virtual void onDisplayAfter(); @@ -157,17 +174,6 @@ class Window // internal void _setAutoScaling(double scaling) noexcept; -private: - struct PrivateData; - PrivateData* const pData; - friend class Application; - friend class Widget; - friend class StandaloneWindow; -#ifdef DISTRHO_DEFINES_H_INCLUDED - friend class DISTRHO_NAMESPACE::UI; - friend class DISTRHO_NAMESPACE::UIExporter; -#endif - virtual void _addWidget(Widget* const widget); virtual void _removeWidget(Widget* const widget); void _idle(); @@ -175,20 +181,24 @@ class Window bool handlePluginKeyboard(const bool press, const uint key); bool handlePluginSpecial(const bool press, const Key key); +// friend class Widget; +// friend class StandaloneWindow; +// #ifdef DISTRHO_DEFINES_H_INCLUDED +// friend class DISTRHO_NAMESPACE::UI; +// friend class DISTRHO_NAMESPACE::UIExporter; +// #endif + // Prevent copies -#ifdef DISTRHO_PROPER_CPP11_SUPPORT - Window& operator=(Window&) = delete; - Window& operator=(const Window&) = delete; -#else - Window& operator=(Window&); - Window& operator=(const Window&); -#endif +// #ifdef DISTRHO_PROPER_CPP11_SUPPORT +// Window& operator=(Window&) = delete; +// Window& operator=(const Window&) = delete; +// #else +// Window& operator=(Window&); +// Window& operator=(const Window&); +// #endif - DISTRHO_LEAK_DETECTOR(Window); -}; +#endif // ----------------------------------------------------------------------- -END_NAMESPACE_DGL - #endif // DGL_WINDOW_HPP_INCLUDED diff --git a/dgl/src/ApplicationPrivateData.cpp b/dgl/src/ApplicationPrivateData.cpp index e3ae472f4..953b47978 100644 --- a/dgl/src/ApplicationPrivateData.cpp +++ b/dgl/src/ApplicationPrivateData.cpp @@ -87,13 +87,13 @@ void Application::PrivateData::idle(const uint timeoutInMs) puglUpdate(world, timeoutInSeconds); } -#ifndef DPF_TEST_APPLICATION_CPP - for (std::list::iterator it = windows.begin(), ite = windows.end(); it != ite; ++it) - { - Window* const window(*it); - window->_idle(); - } -#endif +// #ifndef DPF_TEST_APPLICATION_CPP +// for (std::list::iterator it = windows.begin(), ite = windows.end(); it != ite; ++it) +// { +// Window* const window(*it); +// window->_idle(); +// } +// #endif for (std::list::iterator it = idleCallbacks.begin(), ite = idleCallbacks.end(); it != ite; ++it) { diff --git a/dgl/src/ApplicationPrivateData.hpp b/dgl/src/ApplicationPrivateData.hpp index 98e65dcd6..6057b6dcc 100644 --- a/dgl/src/ApplicationPrivateData.hpp +++ b/dgl/src/ApplicationPrivateData.hpp @@ -68,7 +68,7 @@ struct Application::PrivateData { /** Set flag indicating application is quitting, and closes all windows in reverse order of registration. */ void quit(); - DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) }; // -------------------------------------------------------------------------------------------------------------------- diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp index f424be99d..eae1f2ad6 100644 --- a/dgl/src/Window.cpp +++ b/dgl/src/Window.cpp @@ -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 @@ -16,17 +16,19 @@ #include "WindowPrivateData.hpp" +#include "pugl.hpp" + START_NAMESPACE_DGL // ----------------------------------------------------------------------- // Window +// Window::Window(Window& transientParentWindow) +// : pData(new PrivateData(transientParentWindow.pData->fAppData, this, transientParentWindow)) {} + Window::Window(Application& app) : pData(new PrivateData(app.pData, this)) {} -Window::Window(Window& transientParentWindow) - : pData(new PrivateData(transientParentWindow.pData->fAppData, this, transientParentWindow)) {} - Window::Window(Application& app, const uintptr_t parentWindowHandle, const double scaling, const bool resizable) : pData(new PrivateData(app.pData, this, parentWindowHandle, scaling, resizable)) {} @@ -35,6 +37,17 @@ Window::~Window() delete pData; } +void Window::close() +{ + pData->close(); +} + +uintptr_t Window::getNativeWindowHandle() const noexcept +{ + return puglGetNativeWindow(pData->view); +} + +#if 0 void Window::show() { pData->setVisible(true); @@ -45,11 +58,6 @@ void Window::hide() pData->setVisible(false); } -void Window::close() -{ - pData->close(); -} - #if 0 void Window::exec(bool lockWait) { @@ -191,11 +199,6 @@ Application& Window::getApp() const noexcept } #endif -uintptr_t Window::getNativeWindowHandle() const noexcept -{ - return puglGetNativeWindow(pData->fView); -} - #if 0 const GraphicsContext& Window::getGraphicsContext() const noexcept { @@ -285,6 +288,7 @@ bool Window::handlePluginSpecial(const bool press, const Key key) return false; // return pData->handlePluginSpecial(press, key); } +#endif // ----------------------------------------------------------------------- diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp index 297d35c37..4e2dfa640 100644 --- a/dgl/src/WindowPrivateData.cpp +++ b/dgl/src/WindowPrivateData.cpp @@ -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 @@ -15,7 +15,116 @@ */ #include "WindowPrivateData.hpp" +#include "../Widget.hpp" +#include "pugl.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* const s) + : appData(a), + self(s), + view(puglNewView(appData->world)) +{ + init(true); +} + +Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* const s, Window& transientWindow) + : appData(a), + self(s), + view(puglNewView(appData->world)) +{ + puglSetTransientFor(view, transientWindow.getNativeWindowHandle()); + init(true); +} + +Window::PrivateData::PrivateData(Application::PrivateData* const a, Window* const s, + const uintptr_t parentWindowHandle, const double scaling, const bool resizable) + : appData(a), + self(s), + view(puglNewView(appData->world)) +{ + // TODO view parent + init(resizable); +} + +Window::PrivateData::~PrivateData() +{ + if (self != nullptr) + appData->windows.remove(self); + + if (view != nullptr) + puglFreeView(view); +} + +// ----------------------------------------------------------------------- + +void Window::PrivateData::init(const bool resizable) +{ + if (self == nullptr || view == nullptr) + { + /* + DGL_DBG("Failed!\n"); + */ + return; + } + +#ifdef DGL_CAIRO + puglSetBackend(view, puglCairoBackend()); +#endif +#ifdef DGL_OPENGL + puglSetBackend(view, puglGlBackend()); +#endif +#ifdef DGL_Vulkan + puglSetBackend(view, puglVulkanBackend()); +#endif + + puglSetHandle(view, this); + puglSetViewHint(view, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); + puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, PUGL_FALSE); + puglSetEventFunc(view, puglEventCallback); +// #ifndef DGL_FILE_BROWSER_DISABLED +// puglSetFileSelectedFunc(fView, fileBrowserSelectedCallback); +// #endif + + appData->windows.push_back(self); + + // DGL_DBG("Success!\n"); +} + +void Window::PrivateData::close() +{ + /* + DGL_DBG("Window close\n"); + + if (fUsingEmbed) + return; + + setVisible(false); + + if (! fFirstInit) + { + fAppData->oneWindowHidden(); + fFirstInit = true; + } + */ +} + +// ----------------------------------------------------------------------- + +PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const PuglEvent* const event) +{ + Window::PrivateData* const pData = (Window::PrivateData*)puglGetHandle(view); + return PUGL_SUCCESS; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#if 0 #ifdef DGL_CAIRO # define PUGL_CAIRO # include "../Cairo.hpp" @@ -25,6 +134,12 @@ # include "../OpenGL.hpp" #endif +#ifndef DPF_TEST_WINDOW_CPP +#include "WidgetPrivateData.hpp" +#include "pugl-upstream/include/pugl/pugl.h" +#include "pugl-extra/extras.h" +#endif + extern "C" { #include "pugl-upstream/src/implementation.c" #include "pugl-extra/extras.c" @@ -63,38 +178,151 @@ extern "C" { #include #include +#define FOR_EACH_WIDGET(it) \ + for (std::list::iterator it = fWidgets.begin(); it != fWidgets.end(); ++it) + +#define FOR_EACH_WIDGET_INV(rit) \ + for (std::list::reverse_iterator rit = fWidgets.rbegin(); rit != fWidgets.rend(); ++rit) + +#define DGL_DEBUG_EVENTS + +#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) +# define DGL_DBG(msg) std::fprintf(stderr, "%s", msg); +# define DGL_DBGp(...) std::fprintf(stderr, __VA_ARGS__); +# define DGL_DBGF std::fflush(stderr); +#else +# define DGL_DBG(msg) +# define DGL_DBGp(...) +# define DGL_DBGF +#endif + START_NAMESPACE_DGL +// Fallback build-specific Window functions +struct Fallback { + static void onDisplayBefore(); + static void onDisplayAfter(); + static void onReshape(uint width, uint height); +}; + // ----------------------------------------------------------------------- -void Window::PrivateData::init(const bool resizable) +Window::PrivateData::PrivateData(Application::PrivateData* const appData, Window* const self) + : fAppData(appData), + fSelf(self), + fView(puglNewView(appData->world)), + fFirstInit(true), + fVisible(false), + fUsingEmbed(false), + fScaling(1.0), + fAutoScaling(1.0), + fWidgets(), + fModal() { - if (fSelf == nullptr || fView == nullptr) + DGL_DBG("Creating window without parent..."); DGL_DBGF; + init(); +} + +#ifndef DPF_TEST_WINDOW_CPP +Window::PrivateData::PrivateData(Application::PrivateData* const appData, Window* const self, Window& transientWindow) + : fAppData(appData), + fSelf(self), + fView(puglNewView(appData->world)), + fFirstInit(true), + fVisible(false), + fUsingEmbed(false), + fScaling(1.0), + fAutoScaling(1.0), + fWidgets(), + fModal(transientWindow.pData) +{ + DGL_DBG("Creating window with parent..."); DGL_DBGF; + init(); + + puglSetTransientFor(fView, transientWindow.getNativeWindowHandle()); +} +#endif + +Window::PrivateData::PrivateData(Application::PrivateData* const appData, Window* const self, + const uintptr_t parentWindowHandle, + const double scaling, + const bool resizable) + : fAppData(appData), + fSelf(self), + fView(puglNewView(appData->world)), + fFirstInit(true), + fVisible(parentWindowHandle != 0), + fUsingEmbed(parentWindowHandle != 0), + fScaling(scaling), + fAutoScaling(1.0), + fWidgets(), + fModal() +{ + if (fUsingEmbed) { - DGL_DBG("Failed!\n"); - return; + DGL_DBG("Creating embedded window..."); DGL_DBGF; + puglSetParentWindow(fView, parentWindowHandle); + } + else + { + DGL_DBG("Creating window without parent..."); DGL_DBGF; } -// #ifdef DGL_CAIRO -// puglSetBackend(fView, puglCairoBackend()); -// #endif -#ifdef DGL_OPENGL - puglSetBackend(fView, puglGlBackend()); + init(resizable); + + if (fUsingEmbed) + { + DGL_DBG("NOTE: Embed window is always visible and non-resizable\n"); +// puglShowWindow(fView); +// fAppData->oneWindowShown(); +// fFirstInit = false; + } +} + +Window::PrivateData::~PrivateData() +{ + DGL_DBG("Destroying window..."); DGL_DBGF; + +#if 0 + if (fModal.enabled) + { + exec_fini(); + close(); + } #endif - puglSetHandle(fView, this); - puglSetViewHint(fView, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); - puglSetViewHint(fView, PUGL_IGNORE_KEY_REPEAT, PUGL_FALSE); - puglSetEventFunc(fView, puglEventCallback); -// #ifndef DGL_FILE_BROWSER_DISABLED -// puglSetFileSelectedFunc(fView, fileBrowserSelectedCallback); -// #endif + fWidgets.clear(); - fAppData->windows.push_back(fSelf); + if (fUsingEmbed) + { +// puglHideWindow(fView); +// fAppData->oneWindowHidden(); + } + + if (fSelf != nullptr) + fAppData->windows.remove(fSelf); + +#if defined(DISTRHO_OS_MAC) && !defined(DGL_FILE_BROWSER_DISABLED) + if (fOpenFilePanel) + { + [fOpenFilePanel release]; + fOpenFilePanel = nullptr; + } + if (fFilePanelDelegate) + { + [fFilePanelDelegate release]; + fFilePanelDelegate = nullptr; + } +#endif + + if (fView != nullptr) + puglFreeView(fView); DGL_DBG("Success!\n"); } +// ----------------------------------------------------------------------- + void Window::PrivateData::setVisible(const bool visible) { if (fVisible == visible) @@ -160,6 +388,97 @@ void Window::PrivateData::setVisible(const bool visible) } } +// ----------------------------------------------------------------------- + +void Window::PrivateData::addWidget(Widget* const widget) +{ + fWidgets.push_back(widget); +} + +void Window::PrivateData::removeWidget(Widget* const widget) +{ + fWidgets.remove(widget); +} + +// ----------------------------------------------------------------------- + +void Window::PrivateData::onPuglClose() +{ + DGL_DBG("PUGL: onClose\n"); + +// if (fModal.enabled) +// exec_fini(); + + fSelf->onClose(); + + if (fModal.childFocus != nullptr) + fModal.childFocus->fSelf->onClose(); + + close(); +} + +void Window::PrivateData::onPuglDisplay() +{ + fSelf->onDisplayBefore(); + + if (fWidgets.size() != 0) + { + const PuglRect rect = puglGetFrame(fView); + const int width = rect.width; + const int height = rect.height; + + FOR_EACH_WIDGET(it) + { + Widget* const widget(*it); + widget->pData->display(width, height, fAutoScaling, false); + } + } + + fSelf->onDisplayAfter(); +} + +void Window::PrivateData::onPuglReshape(const int width, const int height) +{ + DISTRHO_SAFE_ASSERT_INT2_RETURN(width > 1 && height > 1, width, height,); + + DGL_DBGp("PUGL: onReshape : %i %i\n", width, height); + + fSelf->onReshape(width, height); + + FOR_EACH_WIDGET(it) + { + Widget* const widget(*it); + + if (widget->pData->needsFullViewport) + widget->setSize(width, height); + } +} + +void Window::PrivateData::onPuglMouse(const Widget::MouseEvent& ev) +{ + DGL_DBGp("PUGL: onMouse : %i %i %i %i\n", ev.button, ev.press, ev.pos.getX(), ev.pos.getY()); + +// if (fModal.childFocus != nullptr) +// return fModal.childFocus->focus(); + + Widget::MouseEvent rev = ev; + double x = ev.pos.getX() / fAutoScaling; + double y = ev.pos.getY() / fAutoScaling; + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + rev.pos = Point(x - widget->getAbsoluteX(), + y - widget->getAbsoluteY()); + + if (widget->isVisible() && widget->onMouse(rev)) + break; + } +} + +// ----------------------------------------------------------------------- + void Window::PrivateData::windowSpecificIdle() { #if defined(DISTRHO_OS_WINDOWS) && !defined(DGL_FILE_BROWSER_DISABLED) @@ -418,3 +737,4 @@ void Window::PrivateData::Fallback::onReshape(const uint width, const uint heigh // ----------------------------------------------------------------------- END_NAMESPACE_DGL +#endif diff --git a/dgl/src/WindowPrivateData.hpp b/dgl/src/WindowPrivateData.hpp index 228dab4be..5353002d0 100644 --- a/dgl/src/WindowPrivateData.hpp +++ b/dgl/src/WindowPrivateData.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 @@ -18,44 +18,41 @@ #define DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED #include "../Window.hpp" - #include "ApplicationPrivateData.hpp" -#include "WidgetPrivateData.hpp" -#include "pugl-upstream/include/pugl/pugl.h" -#include "pugl-extra/extras.h" +#include "pugl.hpp" -#include +START_NAMESPACE_DGL -#define FOR_EACH_WIDGET(it) \ - for (std::list::iterator it = fWidgets.begin(); it != fWidgets.end(); ++it) +class Widget; -#define FOR_EACH_WIDGET_INV(rit) \ - for (std::list::reverse_iterator rit = fWidgets.rbegin(); rit != fWidgets.rend(); ++rit) +// ----------------------------------------------------------------------- -#define DGL_DEBUG_EVENTS +struct Window::PrivateData { + typedef Application::PrivateData AppData; -#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) -# define DGL_DBG(msg) std::fprintf(stderr, "%s", msg); -# define DGL_DBGp(...) std::fprintf(stderr, __VA_ARGS__); -# define DGL_DBGF std::fflush(stderr); -#else -# define DGL_DBG(msg) -# define DGL_DBGp(...) -# define DGL_DBGF -#endif + AppData* const appData; + Window* const self; + PuglView* const view; -START_NAMESPACE_DGL + PrivateData(AppData* appData, Window* self); + PrivateData(AppData* appData, Window* self, Window& transientWindow); + PrivateData(AppData* appData, Window* self, uintptr_t parentWindowHandle, double scaling, bool resizable); + ~PrivateData(); -// ----------------------------------------------------------------------- + void init(bool resizable); + void close(); -struct Window::PrivateData { - typedef Application::PrivateData AppData; + static PuglStatus puglEventCallback(PuglView* view, const PuglEvent* event); + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) +}; + +// ----------------------------------------------------------------------- - AppData* const fAppData; - Window* const fSelf; - PuglView* const fView; +END_NAMESPACE_DGL +#if 0 // this one depends on build type // GraphicsContext fContext; @@ -109,272 +106,36 @@ struct Window::PrivateData { String fSelectedFile; # endif #endif - - // Fallback build-specific Window functions - struct Fallback { - static void onDisplayBefore(); - static void onDisplayAfter(); - static void onReshape(uint width, uint height); - }; - - /* - PrivateData(Application& app, Window* const self) - : fApp(app), - fSelf(self) - { - } - - PrivateData(Application& app, Window* const self, Window& parent) - : fApp(app), - fSelf(self) - { - } - - PrivateData(Application& app, Window* const self, const intptr_t parentId, const double scaling, const bool resizable) - : fApp(app), - fSelf(self) - { - } - */ - PrivateData(Application::PrivateData* const appData, Window* const self) - : fAppData(appData), - fSelf(self), - fView(puglNewView(appData->world)), - fFirstInit(true), - fVisible(false), - fUsingEmbed(false), - fScaling(1.0), - fAutoScaling(1.0), - fWidgets(), - fModal() - { - DGL_DBG("Creating window without parent..."); DGL_DBGF; - init(); - } - - PrivateData(Application::PrivateData* const appData, Window* const self, Window& transientWindow) - : fAppData(appData), - fSelf(self), - fView(puglNewView(appData->world)), - fFirstInit(true), - fVisible(false), - fUsingEmbed(false), - fScaling(1.0), - fAutoScaling(1.0), - fWidgets(), - fModal(transientWindow.pData) - { - DGL_DBG("Creating window with parent..."); DGL_DBGF; - init(); - - puglSetTransientFor(fView, transientWindow.getNativeWindowHandle()); - } - - PrivateData(Application::PrivateData* const appData, Window* const self, - const uintptr_t parentWindowHandle, - const double scaling, - const bool resizable) - : fAppData(appData), - fSelf(self), - fView(puglNewView(appData->world)), - fFirstInit(true), - fVisible(parentWindowHandle != 0), - fUsingEmbed(parentWindowHandle != 0), - fScaling(scaling), - fAutoScaling(1.0), - fWidgets(), - fModal() - { - if (fUsingEmbed) - { - DGL_DBG("Creating embedded window..."); DGL_DBGF; - puglSetParentWindow(fView, parentWindowHandle); - } - else - { - DGL_DBG("Creating window without parent..."); DGL_DBGF; - } - - init(resizable); - - if (fUsingEmbed) - { - DGL_DBG("NOTE: Embed window is always visible and non-resizable\n"); -// puglShowWindow(fView); -// fAppData->oneWindowShown(); -// fFirstInit = false; - } - } - - ~PrivateData() - { - DGL_DBG("Destroying window..."); DGL_DBGF; - -#if 0 - if (fModal.enabled) - { - exec_fini(); - close(); - } -#endif - - fWidgets.clear(); - - if (fUsingEmbed) - { -// puglHideWindow(fView); -// fAppData->oneWindowHidden(); - } - - if (fSelf != nullptr) - fAppData->windows.remove(fSelf); - -#if defined(DISTRHO_OS_MAC) && !defined(DGL_FILE_BROWSER_DISABLED) - if (fOpenFilePanel) - { - [fOpenFilePanel release]; - fOpenFilePanel = nullptr; - } - if (fFilePanelDelegate) - { - [fFilePanelDelegate release]; - fFilePanelDelegate = nullptr; - } #endif - if (fView != nullptr) - puglFreeView(fView); - - DGL_DBG("Success!\n"); - } - +#if 0 // ndef DPF_TEST_WINDOW_CPP // ------------------------------------------------------------------- // stuff that uses pugl internals or build-specific things void init(const bool resizable = false); void setVisible(const bool visible); void windowSpecificIdle(); - static PuglStatus puglEventCallback(PuglView* const view, const PuglEvent* const event); // ------------------------------------------------------------------- - void close() - { - DGL_DBG("Window close\n"); - - if (fUsingEmbed) - return; - - setVisible(false); - - if (! fFirstInit) - { - fAppData->oneWindowHidden(); - fFirstInit = true; - } - } - // ------------------------------------------------------------------- - void addWidget(Widget* const widget) - { - fWidgets.push_back(widget); - } - - void removeWidget(Widget* const widget) - { - fWidgets.remove(widget); - } + void addWidget(Widget* const widget); + void removeWidget(Widget* const widget); // ------------------------------------------------------------------- - void onPuglClose() - { - DGL_DBG("PUGL: onClose\n"); - -// if (fModal.enabled) -// exec_fini(); - - fSelf->onClose(); - - if (fModal.childFocus != nullptr) - fModal.childFocus->fSelf->onClose(); - - close(); - } - - void onPuglDisplay() - { - fSelf->onDisplayBefore(); - - if (fWidgets.size() != 0) - { - const PuglRect rect = puglGetFrame(fView); - const int width = rect.width; - const int height = rect.height; - - FOR_EACH_WIDGET(it) - { - Widget* const widget(*it); - widget->pData->display(width, height, fAutoScaling, false); - } - } - - fSelf->onDisplayAfter(); - } - - void onPuglReshape(const int width, const int height) - { - DISTRHO_SAFE_ASSERT_INT2_RETURN(width > 1 && height > 1, width, height,); - - DGL_DBGp("PUGL: onReshape : %i %i\n", width, height); - - fSelf->onReshape(width, height); - - FOR_EACH_WIDGET(it) - { - Widget* const widget(*it); - - if (widget->pData->needsFullViewport) - widget->setSize(width, height); - } - } - - void onPuglMouse(const Widget::MouseEvent& ev) - { - DGL_DBGp("PUGL: onMouse : %i %i %i %i\n", ev.button, ev.press, ev.pos.getX(), ev.pos.getY()); - -// if (fModal.childFocus != nullptr) -// return fModal.childFocus->focus(); - - Widget::MouseEvent rev = ev; - double x = ev.pos.getX() / fAutoScaling; - double y = ev.pos.getY() / fAutoScaling; - - FOR_EACH_WIDGET_INV(rit) - { - Widget* const widget(*rit); - - rev.pos = Point(x - widget->getAbsoluteX(), - y - widget->getAbsoluteY()); - - if (widget->isVisible() && widget->onMouse(rev)) - break; - } - } + void onPuglClose(); + void onPuglDisplay(); + void onPuglReshape(const int width, const int height); + void onPuglMouse(const Widget::MouseEvent& ev); // ------------------------------------------------------------------- - -#ifdef DISTRHO_DEFINES_H_INCLUDED - friend class DISTRHO_NAMESPACE::UI; #endif - DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) -}; - -// ----------------------------------------------------------------------- - -END_NAMESPACE_DGL +// #ifdef DISTRHO_DEFINES_H_INCLUDED +// friend class DISTRHO_NAMESPACE::UI; +// #endif #if 0 // ----------------------------------------------------------------------- diff --git a/dgl/src/pugl.cpp b/dgl/src/pugl.cpp index a43e626c3..d31a84675 100644 --- a/dgl/src/pugl.cpp +++ b/dgl/src/pugl.cpp @@ -27,6 +27,7 @@ #elif defined(DISTRHO_OS_MAC) #elif defined(DISTRHO_OS_WINDOWS) #else +# include # include # include # include @@ -45,17 +46,39 @@ # include # include # endif +# ifdef DGL_CAIRO +# include +# include +# endif +# ifdef DGL_OPENGL +# include +# endif +# ifdef DGL_VULKAN +# include +# include +# endif #endif START_NAMESPACE_DGL // -------------------------------------------------------------------------------------------------------------------- +#define PUGL_DISABLE_DEPRECATED + #if defined(DISTRHO_OS_HAIKU) #elif defined(DISTRHO_OS_MAC) #elif defined(DISTRHO_OS_WINDOWS) #else # include "pugl-upstream/src/x11.c" +# ifdef DGL_CAIRO +# include "pugl-upstream/src/x11_cairo.c" +# endif +# ifdef DGL_OPENGL +# include "pugl-upstream/src/x11_gl.c" +# endif +# ifdef DGL_VULKAN +# include "pugl-upstream/src/x11_vulkan.c" +# endif #endif #include "pugl-upstream/src/implementation.c" diff --git a/dgl/src/pugl.hpp b/dgl/src/pugl.hpp index 1fb58a349..3d5374e5b 100644 --- a/dgl/src/pugl.hpp +++ b/dgl/src/pugl.hpp @@ -28,6 +28,7 @@ START_NAMESPACE_DGL // -------------------------------------------------------------------------------------------------------------------- +#define PUGL_DISABLE_DEPRECATED #include "pugl-upstream/include/pugl/pugl.h" // -------------------------------------------------------------------------------------------------------------------- diff --git a/tests/Makefile b/tests/Makefile index e3b880875..0b50d12f7 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -20,9 +20,19 @@ BUILD_CXX_FLAGS += -Wno-missing-field-initializers -Wno-extra # --------------------------------------------------------------------------------------------------------------------- -TESTS = Application Color Point -TARGETS = $(TESTS:%=../build/tests/%) -OBJS = $(TARGETS:%=%.cpp.o) +TESTS = Application Color Point +ifeq ($(HAVE_CAIRO),true) +WTESTS = Window.cairo +endif +ifeq ($(HAVE_OPENGL),true) +WTESTS = Window.opengl +endif +ifeq ($(HAVE_VULKAN),true) +WTESTS = Window.vulkan +endif +TARGETS = $(TESTS:%=../build/tests/%) +TARGETS += $(WTESTS:Window.%=../build/tests/Window.%) +OBJS = $(TARGETS:%=%.cpp.o) # --------------------------------------------------------------------------------------------------------------------- @@ -45,6 +55,25 @@ all: $(TARGETS) $(SILENT)$@ # valgrind --leak-check=full $@ +../build/tests/%.cairo: ../build/tests/%.cpp.cairo.o + @echo "Linking $*" + $(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(CAIRO_LIBS) -o $@ + @echo "Running test for $*" + $(SILENT)$@ + +../build/tests/%.opengl: ../build/tests/%.cpp.opengl.o + @echo "Linking $*" + $(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(OPENGL_LIBS) -o $@ + @echo "Running test for $*" + $(SILENT) + gdb -ex run $@ + +../build/tests/%.vulkan: ../build/tests/%.cpp.vulkan.o + @echo "Linking $*" + $(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(VULKAN_LIBS) -o $@ + @echo "Running test for $*" + $(SILENT)$@ + # --------------------------------------------------------------------------------------------------------------------- ../build/tests/%.c.o: %.c @@ -57,14 +86,26 @@ all: $(TARGETS) @echo "Compiling $<" $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ +../build/tests/%.cpp.cairo.o: %.cpp + -@mkdir -p ../build/tests + @echo "Compiling $< (Cairo)" + $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ + +../build/tests/%.cpp.opengl.o: %.cpp + -@mkdir -p ../build/tests + @echo "Compiling $< (OpenGL)" + $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ + +../build/tests/%.cpp.vulkan.o: Window.cpp + -@mkdir -p ../build/tests + @echo "Compiling $< (Vulkan)" + $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_VULKAN -c -o $@ + # --------------------------------------------------------------------------------------------------------------------- clean: rm -rf ../build/tests -debug: - $(MAKE) DEBUG=true - # --------------------------------------------------------------------------------------------------------------------- -include $(OBJS:%.o=%.d) diff --git a/tests/Point.cpp b/tests/Point.cpp index f3e5f6874..f51e5552f 100644 --- a/tests/Point.cpp +++ b/tests/Point.cpp @@ -31,14 +31,22 @@ static int runTestsPerType() Point p; DISTRHO_ASSERT_EQUAL(p.getX(), 0, "point start X value is 0"); DISTRHO_ASSERT_EQUAL(p.getY(), 0, "point start Y value is 0"); + DISTRHO_ASSERT_EQUAL(p.isZero(), true, "point start is zero"); + DISTRHO_ASSERT_EQUAL(p.isNotZero(), false, "point start is for sure zero"); p.setX(5); DISTRHO_ASSERT_EQUAL(p.getX(), 5, "point X value changed to 5"); DISTRHO_ASSERT_EQUAL(p.getY(), 0, "point start Y value remains 0"); + DISTRHO_ASSERT_EQUAL(p.isZero(), false, "point after custom X is not zero"); + DISTRHO_ASSERT_EQUAL(p.isNotZero(), true, "point after custom X is for sure not zero"); p.setY(7); DISTRHO_ASSERT_EQUAL(p.getX(), 5, "point X value remains 5"); DISTRHO_ASSERT_EQUAL(p.getY(), 7, "point Y value changed to 7"); + DISTRHO_ASSERT_EQUAL(p.isZero(), false, "point after custom X and Y is not zero"); + DISTRHO_ASSERT_EQUAL(p.isNotZero(), true, "point after custom X and Y is for sure not zero"); + + // TODO everything else } return 0; diff --git a/tests/Window.cpp b/tests/Window.cpp new file mode 100644 index 000000000..de5d6d00b --- /dev/null +++ b/tests/Window.cpp @@ -0,0 +1,49 @@ +/* + * DISTRHO Plugin Framework (DPF) + * 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 + * 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. + */ + +#if !(defined(DGL_CAIRO) || defined(DGL_OPENGL) || defined(DGL_VULKAN)) +# error test setup failed, must be for cairo, opengl or vulkan +#endif + +#include "tests.hpp" + +#define DPF_TEST_WINDOW_CPP +#include "dgl/src/pugl.cpp" +#include "dgl/src/Application.cpp" +#include "dgl/src/ApplicationPrivateData.cpp" +#include "dgl/src/Window.cpp" +#include "dgl/src/WindowPrivateData.cpp" + +// -------------------------------------------------------------------------------------------------------------------- + +int main() +{ + USE_NAMESPACE_DGL; + + using DGL_NAMESPACE::Window; + + // creating simple window + { + Application app(true); + Window win(app); + } + + // TODO + + return 0; +} + +// --------------------------------------------------------------------------------------------------------------------