summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2007-04-03 15:06:26 +0930
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-04-03 15:06:26 +0930
commit9b0b3406682b5a3161e6c3895771523214c37207 (patch)
tree3db8e7d008ff769b7347673a1e643f839ef979a6
parente8777a91f37d828b9df839bf3d9cf2f954bdddb0 (diff)
Make GrabDevice differ between core grabs and device grabs.
-rw-r--r--Xi/grabdev.c2
-rw-r--r--dix/events.c16
-rw-r--r--include/dix.h3
3 files changed, 12 insertions, 9 deletions
diff --git a/Xi/grabdev.c b/Xi/grabdev.c
index e2809efb1..143b98c73 100644
--- a/Xi/grabdev.c
+++ b/Xi/grabdev.c
@@ -141,7 +141,7 @@ ProcXGrabDevice(ClientPtr client)
error = GrabDevice(client, dev, stuff->this_device_mode,
stuff->other_devices_mode, stuff->grabWindow,
stuff->ownerEvents, stuff->time,
- tmp[stuff->deviceid].mask, &rep.status);
+ tmp[stuff->deviceid].mask, &rep.status, FALSE);
if (error != Success) {
SendErrorToClient(client, IReqCode, X_GrabDevice, 0, error);
diff --git a/dix/events.c b/dix/events.c
index de8ff9b6b..03d82e911 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4110,12 +4110,14 @@ ProcUngrabPointer(ClientPtr client)
int
GrabDevice(ClientPtr client, DeviceIntPtr dev,
unsigned this_mode, unsigned other_mode, Window grabWindow,
- unsigned ownerEvents, Time ctime, Mask mask, CARD8 *status)
+ unsigned ownerEvents, Time ctime, Mask mask, CARD8 *status,
+ Bool coreGrab)
{
WindowPtr pWin;
GrabPtr grab;
TimeStamp time;
int rc;
+ GrabInfoPtr grabInfo = (coreGrab) ? &dev->coreGrab : &dev->deviceGrab;
UpdateCurrentTime();
if ((this_mode != GrabModeSync) && (this_mode != GrabModeAsync))
@@ -4137,16 +4139,16 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
if (rc != Success)
return rc;
time = ClientTimeToServerTime(ctime);
- grab = dev->coreGrab.grab;
+ grab = grabInfo->grab;
if (grab && !SameClient(grab, client))
*status = AlreadyGrabbed;
else if (!pWin->realized)
*status = GrabNotViewable;
else if ((CompareTimeStamps(time, currentTime) == LATER) ||
- (CompareTimeStamps(time, dev->coreGrab.grabTime) == EARLIER))
+ (CompareTimeStamps(time, grabInfo->grabTime) == EARLIER))
*status = GrabInvalidTime;
- else if (dev->coreGrab.sync.frozen &&
- dev->coreGrab.sync.other && !SameClient(dev->coreGrab.sync.other, client))
+ else if (grabInfo->sync.frozen &&
+ grabInfo->sync.other && !SameClient(grabInfo->sync.other, client))
*status = GrabFrozen;
else
{
@@ -4164,7 +4166,7 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
tempGrab.device = dev;
tempGrab.cursor = NULL;
- (*dev->coreGrab.ActivateGrab)(dev, &tempGrab, time, FALSE);
+ (*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
*status = GrabSuccess;
}
return Success;
@@ -4184,7 +4186,7 @@ ProcGrabKeyboard(ClientPtr client)
result = GrabDevice(client, keyboard, stuff->keyboardMode,
stuff->pointerMode, stuff->grabWindow,
stuff->ownerEvents, stuff->time,
- KeyPressMask | KeyReleaseMask, &rep.status);
+ KeyPressMask | KeyReleaseMask, &rep.status, TRUE);
else {
result = Success;
rep.status = AlreadyGrabbed;
diff --git a/include/dix.h b/include/dix.h
index 2ad6c77fa..1b112a1ca 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -485,7 +485,8 @@ extern int GrabDevice(
unsigned /* ownerEvents */,
Time /* ctime */,
Mask /* mask */,
- CARD8 * /* status */);
+ CARD8 * /* status */,
+ Bool /* coreGrab */);
extern void InitEvents(void);
extern void InitSprite(