X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ee31c392ac73dcd67fb25ac368e2ffb7d4c9c0e7..d04d2fb520e226ff931b36a47c95f9fcbb01704b:/src/motif/app.cpp diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 5ef52fda83..72ab9cb7b2 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -340,22 +340,49 @@ void wxApp::ProcessXEvent(WXEvent* _event) if (event->type == KeyPress) { - if (CheckForAccelerator(_event)) - { - // Do nothing! We intercepted and processed the event as an - // accelerator. - return; - } - else if (CheckForKeyDown(_event)) - { - // We intercepted and processed the key down event - return; - } - else - { - XtDispatchEvent(event); - return; - } +#ifdef __WXDEBUG__ + Widget widget = XtWindowToWidget(event->xany.display, event->xany.window); + wxLogDebug("Got key press event for 0x%08x (parent = 0x%08x)", + widget, XtParent(widget)); +#endif // DEBUG + + if (CheckForAccelerator(_event)) + { + // Do nothing! We intercepted and processed the event as an + // accelerator. + return; + } +#if 1 + // It seemed before that this hack was redundant and + // key down events were being generated by wxCanvasInputEvent. + // But no longer - why ??? + // + else if (CheckForKeyDown(_event)) + { + // We intercepted and processed the key down event + return; + } +#endif + else + { + XtDispatchEvent(event); + return; + } + } + else if (event->type == KeyRelease) + { + // TODO: work out why we still need this ! -michael + // + if (CheckForKeyUp(_event)) + { + // We intercepted and processed the key up event + return; + } + else + { + XtDispatchEvent(event); + return; + } } else if (event->type == PropertyNotify) { @@ -632,30 +659,49 @@ bool wxApp::CheckForAccelerator(WXEvent* event) bool wxApp::CheckForKeyDown(WXEvent* event) { XEvent* xEvent = (XEvent*) event; - // VZ: this code doesn't work for me because it never finds the correct - // window. Also, if we go this way, we should generate KEY_UP and - // CHAR events as well, not only KEY_DOWN. -#if 0 if (xEvent->xany.type == KeyPress) { - Widget widget = XtWindowToWidget((Display*) wxGetDisplay(), - xEvent->xany.window); - wxWindow* win = NULL; + Widget widget = XtWindowToWidget((Display*) wxGetDisplay(), + xEvent->xany.window); + wxWindow* win = NULL; + + // Find the first wxWindow that corresponds to this event window + while (widget && !(win = wxGetWindowFromTable(widget))) + widget = XtParent(widget); - // Find the first wxWindow that corresponds to this event window - while (widget && !(win = wxGetWindowFromTable(widget))) - widget = XtParent(widget); + if (!widget || !win) + return FALSE; + + wxKeyEvent keyEvent(wxEVT_KEY_DOWN); + wxTranslateKeyEvent(keyEvent, win, (Widget) 0, xEvent); - if (!widget || !win) - return FALSE; + return win->ProcessEvent( keyEvent ); + } + + return FALSE; +} + +bool wxApp::CheckForKeyUp(WXEvent* event) +{ + XEvent* xEvent = (XEvent*) event; + if (xEvent->xany.type == KeyRelease) + { + Widget widget = XtWindowToWidget((Display*) wxGetDisplay(), + xEvent->xany.window); + wxWindow* win = NULL; + + // Find the first wxWindow that corresponds to this event window + while (widget && !(win = wxGetWindowFromTable(widget))) + widget = XtParent(widget); + + if (!widget || !win) + return FALSE; - wxKeyEvent keyEvent(wxEVT_KEY_DOWN); - wxTranslateKeyEvent(keyEvent, win, (Widget) 0, xEvent); + wxKeyEvent keyEvent(wxEVT_KEY_UP); + wxTranslateKeyEvent(keyEvent, win, (Widget) 0, xEvent); - win->ProcessEvent( keyEvent ); - return (keyEvent.GetSkipped() != TRUE); + return win->ProcessEvent( keyEvent ); } -#endif // 0 return FALSE; }