Browse Source

Add key events

Special keys affect modifiers and send specific LGLW codes
Other keys send the X KeySym for the key
Remove unused key hooks
Add queued mouse warps to redraws
pull/1639/head
Cameron Leger 6 years ago
parent
commit
68c8562102
1 changed files with 232 additions and 34 deletions
  1. +232
    -34
      dep/lglw/lglw_linux.c

+ 232
- 34
dep/lglw/lglw_linux.c View File

@@ -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 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_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_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_get_rect (RECT *rect);
// static lglw_bool_t loc_touchkeyboard_is_visible (void); // 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); 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 // TODO: remove and/or improve debug logging for a debug build
// ---------------------------------------------------------------------------- lglw_log // ---------------------------------------------------------------------------- lglw_log
static FILE *logfile; static FILE *logfile;
@@ -378,6 +372,8 @@ static void loc_eventProc(void *_xevent) {


if(NULL != lglw) if(NULL != lglw)
{ {
lglw_bool_t bHandled = LGLW_FALSE;

switch(xev->type) switch(xev->type)
{ {
default: default:
@@ -386,12 +382,15 @@ static void loc_eventProc(void *_xevent) {


case Expose: case Expose:
printf("vstgltest<lglw_linux>: xev Expose\n"); printf("vstgltest<lglw_linux>: xev Expose\n");
loc_handle_queued_mouse_warp(lglw);
if(NULL != lglw->redraw.cbk) if(NULL != lglw->redraw.cbk)
{ {
lglw->redraw.cbk(lglw); lglw->redraw.cbk(lglw);
} }
break; break;


// TODO: Should FocusIn/Out be treated like WM_CAPTURECHANGED and reset the grab state?

case FocusIn: case FocusIn:
printf("vstgltest<lglw_linux>: xev FocusIn\n"); printf("vstgltest<lglw_linux>: xev FocusIn\n");
break; break;
@@ -462,11 +461,236 @@ static void loc_eventProc(void *_xevent) {


case KeyPress: case KeyPress:
printf("vstgltest<lglw_linux>: xev KeyPress\n"); printf("vstgltest<lglw_linux>: xev KeyPress\n");
lglw_redraw(lglw);
XKeyPressedEvent *keyPress = (XKeyPressedEvent*)xev;

KeySym xkp = XLookupKeysym(keyPress, 0);
switch(xkp)
{
default:
printf("vstgltest<lglw_linux>: 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<lglw_linux>: 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; break;


case KeyRelease: case KeyRelease:
printf("vstgltest<lglw_linux>: xev KeyRelease\n"); printf("vstgltest<lglw_linux>: xev KeyRelease\n");
XKeyReleasedEvent *keyRelease = (XKeyReleasedEvent*)xev;

KeySym xkr = XLookupKeysym(keyRelease, 0);
switch(xkr)
{
default:
printf("vstgltest<lglw_linux>: 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<lglw_linux>: 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; break;


case ButtonPress: case ButtonPress:
@@ -971,12 +1195,9 @@ void lglw_window_close (lglw_t _lglw) {
lglw_timer_stop(_lglw); lglw_timer_stop(_lglw);


lglw_log("lglw:lglw_window_close: 2\n"); 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); 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) if(lglw->win.b_owner)
{ {
XDestroyWindow(lglw->xdsp, lglw->win.xwnd); 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 // ---------------------------------------------------------------------------- loc_handle_mouseleave
static void loc_handle_mouseleave(lglw_int_t *lglw) { static void loc_handle_mouseleave(lglw_int_t *lglw) {
loc_key_unhook(lglw);

lglw->focus.state &= ~LGLW_FOCUS_MOUSE; lglw->focus.state &= ~LGLW_FOCUS_MOUSE;


if(NULL != lglw->focus.cbk) if(NULL != lglw->focus.cbk)
@@ -1224,8 +1424,6 @@ static void loc_handle_mouseleave(lglw_int_t *lglw) {
// ---------------------------------------------------------------------------- loc_handle_mouseenter // ---------------------------------------------------------------------------- loc_handle_mouseenter
static void loc_handle_mouseenter(lglw_int_t *lglw) { static void loc_handle_mouseenter(lglw_int_t *lglw) {


loc_key_hook(lglw);

lglw->focus.state |= LGLW_FOCUS_MOUSE; lglw->focus.state |= LGLW_FOCUS_MOUSE;


if(NULL != lglw->focus.cbk) if(NULL != lglw->focus.cbk)


Loading…
Cancel
Save