| @@ -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<lglw_linux>: unhandled X11 event type=%d\n", xev->type); | |||
| eventHandled = LGLW_FALSE; | |||
| break; | |||
| case Expose: | |||
| printf("vstgltest<lglw_linux>: 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<lglw_linux>: xev FocusIn\n"); | |||
| eventHandled = LGLW_FALSE; | |||
| break; | |||
| case FocusOut: | |||
| printf("vstgltest<lglw_linux>: 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<lglw_linux>: 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<lglw_linux>: 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<lglw_linux>: 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<lglw_linux>: 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<lglw_linux>: 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); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||