<div dir="ltr">Yeah, there's no focus handling in there, and that's what I meant -- it selects for events from slave devices on the root window. I was just surprised that worked.<br></div><div class="gmail_extra"><br>
<br><div class="gmail_quote">On Tue, Jul 16, 2013 at 2:03 AM, Peter Hutterer <span dir="ltr"><<a href="mailto:peter.hutterer@who-t.net" target="_blank">peter.hutterer@who-t.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Tue, Jul 16, 2013 at 01:32:19AM -0400, Jasper St. Pierre wrote:<br>
> POn Tue, Jul 16, 2013 at 1:23 AM, Peter Hutterer<br>
> <<a href="mailto:peter.hutterer@who-t.net">peter.hutterer@who-t.net</a>>wrote:<br>
><br>
> > Tricky one.<br>
> ><br>
> > The protocol spec specifically states:<br>
> > - if the SD is attached to a master keyboard, it sends events to this<br>
> >   keyboard's focus window (if applicable) and/or changes the modifier state<br>
> >   of this keyboard.<br>
> ><br>
> > Except that the actual behavior of the keyboard since 1.7 was that SDs have<br>
> > a separate keyboard focus whether attached or not. That focus by default is<br>
> > PointerRoot, unless set otherwise. So fixing this means we may actually<br>
> > break applications - if there are any that use this, I don't actually know.<br>
> ><br>
><br>
> I will say that I was code reviewing an XI2 port of Dolphin. I thought the<br>
> behavior that selecting for events on slave devices worked without keyboard<br>
> focus, but I suppose it makes sense for floating devices.<br>
><br>
> The developer of the branch claimed he was one of the few explicitly using<br>
> slave devices and MPX. Whether or not these setups are used in "the real<br>
> world" is questionable, but it's actually a convenient way to capture the<br>
> keyboard in the background that doesn't involve calling XQueryKeymap every<br>
> frame, which is what they do now, so it might be worth it to just keep the<br>
> behavior and document it.<br>
><br>
> You can see the respective code for your curiosity as well at:<br>
><br>
> <a href="https://github.com/Max-E/dolphin-emu/blob/xorg_xinput2/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xinput2/Xinput2.cpp#L52" target="_blank">https://github.com/Max-E/dolphin-emu/blob/xorg_xinput2/Source/Core/InputCommon/Src/ControllerInterface/Xlib/Xinput2/Xinput2.cpp#L52</a><br>

<br>
</div>I understand, and that was in part why the devices are accessible separatly<br>
- so you can really tell which keyboard has which physical state. problem is<br>
that it requires a bit of work because unless you're handling the focus for<br>
all devices all it takes is one other client to set the focus to a specific<br>
window, or None, etc. and you lose the event stream.<br>
<br>
quick search didn't show any focus handling in this file, but I didn't look<br>
at the code in detail.<br>
<br>
Cheers,<br>
   Peter<br>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
> > I'm actually contemplating changing the spec to reflect the server behavior<br>
> > we've had since 1.7 than fixing this, but here's the patch anyway.<br>
> ><br>
> > To make the behavior consistent we'd need to extend XISetFocus to return<br>
> > BadDevice when trying to set a<br>
> ><br>
><br>
> ---<br>
> >  dix/events.c | 8 ++++++--<br>
> >  1 file changed, 6 insertions(+), 2 deletions(-)<br>
> ><br>
> > diff --git a/dix/events.c b/dix/events.c<br>
> > index ed3138d..825cb8b 100644<br>
> > --- a/dix/events.c<br>
> > +++ b/dix/events.c<br>
> > @@ -4039,13 +4039,17 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent<br>
> > *event, WindowPtr ancestor)<br>
> >  void<br>
> >  DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr<br>
> > window)<br>
> >  {<br>
> > -    DeviceIntPtr ptr;<br>
> > -    WindowPtr focus = keybd->focus->win;<br>
> > +    DeviceIntPtr ptr, kbd;<br>
> > +    WindowPtr focus;<br>
> >      BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);<br>
> >      xEvent *core = NULL, *xE = NULL, *xi2 = NULL;<br>
> >      int count, rc;<br>
> >      int deliveries = 0;<br>
> ><br>
> > +    kbd = GetMaster(keybd, KEYBOARD_OR_FLOAT);<br>
> > +    BUG_RETURN(!kbd->focus);<br>
> > +    focus = kbd->focus->win;<br>
> > +<br>
> >      if (focus == FollowKeyboardWin)<br>
> >          focus = inputInfo.keyboard->focus->win;<br>
> >      if (!focus)<br>
> > --<br>
> > 1.8.2.1<br>
> ><br>
> ><br>
><br>
><br>
> --<br>
>   Jasper<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>  Jasper<br>
</div>