Signed-off-by: falkTX <falktx@falktx.com>pull/272/head
@@ -305,7 +305,9 @@ public: | |||||
/** | /** | ||||
Constructor reusing a NanoVG context, used for subwidgets. | Constructor reusing a NanoVG context, used for subwidgets. | ||||
*/ | */ | ||||
/* | |||||
NanoVG(NanoWidget* groupWidget); | NanoVG(NanoWidget* groupWidget); | ||||
*/ | |||||
/** | /** | ||||
Destructor. | Destructor. | ||||
@@ -240,10 +240,10 @@ NanoVG::NanoVG(int flags) | |||||
fInFrame(false), | fInFrame(false), | ||||
fIsSubWidget(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() | NanoVG::~NanoVG() | ||||
{ | { | ||||
@@ -257,21 +257,20 @@ NanoVG::~NanoVG() | |||||
void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor) | void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor) | ||||
{ | { | ||||
fInFrame = true; | |||||
if (fContext == nullptr) return; | if (fContext == nullptr) return; | ||||
DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,); | DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,); | ||||
DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); | DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); | ||||
fInFrame = true; | |||||
nvgBeginFrame(fContext, static_cast<int>(width), static_cast<int>(height), scaleFactor); | nvgBeginFrame(fContext, static_cast<int>(width), static_cast<int>(height), scaleFactor); | ||||
} | } | ||||
void NanoVG::beginFrame(Widget* const widget) | void NanoVG::beginFrame(Widget* const widget) | ||||
{ | { | ||||
fInFrame = true; | |||||
DISTRHO_SAFE_ASSERT_RETURN(widget != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(widget != nullptr,); | ||||
DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); | DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); | ||||
fInFrame = true; | |||||
if (fContext == nullptr) | if (fContext == nullptr) | ||||
return; | return; | ||||
@@ -958,6 +957,7 @@ NanoWidget::NanoWidget(Widget* groupWidget, int flags) | |||||
pData->needsScaling = true; | pData->needsScaling = true; | ||||
} | } | ||||
/* | |||||
NanoWidget::NanoWidget(NanoWidget* groupWidget) | NanoWidget::NanoWidget(NanoWidget* groupWidget) | ||||
: Widget(groupWidget, false), | : Widget(groupWidget, false), | ||||
NanoVG(groupWidget), | NanoVG(groupWidget), | ||||
@@ -967,6 +967,7 @@ NanoWidget::NanoWidget(NanoWidget* groupWidget) | |||||
pData->skipDisplay = true; | pData->skipDisplay = true; | ||||
groupWidget->nData->subWidgets.push_back(this); | groupWidget->nData->subWidgets.push_back(this); | ||||
} | } | ||||
*/ | |||||
NanoWidget::~NanoWidget() | NanoWidget::~NanoWidget() | ||||
{ | { | ||||
@@ -129,7 +129,7 @@ void Window::PrivateData::setVisible(const bool visible) | |||||
#ifdef DISTRHO_OS_WINDOWS | #ifdef DISTRHO_OS_WINDOWS | ||||
puglShowWindowCentered(fView); | puglShowWindowCentered(fView); | ||||
#else | #else | ||||
puglShowWindow(fView); | |||||
puglShow(fView); | |||||
#endif | #endif | ||||
fAppData->oneWindowShown(); | fAppData->oneWindowShown(); | ||||
fFirstInit = false; | fFirstInit = false; | ||||
@@ -139,7 +139,7 @@ void Window::PrivateData::setVisible(const bool visible) | |||||
#ifdef DISTRHO_OS_WINDOWS | #ifdef DISTRHO_OS_WINDOWS | ||||
puglWin32RestoreWindow(fView); | puglWin32RestoreWindow(fView); | ||||
#else | #else | ||||
puglShowWindow(fView); | |||||
puglShow(fView); | |||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
@@ -153,7 +153,7 @@ void Window::PrivateData::setVisible(const bool visible) | |||||
} | } | ||||
#endif | #endif | ||||
puglHideWindow(fView); | |||||
puglHide(fView); | |||||
// if (fModal.enabled) | // if (fModal.enabled) | ||||
// exec_fini(); | // exec_fini(); | ||||
@@ -270,7 +270,7 @@ printEvent(const PuglEvent* event, const char* prefix, const bool verbose) | |||||
case PUGL_UNMAP: | case PUGL_UNMAP: | ||||
return fprintf(stderr, "%sUnmap\n", prefix); | return fprintf(stderr, "%sUnmap\n", prefix); | ||||
case PUGL_UPDATE: | case PUGL_UPDATE: | ||||
return fprintf(stderr, "%sUpdate\n", prefix); | |||||
return 0; // fprintf(stderr, "%sUpdate\n", prefix); | |||||
case PUGL_CONFIGURE: | case PUGL_CONFIGURE: | ||||
return PRINT("%sConfigure " PFMT " " PFMT "\n", | return PRINT("%sConfigure " PFMT " " PFMT "\n", | ||||
prefix, | prefix, | ||||
@@ -350,6 +350,20 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||||
pData->onPuglClose(); | pData->onPuglClose(); | ||||
break; | 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_IN: ///< Keyboard focus entered view, a #PuglEventFocus | ||||
case PUGL_FOCUS_OUT: ///< Keyboard focus left view, a #PuglEventFocus | case PUGL_FOCUS_OUT: ///< Keyboard focus left view, a #PuglEventFocus | ||||
case PUGL_KEY_PRESS: ///< Key pressed, a #PuglEventKey | 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_TEXT: ///< Character entered, a #PuglEventText | ||||
case PUGL_POINTER_IN: ///< Pointer entered view, a #PuglEventCrossing | case PUGL_POINTER_IN: ///< Pointer entered view, a #PuglEventCrossing | ||||
case PUGL_POINTER_OUT: ///< Pointer left 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_MOTION: ///< Pointer moved, a #PuglEventMotion | ||||
case PUGL_SCROLL: ///< Scrolled, a #PuglEventScroll | case PUGL_SCROLL: ///< Scrolled, a #PuglEventScroll | ||||
case PUGL_CLIENT: ///< Custom client message, a #PuglEventClient | case PUGL_CLIENT: ///< Custom client message, a #PuglEventClient | ||||
case PUGL_TIMER: ///< Timer triggered, a #PuglEventTimer | 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; | break; | ||||
} | } | ||||
@@ -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 | #ifdef DISTRHO_DEFINES_H_INCLUDED | ||||
@@ -484,36 +507,6 @@ struct Window::PrivateData { | |||||
return 1; | 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) | void onPuglMotion(int x, int y) | ||||
{ | { | ||||
// DBGp("PUGL: onMotion : %i %i\n", x, y); | // DBGp("PUGL: onMotion : %i %i\n", x, y); | ||||