summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-05-14 16:24:35 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-05-16 12:20:59 +1000
commit00ab04d73c612ac85e024105015bdb7c79e8874b (patch)
tree99ec0374ca6a6a3608ff5deebcb52530c8b57f63
parentde78aab0ea3a2d8c61222493f25911258dea65a2 (diff)
Include full modifier + button state in XIQueryPointer.
-rw-r--r--Xi/querydp.c41
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;
}