diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-25 12:45:52 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-25 15:22:50 +1000 |
commit | 9b9f9373f32ebe9a15f286d16b6ba880b44a9c22 (patch) | |
tree | 3682a3a01e54803044089563ca7d001bc5c45ec5 /src/XISelEv.c | |
parent | 13ce4a03824a7c5ac0270198d265b02b18786e1f (diff) |
Add XIGetSelectedEvents.
Diffstat (limited to 'src/XISelEv.c')
-rw-r--r-- | src/XISelEv.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/XISelEv.c b/src/XISelEv.c index fc9f2a2..d76861f 100644 --- a/src/XISelEv.c +++ b/src/XISelEv.c @@ -91,3 +91,85 @@ XISelectEvents(Display* dpy, Window win, XIEventMask* masks, int num_masks) return Success; } + +XIEventMask* +XIGetSelectedEvents(Display* dpy, Window win, int *num_masks_return) +{ + int i, len = 0; + unsigned char *mask; + XIEventMask *mask_out = NULL; + xXIEventMask *mask_in = NULL, *mi; + xXIGetSelectedEventsReq *req; + xXIGetSelectedEventsReply reply; + + XExtDisplayInfo *info = XInput_find_display(dpy); + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XI_2_Major, info) == -1) + { + *num_masks_return = -1; + return NULL; + } + + GetReq(XIGetSelectedEvents, req); + + req->reqType = info->codes->major_opcode; + req->ReqType = X_XIGetSelectedEvents; + req->window = win; + + if (!_XReply(dpy, (xReply *) &reply, 0, xFalse)) + goto error; + + if (reply.num_masks == 0) + { + *num_masks_return = 0; + return NULL; + } + + mask_in = Xmalloc(reply.length * 4); + if (!mask_in) + goto error; + + _XRead(dpy, (char*)mask_in, reply.length * 4); + + /* Memory layout of the XIEventMask for a 3 mask reply: + * [struct a][struct b][struct c][masks a][masks b][masks c] + */ + len = reply.num_masks * sizeof(XIEventMask); + + for (i = 0, mi = mask_in; i < reply.num_masks; i++) + { + len += mi->mask_len * 4; + mi = (xXIEventMask*)((char*)mi + mi->mask_len * 4); + mi++; + } + + mask_out = Xmalloc(len); + if (!mask_out) + goto error; + + mi = mask_in; + mask = (unsigned char*)&mask_out[reply.num_masks]; + for (i = 0; i < reply.num_masks; i++) + { + mask_out[i].deviceid = mi->deviceid; + mask_out[i].mask_len = mi->mask_len * 4; + mask_out[i].mask = mask; + memcpy(mask_out[i].mask, &mi[1], mask_out[i].mask_len); + mask += mask_out[i].mask_len; + mi = (xXIEventMask*)((char*)mi + mi->mask_len * 4); + mi++; + } + + *num_masks_return = reply.num_masks; + + return mask_out; + +error: + if (mask_in) + Xfree(mask_in); + *num_masks_return = -1; + UnlockDisplay(dpy); + SyncHandle(); + return NULL; + +} |