Browse Source

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

Closes #2
pull/6/head
falkTX 8 years ago
parent
commit
e65346c24a
3 changed files with 40 additions and 15 deletions
  1. +20
    -10
      dgl/src/Window.cpp
  2. +4
    -2
      dgl/src/pugl/pugl.h
  3. +16
    -3
      dgl/src/pugl/pugl_x11.c

+ 20
- 10
dgl/src/Window.cpp View File

@@ -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)


+ 4
- 2
dgl/src/pugl/pugl.h View File

@@ -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.


+ 16
- 3
dgl/src/pugl/pugl_x11.c View File

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



Loading…
Cancel
Save