[PATCH xserver 06/10] Make CheckPassiveGrabsOnWindow return grab, export
Daniel Stone
daniel at fooishbar.org
Fri Dec 17 09:13:31 PST 2010
Change CheckPassiveGrabsOnWindow to return the GrabPtr it used (or NULL
if none) rather than a boolean, and export it. Also add an additional
boolean 'activate' parameter; use TRUE for existing behaviour, or FALSE
to only find the grab and then return it.
This will be used in forthcoming touch patches to find the grabs, rather
than open-coding same.
Signed-off-by: Daniel Stone <daniel at fooishbar.org>
---
dix/events.c | 44 ++++++++++++++++++++++++--------------------
include/dix.h | 7 +++++++
2 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/dix/events.c b/dix/events.c
index cb98daf..77e76ac 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -209,10 +209,6 @@ static void CheckPhysLimits(DeviceIntPtr pDev,
Bool generateEvents,
Bool confineToScreen,
ScreenPtr pScreen);
-static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
- DeviceIntPtr device,
- DeviceEvent *event,
- BOOL checkCore);
/** Key repeat hack. Do not use but in TryClientEvents */
extern BOOL EventIsKeyRepeat(xEvent *event);
@@ -2607,7 +2603,6 @@ XYToWindow(SpritePtr pSprite, int x, int y)
BOOL
ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
{
- BOOL rc = FALSE;
DeviceEvent event;
if (dev->deviceGrab.grab)
@@ -2632,10 +2627,13 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
event.deviceid = dev->id;
event.sourceid = dev->id;
event.detail.button = 0;
- rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
- if (rc)
+ if (CheckPassiveGrabsOnWindow(win, dev, &event, FALSE, TRUE))
+ {
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveUngrab);
- return rc;
+ return TRUE;
+ }
+
+ return FALSE;
}
/**
@@ -2647,7 +2645,6 @@ ActivateFocusInGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
static BOOL
ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
{
- BOOL rc = FALSE;
DeviceEvent event;
if (dev->deviceGrab.grab)
@@ -2669,11 +2666,13 @@ ActivateEnterGrab(DeviceIntPtr dev, WindowPtr old, WindowPtr win)
event.deviceid = dev->id;
event.sourceid = dev->id;
event.detail.button = 0;
- rc = CheckPassiveGrabsOnWindow(win, dev, &event, FALSE);
- if (rc)
+ if (CheckPassiveGrabsOnWindow(win, dev, &event, FALSE, TRUE))
+ {
DoEnterLeaveEvents(dev, dev->id, old, win, XINotifyPassiveGrab);
+ return TRUE;
+ }
- return rc;
+ return FALSE;
}
/**
@@ -3342,20 +3341,23 @@ BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin)
/**
* "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a
* passive grab set on the window to be activated.
- * If a passive grab is activated, the event will be delivered to the client.
+ * If activate is true and a passive grab is found, it will be activated,
+ * and the event will be delivered to the client.
*
* @param pWin The window that may be subject to a passive grab.
* @param device Device that caused the event.
* @param event The current device event.
* @param checkCore Check for core grabs too.
+ * @param activate If a grab is found, activate it and deliver the event.
*/
-static Bool
+GrabPtr
CheckPassiveGrabsOnWindow(
WindowPtr pWin,
DeviceIntPtr device,
DeviceEvent *event,
- BOOL checkCore)
+ BOOL checkCore,
+ BOOL activate)
{
SpritePtr pSprite = device->spriteInfo->sprite;
GrabPtr grab = wPassiveGrabs(pWin);
@@ -3367,7 +3369,7 @@ CheckPassiveGrabsOnWindow(
int match = 0;
if (!grab)
- return FALSE;
+ return NULL;
/* Fill out the grab details, but leave the type for later before
* comparing */
tempGrab.window = pWin;
@@ -3481,6 +3483,8 @@ CheckPassiveGrabsOnWindow(
continue;
}
+ if (!activate)
+ return grab;
if (match & CORE_MATCH)
{
@@ -3538,10 +3542,10 @@ CheckPassiveGrabsOnWindow(
if (match & (XI_MATCH | XI2_MATCH))
free(xE); /* on core match xE == &core */
- return TRUE;
+ return grab;
}
}
- return FALSE;
+ return NULL;
#undef CORE_MATCH
#undef XI_MATCH
#undef XI2_MATCH
@@ -3607,7 +3611,7 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
for (; i < focus->traceGood; i++)
{
pWin = focus->trace[i];
- if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore))
+ if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore, TRUE))
return TRUE;
}
@@ -3620,7 +3624,7 @@ CheckDeviceGrabs(DeviceIntPtr device, DeviceEvent *event, WindowPtr ancestor)
for (; i < device->spriteInfo->sprite->spriteTraceGood; i++)
{
pWin = device->spriteInfo->sprite->spriteTrace[i];
- if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore))
+ if (CheckPassiveGrabsOnWindow(pWin, device, event, sendCore, TRUE))
return TRUE;
}
diff --git a/include/dix.h b/include/dix.h
index 7485e8e..12e4b59 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -372,6 +372,13 @@ extern void AllowSome(
extern void ReleaseActiveGrabs(
ClientPtr client);
+extern GrabPtr CheckPassiveGrabsOnWindow(
+ WindowPtr /* pWin */,
+ DeviceIntPtr /* device */,
+ DeviceEvent * /* event */,
+ BOOL /* checkCore */,
+ BOOL /* activate */);
+
extern _X_EXPORT int DeliverEventsToWindow(
DeviceIntPtr /* pWin */,
WindowPtr /* pWin */,
--
1.7.2.3
More information about the xorg-devel
mailing list