[PATCH xserver 1/4 v3] xkb: add hook to allow/deny AccessX key repeat

Olivier Fourdan ofourdan at redhat.com
Mon May 23 16:11:41 UTC 2016


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 <ofourdan at redhat.com>
---
 v3: no change, just keep the patch series together.

 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 7e71089..6e4ad44 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 892cb30..f800577 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;
 }
-- 
2.7.4



More information about the xorg-devel mailing list