summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/evdev_key.c31
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);
}