Signed-off-by: falkTX <falktx@falktx.com>pull/272/head
@@ -130,6 +130,21 @@ enum CrossingMode { | |||
kCrossingUngrab ///< Crossing due to a grab release | |||
}; | |||
/** | |||
Scroll direction. | |||
Describes the direction of a scroll event along with whether the scroll is a "smooth" scroll. | |||
The discrete directions are for devices like mouse wheels with constrained axes, | |||
while a smooth scroll is for those with arbitrary scroll direction freedom, like some touchpads. | |||
*/ | |||
enum ScrollDirection { | |||
kScrollUp, ///< Scroll up | |||
kScrollDown, ///< Scroll down | |||
kScrollLeft, ///< Scroll left | |||
kScrollRight, ///< Scroll right | |||
kScrollSmooth ///< Smooth scroll in any direction | |||
}; | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Base DGL classes | |||
@@ -170,19 +170,22 @@ namespace Events | |||
Some systems and devices support finer resolution and/or higher values for fast scrolls, | |||
so programs should handle any value gracefully. | |||
@a pos The widget-relative coordinates of the pointer. | |||
@a delta The scroll distance. | |||
@a pos The widget-relative coordinates of the pointer. | |||
@a delta The scroll distance. | |||
@a direction The direction of the scroll or "smooth". | |||
@see onScroll | |||
*/ | |||
struct ScrollEvent : BaseEvent { | |||
Point<double> pos; | |||
Point<double> delta; | |||
ScrollDirection direction; | |||
/** Constuctor */ | |||
ScrollEvent() noexcept | |||
: BaseEvent(), | |||
pos(0.0, 0.0), | |||
delta(0.0, 0.0) {} | |||
delta(0.0, 0.0), | |||
direction(kScrollSmooth) {} | |||
}; | |||
/** | |||
@@ -37,7 +37,37 @@ TopLevelWidget::PrivateData::~PrivateData() | |||
window.pData->topLevelWidget = nullptr; | |||
} | |||
void TopLevelWidget::PrivateData::mouseEvent(const Events::MouseEvent& ev) | |||
bool TopLevelWidget::PrivateData::keyboardEvent(const Events::KeyboardEvent& ev) | |||
{ | |||
// give top-level widget chance to catch this event first | |||
if (self->onKeyboard(ev)) | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
return selfw->pData->giveKeyboardEventForSubWidgets(ev); | |||
} | |||
bool TopLevelWidget::PrivateData::specialEvent(const Events::SpecialEvent& ev) | |||
{ | |||
// give top-level widget chance to catch this event first | |||
if (self->onSpecial(ev)) | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
return selfw->pData->giveSpecialEventForSubWidgets(ev); | |||
} | |||
bool TopLevelWidget::PrivateData::characterInputEvent(const Events::CharacterInputEvent& ev) | |||
{ | |||
// give top-level widget chance to catch this event first | |||
if (self->onCharacterInput(ev)) | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
return selfw->pData->giveCharacterInputEventForSubWidgets(ev); | |||
} | |||
bool TopLevelWidget::PrivateData::mouseEvent(const Events::MouseEvent& ev) | |||
{ | |||
Events::MouseEvent rev = ev; | |||
@@ -51,10 +81,52 @@ void TopLevelWidget::PrivateData::mouseEvent(const Events::MouseEvent& ev) | |||
// give top-level widget chance to catch this event first | |||
if (self->onMouse(ev)) | |||
return; | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
return selfw->pData->giveMouseEventForSubWidgets(rev); | |||
} | |||
bool TopLevelWidget::PrivateData::motionEvent(const Events::MotionEvent& ev) | |||
{ | |||
Events::MotionEvent rev = ev; | |||
if (window.pData->autoScaling) | |||
{ | |||
const double autoScaleFactor = window.pData->autoScaleFactor; | |||
rev.pos.setX(ev.pos.getX() / autoScaleFactor); | |||
rev.pos.setY(ev.pos.getY() / autoScaleFactor); | |||
} | |||
// give top-level widget chance to catch this event first | |||
if (self->onMotion(ev)) | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
return selfw->pData->giveMotionEventForSubWidgets(rev); | |||
} | |||
bool TopLevelWidget::PrivateData::scrollEvent(const Events::ScrollEvent& ev) | |||
{ | |||
Events::ScrollEvent rev = ev; | |||
if (window.pData->autoScaling) | |||
{ | |||
const double autoScaleFactor = window.pData->autoScaleFactor; | |||
rev.pos.setX(ev.pos.getX() / autoScaleFactor); | |||
rev.pos.setY(ev.pos.getY() / autoScaleFactor); | |||
rev.delta.setX(ev.delta.getX() / autoScaleFactor); | |||
rev.delta.setY(ev.delta.getY() / autoScaleFactor); | |||
} | |||
// give top-level widget chance to catch this event first | |||
if (self->onScroll(ev)) | |||
return true; | |||
// propagate event to all subwidgets recursively | |||
selfw->pData->giveMouseEventForSubWidgets(rev); | |||
return selfw->pData->giveScrollEventForSubWidgets(rev); | |||
} | |||
void TopLevelWidget::PrivateData::fallbackOnResize() | |||
@@ -33,7 +33,12 @@ struct TopLevelWidget::PrivateData { | |||
explicit PrivateData(TopLevelWidget* const s, Window& w); | |||
~PrivateData(); | |||
void display(); | |||
void mouseEvent(const Events::MouseEvent& ev); | |||
bool keyboardEvent(const Events::KeyboardEvent& ev); | |||
bool specialEvent(const Events::SpecialEvent& ev); | |||
bool characterInputEvent(const Events::CharacterInputEvent& ev); | |||
bool mouseEvent(const Events::MouseEvent& ev); | |||
bool motionEvent(const Events::MotionEvent& ev); | |||
bool scrollEvent(const Events::ScrollEvent& ev); | |||
void fallbackOnResize(); | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) | |||
@@ -67,12 +67,68 @@ void Widget::PrivateData::displaySubWidgets(const uint width, const uint height, | |||
} | |||
} | |||
void Widget::PrivateData::giveMouseEventForSubWidgets(Events::MouseEvent& ev) | |||
// ----------------------------------------------------------------------- | |||
bool Widget::PrivateData::giveKeyboardEventForSubWidgets(const Events::KeyboardEvent& ev) | |||
{ | |||
if (! visible) | |||
return; | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return; | |||
return false; | |||
FOR_EACH_SUBWIDGET_INV(rit) | |||
{ | |||
SubWidget* const widget(*rit); | |||
if (widget->isVisible() && widget->onKeyboard(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool Widget::PrivateData::giveSpecialEventForSubWidgets(const Events::SpecialEvent& ev) | |||
{ | |||
if (! visible) | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return false; | |||
FOR_EACH_SUBWIDGET_INV(rit) | |||
{ | |||
SubWidget* const widget(*rit); | |||
if (widget->isVisible() && widget->onSpecial(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool Widget::PrivateData::giveCharacterInputEventForSubWidgets(const Events::CharacterInputEvent& ev) | |||
{ | |||
if (! visible) | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return false; | |||
FOR_EACH_SUBWIDGET_INV(rit) | |||
{ | |||
SubWidget* const widget(*rit); | |||
if (widget->isVisible() && widget->onCharacterInput(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool Widget::PrivateData::giveMouseEventForSubWidgets(Events::MouseEvent& ev) | |||
{ | |||
if (! visible) | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return false; | |||
const double x = ev.pos.getX(); | |||
const double y = ev.pos.getY(); | |||
@@ -88,8 +144,64 @@ void Widget::PrivateData::giveMouseEventForSubWidgets(Events::MouseEvent& ev) | |||
y - widget->getAbsoluteY()); | |||
if (widget->onMouse(ev)) | |||
return; | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool Widget::PrivateData::giveMotionEventForSubWidgets(Events::MotionEvent& ev) | |||
{ | |||
if (! visible) | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return false; | |||
const double x = ev.pos.getX(); | |||
const double y = ev.pos.getY(); | |||
FOR_EACH_SUBWIDGET_INV(rit) | |||
{ | |||
SubWidget* const widget(*rit); | |||
if (! widget->isVisible()) | |||
continue; | |||
ev.pos = Point<double>(x - widget->getAbsoluteX(), | |||
y - widget->getAbsoluteY()); | |||
if (widget->onMotion(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool Widget::PrivateData::giveScrollEventForSubWidgets(Events::ScrollEvent& ev) | |||
{ | |||
if (! visible) | |||
return false; | |||
if (subWidgets.size() == 0) | |||
return false; | |||
const double x = ev.pos.getX(); | |||
const double y = ev.pos.getY(); | |||
FOR_EACH_SUBWIDGET_INV(rit) | |||
{ | |||
SubWidget* const widget(*rit); | |||
if (! widget->isVisible()) | |||
continue; | |||
ev.pos = Point<double>(x - widget->getAbsoluteX(), | |||
y - widget->getAbsoluteY()); | |||
if (widget->onScroll(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
// ----------------------------------------------------------------------- | |||
@@ -42,7 +42,13 @@ struct Widget::PrivateData { | |||
~PrivateData(); | |||
void displaySubWidgets(uint width, uint height, double autoScaleFactor); | |||
void giveMouseEventForSubWidgets(Events::MouseEvent& ev); | |||
bool giveKeyboardEventForSubWidgets(const Events::KeyboardEvent& ev); | |||
bool giveSpecialEventForSubWidgets(const Events::SpecialEvent& ev); | |||
bool giveCharacterInputEventForSubWidgets(const Events::CharacterInputEvent& ev); | |||
bool giveMouseEventForSubWidgets(Events::MouseEvent& ev); | |||
bool giveMotionEventForSubWidgets(Events::MotionEvent& ev); | |||
bool giveScrollEventForSubWidgets(Events::ScrollEvent& ev); | |||
static TopLevelWidget* findTopLevelWidget(Widget* const w); | |||
@@ -384,9 +384,48 @@ void Window::PrivateData::onPuglClose() | |||
close(); | |||
} | |||
void Window::PrivateData::onPuglKey(const Events::KeyboardEvent& ev) | |||
{ | |||
DGL_DBGp("onPuglKey : %i %u %u\n", ev.press, ev.key, ev.keycode); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->pData->keyboardEvent(ev); | |||
#endif | |||
} | |||
void Window::PrivateData::onPuglSpecial(const Events::SpecialEvent& ev) | |||
{ | |||
DGL_DBGp("onPuglSpecial : %i %u\n", ev.press, ev.key); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->pData->specialEvent(ev); | |||
#endif | |||
} | |||
void Window::PrivateData::onPuglText(const Events::CharacterInputEvent& ev) | |||
{ | |||
DGL_DBGp("onPuglText : %u %u %s\n", ev.keycode, ev.character, ev.string); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->pData->characterInputEvent(ev); | |||
#endif | |||
} | |||
void Window::PrivateData::onPuglMouse(const Events::MouseEvent& ev) | |||
{ | |||
DGL_DBGp("PUGL: onMouse : %i %i %f %f\n", ev.button, ev.press, ev.pos.getX(), ev.pos.getY()); | |||
DGL_DBGp("onPuglMouse : %i %i %f %f\n", ev.button, ev.press, ev.pos.getX(), ev.pos.getY()); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
@@ -397,6 +436,32 @@ void Window::PrivateData::onPuglMouse(const Events::MouseEvent& ev) | |||
#endif | |||
} | |||
void Window::PrivateData::onPuglMotion(const Events::MotionEvent& ev) | |||
{ | |||
DGL_DBGp("onPuglMotion : %f %f\n", ev.button, ev.pos.getX(), ev.pos.getY()); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->pData->motionEvent(ev); | |||
#endif | |||
} | |||
void Window::PrivateData::onPuglScroll(const Events::ScrollEvent& ev) | |||
{ | |||
DGL_DBGp("onPuglScroll : %f %f %f %f\n", ev.pos.getX(), ev.pos.getY(), ev.delta.getX(), ev.delta.getY()); | |||
// if (fModal.childFocus != nullptr) | |||
// return fModal.childFocus->focus(); | |||
#ifndef DPF_TEST_WINDOW_CPP | |||
if (topLevelWidget != nullptr) | |||
topLevelWidget->pData->scrollEvent(ev); | |||
#endif | |||
} | |||
static int printEvent(const PuglEvent* event, const char* prefix, const bool verbose); | |||
PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const PuglEvent* const event) | |||
@@ -424,6 +489,7 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||
///< View moved/resized, a #PuglEventConfigure | |||
case PUGL_CONFIGURE: | |||
// unused x, y (double) | |||
pData->onPuglConfigure(event->configure.width, event->configure.height); | |||
break; | |||
@@ -441,6 +507,7 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||
///< View must be drawn, a #PuglEventExpose | |||
case PUGL_EXPOSE: | |||
// unused x, y, width, height (double) | |||
pData->onPuglExpose(); | |||
break; | |||
@@ -459,14 +526,38 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||
///< Key pressed, a #PuglEventKey | |||
case PUGL_KEY_PRESS: | |||
break; | |||
///< Key released, a #PuglEventKey | |||
case PUGL_KEY_RELEASE: | |||
{ | |||
// unused x, y, xRoot, yRoot (double) | |||
// TODO special keys? | |||
Events::KeyboardEvent ev; | |||
ev.mod = event->key.state; | |||
ev.flags = event->key.flags; | |||
ev.time = static_cast<uint>(event->key.time * 1000.0 + 0.5); | |||
ev.press = event->type == PUGL_KEY_PRESS; | |||
ev.key = event->key.key; | |||
ev.keycode = event->key.keycode; | |||
if ((ev.mod & kModifierShift) != 0 && ev.key >= 'a' && ev.key <= 'z') | |||
ev.key -= 'a' - 'A'; // a-z -> A-Z | |||
pData->onPuglKey(ev); | |||
break; | |||
} | |||
///< Character entered, a #PuglEventText | |||
case PUGL_TEXT: | |||
{ | |||
// unused x, y, xRoot, yRoot (double) | |||
Events::CharacterInputEvent ev; | |||
ev.mod = event->text.state; | |||
ev.flags = event->text.flags; | |||
ev.time = static_cast<uint>(event->text.time * 1000.0 + 0.5); | |||
ev.keycode = event->text.keycode; | |||
ev.character = event->text.character; | |||
std::strncpy(ev.string, event->text.string, sizeof(ev.string)); | |||
pData->onPuglText(ev); | |||
break; | |||
} | |||
///< Pointer entered view, a #PuglEventCrossing | |||
case PUGL_POINTER_IN: | |||
@@ -493,11 +584,29 @@ PuglStatus Window::PrivateData::puglEventCallback(PuglView* const view, const Pu | |||
///< Pointer moved, a #PuglEventMotion | |||
case PUGL_MOTION: | |||
{ | |||
Events::MotionEvent ev; | |||
ev.mod = event->motion.state; | |||
ev.flags = event->motion.flags; | |||
ev.time = static_cast<uint>(event->motion.time * 1000.0 + 0.5); | |||
ev.pos = Point<double>(event->motion.x, event->motion.y); | |||
pData->onPuglMotion(ev); | |||
break; | |||
} | |||
///< Scrolled, a #PuglEventScroll | |||
case PUGL_SCROLL: | |||
{ | |||
Events::ScrollEvent ev; | |||
ev.mod = event->scroll.state; | |||
ev.flags = event->scroll.flags; | |||
ev.time = static_cast<uint>(event->scroll.time * 1000.0 + 0.5); | |||
ev.pos = Point<double>(event->scroll.x, event->scroll.y); | |||
ev.delta = Point<double>(event->scroll.dx, event->scroll.dy); | |||
ev.direction = static_cast<ScrollDirection>(event->scroll.direction); | |||
pData->onPuglScroll(ev); | |||
break; | |||
} | |||
///< Custom client message, a #PuglEventClient | |||
case PUGL_CLIENT: | |||
@@ -646,6 +755,9 @@ static int printEvent(const PuglEvent* event, const char* prefix, const bool ver | |||
return 0; | |||
} | |||
#undef DGL_DBG | |||
#undef DGL_DBGF | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -109,20 +109,16 @@ struct Window::PrivateData : IdleCallback { | |||
void onPuglConfigure(int width, int height); | |||
void onPuglExpose(); | |||
void onPuglClose(); | |||
void onPuglKey(const Events::KeyboardEvent& ev); | |||
void onPuglSpecial(const Events::SpecialEvent& ev); | |||
void onPuglText(const Events::CharacterInputEvent& ev); | |||
void onPuglMouse(const Events::MouseEvent& ev); | |||
void onPuglMotion(const Events::MotionEvent& ev); | |||
void onPuglScroll(const Events::ScrollEvent& ev); | |||
// Pugl event handling entry point | |||
static PuglStatus puglEventCallback(PuglView* view, const PuglEvent* event); | |||
#if 0 | |||
// Fallback build-specific Window functions | |||
struct Fallback { | |||
static void onDisplayBefore(const GraphicsContext& context); | |||
static void onDisplayAfter(const GraphicsContext& context); | |||
static void onReshape(const GraphicsContext& context, uint width, uint height); | |||
}; | |||
#endif | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) | |||
}; | |||
@@ -185,33 +181,6 @@ END_NAMESPACE_DGL | |||
#endif | |||
#endif | |||
#if 0 // ndef DPF_TEST_WINDOW_CPP | |||
// ------------------------------------------------------------------- | |||
// stuff that uses pugl internals or build-specific things | |||
void init(const bool resizable = false); | |||
void setVisible(const bool visible); | |||
void windowSpecificIdle(); | |||
// ------------------------------------------------------------------- | |||
// ------------------------------------------------------------------- | |||
void addWidget(Widget* const widget); | |||
void removeWidget(Widget* const widget); | |||
// ------------------------------------------------------------------- | |||
void onPuglClose(); | |||
void onPuglMouse(const Widget::MouseEvent& ev); | |||
// ------------------------------------------------------------------- | |||
#endif | |||
// #ifdef DISTRHO_DEFINES_H_INCLUDED | |||
// friend class DISTRHO_NAMESPACE::UI; | |||
// #endif | |||
#if 0 | |||
// ----------------------------------------------------------------------- | |||
// Window Private | |||
@@ -287,147 +256,6 @@ struct Window::PrivateData { | |||
// ------------------------------------------------------------------- | |||
// ------------------------------------------------------------------- | |||
int onPuglKeyboard(const bool press, const uint key) | |||
{ | |||
DBGp("PUGL: onKeyboard : %i %i\n", press, key); | |||
if (fModal.childFocus != nullptr) | |||
{ | |||
fModal.childFocus->focus(); | |||
return 0; | |||
} | |||
Widget::KeyboardEvent ev; | |||
ev.press = press; | |||
ev.key = key; | |||
ev.mod = static_cast<Modifier>(puglGetModifiers(fView)); | |||
ev.time = puglGetEventTimestamp(fView); | |||
FOR_EACH_WIDGET_INV(rit) | |||
{ | |||
Widget* const widget(*rit); | |||
if (widget->isVisible() && widget->onKeyboard(ev)) | |||
return 0; | |||
} | |||
return 1; | |||
} | |||
int onPuglSpecial(const bool press, const Key key) | |||
{ | |||
DBGp("PUGL: onSpecial : %i %i\n", press, key); | |||
if (fModal.childFocus != nullptr) | |||
{ | |||
fModal.childFocus->focus(); | |||
return 0; | |||
} | |||
Widget::SpecialEvent ev; | |||
ev.press = press; | |||
ev.key = key; | |||
ev.mod = static_cast<Modifier>(puglGetModifiers(fView)); | |||
ev.time = puglGetEventTimestamp(fView); | |||
FOR_EACH_WIDGET_INV(rit) | |||
{ | |||
Widget* const widget(*rit); | |||
if (widget->isVisible() && widget->onSpecial(ev)) | |||
return 0; | |||
} | |||
return 1; | |||
} | |||
void onPuglMotion(int x, int y) | |||
{ | |||
// DBGp("PUGL: onMotion : %i %i\n", x, y); | |||
if (fModal.childFocus != nullptr) | |||
return; | |||
x /= fAutoScaling; | |||
y /= fAutoScaling; | |||
Widget::MotionEvent ev; | |||
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->onMotion(ev)) | |||
break; | |||
} | |||
} | |||
void onPuglScroll(int x, int y, float dx, float dy) | |||
{ | |||
DBGp("PUGL: onScroll : %i %i %f %f\n", x, y, dx, dy); | |||
if (fModal.childFocus != nullptr) | |||
return; | |||
x /= fAutoScaling; | |||
y /= fAutoScaling; | |||
dx /= fAutoScaling; | |||
dy /= fAutoScaling; | |||
Widget::ScrollEvent ev; | |||
ev.delta = Point<float>(dx, dy); | |||
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->onScroll(ev)) | |||
break; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
bool handlePluginKeyboard(const bool press, const uint key) | |||
{ | |||
DBGp("PUGL: handlePluginKeyboard : %i %i\n", press, key); | |||
if (fModal.childFocus != nullptr) | |||
{ | |||
fModal.childFocus->focus(); | |||
return true; | |||
} | |||
Widget::KeyboardEvent ev; | |||
ev.press = press; | |||
ev.key = key; | |||
ev.mod = static_cast<Modifier>(fView->mods); | |||
ev.time = 0; | |||
if ((ev.mod & kModifierShift) != 0 && ev.key >= 'a' && ev.key <= 'z') | |||
ev.key -= 'a' - 'A'; // a-z -> A-Z | |||
FOR_EACH_WIDGET_INV(rit) | |||
{ | |||
Widget* const widget(*rit); | |||
if (widget->isVisible() && widget->onKeyboard(ev)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
bool handlePluginSpecial(const bool press, const Key key) | |||
{ | |||
DBGp("PUGL: handlePluginSpecial : %i %i\n", press, key); | |||
@@ -519,7 +347,4 @@ struct Window::PrivateData { | |||
}; | |||
#endif | |||
// #undef DGL_DBG | |||
// #undef DGL_DBGF | |||
#endif // DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED |