diff options
author | Sascha Hlusiak <saschahlusiak@arcor.de> | 2008-02-19 22:49:51 +0100 |
---|---|---|
committer | Sascha Hlusiak <saschahlusiak@arcor.de> | 2008-02-19 22:49:51 +0100 |
commit | 8ae4d17ca3fb9ec06b16df5c737cd9021453a020 (patch) | |
tree | 8c25d4f32bb8838f391347f0022194a24d1f0910 /src/evdev_key.c | |
parent | Set repeat_delay and repeat_interval to default values (diff) | |
download | xf86-input-evdev-8ae4d17ca3fb9ec06b16df5c737cd9021453a020.tar.gz xf86-input-evdev-8ae4d17ca3fb9ec06b16df5c737cd9021453a020.tar.bz2 xf86-input-evdev-8ae4d17ca3fb9ec06b16df5c737cd9021453a020.zip |
Let kernel autorepeat pass when set on default values
xorg-server won't generate soft autorepeat, when interval/delay are at default of 40/660 (see xkb/ddxCtrls.c:
XkbDDXUsesSoftRepeat). When we hit the defaults, we let the kernel autorepeat pass, if we differ, we swallow them all
and let the server figure out autorepeat in software.
Diffstat (limited to 'src/evdev_key.c')
-rw-r--r-- | src/evdev_key.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/evdev_key.c b/src/evdev_key.c index 9fd7dbb..dcbe48e 100644 --- a/src/evdev_key.c +++ b/src/evdev_key.c @@ -533,8 +533,35 @@ EvdevKeyProcess (InputInfoPtr pInfo, struct input_event *ev) { int keycode = ev->code + MIN_KEYCODE; - /* filter all repeat events */ - if (ev->value == 2) return; + /* filter repeat events for chording keys */ + if (ev->value == 2) { + DeviceIntPtr device = pInfo->dev; + KeyClassRec *keyc = device->key; + KbdFeedbackClassRec *kbdfeed = device->kbdfeed; + + /* See xkb/ddxCtrls.c: XkbDDXUsesSoftRepeat + Xorg-server will only generate soft autorepeats, when + inverval/delay are NOT set to the default values of 40/660. + + We let the kernel autorepeat events pass, when we hit the + default value and the key is not a modifier. */ + if (device->key && + device->key->xkbInfo && + device->key->xkbInfo->desc && + device->key->xkbInfo->desc->ctrls) + { + if ((device->key->xkbInfo->desc->ctrls->repeat_interval != 40) || + (device->key->xkbInfo->desc->ctrls->repeat_delay != 660)) + return; + } + + int num = keycode >> 3; + int bit = 1 << (keycode & 7); + + if (keyc->modifierMap[keycode] || + !(kbdfeed->ctrl.autoRepeats[num] & bit)) + return; + } xf86PostKeyboardEvent(pInfo->dev, keycode, ev->value); } |