From 81fc6a128b64ad412064405ed45db0175398e3f0 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 14 May 2007 18:12:56 +0930 Subject: [PATCH] Add ungrab support to ExtendedGrabDeviceRequest handling. Polish the code a bit. --- Xi/extgrbdev.c | 49 ++++++++++++------- dix/events.c | 126 +++++++++++++++++++++++-------------------------- include/dix.h | 5 +- 3 files changed, 93 insertions(+), 87 deletions(-) diff --git a/Xi/extgrbdev.c b/Xi/extgrbdev.c index 0f0fd30f0..35756014b 100644 --- a/Xi/extgrbdev.c +++ b/Xi/extgrbdev.c @@ -45,12 +45,15 @@ from the author. #include "scrnintstr.h" /* screen structure */ #include #include +#include #include "gestr.h" #include "extnsionst.h" #include "extinit.h" /* LookupDeviceIntRec */ #include "exevents.h" #include "exglobals.h" +#include "grabdev.h" /* CreateMaskFromList */ + #include "extgrbdev.h" int @@ -68,9 +71,8 @@ SProcXExtendedGrabDevice(ClientPtr client) swapl(&stuff->time, n); swapl(&stuff->confine_to, n); swapl(&stuff->cursor, n); - swaps(&stuff->event_mask, n); swaps(&stuff->event_count, n); - swaps(&stuff->ge_event_count, n); + swaps(&stuff->generic_event_count, n); p = (long *)&stuff[1]; for (i = 0; i < stuff->event_count; i++) { @@ -78,7 +80,7 @@ SProcXExtendedGrabDevice(ClientPtr client) p++; } - for (i = 0; i < stuff->ge_event_count; i++) { + for (i = 0; i < stuff->generic_event_count; i++) { p++; /* first 4 bytes are extension type and padding */ swapl(p, n); p++; @@ -93,7 +95,7 @@ ProcXExtendedGrabDevice(ClientPtr client) { xExtendedGrabDeviceReply rep; DeviceIntPtr dev; - int err, + int err = Success, errval = 0, i; WindowPtr grab_window, @@ -101,14 +103,25 @@ ProcXExtendedGrabDevice(ClientPtr client) CursorPtr cursor = NULL; struct tmask tmp[EMASKSIZE]; TimeStamp time; - XgeEventMask* xgeMask; + XGenericEventMask* xgeMask; GenericMaskPtr gemasks = NULL; REQUEST(xExtendedGrabDeviceReq); REQUEST_AT_LEAST_SIZE(xExtendedGrabDeviceReq); - if (stuff->length != (sizeof(xExtendedGrabDeviceReq) >> 2) + - stuff->event_count + 2 * stuff->ge_event_count) + if (stuff->ungrab) + { + REQUEST_SIZE_MATCH(xExtendedGrabDeviceReq); + } + + rep.repType = X_Reply; + rep.RepType = X_ExtendedGrabDevice; + rep.sequenceNumber = client->sequence; + rep.length = 0; + + if (!stuff->ungrab && /* other fields are undefined for ungrab */ + (stuff->length != (sizeof(xExtendedGrabDeviceReq) >> 2) + + stuff->event_count + 2 * stuff->generic_event_count)) { errval = 0; err = BadLength; @@ -122,6 +135,13 @@ ProcXExtendedGrabDevice(ClientPtr client) goto cleanup; } + + if (stuff->ungrab) + { + ExtUngrabDevice(client, dev); + goto cleanup; + } + err = dixLookupWindow(&grab_window, stuff->grab_window, client, @@ -159,11 +179,6 @@ ProcXExtendedGrabDevice(ClientPtr client) } } - rep.repType = X_Reply; - rep.RepType = X_ExtendedGrabDevice; - rep.sequenceNumber = client->sequence; - rep.length = 0; - if (CreateMaskFromList(client, (XEventClass*)&stuff[1], stuff->event_count, @@ -174,10 +189,10 @@ ProcXExtendedGrabDevice(ClientPtr client) time = ClientTimeToServerTime(stuff->time); - if (stuff->ge_event_count) + if (stuff->generic_event_count) { xgeMask = - (XgeEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count); + (XGenericEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count); gemasks = xcalloc(1, sizeof(GenericMaskRec)); gemasks->extension = xgeMask->extension; @@ -185,7 +200,7 @@ ProcXExtendedGrabDevice(ClientPtr client) gemasks->next = NULL; xgeMask++; - for (i = 1; i < stuff->ge_event_count; i++, xgeMask++) + for (i = 1; i < stuff->generic_event_count; i++, xgeMask++) { gemasks->next = xcalloc(1, sizeof(GenericMaskRec)); gemasks = gemasks->next; @@ -195,9 +210,9 @@ ProcXExtendedGrabDevice(ClientPtr client) } } - ExtGrabDevice(client, dev, stuff->grabmode, stuff->device_mode, + ExtGrabDevice(client, dev, stuff->device_mode, grab_window, confineTo, time, stuff->owner_events, - cursor, stuff->event_mask, tmp[stuff->deviceid].mask, + cursor, tmp[stuff->deviceid].mask, gemasks); if (err != Success) { diff --git a/dix/events.c b/dix/events.c index 1d9417da2..30deeb6d4 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3161,11 +3161,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev, xEvent *dxE; SpritePtr pSprite = thisDev->spriteInfo->sprite; - if (xE->u.u.type & EXTENSION_EVENT_BASE || xE->u.u.type == GenericEvent) - grabinfo = &thisDev->deviceGrab; - else - grabinfo = &thisDev->deviceGrab; - + grabinfo = &thisDev->deviceGrab; grab = grabinfo->grab; if (grab->ownerEvents) @@ -5743,24 +5739,18 @@ SetGenericFilter(int extension, Mask* filters) /** - * Grab a device for core events, XI events or XGE events. - * - * The latter also applies to generic events. + * Grab a device for XI events and XGE events. * grabmode is used to ungrab a device. - * - * */ _X_EXPORT int ExtGrabDevice(ClientPtr client, DeviceIntPtr dev, - int grabmode, int device_mode, WindowPtr grabWindow, WindowPtr confineTo, TimeStamp ctime, Bool ownerEvents, CursorPtr cursor, - Mask core_mask, Mask xi_mask, GenericMaskPtr ge_masks) { @@ -5769,72 +5759,72 @@ ExtGrabDevice(ClientPtr client, UpdateCurrentTime(); - if (grabmode & DeviceOnlyGrab) - { - grabinfo = &dev->deviceGrab; + grabinfo = &dev->deviceGrab; - if (grabinfo->grab && !SameClient(grabinfo->grab, client)) - return AlreadyGrabbed; + if (grabinfo->grab && !SameClient(grabinfo->grab, client)) + return AlreadyGrabbed; - if (!grabWindow->realized) - return GrabNotViewable; + if (!grabWindow->realized) + return GrabNotViewable; - if ((CompareTimeStamps(ctime, currentTime) == LATER) || + if ((CompareTimeStamps(ctime, currentTime) == LATER) || (CompareTimeStamps(ctime, grabinfo->grabTime) == EARLIER)) - return GrabInvalidTime; + return GrabInvalidTime; - if (grabinfo->sync.frozen && grabinfo->sync.other && - !SameClient(grabinfo->sync.other, client)) - return GrabFrozen; + if (grabinfo->sync.frozen && grabinfo->sync.other && + !SameClient(grabinfo->sync.other, client)) + return GrabFrozen; - memset(&newGrab, 0, sizeof(GrabRec)); - newGrab.window = grabWindow; - newGrab.resource = client->clientAsMask; - newGrab.ownerEvents = ownerEvents; - newGrab.device = dev; - newGrab.cursor = cursor; - newGrab.confineTo = confineTo; - newGrab.eventMask = xi_mask; - newGrab.genericMasks = NULL; + memset(&newGrab, 0, sizeof(GrabRec)); + newGrab.window = grabWindow; + newGrab.resource = client->clientAsMask; + newGrab.ownerEvents = ownerEvents; + newGrab.device = dev; + newGrab.cursor = cursor; + newGrab.confineTo = confineTo; + newGrab.eventMask = xi_mask; + newGrab.genericMasks = NULL; - if (ge_masks) - { - GenericMaskPtr last; - newGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec)); - *newGrab.genericMasks = *ge_masks; - newGrab.genericMasks->next = NULL; - ge_masks = ge_masks->next; - last = newGrab.genericMasks; - - while(ge_masks) - { - last->next = xcalloc(1, sizeof(GenericMaskRec)); - last = last->next; - *last = *ge_masks; - ge_masks = ge_masks->next; - } - } - - if (IsPointerDevice(dev)) - { - newGrab.keyboardMode = GrabModeAsync; - newGrab.pointerMode = device_mode; - } else - { - newGrab.keyboardMode = device_mode; - newGrab.pointerMode = GrabModeAsync; - } - - (*grabinfo->ActivateGrab)(dev, &newGrab, ctime, FALSE); - } - - if (grabmode & UngrabAll) + if (ge_masks) { - grabinfo = &dev->deviceGrab; - if (grabinfo->grab && SameClient(grabinfo->grab, client)) - (*grabinfo->DeactivateGrab)(dev); + GenericMaskPtr last; + newGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec)); + *newGrab.genericMasks = *ge_masks; + newGrab.genericMasks->next = NULL; + ge_masks = ge_masks->next; + last = newGrab.genericMasks; + + while(ge_masks) + { + last->next = xcalloc(1, sizeof(GenericMaskRec)); + last = last->next; + *last = *ge_masks; + ge_masks = ge_masks->next; + } } + if (IsPointerDevice(dev)) + { + newGrab.keyboardMode = GrabModeAsync; + newGrab.pointerMode = device_mode; + } else + { + newGrab.keyboardMode = device_mode; + newGrab.pointerMode = GrabModeAsync; + } + + (*grabinfo->ActivateGrab)(dev, &newGrab, ctime, FALSE); return GrabSuccess; } + +_X_EXPORT int +ExtUngrabDevice(ClientPtr client, DeviceIntPtr dev) +{ + GrabInfoPtr grabinfo = &dev->deviceGrab; + if (grabinfo->grab && SameClient(grabinfo->grab, client)) + (*grabinfo->DeactivateGrab)(dev); + return GrabSuccess; +} + + diff --git a/include/dix.h b/include/dix.h index 60a68eea9..736a93e06 100644 --- a/include/dix.h +++ b/include/dix.h @@ -699,15 +699,16 @@ extern void SetGenericFilter(int extension, Mask* filters); extern int ExtGrabDevice(ClientPtr client, DeviceIntPtr dev, - int grabmode, int device_mode, WindowPtr grabWindow, WindowPtr confineTo, TimeStamp ctime, Bool ownerEvents, CursorPtr cursor, - Mask core_mask, Mask xi_mask, GenericMaskPtr ge_masks); +extern int ExtUngrabDevice(ClientPtr client, + DeviceIntPtr dev); + #endif /* DIX_H */