[PATCH try2] dix: Send KeyPress and KeyRelease events to the XACE_KEY_AVAIL hook

Andrew Eikum aeikum at codeweavers.com
Fri May 15 13:10:13 PDT 2015


While it's documented in the XACE spec, the XACE_KEY_AVAIL hook is
currently never actually invoked by the xserver.

This hook was added in 13c6713c82 (25 Aug 2006), but as the keyboard
processing was moved into XKB, the hook was forgotten and silently
dropped. The code calling this hook was removed by 7af53799c (4 Jan
2009), but it was probably already unused before that.

This patch re-adds support for this hook. The "count" hook parameter is
unused.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---

Change from previous patch: Daniel S on IRC suggested placing the hook
into ProcessDeviceEvent, as that's where the X server does most of the
actual event prep and handling before dispatch to clients.

I noticed while testing this that my XACE plugin got multiple calls for
a single physical keypress. One came from the physical keyboard device,
and another from the Virtual core keyboard. I thought about doing some
sort of filtering to prevent duplicate events, but I think it's better
to ask the XACE plugin to do its own discrimination based on the device.

Pending approval, updates to the XACE spec documentation for the "count"
parameter, and to warn about duplicate events, will follow.
---
 Xi/exevents.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 1c586d0..859c29f 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1730,6 +1730,18 @@ ProcessDeviceEvent(InternalEvent *ev, DeviceIntPtr device)
         break;
     }
 
+    /* send KeyPress and KeyRelease events to XACE plugins */
+    if (XaceHooks[XACE_KEY_AVAIL] &&
+            (event->type == ET_KeyPress || event->type == ET_KeyRelease)) {
+        xEvent *core;
+        int count;
+
+        if (EventToCore(ev, &core, &count) == Success) {
+            XaceHook(XACE_KEY_AVAIL, core, device, 0);
+            free(core);
+        }
+    }
+
     if (DeviceEventCallback && !syncEvents.playingEvents) {
         DeviceEventInfoRec eventinfo;
         SpritePtr pSprite = device->spriteInfo->sprite;
-- 
2.4.0



More information about the xorg-devel mailing list