Browse Source

Move IdleCallback outside App class; Cleanup

gh-pages
falkTX 11 years ago
parent
commit
422838fe91
9 changed files with 112 additions and 104 deletions
  1. +0
    -15
      dgl/App.hpp
  2. +9
    -0
      dgl/Base.hpp
  3. +4
    -1
      dgl/Window.hpp
  4. +1
    -64
      dgl/src/App.cpp
  5. +63
    -0
      dgl/src/AppPrivateData.hpp
  6. +23
    -10
      dgl/src/Window.cpp
  7. +3
    -3
      examples/cairo.cpp
  8. +3
    -6
      examples/color.cpp
  9. +6
    -5
      examples/images.cpp

+ 0
- 15
dgl/App.hpp View File

@@ -28,13 +28,6 @@ class Window;
class App class App
{ {
public: public:
class IdleCallback
{
public:
virtual ~IdleCallback() {}
virtual void idleCallback() = 0;
};

App(); App();
~App(); ~App();


@@ -43,19 +36,11 @@ public:
void quit(); void quit();
bool isQuiting() const noexcept; bool isQuiting() const noexcept;


void addIdleCallback(IdleCallback* const callback);
void removeIdleCallback(IdleCallback* const callback);

private: private:
struct PrivateData; struct PrivateData;
PrivateData* const pData; PrivateData* const pData;
friend class Window; 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) DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(App)
}; };




+ 9
- 0
dgl/Base.hpp View File

@@ -106,6 +106,15 @@ enum Modifier {


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


class IdleCallback
{
public:
virtual ~IdleCallback() {}
virtual void idleCallback() = 0;
};

// -----------------------------------------------------------------------

END_NAMESPACE_DGL END_NAMESPACE_DGL


#endif // DGL_BASE_HPP_INCLUDED #endif // DGL_BASE_HPP_INCLUDED

+ 4
- 1
dgl/Window.hpp View File

@@ -68,8 +68,11 @@ public:
int getModifiers() const; int getModifiers() const;
intptr_t getWindowId() const; intptr_t getWindowId() const;


void addIdleCallback(IdleCallback* const callback);
void removeIdleCallback(IdleCallback* const callback);

private: private:
class PrivateData;
struct PrivateData;
PrivateData* const pData; PrivateData* const pData;
friend class App; friend class App;
friend class Widget; friend class Widget;


+ 1
- 64
dgl/src/App.cpp View File

@@ -14,7 +14,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */


#include "../App.hpp"
#include "AppPrivateData.hpp"
#include "../Window.hpp" #include "../Window.hpp"


#include <list> #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() App::App()
: pData(new PrivateData()) : 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 END_NAMESPACE_DGL

+ 63
- 0
dgl/src/AppPrivateData.hpp View File

@@ -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

+ 23
- 10
dgl/src/Window.cpp View File

@@ -17,7 +17,7 @@
// we need this for now // we need this for now
#define XKEYFOCUSGRAB 1 #define XKEYFOCUSGRAB 1


#include "../App.hpp"
#include "AppPrivateData.hpp"
#include "../Widget.hpp" #include "../Widget.hpp"
#include "../Window.hpp" #include "../Window.hpp"


@@ -69,9 +69,8 @@ Window* dgl_lastUiParent = nullptr;
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Window Private // Window Private


class Window::PrivateData
struct Window::PrivateData
{ {
public:
PrivateData(App& app, Window* const self) PrivateData(App& app, Window* const self)
: fApp(app), : fApp(app),
fSelf(self), fSelf(self),
@@ -155,7 +154,7 @@ public:
if (parentId != 0) if (parentId != 0)
{ {
DBG("NOTE: Embed window is always visible and non-resizable\n"); DBG("NOTE: Embed window is always visible and non-resizable\n");
fApp._oneShown();
fApp.pData->oneShown();
fFirstInit = false; fFirstInit = false;
} }
} }
@@ -199,7 +198,7 @@ public:
} }
#endif #endif


fApp._addWindow(fSelf);
fApp.pData->windows.push_back(fSelf);


DBG("Success!\n"); DBG("Success!\n");
} }
@@ -213,7 +212,7 @@ public:


if (fSelf != nullptr) if (fSelf != nullptr)
{ {
fApp._removeWindow(fSelf);
fApp.pData->windows.remove(fSelf);
fSelf = nullptr; fSelf = nullptr;
} }


@@ -242,7 +241,7 @@ public:


if (! fFirstInit) if (! fFirstInit)
{ {
fApp._oneHidden();
fApp.pData->oneHidden();
fFirstInit = true; fFirstInit = true;
} }
} }
@@ -341,7 +340,7 @@ public:
{ {
if (fFirstInit) if (fFirstInit)
{ {
fApp._oneShown();
fApp.pData->oneShown();
fFirstInit = false; fFirstInit = false;
} }
} }
@@ -577,7 +576,6 @@ public:


// ------------------------------------------------------------------- // -------------------------------------------------------------------


protected:
void onDisplay() void onDisplay()
{ {
//DBG("PUGL: onDisplay\n"); //DBG("PUGL: onDisplay\n");
@@ -706,7 +704,6 @@ protected:


// ------------------------------------------------------------------- // -------------------------------------------------------------------


private:
App& fApp; App& fApp;
Window* fSelf; Window* fSelf;
PuglView* fView; 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 END_NAMESPACE_DGL


#undef DBG #undef DBG


+ 3
- 3
examples/cairo.cpp View File

@@ -76,8 +76,8 @@ private:
// ------------------------------------------------------ // ------------------------------------------------------
// Custom Cairo Widget // Custom Cairo Widget


class CustomCairoWidget : public App::IdleCallback,
CairoWidget
class CustomCairoWidget : public CairoWidget,
public IdleCallback
{ {
public: public:
CustomCairoWidget(Window& parent) CustomCairoWidget(Window& parent)
@@ -186,7 +186,7 @@ public:
bg(*this), bg(*this),
cairo(*this) cairo(*this)
{ {
app.addIdleCallback(&cairo);
addIdleCallback(&cairo);
} }


private: private:


+ 3
- 6
examples/color.cpp View File

@@ -21,8 +21,6 @@
#include "Window.hpp" #include "Window.hpp"
#include "Widget.hpp" #include "Widget.hpp"


#include <cstdio>

// ------------------------------------------------------ // ------------------------------------------------------
// use namespace // use namespace


@@ -31,8 +29,8 @@ using namespace DGL;
// ------------------------------------------------------ // ------------------------------------------------------
// Single color widget // Single color widget


class ColorWidget : public App::IdleCallback,
Widget
class ColorWidget : public Widget,
public IdleCallback
{ {
public: public:
ColorWidget(Window& parent) ColorWidget(Window& parent)
@@ -41,6 +39,7 @@ public:
reverse(false), reverse(false),
r(0), g(0), b(0) r(0), g(0), b(0)
{ {
parent.addIdleCallback(this);
} }


private: private:
@@ -139,8 +138,6 @@ int main()
Window win(app); Window win(app);
ColorWidget color(win); ColorWidget color(win);


app.addIdleCallback(&color);

win.setSize(300, 300); win.setSize(300, 300);
win.setTitle("Color"); win.setTitle("Color");
win.show(); win.show();


+ 6
- 5
examples/images.cpp View File

@@ -34,8 +34,8 @@ using namespace DGL;
// ------------------------------------------------------ // ------------------------------------------------------
// our widget // our widget


class ExampleImagesWidget : public App::IdleCallback,
Widget
class ExampleImagesWidget : public Widget,
public IdleCallback
{ {
public: public:
static const int kImg1y = 0; static const int kImg1y = 0;
@@ -59,7 +59,10 @@ public:
fImg3rev(true), fImg3rev(true),
fImg1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, GL_BGR), fImg1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, GL_BGR),
fImg2(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, 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: private:
void idleCallback() override void idleCallback() override
@@ -198,8 +201,6 @@ int main()
Window win(app); Window win(app);
ExampleImagesWidget images(win); ExampleImagesWidget images(win);


app.addIdleCallback(&images);

win.setResizable(false); win.setResizable(false);
win.setSize(500, 400); win.setSize(500, 400);
win.setTitle("Images"); win.setTitle("Images");


Loading…
Cancel
Save