From 1e7b500a8e1d79b91a4e857a2da06194efe8cf69 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 1 May 2012 10:21:11 -0700 Subject: Report logical button state in ProcXIQueryPointer Physical button state is usually meaningless to an X client. Signed-off-by: Chase Douglas Signed-off-by: Peter Hutterer Reviewed-by: Peter Hutterer --- Xi/xiquerypointer.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c index a2e7442e0..ba99752ef 100644 --- a/Xi/xiquerypointer.c +++ b/Xi/xiquerypointer.c @@ -132,7 +132,7 @@ ProcXIQueryPointer(ClientPtr client) } if (pDev->button) { - int i, down; + int i; rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons)); @@ -142,14 +142,9 @@ ProcXIQueryPointer(ClientPtr client) if (!buttons) return BadAlloc; - down = pDev->button->buttonsDown; - - for (i = 0; i < pDev->button->numButtons && down; i++) { - if (BitIsOn(pDev->button->down, i)) { - SetBit(buttons, i); - down--; - } - } + for (i = 1; i < pDev->button->numButtons; i++) + if (BitIsOn(pDev->button->down, i)) + SetBit(buttons, pDev->button->map[i]); } else rep.buttons_len = 0; -- cgit v1.2.3 From ee542b85590814ee25369babce1ad14feeb137af Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 1 May 2012 10:21:12 -0700 Subject: Report touch emulated buttons in XIQueryPointer for XI 2.1 and earlier 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- Xi/xiquerypointer.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c index ba99752ef..169436e14 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; -- cgit v1.2.3