diff --git a/dep/lglw/lglw_linux.c b/dep/lglw/lglw_linux.c index c227ab52..3760ada6 100644 --- a/dep/lglw/lglw_linux.c +++ b/dep/lglw/lglw_linux.c @@ -372,20 +372,23 @@ static void loc_eventProc(void *_xevent) { if(NULL != lglw) { - lglw_bool_t bHandled = LGLW_FALSE; + lglw_bool_t eventHandled = LGLW_FALSE; switch(xev->type) { default: printf("vstgltest: unhandled X11 event type=%d\n", xev->type); + eventHandled = LGLW_FALSE; break; case Expose: printf("vstgltest: xev Expose\n"); loc_handle_queued_mouse_warp(lglw); + eventHandled = LGLW_FALSE; if(NULL != lglw->redraw.cbk) { lglw->redraw.cbk(lglw); + eventHandled = LGLW_TRUE; } break; @@ -393,10 +396,12 @@ static void loc_eventProc(void *_xevent) { case FocusIn: printf("vstgltest: xev FocusIn\n"); + eventHandled = LGLW_FALSE; break; case FocusOut: printf("vstgltest: xev FocusOut\n"); + eventHandled = LGLW_FALSE; break; case EnterNotify: @@ -415,6 +420,7 @@ static void loc_eventProc(void *_xevent) { { loc_handle_mouseenter(lglw); } + eventHandled = LGLW_TRUE; break; @@ -431,6 +437,7 @@ static void loc_eventProc(void *_xevent) { { loc_handle_mouseleave(lglw); } + eventHandled = LGLW_TRUE; break; @@ -456,6 +463,7 @@ static void loc_eventProc(void *_xevent) { } loc_handle_mousemotion(lglw); + eventHandled = LGLW_TRUE; break; @@ -463,6 +471,7 @@ static void loc_eventProc(void *_xevent) { printf("vstgltest: xev KeyPress\n"); XKeyPressedEvent *keyPress = (XKeyPressedEvent*)xev; + eventHandled = LGLW_FALSE; KeySym xkp = XLookupKeysym(keyPress, 0); switch(xkp) { @@ -473,11 +482,11 @@ static void loc_eventProc(void *_xevent) { KeySym xkpl; KeySym xkpu; XConvertCase(xkp, &xkpl, &xkpu); - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkpu); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkpu); } else { - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkp); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkp); } break; @@ -486,91 +495,91 @@ static void loc_eventProc(void *_xevent) { break; case XK_F1: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F1); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F1); break; case XK_F2: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F2); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F2); break; case XK_F3: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F3); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F3); break; case XK_F4: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F4); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F4); break; case XK_F5: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F5); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F5); break; case XK_F6: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F6); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F6); break; case XK_F7: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F7); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F7); break; case XK_F8: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F8); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F8); break; case XK_F9: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F9); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F9); break; case XK_F10: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F10); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F10); break; case XK_F11: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F11); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F11); break; case XK_F12: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F12); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_F12); break; case XK_BackSpace: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_BACKSPACE); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_BACKSPACE); break; case XK_Tab: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_TAB); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_TAB); break; case XK_Return: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_RETURN); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_RETURN); break; case XK_Escape: - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_ESCAPE); + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_ESCAPE); break; case XK_Shift_L: lglw->keyboard.kmod_state |= LGLW_KMOD_LSHIFT; - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_LSHIFT); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_LSHIFT); + eventHandled = LGLW_FALSE; break; case XK_Shift_R: lglw->keyboard.kmod_state |= LGLW_KMOD_RSHIFT; - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_RSHIFT); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_VKEY_RSHIFT); + eventHandled = LGLW_FALSE; break; case XK_Control_L: lglw->keyboard.kmod_state |= LGLW_KMOD_LCTRL; - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_KMOD_LCTRL); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_KMOD_LCTRL); + eventHandled = LGLW_FALSE; break; case XK_Control_R: lglw->keyboard.kmod_state |= LGLW_KMOD_RCTRL; - bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_KMOD_RCTRL); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, LGLW_KMOD_RCTRL); + eventHandled = LGLW_FALSE; break; } @@ -580,6 +589,7 @@ static void loc_eventProc(void *_xevent) { printf("vstgltest: xev KeyRelease\n"); XKeyReleasedEvent *keyRelease = (XKeyReleasedEvent*)xev; + eventHandled = LGLW_FALSE; KeySym xkr = XLookupKeysym(keyRelease, 0); switch(xkr) { @@ -590,11 +600,11 @@ static void loc_eventProc(void *_xevent) { KeySym xkrl; KeySym xkru; XConvertCase(xkr, &xkrl, &xkru); - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkru); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkru); } else { - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkr); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkr); } break; @@ -603,91 +613,91 @@ static void loc_eventProc(void *_xevent) { break; case XK_F1: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F1); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F1); break; case XK_F2: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F2); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F2); break; case XK_F3: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F3); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F3); break; case XK_F4: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F4); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F4); break; case XK_F5: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F5); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F5); break; case XK_F6: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F6); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F6); break; case XK_F7: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F7); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F7); break; case XK_F8: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F8); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F8); break; case XK_F9: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F9); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F9); break; case XK_F10: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F10); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F10); break; case XK_F11: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F11); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F11); break; case XK_F12: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F12); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_F12); break; case XK_BackSpace: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_BACKSPACE); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_BACKSPACE); break; case XK_Tab: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_TAB); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_TAB); break; case XK_Return: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RETURN); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RETURN); break; case XK_Escape: - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_ESCAPE); + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_ESCAPE); break; case XK_Shift_L: lglw->keyboard.kmod_state &= ~LGLW_KMOD_LSHIFT; - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_LSHIFT); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_LSHIFT); + eventHandled = LGLW_FALSE; break; case XK_Shift_R: lglw->keyboard.kmod_state &= ~LGLW_KMOD_RSHIFT; - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RSHIFT); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RSHIFT); + eventHandled = LGLW_FALSE; break; case XK_Control_L: lglw->keyboard.kmod_state &= ~LGLW_KMOD_LCTRL; - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_LCTRL); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_LCTRL); + eventHandled = LGLW_FALSE; break; case XK_Control_R: lglw->keyboard.kmod_state &= ~LGLW_KMOD_RCTRL; - bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RCTRL); - bHandled = LGLW_FALSE; + eventHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, LGLW_VKEY_RCTRL); + eventHandled = LGLW_FALSE; break; } @@ -708,21 +718,27 @@ static void loc_eventProc(void *_xevent) { { default: printf("vstgltest: xev ButtonPress unhandled button: %i\n", btnPress->button); + eventHandled = LGLW_FALSE; break; case Button1: loc_handle_mousebutton(lglw, LGLW_TRUE/*bPressed*/, LGLW_MOUSE_LBUTTON); + eventHandled = LGLW_TRUE; break; case Button2: loc_handle_mousebutton(lglw, LGLW_TRUE/*bPressed*/, LGLW_MOUSE_RBUTTON); + eventHandled = LGLW_TRUE; break; case Button3: loc_handle_mousebutton(lglw, LGLW_TRUE/*bPressed*/, LGLW_MOUSE_MBUTTON); + eventHandled = LGLW_TRUE; break; case Button4: loc_handle_mousebutton(lglw, LGLW_TRUE/*bPressed*/, LGLW_MOUSE_WHEELUP); + eventHandled = LGLW_TRUE; break; case Button5: loc_handle_mousebutton(lglw, LGLW_TRUE/*bPressed*/, LGLW_MOUSE_WHEELDOWN); + eventHandled = LGLW_TRUE; break; } break; @@ -736,21 +752,27 @@ static void loc_eventProc(void *_xevent) { { default: printf("vstgltest: xev ButtonRelease unhandled button: %i\n", btnRelease->button); + eventHandled = LGLW_FALSE; break; case Button1: loc_handle_mousebutton(lglw, LGLW_FALSE/*bPressed*/, LGLW_MOUSE_LBUTTON); + eventHandled = LGLW_TRUE; break; case Button2: loc_handle_mousebutton(lglw, LGLW_FALSE/*bPressed*/, LGLW_MOUSE_RBUTTON); + eventHandled = LGLW_TRUE; break; case Button3: loc_handle_mousebutton(lglw, LGLW_FALSE/*bPressed*/, LGLW_MOUSE_MBUTTON); + eventHandled = LGLW_TRUE; break; case Button4: loc_handle_mousebutton(lglw, LGLW_FALSE/*bPressed*/, LGLW_MOUSE_WHEELUP); + eventHandled = LGLW_TRUE; break; case Button5: loc_handle_mousebutton(lglw, LGLW_FALSE/*bPressed*/, LGLW_MOUSE_WHEELDOWN); + eventHandled = LGLW_TRUE; break; } break; @@ -759,6 +781,7 @@ static void loc_eventProc(void *_xevent) { printf("vstgltest: xev SelectionClear\n"); lglw->clipboard.numChars = 0; free(lglw->clipboard.data); + eventHandled = LGLW_TRUE; break; case SelectionRequest: @@ -787,9 +810,23 @@ static void loc_eventProc(void *_xevent) { } XSendEvent(lglw->xdsp, cbReq->requestor, True, NoEventMask, (XEvent *)&cbRes); + eventHandled = LGLW_TRUE; break; } + + if(LGLW_FALSE == eventHandled) + { + if(0 == lglw->parent_xwnd) + { + printf("lglw_linux:loc_eventProc: no parent window to send events to"); + XSendEvent(lglw->xdsp, InputFocus, True/*propgate*/, NoEventMask, xev); + } + else + { + XSendEvent(lglw->xdsp, lglw->parent_xwnd, True/*propgate*/, NoEventMask, xev); + } + } } } }