Unverified Commit 7f4b50de authored by Mike Gabriel's avatar Mike Gabriel

Merge branch 'uli42-pr/no_keystroke_passthrough' into 3.6.x

parents 360cb5dd ceeb53f0
...@@ -1113,8 +1113,8 @@ FIXME: If we don't flush the queue here, it could happen ...@@ -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 FIXME: Don't enqueue the KeyRelease event if the key was
not already pressed. This workaround avoids a fake not already pressed. This workaround avoids a fake
KeyPress is enqueued by the XKEYBOARD extension. KeyPress being enqueued by the XKEYBOARD extension.
Another solution would be to let the events are Another solution would be to let the events
enqueued and to remove the KeyPress afterwards. enqueued and to remove the KeyPress afterwards.
*/ */
if (BitIsOn(inputInfo.keyboard -> key -> down, if (BitIsOn(inputInfo.keyboard -> key -> down,
...@@ -1153,6 +1153,9 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1153,6 +1153,9 @@ FIXME: Don't enqueue the KeyRelease event if the key was
nxagentXkbNumTrap = 0; 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)); memset(&x, 0, sizeof(xEvent));
x.u.u.type = KeyRelease; x.u.u.type = KeyRelease;
x.u.u.detail = nxagentConvertKeycode(X.xkey.keycode); x.u.u.detail = nxagentConvertKeycode(X.xkey.keycode);
...@@ -1168,8 +1171,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1168,8 +1171,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was
x.u.keyButtonPointer.time = nxagentLastEventTime; 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); mieqEnqueue(&x);
CriticalOutputPending = 1; CriticalOutputPending = 1;
...@@ -1181,6 +1190,12 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -1181,6 +1190,12 @@ FIXME: Don't enqueue the KeyRelease event if the key was
NXShadowEvent(nxagentDisplay, X); NXShadowEvent(nxagentDisplay, X);
} }
} }
else
{
#ifdef TEST
fprintf(stderr, "%s: NOT passing KeyRelease event to clients\n", __func__);
#endif
}
break; break;
} }
...@@ -2225,8 +2240,6 @@ FIXME: Don't enqueue the KeyRelease event if the key was ...@@ -2225,8 +2240,6 @@ FIXME: Don't enqueue the KeyRelease event if the key was
int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result)
{ {
xEvent x;
if (nxagentXkbState.Initialized == 0) if (nxagentXkbState.Initialized == 0)
{ {
if (X -> xkey.keycode == nxagentCapsLockKeycode) if (X -> xkey.keycode == nxagentCapsLockKeycode)
...@@ -2246,6 +2259,9 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) ...@@ -2246,6 +2259,9 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result)
if (nxagentCheckSpecialKeystroke(&X -> xkey, result)) if (nxagentCheckSpecialKeystroke(&X -> xkey, result))
{ {
#ifdef TEST
fprintf(stderr, "%s: NOT passing KeyPress event to clients\n", __func__);
#endif
return 1; return 1;
} }
...@@ -2258,14 +2274,18 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) ...@@ -2258,14 +2274,18 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result)
nxagentXkbState.Num = (~nxagentXkbState.Num & 1); nxagentXkbState.Num = (~nxagentXkbState.Num & 1);
} }
nxagentLastServerTime = X -> xkey.time;
nxagentLastEventTime = nxagentLastKeyPressTime = GetTimeInMillis(); nxagentLastEventTime = nxagentLastKeyPressTime = GetTimeInMillis();
memset(&x, 0, sizeof(xEvent)); xEvent x = {0};
x.u.u.type = KeyPress; x.u.u.type = KeyPress;
x.u.u.detail = nxagentConvertKeycode(X -> xkey.keycode); x.u.u.detail = nxagentConvertKeycode(X -> xkey.keycode);
x.u.keyButtonPointer.time = nxagentLastKeyPressTime; x.u.keyButtonPointer.time = nxagentLastKeyPressTime;
nxagentLastServerTime = X -> xkey.time; #ifdef TEST
fprintf(stderr, "%s: passing KeyPress event to clients\n", __func__);
#endif
mieqEnqueue(&x); mieqEnqueue(&x);
......
...@@ -480,6 +480,9 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X) ...@@ -480,6 +480,9 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
return ret; return ret;
} }
/*
* returns True if a special keystroke has been pressed. *result will contain the action.
*/
Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result) Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
{ {
enum nxagentSpecialKeystroke stroke = find_keystroke(X); enum nxagentSpecialKeystroke stroke = find_keystroke(X);
...@@ -629,5 +632,5 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result) ...@@ -629,5 +632,5 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
case KEYSTROKE_MAX: case KEYSTROKE_MAX:
break; break;
} }
return (*result == doNothing); return (*result != doNothing);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment