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

Jasper St. Pierre jstpierre at mecheye.net
Mon Jul 15 22:32:19 PDT 2013


POn Tue, Jul 16, 2013 at 1:23 AM, Peter Hutterer
<peter.hutterer at who-t.net>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 will say that I was code reviewing an XI2 port of Dolphin. I thought the
behavior that selecting for events on slave devices worked without keyboard
focus, but I suppose it makes sense for floating devices.

The developer of the branch claimed he was one of the few explicitly using
slave devices and MPX. Whether or not these setups are used in "the real
world" is questionable, but it's actually a convenient way to capture the
keyboard in the background that doesn't involve calling XQueryKeymap every
frame, which is what they do now, so it might be worth it to just keep the
behavior and document it.

You can see the respective code for your curiosity as well at:

https://github.com/Max-E/dolphin-emu/blob/xorg_xinput2/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xinput2/Xinput2.cpp#L52


> 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
>

---
>  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
>
>


-- 
  Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20130716/a9c5de85/attachment.html>


More information about the xorg-devel mailing list