DPF

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

commit 422838fe915f9e67581774151209c613ef737532
parent 6da0a1c1a71fb984f89614c38aec9aca0bb5189d
Author: falkTX <falktx@gmail.com>
Date:   Fri,  9 May 2014 15:04:07 +0100

Move IdleCallback outside App class; Cleanup

Diffstat:
Mdgl/App.hpp | 15---------------
Mdgl/Base.hpp | 9+++++++++
Mdgl/Window.hpp | 5++++-
Mdgl/src/App.cpp | 65+----------------------------------------------------------------
Adgl/src/AppPrivateData.hpp | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdgl/src/Window.cpp | 33+++++++++++++++++++++++----------
Mexamples/cairo.cpp | 6+++---
Mexamples/color.cpp | 9+++------
Mexamples/images.cpp | 11++++++-----
9 files changed, 112 insertions(+), 104 deletions(-)

diff --git a/dgl/App.hpp b/dgl/App.hpp @@ -28,13 +28,6 @@ class Window; class App { public: - class IdleCallback - { - public: - virtual ~IdleCallback() {} - virtual void idleCallback() = 0; - }; - App(); ~App(); @@ -43,19 +36,11 @@ public: void quit(); bool isQuiting() const noexcept; - void addIdleCallback(IdleCallback* const callback); - void removeIdleCallback(IdleCallback* const callback); - private: struct PrivateData; PrivateData* const pData; friend class Window; - void _addWindow(Window* const window); - void _removeWindow(Window* const window); - void _oneShown(); - void _oneHidden(); - DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(App) }; diff --git a/dgl/Base.hpp b/dgl/Base.hpp @@ -106,6 +106,15 @@ enum Modifier { // ----------------------------------------------------------------------- +class IdleCallback +{ +public: + virtual ~IdleCallback() {} + virtual void idleCallback() = 0; +}; + +// ----------------------------------------------------------------------- + END_NAMESPACE_DGL #endif // DGL_BASE_HPP_INCLUDED diff --git a/dgl/Window.hpp b/dgl/Window.hpp @@ -68,8 +68,11 @@ public: int getModifiers() const; intptr_t getWindowId() const; + void addIdleCallback(IdleCallback* const callback); + void removeIdleCallback(IdleCallback* const callback); + private: - class PrivateData; + struct PrivateData; PrivateData* const pData; friend class App; friend class Widget; diff --git a/dgl/src/App.cpp b/dgl/src/App.cpp @@ -14,7 +14,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "../App.hpp" +#include "AppPrivateData.hpp" #include "../Window.hpp" #include <list> @@ -23,25 +23,6 @@ START_NAMESPACE_DGL // ----------------------------------------------------------------------- -struct App::PrivateData { - bool doLoop; - uint visibleWindows; - std::list<Window*> windows; - std::list<IdleCallback*> idleCallbacks; - - PrivateData() - : doLoop(false), - visibleWindows(0) {} - - ~PrivateData() - { - windows.clear(); - idleCallbacks.clear(); - } -}; - -// ----------------------------------------------------------------------- - App::App() : pData(new PrivateData()) { @@ -94,48 +75,4 @@ bool App::isQuiting() const noexcept // ----------------------------------------------------------------------- -void App::addIdleCallback(IdleCallback* const callback) -{ - DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) - - pData->idleCallbacks.push_back(callback); -} - -void App::removeIdleCallback(IdleCallback* const callback) -{ - DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) - - pData->idleCallbacks.remove(callback); -} - -// ----------------------------------------------------------------------- - -void App::_addWindow(Window* const window) -{ - DISTRHO_SAFE_ASSERT_RETURN(window != nullptr,) - - pData->windows.push_back(window); -} - -void App::_removeWindow(Window* const window) -{ - DISTRHO_SAFE_ASSERT_RETURN(window != nullptr,) - - pData->windows.remove(window); -} - -void App::_oneShown() -{ - if (++pData->visibleWindows == 1) - pData->doLoop = true; -} - -void App::_oneHidden() -{ - if (--pData->visibleWindows == 0) - pData->doLoop = false; -} - -// ----------------------------------------------------------------------- - END_NAMESPACE_DGL diff --git a/dgl/src/AppPrivateData.hpp b/dgl/src/AppPrivateData.hpp @@ -0,0 +1,63 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> + * + * 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 DGL_APP_PRIVATE_DATA_HPP_INCLUDED +#define DGL_APP_PRIVATE_DATA_HPP_INCLUDED + +#include "../App.hpp" + +#include <list> + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +struct App::PrivateData { + bool doLoop; + uint visibleWindows; + std::list<Window*> windows; + std::list<IdleCallback*> idleCallbacks; + + PrivateData() + : doLoop(false), + visibleWindows(0) {} + + ~PrivateData() + { + windows.clear(); + idleCallbacks.clear(); + } + + void oneShown() noexcept + { + if (++visibleWindows == 1) + doLoop = true; + } + + void oneHidden() noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(visibleWindows > 0,); + + if (--visibleWindows == 0) + doLoop = false; + } +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_APP_PRIVATE_DATA_HPP_INCLUDED diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp @@ -17,7 +17,7 @@ // we need this for now #define XKEYFOCUSGRAB 1 -#include "../App.hpp" +#include "AppPrivateData.hpp" #include "../Widget.hpp" #include "../Window.hpp" @@ -69,9 +69,8 @@ Window* dgl_lastUiParent = nullptr; // ----------------------------------------------------------------------- // Window Private -class Window::PrivateData +struct Window::PrivateData { -public: PrivateData(App& app, Window* const self) : fApp(app), fSelf(self), @@ -155,7 +154,7 @@ public: if (parentId != 0) { DBG("NOTE: Embed window is always visible and non-resizable\n"); - fApp._oneShown(); + fApp.pData->oneShown(); fFirstInit = false; } } @@ -199,7 +198,7 @@ public: } #endif - fApp._addWindow(fSelf); + fApp.pData->windows.push_back(fSelf); DBG("Success!\n"); } @@ -213,7 +212,7 @@ public: if (fSelf != nullptr) { - fApp._removeWindow(fSelf); + fApp.pData->windows.remove(fSelf); fSelf = nullptr; } @@ -242,7 +241,7 @@ public: if (! fFirstInit) { - fApp._oneHidden(); + fApp.pData->oneHidden(); fFirstInit = true; } } @@ -341,7 +340,7 @@ public: { if (fFirstInit) { - fApp._oneShown(); + fApp.pData->oneShown(); fFirstInit = false; } } @@ -577,7 +576,6 @@ public: // ------------------------------------------------------------------- -protected: void onDisplay() { //DBG("PUGL: onDisplay\n"); @@ -706,7 +704,6 @@ protected: // ------------------------------------------------------------------- -private: App& fApp; Window* fSelf; PuglView* fView; @@ -938,6 +935,22 @@ void Window::_idle() // ----------------------------------------------------------------------- +void Window::addIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->fApp.pData->idleCallbacks.push_back(callback); +} + +void Window::removeIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->fApp.pData->idleCallbacks.remove(callback); +} + +// ----------------------------------------------------------------------- + END_NAMESPACE_DGL #undef DBG diff --git a/examples/cairo.cpp b/examples/cairo.cpp @@ -76,8 +76,8 @@ private: // ------------------------------------------------------ // Custom Cairo Widget -class CustomCairoWidget : public App::IdleCallback, - CairoWidget +class CustomCairoWidget : public CairoWidget, + public IdleCallback { public: CustomCairoWidget(Window& parent) @@ -186,7 +186,7 @@ public: bg(*this), cairo(*this) { - app.addIdleCallback(&cairo); + addIdleCallback(&cairo); } private: diff --git a/examples/color.cpp b/examples/color.cpp @@ -21,8 +21,6 @@ #include "Window.hpp" #include "Widget.hpp" -#include <cstdio> - // ------------------------------------------------------ // use namespace @@ -31,8 +29,8 @@ using namespace DGL; // ------------------------------------------------------ // Single color widget -class ColorWidget : public App::IdleCallback, - Widget +class ColorWidget : public Widget, + public IdleCallback { public: ColorWidget(Window& parent) @@ -41,6 +39,7 @@ public: reverse(false), r(0), g(0), b(0) { + parent.addIdleCallback(this); } private: @@ -139,8 +138,6 @@ int main() Window win(app); ColorWidget color(win); - app.addIdleCallback(&color); - win.setSize(300, 300); win.setTitle("Color"); win.show(); diff --git a/examples/images.cpp b/examples/images.cpp @@ -34,8 +34,8 @@ using namespace DGL; // ------------------------------------------------------ // our widget -class ExampleImagesWidget : public App::IdleCallback, - Widget +class ExampleImagesWidget : public Widget, + public IdleCallback { public: static const int kImg1y = 0; @@ -59,7 +59,10 @@ public: fImg3rev(true), fImg1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, GL_BGR), fImg2(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, GL_BGR), - fImg3(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, GL_BGR) {} + fImg3(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, GL_BGR) + { + win.addIdleCallback(this); + } private: void idleCallback() override @@ -198,8 +201,6 @@ int main() Window win(app); ExampleImagesWidget images(win); - app.addIdleCallback(&images); - win.setResizable(false); win.setSize(500, 400); win.setTitle("Images");