Signed-off-by: falkTX <falktx@falktx.com>pull/272/head
@@ -40,7 +40,6 @@ OBJS_common = \ | |||||
../build/dgl/Window.cpp.o \ | ../build/dgl/Window.cpp.o \ | ||||
../build/dgl/WindowPrivateData.cpp.o | ../build/dgl/WindowPrivateData.cpp.o | ||||
# ../build/dgl/StandaloneWindow.cpp.o \ | |||||
# ../build/dgl/WindowFileBrowser.cpp.o | # ../build/dgl/WindowFileBrowser.cpp.o | ||||
# TODO: ImageWidgets.cpp | # TODO: ImageWidgets.cpp | ||||
@@ -65,11 +64,6 @@ OBJS_opengl = $(OBJS_common) \ | |||||
../build/dgl/NanoVG.cpp.opengl.o \ | ../build/dgl/NanoVG.cpp.opengl.o \ | ||||
../build/dgl/pugl.cpp.opengl.o | ../build/dgl/pugl.cpp.opengl.o | ||||
# ../build/dgl/Image.cpp.opengl.o \ | |||||
# ../build/dgl/ImageWidgets.cpp.opengl.o \ | |||||
# ../build/dgl/WidgetPrivateData.cpp.opengl.o \ | |||||
# ../build/dgl/WindowPrivateData.cpp.opengl.o | |||||
# ifeq ($(MACOS),true) | # ifeq ($(MACOS),true) | ||||
# OBJS_opengl += ../build/dgl/Window.mm.opengl.o | # OBJS_opengl += ../build/dgl/Window.mm.opengl.o | ||||
# else | # else | ||||
@@ -185,16 +185,6 @@ public: | |||||
const GLenum format = GL_BGRA, | const GLenum format = GL_BGRA, | ||||
const GLenum type = GL_UNSIGNED_BYTE) noexcept; | const GLenum type = GL_UNSIGNED_BYTE) noexcept; | ||||
/** | |||||
TODO document this. | |||||
*/ | |||||
void setup(); | |||||
/** | |||||
TODO document this. | |||||
*/ | |||||
void cleanup(); | |||||
/** | /** | ||||
Get the image format. | Get the image format. | ||||
*/ | */ | ||||
@@ -53,33 +53,10 @@ public: | |||||
uint getHeight() const noexcept { return Window::getHeight(); } | uint getHeight() const noexcept { return Window::getHeight(); } | ||||
const Size<uint> getSize() const noexcept { return Window::getSize(); } | const Size<uint> getSize() const noexcept { return Window::getSize(); } | ||||
void repaint() noexcept { Window::repaint(); } | void repaint() noexcept { Window::repaint(); } | ||||
/** | |||||
Overloaded functions to ensure size changes apply on both TopLevelWidget and Window classes. | |||||
*/ | |||||
void setWidth(uint width) | |||||
{ | |||||
TopLevelWidget::setWidth(width); | |||||
Window::setWidth(width); | |||||
} | |||||
void setHeight(uint height) | |||||
{ | |||||
TopLevelWidget::setHeight(height); | |||||
Window::setHeight(height); | |||||
} | |||||
void setSize(uint width, uint height) | |||||
{ | |||||
TopLevelWidget::setSize(width, height); | |||||
Window::setSize(width, height); | |||||
} | |||||
void setSize(const Size<uint>& size) | |||||
{ | |||||
TopLevelWidget::setSize(size); | |||||
Window::setSize(size); | |||||
} | |||||
void setWidth(uint width) { Window::setWidth(width); } | |||||
void setHeight(uint height) { Window::setHeight(height); } | |||||
void setSize(uint width, uint height) { Window::setSize(width, height); } | |||||
void setSize(const Size<uint>& size) { Window::setSize(size); } | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(StandaloneWindow) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(StandaloneWindow) | ||||
}; | }; | ||||
@@ -52,12 +52,14 @@ public: | |||||
/** | /** | ||||
Check if this widget contains the point defined by @a x and @a y. | Check if this widget contains the point defined by @a x and @a y. | ||||
*/ | */ | ||||
// TODO rename as containsRelativePos | |||||
template<typename T> | template<typename T> | ||||
bool contains(T x, T y) const noexcept; | bool contains(T x, T y) const noexcept; | ||||
/** | /** | ||||
Check if this widget contains the point @a pos. | Check if this widget contains the point @a pos. | ||||
*/ | */ | ||||
// TODO rename as containsRelativePos | |||||
template<typename T> | template<typename T> | ||||
bool contains(const Point<T>& pos) const noexcept; | bool contains(const Point<T>& pos) const noexcept; | ||||
@@ -119,6 +121,11 @@ public: | |||||
*/ | */ | ||||
void repaint() noexcept override; | void repaint() noexcept override; | ||||
/** | |||||
Indicate that this subwidget will draw out of bounds, and thus needs the entire viewport available for drawing. | |||||
*/ | |||||
void setNeedsFullViewportDrawing(bool needsFullViewportForDrawing = true); | |||||
protected: | protected: | ||||
/** | /** | ||||
A function called when the subwidget's absolute position is changed. | A function called when the subwidget's absolute position is changed. | ||||
@@ -271,7 +271,6 @@ protected: | |||||
/** | /** | ||||
A function called when the window is resized. | A function called when the window is resized. | ||||
If there is a top-level widget associated with this window, its size will be set right after this function. | If there is a top-level widget associated with this window, its size will be set right after this function. | ||||
TODO this seems wrong, top-level widget should be resized here | |||||
*/ | */ | ||||
virtual void onReshape(uint width, uint height); | virtual void onReshape(uint width, uint height); | ||||
@@ -551,9 +551,7 @@ ImageSlider::ImageSlider(Widget* const parentWidget, const Image& image) noexcep | |||||
fEndPos(), | fEndPos(), | ||||
fSliderArea() | fSliderArea() | ||||
{ | { | ||||
/* TODO | |||||
setNeedsFullViewport(); | |||||
*/ | |||||
setNeedsFullViewportDrawing(); | |||||
} | } | ||||
float ImageSlider::getValue() const noexcept | float ImageSlider::getValue() const noexcept | ||||
@@ -114,44 +114,81 @@ void Rectangle<T>::_draw(const bool outline) | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
static void setupOpenGLImage(const OpenGLImage& image, GLuint textureId) | |||||
{ | |||||
DISTRHO_SAFE_ASSERT_RETURN(image.isValid(),); | |||||
glEnable(GL_TEXTURE_2D); | |||||
glBindTexture(GL_TEXTURE_2D, textureId); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); | |||||
static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f }; | |||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans); | |||||
glPixelStorei(GL_PACK_ALIGNMENT, 1); | |||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | |||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, | |||||
static_cast<GLsizei>(image.getWidth()), | |||||
static_cast<GLsizei>(image.getHeight()), | |||||
0, | |||||
image.getFormat(), image.getType(), image.getRawData()); | |||||
glBindTexture(GL_TEXTURE_2D, 0); | |||||
glDisable(GL_TEXTURE_2D); | |||||
} | |||||
OpenGLImage::OpenGLImage() | OpenGLImage::OpenGLImage() | ||||
: ImageBase(), | : ImageBase(), | ||||
fFormat(0), | fFormat(0), | ||||
fType(0), | fType(0), | ||||
fTextureId(0), | fTextureId(0), | ||||
setupCalled(false) {} | |||||
setupCalled(false) | |||||
{ | |||||
glGenTextures(1, &fTextureId); | |||||
DISTRHO_SAFE_ASSERT(fTextureId != 0); | |||||
} | |||||
OpenGLImage::OpenGLImage(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) | OpenGLImage::OpenGLImage(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) | ||||
: ImageBase(rawData, width, height), | : ImageBase(rawData, width, height), | ||||
fFormat(format), | fFormat(format), | ||||
fType(type), | fType(type), | ||||
fTextureId(0), | fTextureId(0), | ||||
setupCalled(false) {} | |||||
setupCalled(false) | |||||
{ | |||||
glGenTextures(1, &fTextureId); | |||||
DISTRHO_SAFE_ASSERT(fTextureId != 0); | |||||
} | |||||
OpenGLImage::OpenGLImage(const char* const rawData, const Size<uint>& size, const GLenum format, const GLenum type) | OpenGLImage::OpenGLImage(const char* const rawData, const Size<uint>& size, const GLenum format, const GLenum type) | ||||
: ImageBase(rawData, size), | : ImageBase(rawData, size), | ||||
fFormat(format), | fFormat(format), | ||||
fType(type), | fType(type), | ||||
fTextureId(0), | fTextureId(0), | ||||
setupCalled(false) {} | |||||
setupCalled(false) | |||||
{ | |||||
glGenTextures(1, &fTextureId); | |||||
DISTRHO_SAFE_ASSERT(fTextureId != 0); | |||||
} | |||||
OpenGLImage::OpenGLImage(const OpenGLImage& image) | OpenGLImage::OpenGLImage(const OpenGLImage& image) | ||||
: ImageBase(image), | : ImageBase(image), | ||||
fFormat(image.fFormat), | fFormat(image.fFormat), | ||||
fType(image.fType), | fType(image.fType), | ||||
fTextureId(0), | fTextureId(0), | ||||
setupCalled(false) {} | |||||
setupCalled(false) | |||||
{ | |||||
glGenTextures(1, &fTextureId); | |||||
DISTRHO_SAFE_ASSERT(fTextureId != 0); | |||||
} | |||||
OpenGLImage::~OpenGLImage() | OpenGLImage::~OpenGLImage() | ||||
{ | { | ||||
if (setupCalled) { | |||||
// FIXME test if this is still necessary with new pugl | |||||
#ifndef DISTRHO_OS_MAC | |||||
if (fTextureId != 0) | |||||
cleanup(); | |||||
#endif | |||||
DISTRHO_SAFE_ASSERT(fTextureId == 0); | |||||
} | |||||
if (fTextureId != 0) | |||||
glDeleteTextures(1, &fTextureId); | |||||
} | } | ||||
void OpenGLImage::loadFromMemory(const char* const rawData, | void OpenGLImage::loadFromMemory(const char* const rawData, | ||||
@@ -175,43 +212,6 @@ void OpenGLImage::loadFromMemory(const char* const rdata, | |||||
setupCalled = false; | setupCalled = false; | ||||
} | } | ||||
void OpenGLImage::setup() | |||||
{ | |||||
setupCalled = true; | |||||
DISTRHO_SAFE_ASSERT_RETURN(fTextureId == 0,); | |||||
DISTRHO_SAFE_ASSERT_RETURN(isValid(),); | |||||
glGenTextures(1, &fTextureId); | |||||
DISTRHO_SAFE_ASSERT_RETURN(fTextureId != 0,); | |||||
glEnable(GL_TEXTURE_2D); | |||||
glBindTexture(GL_TEXTURE_2D, fTextureId); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); | |||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); | |||||
static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f }; | |||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans); | |||||
glPixelStorei(GL_PACK_ALIGNMENT, 1); | |||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | |||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, | |||||
static_cast<GLsizei>(size.getWidth()), static_cast<GLsizei>(size.getHeight()), 0, | |||||
fFormat, fType, rawData); | |||||
glBindTexture(GL_TEXTURE_2D, 0); | |||||
glDisable(GL_TEXTURE_2D); | |||||
} | |||||
void OpenGLImage::cleanup() | |||||
{ | |||||
DISTRHO_SAFE_ASSERT_RETURN(fTextureId != 0,); | |||||
glDeleteTextures(1, &fTextureId); | |||||
fTextureId = 0; | |||||
} | |||||
GLenum OpenGLImage::getFormat() const noexcept | GLenum OpenGLImage::getFormat() const noexcept | ||||
{ | { | ||||
return fFormat; | return fFormat; | ||||
@@ -249,18 +249,15 @@ void OpenGLImage::drawAt(const int x, const int y) | |||||
void OpenGLImage::drawAt(const Point<int>& pos) | void OpenGLImage::drawAt(const Point<int>& pos) | ||||
{ | { | ||||
if (isInvalid()) | |||||
if (fTextureId == 0 || isInvalid()) | |||||
return; | return; | ||||
if (! setupCalled) | if (! setupCalled) | ||||
{ | { | ||||
// TODO check if this is valid, give warning about needing to call setup/cleanup manually | |||||
setup(); | |||||
setupOpenGLImage(*this, fTextureId); | |||||
setupCalled = true; | |||||
} | } | ||||
if (fTextureId == 0) | |||||
return; | |||||
glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
glBindTexture(GL_TEXTURE_2D, fTextureId); | glBindTexture(GL_TEXTURE_2D, fTextureId); | ||||
@@ -305,7 +302,7 @@ void SubWidget::PrivateData::display(const uint width, const uint height, const | |||||
{ | { | ||||
bool needsDisableScissor = false; | bool needsDisableScissor = false; | ||||
if (absolutePos.isZero() && self->getSize() == Size<uint>(width, height)) | |||||
if (needsFullViewportForDrawing || (absolutePos.isZero() && self->getSize() == Size<uint>(width, height))) | |||||
{ | { | ||||
// full viewport size | // full viewport size | ||||
glViewport(0, | glViewport(0, | ||||
@@ -348,7 +345,7 @@ void SubWidget::PrivateData::display(const uint width, const uint height, const | |||||
needsDisableScissor = false; | needsDisableScissor = false; | ||||
} | } | ||||
// displaySubWidgets(width, height, autoScaleFactor); | |||||
selfw->pData->displaySubWidgets(width, height, autoScaleFactor); | |||||
} | } | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -365,7 +362,7 @@ void TopLevelWidget::PrivateData::display() | |||||
if (window.pData->autoScaling) | if (window.pData->autoScaling) | ||||
glViewport(0, -(height * autoScaleFactor - height), width * autoScaleFactor, height * autoScaleFactor); | glViewport(0, -(height * autoScaleFactor - height), width * autoScaleFactor, height * autoScaleFactor); | ||||
else | else | ||||
glViewport(0, -height, width, height); | |||||
glViewport(0, 0, width, height); | |||||
// main widget drawing | // main widget drawing | ||||
self->onDisplay(); | self->onDisplay(); | ||||
@@ -1,65 +0,0 @@ | |||||
/* | |||||
* DISTRHO Plugin Framework (DPF) | |||||
* Copyright (C) 2012-2020 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. | |||||
*/ | |||||
#include "../StandaloneWindow.hpp" | |||||
#include "../TopLevelWidget.hpp" | |||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
StandaloneWindow::StandaloneWindow(Application& app) | |||||
: Window(app), | |||||
TopLevelWidget(this) {} | |||||
void StandaloneWindow::exec() | |||||
{ | |||||
Window::show(); | |||||
Application::exec(); | |||||
} | |||||
void StandaloneWindow::onReshape(uint width, uint height) | |||||
{ | |||||
if (fWidget != nullptr) | |||||
fWidget->setSize(width, height); | |||||
Window::onReshape(width, height); | |||||
} | |||||
#if 0 | |||||
void StandaloneWindow::_addWidget(TopLevelWidget* widget) | |||||
{ | |||||
if (fWidget == nullptr) | |||||
{ | |||||
fWidget = widget; | |||||
fWidget->pData->needsFullViewport = true; | |||||
} | |||||
Window::_addWidget(widget); | |||||
} | |||||
void StandaloneWindow::_removeWidget(TopLevelWidget* widget) | |||||
{ | |||||
if (fWidget == widget) | |||||
{ | |||||
fWidget->pData->needsFullViewport = false; | |||||
fWidget = nullptr; | |||||
} | |||||
Window::_removeWidget(widget); | |||||
} | |||||
#endif | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL |
@@ -33,7 +33,7 @@ SubWidget::~SubWidget() | |||||
template<typename T> | template<typename T> | ||||
bool SubWidget::contains(T x, T y) const noexcept | bool SubWidget::contains(T x, T y) const noexcept | ||||
{ | { | ||||
return Rectangle<double>(getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()).contains(x, y); | |||||
return Rectangle<double>(0, 0, getWidth(), getHeight()).contains(x, y); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -111,7 +111,17 @@ void SubWidget::repaint() noexcept | |||||
return; | return; | ||||
if (TopLevelWidget* const topw = getTopLevelWidget()) | if (TopLevelWidget* const topw = getTopLevelWidget()) | ||||
topw->repaint(getConstrainedAbsoluteArea()); | |||||
{ | |||||
if (pData->needsFullViewportForDrawing) | |||||
topw->repaint(); | |||||
else | |||||
topw->repaint(getConstrainedAbsoluteArea()); | |||||
} | |||||
} | |||||
void SubWidget::setNeedsFullViewportDrawing(const bool needsFullViewportForDrawing) | |||||
{ | |||||
pData->needsFullViewportForDrawing = needsFullViewportForDrawing; | |||||
} | } | ||||
void SubWidget::onPositionChanged(const PositionChangedEvent&) | void SubWidget::onPositionChanged(const PositionChangedEvent&) | ||||
@@ -23,6 +23,7 @@ START_NAMESPACE_DGL | |||||
SubWidget::PrivateData::PrivateData(SubWidget* const s, Widget* const pw) | SubWidget::PrivateData::PrivateData(SubWidget* const s, Widget* const pw) | ||||
: self(s), | : self(s), | ||||
selfw((Widget*)s), | |||||
parentWidget(pw), | parentWidget(pw), | ||||
absolutePos(), | absolutePos(), | ||||
needsViewportScaling(false) | needsViewportScaling(false) | ||||
@@ -25,8 +25,10 @@ START_NAMESPACE_DGL | |||||
struct SubWidget::PrivateData { | struct SubWidget::PrivateData { | ||||
SubWidget* const self; | SubWidget* const self; | ||||
Widget* const selfw; | |||||
Widget* const parentWidget; | Widget* const parentWidget; | ||||
Point<int> absolutePos; | Point<int> absolutePos; | ||||
bool needsFullViewportForDrawing; // needed for widgets drawing out of bounds | |||||
bool needsViewportScaling; // needed for NanoVG | bool needsViewportScaling; // needed for NanoVG | ||||
explicit PrivateData(SubWidget* const s, Widget* const pw); | explicit PrivateData(SubWidget* const s, Widget* const pw); | ||||
@@ -205,6 +205,7 @@ void Window::PrivateData::init(const uint width, const uint height, const bool r | |||||
rect.width = width; | rect.width = width; | ||||
rect.height = height; | rect.height = height; | ||||
puglSetFrame(view, rect); | puglSetFrame(view, rect); | ||||
puglSetWindowSize(view, width, height); | |||||
// FIXME this is bad | // FIXME this is bad | ||||
puglRealize(view); | puglRealize(view); | ||||
@@ -293,16 +294,6 @@ void Window::PrivateData::hide() | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
void Window::PrivateData::focus() | |||||
{ | |||||
if (! isEmbed) | |||||
puglRaiseWindow(view); | |||||
puglGrabFocus(view); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
void Window::PrivateData::close() | void Window::PrivateData::close() | ||||
{ | { | ||||
DGL_DBG("Window close\n"); | DGL_DBG("Window close\n"); | ||||
@@ -317,6 +308,16 @@ void Window::PrivateData::close() | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
void Window::PrivateData::focus() | |||||
{ | |||||
if (! isEmbed) | |||||
puglRaiseWindow(view); | |||||
puglGrabFocus(view); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
void Window::PrivateData::setResizable(const bool resizable) | void Window::PrivateData::setResizable(const bool resizable) | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(! isEmbed,); | DISTRHO_SAFE_ASSERT_RETURN(! isEmbed,); | ||||
@@ -360,6 +361,10 @@ void Window::PrivateData::startModal() | |||||
// make parent give focus to us | // make parent give focus to us | ||||
modal.parent->modal.child = this; | modal.parent->modal.child = this; | ||||
// FIXME? | |||||
PuglRect rect = puglGetFrame(view); | |||||
puglSetDefaultSize(view, rect.width, rect.height); | |||||
// make sure both parent and ourselves are visible | // make sure both parent and ourselves are visible | ||||
modal.parent->show(); | modal.parent->show(); | ||||
show(); | show(); | ||||
@@ -446,6 +451,9 @@ void Window::PrivateData::onPuglConfigure(const int width, const int height) | |||||
if (topLevelWidget != nullptr) | if (topLevelWidget != nullptr) | ||||
topLevelWidget->setSize(width, height); | topLevelWidget->setSize(width, height); | ||||
#endif | #endif | ||||
// always repaint after a resize | |||||
puglPostRedisplay(view); | |||||
} | } | ||||
void Window::PrivateData::onPuglExpose() | void Window::PrivateData::onPuglExpose() | ||||
@@ -488,9 +496,7 @@ void Window::PrivateData::onPuglFocus(const bool focus, const CrossingMode mode) | |||||
if (modal.child != nullptr) | if (modal.child != nullptr) | ||||
return modal.child->focus(); | return modal.child->focus(); | ||||
#ifndef DPF_TEST_WINDOW_CPP | |||||
self->onFocus(focus, mode); | self->onFocus(focus, mode); | ||||
#endif | |||||
} | } | ||||
void Window::PrivateData::onPuglKey(const Events::KeyboardEvent& ev) | void Window::PrivateData::onPuglKey(const Events::KeyboardEvent& ev) | ||||
@@ -571,12 +577,16 @@ void Window::PrivateData::onPuglScroll(const Events::ScrollEvent& ev) | |||||
#endif | #endif | ||||
} | } | ||||
#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) | |||||
static int printEvent(const PuglEvent* event, const char* prefix, const bool verbose); | static int printEvent(const PuglEvent* event, const char* prefix, const bool verbose); | ||||
#endif | |||||
PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const PuglEvent* const event) | PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const PuglEvent* const event) | ||||
{ | { | ||||
printEvent(event, "pugl event: ", true); | |||||
Window::PrivateData* const pData = (Window::PrivateData*)puglGetHandle(view); | Window::PrivateData* const pData = (Window::PrivateData*)puglGetHandle(view); | ||||
#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) | |||||
printEvent(event, "pugl event: ", true); | |||||
#endif | |||||
switch (event->type) | switch (event->type) | ||||
{ | { | ||||
@@ -739,6 +749,7 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS) | |||||
static int printModifiers(const uint32_t mods) | static int printModifiers(const uint32_t mods) | ||||
{ | { | ||||
return fprintf(stderr, "Modifiers:%s%s%s%s\n", | return fprintf(stderr, "Modifiers:%s%s%s%s\n", | ||||
@@ -863,6 +874,7 @@ static int printEvent(const PuglEvent* event, const char* prefix, const bool ver | |||||
return 0; | return 0; | ||||
} | } | ||||
#endif | |||||
#undef DGL_DBG | #undef DGL_DBG | ||||
#undef DGL_DBGF | #undef DGL_DBGF | ||||
@@ -118,7 +118,6 @@ struct Window::PrivateData : IdleCallback { | |||||
void show(); | void show(); | ||||
void hide(); | void hide(); | ||||
void focus(); | |||||
/** Hide window and notify application of a window close event. | /** Hide window and notify application of a window close event. | ||||
* Does nothing if window is embed (that is, not standalone). | * Does nothing if window is embed (that is, not standalone). | ||||
@@ -129,6 +128,8 @@ struct Window::PrivateData : IdleCallback { | |||||
*/ | */ | ||||
void close(); | void close(); | ||||
void focus(); | |||||
void setResizable(bool resizable); | void setResizable(bool resizable); | ||||
const GraphicsContext& getGraphicsContext() const noexcept; | const GraphicsContext& getGraphicsContext() const noexcept; | ||||