diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-14 16:24:35 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-16 12:20:59 +1000 |
commit | 00ab04d73c612ac85e024105015bdb7c79e8874b (patch) | |
tree | 99ec0374ca6a6a3608ff5deebcb52530c8b57f63 | |
parent | de78aab0ea3a2d8c61222493f25911258dea65a2 (diff) |
Include full modifier + button state in XIQueryPointer.
-rw-r--r-- | Xi/querydp.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/Xi/querydp.c b/Xi/querydp.c index dee00fe39..d7df73368 100644 --- a/Xi/querydp.c +++ b/Xi/querydp.c @@ -75,6 +75,8 @@ ProcXIQueryPointer(ClientPtr client) DeviceIntPtr pDev, kbd; WindowPtr pWin, t; SpritePtr pSprite; + XkbStatePtr state; + char *buttons = NULL; REQUEST(xXIQueryPointerReq); REQUEST_SIZE_MATCH(xXIQueryPointerReq); @@ -107,14 +109,40 @@ ProcXIQueryPointer(ClientPtr client) rep.RepType = X_XIQueryPointer; rep.length = 0; rep.sequenceNumber = client->sequence; - rep.mask = pDev->button->state; - if (kbd && kbd->key) - rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state); rep.root = (GetCurrentRootWindow(pDev))->drawable.id; rep.root_x = FP1616(pSprite->hot.x, 0); rep.root_y = FP1616(pSprite->hot.y, 0); rep.child = None; - rep.deviceid = pDev->id; + + state = &kbd->key->xkbInfo->prev_state; + rep.mods.base_mods = state->base_mods; + rep.mods.latched_mods = state->latched_mods; + rep.mods.locked_mods = state->locked_mods; + + rep.group.base_group = state->base_group; + rep.group.latched_group = state->latched_group; + rep.group.locked_group = state->locked_group; + + if (pDev->button) + { + int i, down; + rep.buttons_len = ((pDev->button->numButtons/8) + 3)/4; + buttons = xcalloc(rep.buttons_len, 4); + 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--; + } + } + } else + rep.buttons_len = 0; if (pSprite->hot.pScreen == pWin->drawable.pScreen) { @@ -147,6 +175,11 @@ ProcXIQueryPointer(ClientPtr client) #endif WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep); + if (buttons) + WriteToClient(client, rep.buttons_len * 4, buttons); + + xfree(buttons); + return Success; } |