diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-01-23 15:43:48 +1030 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2008-01-25 10:26:41 +1030 |
commit | 94a6a65ae7414c8247aa1741ec5c7561e6f4bbe0 (patch) | |
tree | 4e5e3c6c731861efb1bda9ee0e5c38e3b9bc0745 | |
parent | ba315ae5ddd00763147a4b0cdcacba7691793dfc (diff) |
Xext: allow per-device GE masks.
Instead of a single mask per client we allow the storage of a mask per client
per device.
-rw-r--r-- | Xext/geext.c | 12 | ||||
-rw-r--r-- | Xext/geext.h | 11 | ||||
-rw-r--r-- | Xi/xiselev.c | 9 |
3 files changed, 20 insertions, 12 deletions
diff --git a/Xext/geext.c b/Xext/geext.c index 8f48e4493..0127a05f1 100644 --- a/Xext/geext.c +++ b/Xext/geext.c @@ -300,7 +300,8 @@ GERecalculateWinMask(WindowPtr pWin) } /* Set generic event mask for given window. */ -void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask) +void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev, + WindowPtr pWin, int extension, Mask mask) { GenericMaskPtr cli; @@ -326,13 +327,13 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask cli = evmasks->geClients; while(cli) { - if (cli->client == pClient) + if (cli->client == pClient && cli->dev == pDev) break; cli = cli->next; } if (!cli) { - /* new client */ + /* new client and/or new device */ cli = (GenericMaskPtr)xcalloc(1, sizeof(GenericMaskRec)); if (!cli) { @@ -341,6 +342,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask } cli->next = evmasks->geClients; cli->client = pClient; + cli->dev = pDev; evmasks->geClients = cli; } cli->eventMask[extension] = mask; @@ -348,7 +350,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask { /* remove client. */ cli = pWin->optional->geMasks->geClients; - if (cli->client == pClient) + if (cli->client == pClient && cli->dev == pDev) { pWin->optional->geMasks->geClients = cli->next; xfree(cli); @@ -359,7 +361,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask while(cli) { - if (cli->client == pClient) + if (cli->client == pClient && cli->dev == pDev) { prev->next = cli->next; xfree(cli); diff --git a/Xext/geext.h b/Xext/geext.h index 1ba71e070..a9021277b 100644 --- a/Xext/geext.h +++ b/Xext/geext.h @@ -39,12 +39,13 @@ from the author. * This struct is used both in the window and by grabs to determine the event * mask for a client. * A window will have a linked list of these structs, with one entry per - * client, null-terminated. + * client per device, null-terminated. * A grab has only one instance of this struct. */ typedef struct _GenericMaskRec { - ClientPtr client; /* client who set the event mask */ - Mask eventMask[MAXEXTENSIONS]; /* one mask per extension */ + ClientPtr client; /* client who set the event mask */ + DeviceIntPtr dev; + Mask eventMask[MAXEXTENSIONS]; /* one mask per extension */ struct _GenericMaskRec* next; } GenericMaskRec, *GenericMaskPtr; @@ -94,7 +95,9 @@ extern GEExtension GEExtensions[MAXEXTENSIONS]; /* Interface for other extensions */ -void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask); +void GEWindowSetMask(ClientPtr pClient, DeviceIntPtr pDev, + WindowPtr pWin, int extension, Mask mask); + void GERegisterExtension( int extension, void (*ev_dispatch)(xGenericEvent* from, xGenericEvent* to), diff --git a/Xi/xiselev.c b/Xi/xiselev.c index 3c85032d5..601b10caf 100644 --- a/Xi/xiselev.c +++ b/Xi/xiselev.c @@ -61,16 +61,19 @@ ProcXiSelectEvent(ClientPtr client) { int rc; WindowPtr pWin; + DeviceIntPtr pDev; REQUEST(xXiSelectEventReq); REQUEST_SIZE_MATCH(xXiSelectEventReq); rc = dixLookupWindow(&pWin, stuff->window, client, DixWriteAccess); if (rc != Success) - { return rc; - } - GEWindowSetMask(client, pWin, IReqCode, stuff->mask); + rc = dixLookupDevice(&pDev, stuff->deviceid, client, DixReadAccess); + if (rc != Success) + return rc; + + GEWindowSetMask(client, pDev, pWin, IReqCode, stuff->mask); return Success; } |