From e2637097fb360dfa70437fed6b4c1503477043cd Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Sun, 20 Jan 2019 22:49:06 +0100 Subject: [PATCH] X11: handling of keyboard mouse emulation + mouse panning --- src/input.c | 24 ++++++++++++++++++++++-- src/x11screen.c | 3 ++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/input.c b/src/input.c index 32759d7a..3278b990 100644 --- a/src/input.c +++ b/src/input.c @@ -1658,7 +1658,7 @@ int Get_input(int sleep_time) mod |= MOD_META; //sym = XKeycodeToKeysym(X11_display, event.xkey.keycode, 0); sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0); - GFX2_Log(GFX2_DEBUG, "key code = %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n", + GFX2_Log(GFX2_DEBUG, "key press code = %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n", event.xkey.keycode, event.xkey.state, sym, XKeysymToString(sym), mod); if (sym == XK_Shift_L || sym == XK_Shift_R || sym == XK_Control_L || sym == XK_Control_R || @@ -1674,7 +1674,8 @@ int Get_input(int sleep_time) static XComposeStatus status; count = XLookupString(&event.xkey, buffer, sizeof(buffer), &sym, &status); - if (count == 1) { + if (count == 1) + { Key_ANSI = Key_UNICODE = (word)buffer[0] & 0x00ff; } else if((sym & 0xf000) != 0xf000) @@ -1688,9 +1689,28 @@ int Get_input(int sleep_time) { Key_UNICODE = Key_ANSI = 0; } + Handle_special_key_press(); user_feedback_required = 1; } break; + case KeyRelease: + { + KeySym sym; + + if (event.xkey.state & ShiftMask) + mod |= MOD_SHIFT; + if (event.xkey.state & ControlMask) + mod |= MOD_CTRL; + if (event.xkey.state & (Mod1Mask | Mod5Mask)) + mod |= MOD_ALT; + if (event.xkey.state & Mod4Mask) + mod |= MOD_META; + sym = XkbKeycodeToKeysym(X11_display, event.xkey.keycode, 0, 0); + GFX2_Log(GFX2_DEBUG, "keyrelease code= %3d state=0x%08x sym = 0x%04lx %s\tmod=%04x\n", + event.xkey.keycode, event.xkey.state, sym, XKeysymToString(sym), mod); + Release_control(sym & 0x0fff, mod); + } + break; case ButtonPress: // left = 1, middle = 2, right = 3, wheelup = 4, wheeldown = 5 //printf("Press button = %d state = 0x%08x\n", event.xbutton.button, event.xbutton.state); if (event.xkey.state & ShiftMask) diff --git a/src/x11screen.c b/src/x11screen.c index 2dc3e8e3..3e62c2fd 100644 --- a/src/x11screen.c +++ b/src/x11screen.c @@ -148,7 +148,8 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen) } XSelectInput(X11_display, X11_window, - PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | ExposureMask | StructureNotifyMask); + PointerMotionMask | ButtonPressMask | ButtonReleaseMask + | KeyPressMask | KeyReleaseMask | ExposureMask | StructureNotifyMask); wmDelete = XInternAtom(X11_display, "WM_DELETE_WINDOW", True); XSetWMProtocols(X11_display, X11_window, &wmDelete, 1);