From fda5675f9d257d583ea0683adf863c5e1e51e30c Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Wed, 9 Mar 2016 10:31:13 +0100 Subject: [PATCH] xkb: add hook to allow/deny AccessX key repeat The xserver generates the key repeat by itself. But when used with another server processing inputs first (e.g. a Wayland compositor), the other server may be busy dealing with some other things and not queue up key release events in time. Add a vfunc in XkbSrvInfo to possibly add a check before re-emitting a keypress event in the AccessX timer handler, so that the key repeat has a chance to be denied if the server processing the input is not ready. Signed-off-by: Olivier Fourdan Reviewed-by: Peter Hutterer --- include/xkbsrv.h | 6 ++++++ xkb/xkbAccessX.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/xkbsrv.h b/include/xkbsrv.h index 7e71089f1..6e4ad44d4 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -142,6 +142,10 @@ typedef struct _XkbFilter { struct _XkbFilter *next; } XkbFilterRec, *XkbFilterPtr; +typedef Bool (*XkbSrvCheckRepeatPtr) (DeviceIntPtr dev, + struct _XkbSrvInfo * /* xkbi */ , + unsigned /* keycode */); + typedef struct _XkbSrvInfo { XkbStateRec prev_state; XkbStateRec state; @@ -189,6 +193,8 @@ typedef struct _XkbSrvInfo { int szFilters; XkbFilterPtr filters; + + XkbSrvCheckRepeatPtr checkRepeat; } XkbSrvInfoRec, *XkbSrvInfoPtr; #define XkbSLI_IsDefault (1L<<0) diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c index 892cb3097..f80057747 100644 --- a/xkb/xkbAccessX.c +++ b/xkb/xkbAccessX.c @@ -89,6 +89,7 @@ AccessXInit(DeviceIntPtr keybd) xkbi->repeatKeyTimer = NULL; xkbi->krgTimer = NULL; xkbi->beepTimer = NULL; + xkbi->checkRepeat = NULL; ctrls->repeat_delay = XkbDfltRepeatDelay; ctrls->repeat_interval = XkbDfltRepeatInterval; ctrls->debounce_delay = 300; @@ -317,7 +318,8 @@ AccessXRepeatKeyExpire(OsTimerPtr timer, CARD32 now, void *arg) if (xkbi->repeatKey == 0) return 0; - AccessXKeyboardEvent(dev, ET_KeyPress, xkbi->repeatKey, TRUE); + if (xkbi->checkRepeat == NULL || xkbi->checkRepeat (dev, xkbi, xkbi->repeatKey)) + AccessXKeyboardEvent(dev, ET_KeyPress, xkbi->repeatKey, TRUE); return xkbi->desc->ctrls->repeat_interval; }