summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-05-14 18:12:56 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-05-14 18:12:56 +0930
commit81fc6a128b64ad412064405ed45db0175398e3f0 (patch)
treeebe510423e16a2ba2e44ae81cc608a635f18661d
parent5c680e94938c16e04a4349715cf11796b80400db (diff)
Add ungrab support to ExtendedGrabDeviceRequest handling.
Polish the code a bit.
-rw-r--r--Xi/extgrbdev.c49
-rw-r--r--dix/events.c122
-rw-r--r--include/dix.h5
3 files changed, 91 insertions, 85 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 <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
+#include <X11/extensions/Xge.h>
#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;
-
- 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;
-
- if (ge_masks)
+ return GrabInvalidTime;
+
+ 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;
+
+ 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)
{
- GenericMaskPtr last;
- newGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec));
- *newGrab.genericMasks = *ge_masks;
- newGrab.genericMasks->next = NULL;
+ last->next = xcalloc(1, sizeof(GenericMaskRec));
+ last = last->next;
+ *last = *ge_masks;
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 (IsPointerDevice(dev))
+ {
+ newGrab.keyboardMode = GrabModeAsync;
+ newGrab.pointerMode = device_mode;
+ } else
{
- grabinfo = &dev->deviceGrab;
- if (grabinfo->grab && SameClient(grabinfo->grab, client))
- (*grabinfo->DeactivateGrab)(dev);
+ 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 */