diff options
author | Naoki Hamada <nao@tom-yam.or.jp> | 2007-10-25 18:45:50 +0300 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2007-10-25 18:46:27 +0300 |
commit | 242f56f722243938e908d1957781ee53c2999783 (patch) | |
tree | d7de294ea494a2216ccf222e4e4d829b38ac1e6e | |
parent | 48ca5961caee62f2980017a6bdc96a1b4c747727 (diff) |
Input: Fix key down test (bug #12858)
Fix the botched previous key_is_down test, which would give false positives.
Also move key_autorepeats to a separate inline function.
-rw-r--r-- | dix/getevents.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/dix/getevents.c b/dix/getevents.c index a6e246ac7..ffcdf174e 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -95,7 +95,14 @@ set_key_up(DeviceIntPtr pDev, int key_code) static Bool key_is_down(DeviceIntPtr pDev, int key_code) { - return pDev->key->postdown[key_code >> 3] >> (key_code & 7); + return !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7))); +} + +static Bool +key_autorepeats(DeviceIntPtr pDev, int key_code) +{ + return !!(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3] & + (1 << (key_code & 7))); } /** @@ -444,10 +451,11 @@ GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type, * FIXME: In theory, if you're repeating with two keyboards in non-XKB, * you could get unbalanced events here. */ if (type == KeyPress && key_is_down(pDev, key_code)) { + /* If autorepeating is disabled either globally or just for that key, + * or we have a modifier, don't generate a repeat event. */ if (!pDev->kbdfeed->ctrl.autoRepeat || - pDev->key->modifierMap[key_code] || - !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3] - & (1 << (key_code & 7)))) + !key_autorepeats(pDev, key_code) || + pDev->key->modifierMap[key_code]) return 0; #ifdef XKB |