DPF

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

commit 91d4212e930f2ec5f3416e3a78ad3fa9e7ac6d9b
parent bc66137eb26c2668b9b75b2dda1816f064a93796
Author: falkTX <falktx@falktx.com>
Date:   Mon,  8 Mar 2021 23:38:55 +0000

Get mouse button event working at least

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdgl/NanoVG.hpp | 2++
Mdgl/src/NanoVG.cpp | 15++++++++-------
Mdgl/src/WindowPrivateData.cpp | 26++++++++++++++++++++------
Mdgl/src/WindowPrivateData.hpp | 53+++++++++++++++++++++++------------------------------
4 files changed, 53 insertions(+), 43 deletions(-)

diff --git a/dgl/NanoVG.hpp b/dgl/NanoVG.hpp @@ -305,7 +305,9 @@ public: /** Constructor reusing a NanoVG context, used for subwidgets. */ + /* NanoVG(NanoWidget* groupWidget); + */ /** Destructor. diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp @@ -240,10 +240,10 @@ NanoVG::NanoVG(int flags) fInFrame(false), fIsSubWidget(false) {} -NanoVG::NanoVG(NanoWidget* groupWidget) - : fContext(groupWidget->fContext), - fInFrame(false), - fIsSubWidget(true) {} +// NanoVG::NanoVG(NanoWidget* groupWidget) +// : fContext(groupWidget->fContext), +// fInFrame(false), +// fIsSubWidget(true) {} NanoVG::~NanoVG() { @@ -257,21 +257,20 @@ NanoVG::~NanoVG() void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor) { + fInFrame = true; if (fContext == nullptr) return; DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,); DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); - fInFrame = true; nvgBeginFrame(fContext, static_cast<int>(width), static_cast<int>(height), scaleFactor); } void NanoVG::beginFrame(Widget* const widget) { + fInFrame = true; DISTRHO_SAFE_ASSERT_RETURN(widget != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); - fInFrame = true; - if (fContext == nullptr) return; @@ -958,6 +957,7 @@ NanoWidget::NanoWidget(Widget* groupWidget, int flags) pData->needsScaling = true; } +/* NanoWidget::NanoWidget(NanoWidget* groupWidget) : Widget(groupWidget, false), NanoVG(groupWidget), @@ -967,6 +967,7 @@ NanoWidget::NanoWidget(NanoWidget* groupWidget) pData->skipDisplay = true; groupWidget->nData->subWidgets.push_back(this); } +*/ NanoWidget::~NanoWidget() { diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp @@ -129,7 +129,7 @@ void Window::PrivateData::setVisible(const bool visible) #ifdef DISTRHO_OS_WINDOWS puglShowWindowCentered(fView); #else - puglShowWindow(fView); + puglShow(fView); #endif fAppData->oneWindowShown(); fFirstInit = false; @@ -139,7 +139,7 @@ void Window::PrivateData::setVisible(const bool visible) #ifdef DISTRHO_OS_WINDOWS puglWin32RestoreWindow(fView); #else - puglShowWindow(fView); + puglShow(fView); #endif } } @@ -153,7 +153,7 @@ void Window::PrivateData::setVisible(const bool visible) } #endif - puglHideWindow(fView); + puglHide(fView); // if (fModal.enabled) // exec_fini(); @@ -270,7 +270,7 @@ printEvent(const PuglEvent* event, const char* prefix, const bool verbose) case PUGL_UNMAP: return fprintf(stderr, "%sUnmap\n", prefix); case PUGL_UPDATE: - return fprintf(stderr, "%sUpdate\n", prefix); + return 0; // fprintf(stderr, "%sUpdate\n", prefix); case PUGL_CONFIGURE: return PRINT("%sConfigure " PFMT " " PFMT "\n", prefix, @@ -350,6 +350,20 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu pData->onPuglClose(); break; + case PUGL_BUTTON_PRESS: ///< Mouse button pressed, a #PuglEventButton + case PUGL_BUTTON_RELEASE: ///< Mouse button released, a #PuglEventButton + { + Widget::MouseEvent ev; + ev.mod = event->button.state; + ev.flags = event->button.flags; + ev.time = static_cast<uint>(event->button.time * 1000.0 + 0.5); + ev.button = event->button.button; + ev.press = event->type == PUGL_BUTTON_PRESS; + ev.pos = Point<double>(event->button.x, event->button.y); + pData->onPuglMouse(ev); + break; + } + case PUGL_FOCUS_IN: ///< Keyboard focus entered view, a #PuglEventFocus case PUGL_FOCUS_OUT: ///< Keyboard focus left view, a #PuglEventFocus case PUGL_KEY_PRESS: ///< Key pressed, a #PuglEventKey @@ -357,12 +371,12 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu case PUGL_TEXT: ///< Character entered, a #PuglEventText case PUGL_POINTER_IN: ///< Pointer entered view, a #PuglEventCrossing case PUGL_POINTER_OUT: ///< Pointer left view, a #PuglEventCrossing - case PUGL_BUTTON_PRESS: ///< Mouse button pressed, a #PuglEventButton - case PUGL_BUTTON_RELEASE: ///< Mouse button released, a #PuglEventButton case PUGL_MOTION: ///< Pointer moved, a #PuglEventMotion case PUGL_SCROLL: ///< Scrolled, a #PuglEventScroll case PUGL_CLIENT: ///< Custom client message, a #PuglEventClient case PUGL_TIMER: ///< Timer triggered, a #PuglEventTimer + case PUGL_LOOP_ENTER: ///< Recursive loop entered, a #PuglEventLoopEnter + case PUGL_LOOP_LEAVE: ///< Recursive loop left, a #PuglEventLoopLeave break; } diff --git a/dgl/src/WindowPrivateData.hpp b/dgl/src/WindowPrivateData.hpp @@ -340,6 +340,29 @@ struct Window::PrivateData { } } + 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<double>(x - widget->getAbsoluteX(), + y - widget->getAbsoluteY()); + + if (widget->isVisible() && widget->onMouse(rev)) + break; + } + } + // ------------------------------------------------------------------- #ifdef DISTRHO_DEFINES_H_INCLUDED @@ -484,36 +507,6 @@ struct Window::PrivateData { return 1; } - void onPuglMouse(const int button, const bool press, int x, int y) - { - DBGp("PUGL: onMouse : %i %i %i %i\n", button, press, x, y); - - // FIXME - pugl sends 2 of these for each window on init, don't ask me why. we'll ignore it - if (press && button == 0 && x == 0 && y == 0) return; - - if (fModal.childFocus != nullptr) - return fModal.childFocus->focus(); - - x /= fAutoScaling; - y /= fAutoScaling; - - Widget::MouseEvent ev; - ev.button = button; - ev.press = press; - ev.mod = static_cast<Modifier>(puglGetModifiers(fView)); - ev.time = puglGetEventTimestamp(fView); - - FOR_EACH_WIDGET_INV(rit) - { - Widget* const widget(*rit); - - ev.pos = Point<int>(x-widget->getAbsoluteX(), y-widget->getAbsoluteY()); - - if (widget->isVisible() && widget->onMouse(ev)) - break; - } - } - void onPuglMotion(int x, int y) { // DBGp("PUGL: onMotion : %i %i\n", x, y);