Add ungrab support to ExtendedGrabDeviceRequest handling.
Polish the code a bit.
This commit is contained in:
parent
5c680e9493
commit
81fc6a128b
|
@ -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) {
|
||||||
|
|
34
dix/events.c
34
dix/events.c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue