@@ -27,10 +27,10 @@ class Image | |||||
{ | { | ||||
public: | public: | ||||
Image(); | Image(); | ||||
Image(const char* data, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE); | |||||
Image(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE); | |||||
Image(const Image& image); | Image(const Image& image); | ||||
void loadFromMemory(const char* data, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE); | |||||
void loadFromMemory(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE); | |||||
bool isValid() const; | bool isValid() const; | ||||
@@ -38,12 +38,14 @@ public: | |||||
int getHeight() const; | int getHeight() const; | ||||
const Size<int>& getSize() const; | const Size<int>& getSize() const; | ||||
const char* getData() const; | |||||
const char* getRawData() const; | |||||
GLenum getFormat() const; | GLenum getFormat() const; | ||||
GLenum getType() const; | GLenum getType() const; | ||||
Image& operator=(const Image& image); | |||||
private: | private: | ||||
const char* fData; | |||||
const char* fRawData; | |||||
Size<int> fSize; | Size<int> fSize; | ||||
GLenum fFormat; | GLenum fFormat; | ||||
GLenum fType; | GLenum fType; | ||||
@@ -28,22 +28,35 @@ class Window; | |||||
class Widget | class Widget | ||||
{ | { | ||||
public: | public: | ||||
Widget(Window* parent = nullptr); | |||||
Widget(Window* parent); | |||||
virtual ~Widget(); | virtual ~Widget(); | ||||
bool isVisible(); | |||||
void setVisible(bool yesNo); | |||||
void show() | |||||
{ | |||||
setVisible(true); | |||||
} | |||||
void hide() | |||||
{ | |||||
setVisible(false); | |||||
} | |||||
protected: | protected: | ||||
void onDisplay(); | |||||
void onKeyboard(bool press, uint32_t key); | |||||
void onMouse(int button, bool press, int x, int y); | |||||
void onMotion(int x, int y); | |||||
void onScroll(float dx, float dy); | |||||
void onSpecial(bool press, Key key); | |||||
void onReshape(int width, int height); | |||||
void onClose(); | |||||
virtual void onDisplay(); | |||||
virtual void onKeyboard(bool press, uint32_t key); | |||||
virtual void onMouse(int button, bool press, int x, int y); | |||||
virtual void onMotion(int x, int y); | |||||
virtual void onScroll(float dx, float dy); | |||||
virtual void onSpecial(bool press, Key key); | |||||
virtual void onReshape(int width, int height); | |||||
virtual void onClose(); | |||||
private: | private: | ||||
class Private; | |||||
Private* const kPrivate; | |||||
Window* fParent; | |||||
bool fVisible; | |||||
friend class Window; | friend class Window; | ||||
}; | }; | ||||
@@ -24,6 +24,7 @@ START_NAMESPACE_DISTRHO | |||||
// ------------------------------------------------- | // ------------------------------------------------- | ||||
class App; | class App; | ||||
class Widget; | |||||
class Window | class Window | ||||
{ | { | ||||
@@ -39,10 +40,15 @@ public: | |||||
bool isVisible(); | bool isVisible(); | ||||
void setVisible(bool yesNo); | void setVisible(bool yesNo); | ||||
void setResizable(bool yesNo); | |||||
void setSize(unsigned int width, unsigned int height); | |||||
void setWindowTitle(const char* title); | void setWindowTitle(const char* title); | ||||
intptr_t getWindowId(); | intptr_t getWindowId(); | ||||
void addWidget(Widget* widget); | |||||
void removeWidget(Widget* widget); | |||||
void show() | void show() | ||||
{ | { | ||||
setVisible(true); | setVisible(true); | ||||
@@ -0,0 +1,101 @@ | |||||
/* | |||||
* DISTRHO Plugin Toolkit (DPT) | |||||
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Lesser General Public License for more details. | |||||
* | |||||
* For a full copy of the license see the LGPL.txt file | |||||
*/ | |||||
#include "../Image.hpp" | |||||
START_NAMESPACE_DISTRHO | |||||
// ------------------------------------------------- | |||||
Image::Image() | |||||
: fRawData(nullptr), | |||||
fSize(0, 0), | |||||
fFormat(0), | |||||
fType(0) | |||||
{ | |||||
} | |||||
Image::Image(const char* rawData, const Size<int>& size, GLenum format, GLenum type) | |||||
: fRawData(rawData), | |||||
fSize(size), | |||||
fFormat(format), | |||||
fType(type) | |||||
{ | |||||
} | |||||
Image::Image(const Image& image) | |||||
: fRawData(image.fRawData), | |||||
fSize(image.fSize), | |||||
fFormat(image.fFormat), | |||||
fType(image.fType) | |||||
{ | |||||
} | |||||
void Image::loadFromMemory(const char* rawData, const Size<int>& size, GLenum format, GLenum type) | |||||
{ | |||||
fRawData = rawData; | |||||
fSize = size; | |||||
fFormat = format; | |||||
fType = type; | |||||
} | |||||
bool Image::isValid() const | |||||
{ | |||||
return (fRawData != nullptr && getWidth() > 0 && getHeight() > 0); | |||||
} | |||||
int Image::getWidth() const | |||||
{ | |||||
return fSize.getWidth(); | |||||
} | |||||
int Image::getHeight() const | |||||
{ | |||||
return fSize.getHeight(); | |||||
} | |||||
const Size<int>& Image::getSize() const | |||||
{ | |||||
return fSize; | |||||
} | |||||
const char* Image::getRawData() const | |||||
{ | |||||
return fRawData; | |||||
} | |||||
GLenum Image::getFormat() const | |||||
{ | |||||
return fFormat; | |||||
} | |||||
GLenum Image::getType() const | |||||
{ | |||||
return fType; | |||||
} | |||||
Image& Image::operator=(const Image& image) | |||||
{ | |||||
fRawData = image.fRawData; | |||||
fSize = image.fSize; | |||||
fFormat = image.fFormat; | |||||
fType = image.fType; | |||||
return *this; | |||||
} | |||||
// ------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -18,58 +18,40 @@ | |||||
#include "../Widget.hpp" | #include "../Widget.hpp" | ||||
#include "../Window.hpp" | #include "../Window.hpp" | ||||
START_NAMESPACE_DISTRHO | |||||
// ------------------------------------------------- | |||||
// Window Private | |||||
#include <cstdio> | |||||
class Widget::Private | |||||
{ | |||||
public: | |||||
Private(Window* parent) | |||||
: fApp(nullptr), | |||||
fWindow(nullptr) | |||||
{ | |||||
if (parent == nullptr) | |||||
{ | |||||
fApp = new App; | |||||
fWindow = new Window(fApp); | |||||
} | |||||
} | |||||
~Private() | |||||
{ | |||||
if (fWindow != nullptr) | |||||
delete fWindow; | |||||
if (fApp != nullptr) | |||||
delete fApp; | |||||
} | |||||
private: | |||||
App* fApp; | |||||
Window* fWindow; | |||||
}; | |||||
START_NAMESPACE_DISTRHO | |||||
// ------------------------------------------------- | // ------------------------------------------------- | ||||
// Widget | // Widget | ||||
Widget::Widget(Window* parent) | Widget::Widget(Window* parent) | ||||
: kPrivate(new Private(parent)) | |||||
: fParent(parent), | |||||
fVisible(true) | |||||
{ | { | ||||
parent->addWidget(this); | |||||
} | } | ||||
Widget::~Widget() | Widget::~Widget() | ||||
{ | { | ||||
} | } | ||||
void Widget::onDisplay() | |||||
bool Widget::isVisible() | |||||
{ | { | ||||
//if (fParent == nullptr) | |||||
// glColor3f(0.0f, 1.0f, 0.0f); | |||||
//else | |||||
glColor3f(0.0f, 0.0f, 1.0f); | |||||
glRectf(-0.75f, 0.75f, 0.75f, -0.75f); | |||||
return fVisible; | |||||
} | |||||
void Widget::setVisible(bool yesNo) | |||||
{ | |||||
if (yesNo == fVisible) | |||||
return; | |||||
fVisible = yesNo; | |||||
fParent->repaint(); | |||||
} | |||||
void Widget::onDisplay() | |||||
{ | |||||
} | } | ||||
void Widget::onKeyboard(bool, uint32_t) | void Widget::onKeyboard(bool, uint32_t) | ||||
@@ -58,7 +58,7 @@ public: | |||||
Private(Window* self, App::Private* app, Private* parent, intptr_t parentId = 0) | Private(Window* self, App::Private* app, Private* parent, intptr_t parentId = 0) | ||||
: kApp(app), | : kApp(app), | ||||
kSelf(self), | kSelf(self), | ||||
kView(puglCreate(parentId, "test", 300, 100, false, false)), | |||||
kView(puglCreate(parentId, "Window", 600, 500, false, false)), | |||||
fParent(parent), | fParent(parent), | ||||
fChildFocus(nullptr), | fChildFocus(nullptr), | ||||
fVisible(false), | fVisible(false), | ||||
@@ -75,6 +75,12 @@ public: | |||||
if (kView == nullptr) | if (kView == nullptr) | ||||
return; | return; | ||||
// we can't have both | |||||
if (parent != nullptr) | |||||
{ | |||||
assert(parentId != 0); | |||||
} | |||||
puglSetHandle(kView, this); | puglSetHandle(kView, this); | ||||
puglSetDisplayFunc(kView, onDisplayCallback); | puglSetDisplayFunc(kView, onDisplayCallback); | ||||
puglSetKeyboardFunc(kView, onKeyboardCallback); | puglSetKeyboardFunc(kView, onKeyboardCallback); | ||||
@@ -85,21 +91,13 @@ public: | |||||
puglSetReshapeFunc(kView, onReshapeCallback); | puglSetReshapeFunc(kView, onReshapeCallback); | ||||
puglSetCloseFunc(kView, onCloseCallback); | puglSetCloseFunc(kView, onCloseCallback); | ||||
#if DISTRHO_OS_LINUX | |||||
PuglInternals* impl = kView->impl; | PuglInternals* impl = kView->impl; | ||||
#if DISTRHO_OS_WINDOWS | |||||
//hwnd = impl->hwnd; | |||||
if (parent != nullptr) | |||||
{ | |||||
//PuglInternals* parentImpl = parent->kView->impl; | |||||
//SetParent(parentImpl->hwnd, hwnd); | |||||
} | |||||
#elif DISTRHO_OS_LINUX | |||||
xDisplay = impl->display; | xDisplay = impl->display; | ||||
xWindow = impl->win; | xWindow = impl->win; | ||||
if (parent != nullptr) | |||||
if (parent != nullptr && parentId == 0) | |||||
{ | { | ||||
PuglInternals* parentImpl = parent->kView->impl; | PuglInternals* parentImpl = parent->kView->impl; | ||||
bool parentWasVisible = parent->isVisible(); | bool parentWasVisible = parent->isVisible(); | ||||
@@ -232,18 +230,10 @@ public: | |||||
UpdateWindow(hwnd); | UpdateWindow(hwnd); | ||||
#elif DISTRHO_OS_LINUX | #elif DISTRHO_OS_LINUX | ||||
XEvent event; | |||||
if (yesNo) | if (yesNo) | ||||
{ | |||||
XMapRaised(xDisplay, xWindow); | XMapRaised(xDisplay, xWindow); | ||||
XIfEvent(xDisplay, &event, &isMapNotify, (XPointer)&xWindow); | |||||
} | |||||
else | else | ||||
{ | |||||
XUnmapWindow(xDisplay, xWindow); | XUnmapWindow(xDisplay, xWindow); | ||||
XIfEvent(xDisplay, &event, &isUnmapNotify, (XPointer)&xWindow); | |||||
} | |||||
XFlush(xDisplay); | XFlush(xDisplay); | ||||
#endif | #endif | ||||
@@ -254,6 +244,24 @@ public: | |||||
kApp->oneHidden(); | kApp->oneHidden(); | ||||
} | } | ||||
void setSize(unsigned int width, unsigned int height) | |||||
{ | |||||
#if DISTRHO_OS_LINUX | |||||
XSizeHints sizeHints; | |||||
memset(&sizeHints, 0, sizeof(sizeHints)); | |||||
sizeHints.flags = PMinSize|PMaxSize; | |||||
sizeHints.min_width = width; | |||||
sizeHints.min_height = height; | |||||
sizeHints.max_width = width; | |||||
sizeHints.max_height = height; | |||||
XSetNormalHints(xDisplay, xWindow, &sizeHints); | |||||
XFlush(xDisplay); | |||||
#endif | |||||
repaint(); | |||||
} | |||||
void setWindowTitle(const char* title) | void setWindowTitle(const char* title) | ||||
{ | { | ||||
#if DISTRHO_OS_WINDOWS | #if DISTRHO_OS_WINDOWS | ||||
@@ -269,6 +277,16 @@ public: | |||||
return puglGetNativeWindow(kView); | return puglGetNativeWindow(kView); | ||||
} | } | ||||
void addWidget(Widget* widget) | |||||
{ | |||||
fWidgets.push_back(widget); | |||||
} | |||||
void removeWidget(Widget* widget) | |||||
{ | |||||
fWidgets.remove(widget); | |||||
} | |||||
protected: | protected: | ||||
void onDisplay() | void onDisplay() | ||||
{ | { | ||||
@@ -277,7 +295,8 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onDisplay(); | |||||
if (widget->isVisible()) | |||||
widget->onDisplay(); | |||||
} | } | ||||
} | } | ||||
@@ -289,7 +308,8 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onKeyboard(press, key); | |||||
if (widget->isVisible()) | |||||
widget->onKeyboard(press, key); | |||||
} | } | ||||
} | } | ||||
@@ -301,7 +321,8 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onMouse(button, press, x, y); | |||||
if (widget->isVisible()) | |||||
widget->onMouse(button, press, x, y); | |||||
} | } | ||||
} | } | ||||
@@ -313,7 +334,8 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onMotion(x, y); | |||||
if (widget->isVisible()) | |||||
widget->onMotion(x, y); | |||||
} | } | ||||
} | } | ||||
@@ -325,7 +347,8 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onScroll(dx, dy); | |||||
if (widget->isVisible()) | |||||
widget->onScroll(dx, dy); | |||||
} | } | ||||
} | } | ||||
@@ -337,13 +360,13 @@ protected: | |||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
widget->onSpecial(press, key); | |||||
if (widget->isVisible()) | |||||
widget->onSpecial(press, key); | |||||
} | } | ||||
} | } | ||||
void onReshape(int width, int height) | void onReshape(int width, int height) | ||||
{ | { | ||||
FOR_EACH_WIDGET(it) | FOR_EACH_WIDGET(it) | ||||
{ | { | ||||
Widget* widget = *it; | Widget* widget = *it; | ||||
@@ -482,6 +505,11 @@ void Window::setVisible(bool yesNo) | |||||
kPrivate->setVisible(yesNo); | kPrivate->setVisible(yesNo); | ||||
} | } | ||||
void Window::setSize(unsigned int width, unsigned int height) | |||||
{ | |||||
kPrivate->setSize(width, height); | |||||
} | |||||
void Window::setWindowTitle(const char* title) | void Window::setWindowTitle(const char* title) | ||||
{ | { | ||||
kPrivate->setWindowTitle(title); | kPrivate->setWindowTitle(title); | ||||
@@ -492,6 +520,16 @@ intptr_t Window::getWindowId() | |||||
return kPrivate->getWindowId(); | return kPrivate->getWindowId(); | ||||
} | } | ||||
void Window::addWidget(Widget* widget) | |||||
{ | |||||
kPrivate->addWidget(widget); | |||||
} | |||||
void Window::removeWidget(Widget* widget) | |||||
{ | |||||
kPrivate->removeWidget(widget); | |||||
} | |||||
// ------------------------------------------------- | // ------------------------------------------------- | ||||
END_NAMESPACE_DISTRHO | END_NAMESPACE_DISTRHO |