XInput 2.1 and earlier clients do not know about touches. We must report touch emulated button presses for these clients. For later clients, we only report true pointer button presses.
Signed-off-by: Chase Douglas <[email protected]> --- Changes since v1: * Separate touch button setting out of button state looping. We only need to check if any buttons are down and then set the logically mapped first button. Xi/xiquerypointer.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c index ba99752..169436e 100644 --- a/Xi/xiquerypointer.c +++ b/Xi/xiquerypointer.c @@ -79,10 +79,21 @@ ProcXIQueryPointer(ClientPtr client) XkbStatePtr state; char *buttons = NULL; int buttons_size = 0; /* size of buttons array */ + XIClientPtr xi_client; + Bool have_xi22 = FALSE; REQUEST(xXIQueryPointerReq); REQUEST_SIZE_MATCH(xXIQueryPointerReq); + /* Check if client is compliant with XInput 2.2 or later. Earlier clients + * do not know about touches, so we must report emulated button presses. 2.2 + * and later clients are aware of touches, so we don't include emulated + * button presses in the reply. */ + xi_client = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey); + if (version_compare(xi_client->major_version, + xi_client->minor_version, 2, 2) >= 0) + have_xi22 = TRUE; + rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess); if (rc != Success) { client->errorValue = stuff->deviceid; @@ -145,6 +156,9 @@ ProcXIQueryPointer(ClientPtr client) for (i = 1; i < pDev->button->numButtons; i++) if (BitIsOn(pDev->button->down, i)) SetBit(buttons, pDev->button->map[i]); + + if (!have_xi22 && pDev->touch && pDev->touch->buttonsDown > 0) + SetBit(buttons, pDev->button->map[1]); } else rep.buttons_len = 0; -- 1.7.9.5 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
