diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2019-08-16 11:50:10 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2019-08-16 11:50:10 +0200 |
commit | 7f4b50deb5a41bc88227ce925ecbb3fe713705c2 (patch) | |
tree | 1610ccb35951db123ff9f0eee50e58b00391e27b | |
parent | 360cb5dd9c307be05dfeee93b5303e257b389f1c (diff) | |
parent | ceeb53f0c591b2a0b69343208282cfc2c7872509 (diff) | |
download | nx-libs-7f4b50deb5a41bc88227ce925ecbb3fe713705c2.tar.gz nx-libs-7f4b50deb5a41bc88227ce925ecbb3fe713705c2.tar.bz2 nx-libs-7f4b50deb5a41bc88227ce925ecbb3fe713705c2.zip |
Merge branch 'uli42-pr/no_keystroke_passthrough' into 3.6.x
Attributes GH PR #823: https://github.com/ArcticaProject/nx-libs/pull/823
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Events.c | 36 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Keystroke.c | 5 |
2 files changed, 32 insertions, 9 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index d8bf4df60..846254e92 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -1113,8 +1113,8 @@ FIXME: If we don't flush the queue here, it could happen /* FIXME: Don't enqueue the KeyRelease event if the key was not already pressed. This workaround avoids a fake - KeyPress is enqueued by the XKEYBOARD extension. - Another solution would be to let the events are + KeyPress being enqueued by the XKEYBOARD extension. + Another solution would be to let the events enqueued and to remove the KeyPress afterwards. */ if (BitIsOn(inputInfo.keyboard -> key -> down, @@ -1153,6 +1153,9 @@ FIXME: Don't enqueue the KeyRelease event if the key was nxagentXkbNumTrap = 0; } + /* Calculate the time elapsed between this and the last event we + received. Add this delta to time we recorded for the last + KeyPress event we passed on to our clients. */ memset(&x, 0, sizeof(xEvent)); x.u.u.type = KeyRelease; x.u.u.detail = nxagentConvertKeycode(X.xkey.keycode); @@ -1168,8 +1171,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was x.u.keyButtonPointer.time = nxagentLastEventTime; } - if (!(nxagentCheckSpecialKeystroke(&X.xkey, &result)) && sendKey == 1) + /* do not send a KeyRelease for a special keystroke since we + also did not send a KeyPress event in that case */ + if (!(nxagentCheckSpecialKeystroke(&X.xkey, &result)) && (sendKey == 1)) { + #ifdef TEST + fprintf(stderr, "%s: passing KeyRelease event to clients\n", __func__); + #endif + mieqEnqueue(&x); CriticalOutputPending = 1; @@ -1181,6 +1190,12 @@ FIXME: Don't enqueue the KeyRelease event if the key was NXShadowEvent(nxagentDisplay, X); } } + else + { + #ifdef TEST + fprintf(stderr, "%s: NOT passing KeyRelease event to clients\n", __func__); + #endif + } break; } @@ -2225,8 +2240,6 @@ FIXME: Don't enqueue the KeyRelease event if the key was int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) { - xEvent x; - if (nxagentXkbState.Initialized == 0) { if (X -> xkey.keycode == nxagentCapsLockKeycode) @@ -2246,6 +2259,9 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) if (nxagentCheckSpecialKeystroke(&X -> xkey, result)) { + #ifdef TEST + fprintf(stderr, "%s: NOT passing KeyPress event to clients\n", __func__); + #endif return 1; } @@ -2258,14 +2274,18 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) nxagentXkbState.Num = (~nxagentXkbState.Num & 1); } + nxagentLastServerTime = X -> xkey.time; + nxagentLastEventTime = nxagentLastKeyPressTime = GetTimeInMillis(); - - memset(&x, 0, sizeof(xEvent)); + + xEvent x = {0}; x.u.u.type = KeyPress; x.u.u.detail = nxagentConvertKeycode(X -> xkey.keycode); x.u.keyButtonPointer.time = nxagentLastKeyPressTime; - nxagentLastServerTime = X -> xkey.time; + #ifdef TEST + fprintf(stderr, "%s: passing KeyPress event to clients\n", __func__); + #endif mieqEnqueue(&x); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c index 662da6b04..966b4f842 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c @@ -480,6 +480,9 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X) return ret; } +/* + * returns True if a special keystroke has been pressed. *result will contain the action. + */ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result) { enum nxagentSpecialKeystroke stroke = find_keystroke(X); @@ -629,5 +632,5 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result) case KEYSTROKE_MAX: break; } - return (*result == doNothing); + return (*result != doNothing); } |