DPF

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

commit e65346c24a47287d8cc1f0058f25f12399b4777a
parent 9c1aa0c37c27a4158a4d1dec1ee94e757ea5227d
Author: falkTX <falktx@gmail.com>
Date:   Thu,  8 Oct 2015 00:22:37 +0200

Pass non-handled keyboard events to parent window (X11 only)
Closes #2

Diffstat:
Mdgl/src/Window.cpp | 30++++++++++++++++++++----------
Mdgl/src/pugl/pugl.h | 6++++--
Mdgl/src/pugl/pugl_x11.c | 19++++++++++++++++---
3 files changed, 40 insertions(+), 15 deletions(-)

diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp @@ -677,12 +677,15 @@ struct Window::PrivateData { fSelf->onDisplayAfter(); } - void onPuglKeyboard(const bool press, const uint key) + int onPuglKeyboard(const bool press, const uint key) { DBGp("PUGL: onKeyboard : %i %i\n", press, key); if (fModal.childFocus != nullptr) - return fModal.childFocus->focus(); + { + fModal.childFocus->focus(); + return 0; + } Widget::KeyboardEvent ev; ev.press = press; @@ -695,16 +698,21 @@ struct Window::PrivateData { Widget* const widget(*rit); if (widget->isVisible() && widget->onKeyboard(ev)) - break; + return 0; } + + return 1; } - void onPuglSpecial(const bool press, const Key key) + int onPuglSpecial(const bool press, const Key key) { DBGp("PUGL: onSpecial : %i %i\n", press, key); if (fModal.childFocus != nullptr) - return fModal.childFocus->focus(); + { + fModal.childFocus->focus(); + return 0; + } Widget::SpecialEvent ev; ev.press = press; @@ -717,8 +725,10 @@ struct Window::PrivateData { Widget* const widget(*rit); if (widget->isVisible() && widget->onSpecial(ev)) - break; + return 0; } + + return 1; } void onPuglMouse(const int button, const bool press, const int x, const int y) @@ -889,14 +899,14 @@ struct Window::PrivateData { handlePtr->onPuglDisplay(); } - static void onKeyboardCallback(PuglView* view, bool press, uint32_t key) + static int onKeyboardCallback(PuglView* view, bool press, uint32_t key) { - handlePtr->onPuglKeyboard(press, key); + return handlePtr->onPuglKeyboard(press, key); } - static void onSpecialCallback(PuglView* view, bool press, PuglKey key) + static int onSpecialCallback(PuglView* view, bool press, PuglKey key) { - handlePtr->onPuglSpecial(press, static_cast<Key>(key)); + return handlePtr->onPuglSpecial(press, static_cast<Key>(key)); } static void onMouseCallback(PuglView* view, int button, bool press, int x, int y) diff --git a/dgl/src/pugl/pugl.h b/dgl/src/pugl/pugl.h @@ -74,8 +74,9 @@ typedef void (*PuglDisplayFunc)(PuglView* view); @param view The view the event occured in. @param press True if the key was pressed, false if released. @param key Unicode point of the key pressed. + @return 0 if event was handled, otherwise send event to parent window. */ -typedef void (*PuglKeyboardFunc)(PuglView* view, bool press, uint32_t key); +typedef int (*PuglKeyboardFunc)(PuglView* view, bool press, uint32_t key); /** A function called when the pointer moves. @@ -129,8 +130,9 @@ typedef void (*PuglScrollFunc)(PuglView* view, int x, int y, float dx, float dy) @param view The view the event occured in. @param press True if the key was pressed, false if released. @param key The key pressed. + @return 0 if event was handled, otherwise send event to parent window. */ -typedef void (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); +typedef int (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); /** A function called when a filename is selected via file-browser. diff --git a/dgl/src/pugl/pugl_x11.c b/dgl/src/pugl/pugl_x11.c @@ -430,6 +430,7 @@ dispatchKey(PuglView* view, XEvent* event, bool press) { KeySym sym; char str[5]; + PuglKey special; const int n = XLookupString(&event->xkey, str, 4, &sym, NULL); if (sym == XK_Escape && view->closeFunc && !press && !view->parent) { @@ -438,18 +439,30 @@ dispatchKey(PuglView* view, XEvent* event, bool press) return; } if (n == 0) { + goto send_event; return; } if (n > 1) { fprintf(stderr, "warning: Unsupported multi-byte key %X\n", (int)sym); + goto send_event; return; } - const PuglKey special = keySymToSpecial(sym); + special = keySymToSpecial(sym); if (special && view->specialFunc) { - view->specialFunc(view, press, special); + if (view->specialFunc(view, press, special) == 0) { + return; + } } else if (!special && view->keyboardFunc) { - view->keyboardFunc(view, press, str[0]); + if (view->keyboardFunc(view, press, str[0]) == 0) { + return; + } + } + +send_event: + if (view->parent) { + event->xany.window = view->parent; + XSendEvent(view->impl->display, view->parent, True, press ? KeyPressMask : KeyReleaseMask, event); } }