Add ungrab support to ExtendedGrabDeviceRequest handling.

Polish the code a bit.
This commit is contained in:
Peter Hutterer 2007-05-14 18:12:56 +09:30
parent 5c680e9493
commit 81fc6a128b
3 changed files with 93 additions and 87 deletions

View File

@ -45,12 +45,15 @@ from the author.
#include "scrnintstr.h" /* screen structure */ #include "scrnintstr.h" /* screen structure */
#include <X11/extensions/XI.h> #include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h> #include <X11/extensions/XIproto.h>
#include <X11/extensions/Xge.h>
#include "gestr.h" #include "gestr.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "extinit.h" /* LookupDeviceIntRec */ #include "extinit.h" /* LookupDeviceIntRec */
#include "exevents.h" #include "exevents.h"
#include "exglobals.h" #include "exglobals.h"
#include "grabdev.h" /* CreateMaskFromList */
#include "extgrbdev.h" #include "extgrbdev.h"
int int
@ -68,9 +71,8 @@ SProcXExtendedGrabDevice(ClientPtr client)
swapl(&stuff->time, n); swapl(&stuff->time, n);
swapl(&stuff->confine_to, n); swapl(&stuff->confine_to, n);
swapl(&stuff->cursor, n); swapl(&stuff->cursor, n);
swaps(&stuff->event_mask, n);
swaps(&stuff->event_count, n); swaps(&stuff->event_count, n);
swaps(&stuff->ge_event_count, n); swaps(&stuff->generic_event_count, n);
p = (long *)&stuff[1]; p = (long *)&stuff[1];
for (i = 0; i < stuff->event_count; i++) { for (i = 0; i < stuff->event_count; i++) {
@ -78,7 +80,7 @@ SProcXExtendedGrabDevice(ClientPtr client)
p++; 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 */ p++; /* first 4 bytes are extension type and padding */
swapl(p, n); swapl(p, n);
p++; p++;
@ -93,7 +95,7 @@ ProcXExtendedGrabDevice(ClientPtr client)
{ {
xExtendedGrabDeviceReply rep; xExtendedGrabDeviceReply rep;
DeviceIntPtr dev; DeviceIntPtr dev;
int err, int err = Success,
errval = 0, errval = 0,
i; i;
WindowPtr grab_window, WindowPtr grab_window,
@ -101,14 +103,25 @@ ProcXExtendedGrabDevice(ClientPtr client)
CursorPtr cursor = NULL; CursorPtr cursor = NULL;
struct tmask tmp[EMASKSIZE]; struct tmask tmp[EMASKSIZE];
TimeStamp time; TimeStamp time;
XgeEventMask* xgeMask; XGenericEventMask* xgeMask;
GenericMaskPtr gemasks = NULL; GenericMaskPtr gemasks = NULL;
REQUEST(xExtendedGrabDeviceReq); REQUEST(xExtendedGrabDeviceReq);
REQUEST_AT_LEAST_SIZE(xExtendedGrabDeviceReq); REQUEST_AT_LEAST_SIZE(xExtendedGrabDeviceReq);
if (stuff->length != (sizeof(xExtendedGrabDeviceReq) >> 2) + if (stuff->ungrab)
stuff->event_count + 2 * stuff->ge_event_count) {
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; errval = 0;
err = BadLength; err = BadLength;
@ -122,6 +135,13 @@ ProcXExtendedGrabDevice(ClientPtr client)
goto cleanup; goto cleanup;
} }
if (stuff->ungrab)
{
ExtUngrabDevice(client, dev);
goto cleanup;
}
err = dixLookupWindow(&grab_window, err = dixLookupWindow(&grab_window,
stuff->grab_window, stuff->grab_window,
client, 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, if (CreateMaskFromList(client,
(XEventClass*)&stuff[1], (XEventClass*)&stuff[1],
stuff->event_count, stuff->event_count,
@ -174,10 +189,10 @@ ProcXExtendedGrabDevice(ClientPtr client)
time = ClientTimeToServerTime(stuff->time); time = ClientTimeToServerTime(stuff->time);
if (stuff->ge_event_count) if (stuff->generic_event_count)
{ {
xgeMask = xgeMask =
(XgeEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count); (XGenericEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count);
gemasks = xcalloc(1, sizeof(GenericMaskRec)); gemasks = xcalloc(1, sizeof(GenericMaskRec));
gemasks->extension = xgeMask->extension; gemasks->extension = xgeMask->extension;
@ -185,7 +200,7 @@ ProcXExtendedGrabDevice(ClientPtr client)
gemasks->next = NULL; gemasks->next = NULL;
xgeMask++; 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->next = xcalloc(1, sizeof(GenericMaskRec));
gemasks = gemasks->next; 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, grab_window, confineTo, time, stuff->owner_events,
cursor, stuff->event_mask, tmp[stuff->deviceid].mask, cursor, tmp[stuff->deviceid].mask,
gemasks); gemasks);
if (err != Success) { if (err != Success) {

View File

@ -3161,11 +3161,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
xEvent *dxE; xEvent *dxE;
SpritePtr pSprite = thisDev->spriteInfo->sprite; SpritePtr pSprite = thisDev->spriteInfo->sprite;
if (xE->u.u.type & EXTENSION_EVENT_BASE || xE->u.u.type == GenericEvent)
grabinfo = &thisDev->deviceGrab; grabinfo = &thisDev->deviceGrab;
else
grabinfo = &thisDev->deviceGrab;
grab = grabinfo->grab; grab = grabinfo->grab;
if (grab->ownerEvents) if (grab->ownerEvents)
@ -5743,24 +5739,18 @@ SetGenericFilter(int extension, Mask* filters)
/** /**
* Grab a device for core events, XI events or XGE events. * Grab a device for XI events and XGE events.
*
* The latter also applies to generic events.
* grabmode is used to ungrab a device. * grabmode is used to ungrab a device.
*
*
*/ */
_X_EXPORT int _X_EXPORT int
ExtGrabDevice(ClientPtr client, ExtGrabDevice(ClientPtr client,
DeviceIntPtr dev, DeviceIntPtr dev,
int grabmode,
int device_mode, int device_mode,
WindowPtr grabWindow, WindowPtr grabWindow,
WindowPtr confineTo, WindowPtr confineTo,
TimeStamp ctime, TimeStamp ctime,
Bool ownerEvents, Bool ownerEvents,
CursorPtr cursor, CursorPtr cursor,
Mask core_mask,
Mask xi_mask, Mask xi_mask,
GenericMaskPtr ge_masks) GenericMaskPtr ge_masks)
{ {
@ -5769,8 +5759,6 @@ ExtGrabDevice(ClientPtr client,
UpdateCurrentTime(); UpdateCurrentTime();
if (grabmode & DeviceOnlyGrab)
{
grabinfo = &dev->deviceGrab; grabinfo = &dev->deviceGrab;
if (grabinfo->grab && !SameClient(grabinfo->grab, client)) if (grabinfo->grab && !SameClient(grabinfo->grab, client))
@ -5826,15 +5814,17 @@ ExtGrabDevice(ClientPtr client,
} }
(*grabinfo->ActivateGrab)(dev, &newGrab, ctime, FALSE); (*grabinfo->ActivateGrab)(dev, &newGrab, ctime, FALSE);
}
if (grabmode & UngrabAll)
{
grabinfo = &dev->deviceGrab;
if (grabinfo->grab && SameClient(grabinfo->grab, client))
(*grabinfo->DeactivateGrab)(dev);
}
return GrabSuccess; 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;
}

View File

@ -699,15 +699,16 @@ extern void SetGenericFilter(int extension, Mask* filters);
extern int ExtGrabDevice(ClientPtr client, extern int ExtGrabDevice(ClientPtr client,
DeviceIntPtr dev, DeviceIntPtr dev,
int grabmode,
int device_mode, int device_mode,
WindowPtr grabWindow, WindowPtr grabWindow,
WindowPtr confineTo, WindowPtr confineTo,
TimeStamp ctime, TimeStamp ctime,
Bool ownerEvents, Bool ownerEvents,
CursorPtr cursor, CursorPtr cursor,
Mask core_mask,
Mask xi_mask, Mask xi_mask,
GenericMaskPtr ge_masks); GenericMaskPtr ge_masks);
extern int ExtUngrabDevice(ClientPtr client,
DeviceIntPtr dev);
#endif /* DIX_H */ #endif /* DIX_H */