diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-09-06 18:52:02 +0930 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-09-06 18:52:02 +0930 |
commit | 5ee409794ee604fcf84886f70429fc2d6b1ff4f1 (patch) | |
tree | d102ba9605a0cc1dcf26aeb94db44a9c247535d3 | |
parent | 6334d4e7be18de5f237c12a6dc20f75aa23477d0 (diff) |
dix: add XI event support to FixKeyState.
FixKeyState needs to be able to handle XI events, otherwise we get "impossible
keyboard events" on server zaps and other special key combos.
-rw-r--r-- | dix/events.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/dix/events.c b/dix/events.c index 07a191fa3..ad9ec1ca1 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3584,7 +3584,7 @@ drawable.id:0; #ifdef XKB /* This function is used to set the key pressed or key released state - this is only used when the pressing of keys does not cause - CoreProcessKeyEvent to be called, as in for example Mouse Keys. + the device's processInputProc to be called, as in for example Mouse Keys. */ void FixKeyState (xEvent *xE, DeviceIntPtr keybd) @@ -3597,22 +3597,19 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd) kptr = &keyc->down[key >> 3]; bit = 1 << (key & 7); - if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) { + if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease)|| + (xE->u.u.type==DeviceKeyPress)||(xE->u.u.type==DeviceKeyRelease)) + ) { DebugF("FixKeyState: Key %d %s\n",key, - (xE->u.u.type==KeyPress?"down":"up")); + (((xE->u.u.type==KeyPress)||(xE->u.u.type==DeviceKeyPress))?"down":"up")); } - switch (xE->u.u.type) - { - case KeyPress: + if (xE->u.u.type == KeyPress || xE->u.u.type == DeviceKeyPress) *kptr |= bit; - break; - case KeyRelease: + else if (xE->u.u.type == KeyRelease || xE->u.u.type == DeviceKeyRelease) *kptr &= ~bit; - break; - default: - FatalError("Impossible keyboard event"); - } + else + FatalError("Impossible keyboard event"); } #endif |