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

Andrew Eikum aeikum at codeweavers.com
Tue May 26 12:11:43 PDT 2015


Hey, anyone have any comments on this patch?

Thanks,
Andrew

On Fri, May 15, 2015 at 03:10:13PM -0500, Andrew Eikum wrote:
> 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
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list