summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter@cs.unisa.edu.au>2008-01-23 16:08:37 +1030
committerPeter Hutterer <peter@cs.unisa.edu.au>2008-01-25 10:27:26 +1030
commit379f057646588fa3211d7ba0ec8d77d2fc0ad246 (patch)
tree184ea92a634f11b1b84f98359e89e455d8b55865
parent91dc8c43d2343e494c59023484883f4683bdc639 (diff)
Xext: add GEDeviceMaskIsSet (GE mask checking per device)
If a mask was set for the NULL device, then we pretend the mask is set for all devices.
-rw-r--r--Xext/geext.c34
-rw-r--r--Xext/geext.h3
-rw-r--r--dix/events.c4
3 files changed, 38 insertions, 3 deletions
diff --git a/Xext/geext.c b/Xext/geext.c
index 0127a05f1..77bb181ee 100644
--- a/Xext/geext.c
+++ b/Xext/geext.c
@@ -378,4 +378,38 @@ void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev,
GERecalculateWinMask(pWin);
}
+/**
+ * Return TRUE if the mask for the given device is set.
+ * @param pWin Window the event may be delivered to.
+ * @param pDev Device the device originating the event. May be NULL.
+ * @param extension Extension ID
+ * @param mask Event mask
+ */
+BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
+ int extension, Mask mask)
+{
+ GenericMaskPtr gemask;
+
+ if (!pWin->optional || !pWin->optional->geMasks)
+ return FALSE;
+
+ extension &= 0x7F;
+
+ if (!pWin->optional->geMasks->eventMasks[extension] & mask)
+ return FALSE;
+
+
+ gemask = pWin->optional->geMasks->geClients;
+
+ while(gemask)
+ {
+ if ((!gemask->dev || gemask->dev == pDev) &&
+ (gemask->eventMask[extension] & mask))
+ return TRUE;
+
+ gemask = gemask->next;
+ }
+
+ return FALSE;
+}
diff --git a/Xext/geext.h b/Xext/geext.h
index a9021277b..577654a17 100644
--- a/Xext/geext.h
+++ b/Xext/geext.h
@@ -106,7 +106,8 @@ void GERegisterExtension(
);
void GEInitEvent(xGenericEvent* ev, int extension);
-
+BOOL GEDeviceMaskIsSet(WindowPtr pWin, DeviceIntPtr pDev,
+ int extension, Mask mask);
void GEExtensionInit(void);
diff --git a/dix/events.c b/dix/events.c
index f955d8152..2928554ff 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2151,7 +2151,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
/* if we get here, filter should be set to the GE specific mask.
check if any client wants it */
- if (!GEMaskIsSet(pWin, GEEXT(pEvents), filter))
+ if (!GEDeviceMaskIsSet(pWin, pDev, GEEXT(pEvents), filter))
return 0;
/* run through all clients, deliver event */
@@ -2471,7 +2471,7 @@ DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab,
while(win)
{
- if (GEMaskIsSet(win, GEEXT(xE), filter))
+ if (GEDeviceMaskIsSet(win, dev, GEEXT(xE), filter))
{
if (GEExtensions[GEEXTIDX(xE)].evfill)
GEExtensions[GEEXTIDX(xE)].evfill(ge, dev, win, grab);