[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:37:35 PDT 2013


On Tue, Jul 16, 2013 at 1:32 AM, Jasper St. Pierre <jstpierre at mecheye.net>wrote:

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

erm, it's late. I thought the behavior that getting events on slave devices
without keyboard focus was strange, 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
>



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


More information about the xorg-devel mailing list