<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 16, 2013 at 1:32 AM, Jasper St. Pierre <span dir="ltr"><<a href="mailto:jstpierre@mecheye.net" target="_blank">jstpierre@mecheye.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class="im">POn Tue, Jul 16, 2013 at 1:23 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">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></blockquote><div><br></div></div><div>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.<br>
</div></div></div></div></blockquote><div><br></div><div>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.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>
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.<br>

<br></div><div>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>

</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
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></blockquote><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<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 *event, WindowPtr ancestor)<br>
 void<br>
 DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr 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>
<span><font color="#888888">--<br>
1.8.2.1<br>
<br>
</font></span></blockquote></div></div></div><span class=""><font color="#888888"><br><br clear="all"><br>-- <br>  Jasper<br>
</font></span></div></div>
</blockquote></div><br><br clear="all"><br>-- <br>  Jasper<br>
</div></div>