[PATCH] dix: deliver attached slave device's keyboard events to the master's focus

Peter Hutterer peter.hutterer at who-t.net
Mon Jul 15 22:27:47 PDT 2013


On Tue, Jul 16, 2013 at 03:23:45PM +1000, Peter Hutterer wrote:
> Tricky one.
> 
> The protocol spec specifically states:
> - if the SD is attached to a master keyboard, it sends events to this
>   keyboard's focus window (if applicable) and/or changes the modifier state
>   of this keyboard.
> 
> Except that the actual behavior of the keyboard since 1.7 was that SDs have
> a separate keyboard focus whether attached or not. That focus by default is
> PointerRoot, unless set otherwise. So fixing this means we may actually
> break applications - if there are any that use this, I don't actually know.
> 
> I'm actually contemplating changing the spec to reflect the server behavior
> we've had since 1.7 than fixing this, but here's the patch anyway.
> 
> To make the behavior consistent we'd need to extend XISetFocus to return
> BadDevice when trying to set a

urgh, got cut off here, this reads:

To make the behavior consistent we'd need to extend XISetFocus to return
BadDevice when trying to set a keyboard focus for an attached slave. That
too would be a change in behavior.

Cheers,
   Peter

> ---
>  dix/events.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/dix/events.c b/dix/events.c
> index ed3138d..825cb8b 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -4039,13 +4039,17 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
>  void
>  DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
>  {
> -    DeviceIntPtr ptr;
> -    WindowPtr focus = keybd->focus->win;
> +    DeviceIntPtr ptr, kbd;
> +    WindowPtr focus;
>      BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);
>      xEvent *core = NULL, *xE = NULL, *xi2 = NULL;
>      int count, rc;
>      int deliveries = 0;
>  
> +    kbd = GetMaster(keybd, KEYBOARD_OR_FLOAT);
> +    BUG_RETURN(!kbd->focus);
> +    focus = kbd->focus->win;
> +
>      if (focus == FollowKeyboardWin)
>          focus = inputInfo.keyboard->focus->win;
>      if (!focus)
> -- 
> 1.8.2.1
> 


More information about the xorg-devel mailing list