summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaoki Hamada <nao@tom-yam.or.jp>2007-10-25 18:45:50 +0300
committerDaniel Stone <daniel@fooishbar.org>2007-10-25 18:46:27 +0300
commit242f56f722243938e908d1957781ee53c2999783 (patch)
treed7de294ea494a2216ccf222e4e4d829b38ac1e6e
parent48ca5961caee62f2980017a6bdc96a1b4c747727 (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.c16
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