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:
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);
}
}