diff --git a/dep/lglw/lglw_linux.c b/dep/lglw/lglw_linux.c index a509b584..c227ab52 100644 --- a/dep/lglw/lglw_linux.c +++ b/dep/lglw/lglw_linux.c @@ -150,8 +150,6 @@ typedef struct lglw_int_s { static lglw_bool_t loc_create_hidden_window (lglw_int_t *lglw, int32_t _w, int32_t _h); static void loc_destroy_hidden_window(lglw_int_t *lglw); -static void loc_key_hook(lglw_int_t *lglw); -static void loc_key_unhook(lglw_int_t *lglw); static lglw_bool_t loc_handle_key (lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _vkey); // static lglw_bool_t loc_touchkeyboard_get_rect (RECT *rect); // static lglw_bool_t loc_touchkeyboard_is_visible (void); @@ -172,10 +170,6 @@ static void *loc_getProperty (Display *_display, Window _window, const char *_na static void loc_setEventProc (Display *display, Window window); -// ---------------------------------------------------------------------------- module vars -static lglw_int_t *khook_lglw = NULL; // currently key-hooked lglw instance (one at a time) - - // TODO: remove and/or improve debug logging for a debug build // ---------------------------------------------------------------------------- lglw_log static FILE *logfile; @@ -378,6 +372,8 @@ static void loc_eventProc(void *_xevent) { if(NULL != lglw) { + lglw_bool_t bHandled = LGLW_FALSE; + switch(xev->type) { default: @@ -386,12 +382,15 @@ static void loc_eventProc(void *_xevent) { case Expose: printf("vstgltest: xev Expose\n"); + loc_handle_queued_mouse_warp(lglw); if(NULL != lglw->redraw.cbk) { lglw->redraw.cbk(lglw); } break; + // TODO: Should FocusIn/Out be treated like WM_CAPTURECHANGED and reset the grab state? + case FocusIn: printf("vstgltest: xev FocusIn\n"); break; @@ -462,11 +461,236 @@ static void loc_eventProc(void *_xevent) { case KeyPress: printf("vstgltest: xev KeyPress\n"); - lglw_redraw(lglw); + XKeyPressedEvent *keyPress = (XKeyPressedEvent*)xev; + + KeySym xkp = XLookupKeysym(keyPress, 0); + switch(xkp) + { + default: + printf("vstgltest: xev KeyPress: %x or %lu\n", keyPress->keycode, xkp); + if(0u != (lglw->keyboard.kmod_state & LGLW_KMOD_SHIFT)) + { + KeySym xkpl; + KeySym xkpu; + XConvertCase(xkp, &xkpl, &xkpu); + bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkpu); + } + else + { + bHandled = loc_handle_key(lglw, LGLW_TRUE/*bPressed*/, xkp); + } + break; + + case NoSymbol: + printf("vstgltest: xev UNKNOWN KeyPress: %x\n", keyPress->keycode); + break; + + case XK_F1: + bHandled = 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); + break; + + case XK_F3: + bHandled = 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); + break; + + case XK_F5: + bHandled = 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); + break; + + case XK_F7: + bHandled = 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); + break; + + case XK_F9: + bHandled = 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); + break; + + case XK_F11: + bHandled = 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); + break; + + case XK_BackSpace: + bHandled = 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); + break; + + case XK_Return: + bHandled = 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); + 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; + 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; + 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; + 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; + break; + } + break; case KeyRelease: printf("vstgltest: xev KeyRelease\n"); + XKeyReleasedEvent *keyRelease = (XKeyReleasedEvent*)xev; + + KeySym xkr = XLookupKeysym(keyRelease, 0); + switch(xkr) + { + default: + printf("vstgltest: xev KeyRelease: %x or %lu\n", keyRelease->keycode, xkr); + if(0u != (lglw->keyboard.kmod_state & LGLW_KMOD_SHIFT)) + { + KeySym xkrl; + KeySym xkru; + XConvertCase(xkr, &xkrl, &xkru); + bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkru); + } + else + { + bHandled = loc_handle_key(lglw, LGLW_FALSE/*bPressed*/, xkr); + } + break; + + case NoSymbol: + printf("vstgltest: xev UNKNOWN KeyRelease: %x\n", keyRelease->keycode); + break; + + case XK_F1: + bHandled = 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); + break; + + case XK_F3: + bHandled = 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); + break; + + case XK_F5: + bHandled = 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); + break; + + case XK_F7: + bHandled = 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); + break; + + case XK_F9: + bHandled = 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); + break; + + case XK_F11: + bHandled = 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); + break; + + case XK_BackSpace: + bHandled = 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); + break; + + case XK_Return: + bHandled = 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); + 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; + 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; + 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; + 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; + break; + } + break; case ButtonPress: @@ -971,12 +1195,9 @@ void lglw_window_close (lglw_t _lglw) { lglw_timer_stop(_lglw); lglw_log("lglw:lglw_window_close: 2\n"); - loc_key_unhook(lglw); - - lglw_log("lglw:lglw_window_close: 3\n"); glXMakeCurrent(lglw->xdsp, None, NULL); - lglw_log("lglw:lglw_window_close: 4\n"); + lglw_log("lglw:lglw_window_close: 3\n"); if(lglw->win.b_owner) { XDestroyWindow(lglw->xdsp, lglw->win.xwnd); @@ -1187,29 +1408,8 @@ int32_t lglw_swap_interval_get(lglw_t _lglw) { } -// ---------------------------------------------------------------------------- loc_key_hook -static void loc_key_hook(lglw_int_t *lglw) { - loc_key_unhook(lglw); - - // (todo) implement me - - khook_lglw = lglw; -} - - -// ---------------------------------------------------------------------------- loc_key_unhook -static void loc_key_unhook(lglw_int_t *lglw) { - - // (todo) implement me - if(khook_lglw == lglw) - khook_lglw = NULL; -} - - // ---------------------------------------------------------------------------- loc_handle_mouseleave static void loc_handle_mouseleave(lglw_int_t *lglw) { - loc_key_unhook(lglw); - lglw->focus.state &= ~LGLW_FOCUS_MOUSE; if(NULL != lglw->focus.cbk) @@ -1224,8 +1424,6 @@ static void loc_handle_mouseleave(lglw_int_t *lglw) { // ---------------------------------------------------------------------------- loc_handle_mouseenter static void loc_handle_mouseenter(lglw_int_t *lglw) { - loc_key_hook(lglw); - lglw->focus.state |= LGLW_FOCUS_MOUSE; if(NULL != lglw->focus.cbk)