Use the same struct for generic event masks throughout the code.

Renaming those structs too.

Previously grabs were using a different struct than windows, which was
reasonably stupid.
This commit is contained in:
Peter Hutterer 2007-07-06 15:43:08 +09:30
parent c1a16bdcfe
commit 5ccc09b182
9 changed files with 66 additions and 68 deletions

View File

@ -207,7 +207,7 @@ GEExtensionInit(void)
GEClientPrivateIndex = AllocateClientPrivateIndex(); GEClientPrivateIndex = AllocateClientPrivateIndex();
if (!AllocateClientPrivate(GEClientPrivateIndex, if (!AllocateClientPrivate(GEClientPrivateIndex,
sizeof(GEClientRec))) sizeof(GenericMaskRec)))
{ {
FatalError("GEExtensionInit: Alloc client private failed.\n"); FatalError("GEExtensionInit: Alloc client private failed.\n");
} }
@ -277,8 +277,8 @@ static void
GERecalculateWinMask(WindowPtr pWin) GERecalculateWinMask(WindowPtr pWin)
{ {
int i; int i;
GEClientPtr it; GenericMaskPtr it;
GEEventMasksPtr evmasks; GenericClientMasksPtr evmasks;
if (!pWin->optional) if (!pWin->optional)
return; return;
@ -304,7 +304,7 @@ GERecalculateWinMask(WindowPtr pWin)
/* Set generic event mask for given window. */ /* Set generic event mask for given window. */
void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask) void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask)
{ {
GEClientPtr cli; GenericMaskPtr cli;
extension = (extension & 0x7F); extension = (extension & 0x7F);
@ -322,7 +322,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
if (mask) if (mask)
{ {
GEEventMasksPtr evmasks = pWin->optional->geMasks; GenericClientMasksPtr evmasks = pWin->optional->geMasks;
/* check for existing client */ /* check for existing client */
cli = evmasks->geClients; cli = evmasks->geClients;
@ -335,7 +335,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
if (!cli) if (!cli)
{ {
/* new client */ /* new client */
cli = (GEClientPtr)xcalloc(1, sizeof(GEClientRec)); cli = (GenericMaskPtr)xcalloc(1, sizeof(GenericMaskRec));
if (!cli) if (!cli)
{ {
ErrorF("GE: Insufficient memory to alloc client.\n"); ErrorF("GE: Insufficient memory to alloc client.\n");
@ -356,7 +356,7 @@ void GEWindowSetMask(ClientPtr pClient, WindowPtr pWin, int extension, Mask mask
xfree(cli); xfree(cli);
} else } else
{ {
GEClientPtr prev = cli; GenericMaskPtr prev = cli;
cli = cli->next; cli = cli->next;
while(cli) while(cli)

View File

@ -34,6 +34,21 @@ from the author.
#define _GEEXT_H_ #define _GEEXT_H_
#include <X11/extensions/geproto.h> #include <X11/extensions/geproto.h>
/**
* 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.
* 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 */
struct _GenericMaskRec* next;
} GenericMaskRec, *GenericMaskPtr;
/* Struct to keep information about registered extensions /* Struct to keep information about registered extensions
* *
* evswap ... use to swap event fields for different byte ordered clients. * evswap ... use to swap event fields for different byte ordered clients.
@ -48,6 +63,7 @@ typedef struct _GEExtension {
); );
} GEExtension, *GEExtensionPtr; } GEExtension, *GEExtensionPtr;
/* All registered extensions and their handling functions. */ /* All registered extensions and their handling functions. */
extern GEExtension GEExtensions[MAXEXTENSIONS]; extern GEExtension GEExtensions[MAXEXTENSIONS];

View File

@ -194,19 +194,13 @@ ProcXExtendedGrabDevice(ClientPtr client)
(XGenericEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count); (XGenericEventMask*)(((XEventClass*)&stuff[1]) + stuff->event_count);
gemasks = xcalloc(1, sizeof(GenericMaskRec)); gemasks = xcalloc(1, sizeof(GenericMaskRec));
gemasks->extension = xgeMask->extension; gemasks->client = client;
gemasks->mask = xgeMask->evmask;
gemasks->next = NULL; gemasks->next = NULL;
xgeMask++; gemasks->eventMask[xgeMask->extension & 0x7F] = xgeMask->evmask;
xgeMask++;
for (i = 1; i < stuff->generic_event_count; i++, xgeMask++) for (i = 1; i < stuff->generic_event_count; i++, xgeMask++)
{ gemasks->eventMask[xgeMask->extension & 0x7F]= xgeMask->evmask;
gemasks->next = xcalloc(1, sizeof(GenericMaskRec));
gemasks = gemasks->next;
gemasks->extension = xgeMask->extension;
gemasks->mask = xgeMask->evmask;
gemasks->next = NULL;
}
} }
ExtGrabDevice(client, dev, stuff->device_mode, ExtGrabDevice(client, dev, stuff->device_mode,
@ -221,12 +215,8 @@ ProcXExtendedGrabDevice(ClientPtr client)
cleanup: cleanup:
while(gemasks) if (gemasks)
{ xfree(gemasks);
GenericMaskPtr prev = gemasks;
gemasks = gemasks->next;
xfree(prev);
}
if (err == Success) if (err == Success)
{ {

View File

@ -1934,7 +1934,7 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
/* Handle generic events */ /* Handle generic events */
if (type == GenericEvent) if (type == GenericEvent)
{ {
GEClientPtr pClient; GenericMaskPtr pClient;
/* We don't do more than one GenericEvent at a time. */ /* We don't do more than one GenericEvent at a time. */
if (count > 1) if (count > 1)
{ {
@ -2017,7 +2017,24 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
inputMasks = wOtherInputMasks(pWin); inputMasks = wOtherInputMasks(pWin);
tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[pDev->id]: 0; tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[pDev->id]: 0;
tempGrab.genericMasks = NULL; /* get the XGE event mask.
* FIXME: needs to be freed somewhere too.
*/
if (!pWin->optional || !pWin->optional->geMasks)
tempGrab.genericMasks = NULL;
else
{
GenericClientMasksPtr gemasks = pWin->optional->geMasks;
GenericMaskPtr geclient = gemasks->geClients;
while(geclient && geclient->client != client)
geclient = geclient->next;
if (geclient)
{
tempGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec));
*tempGrab.genericMasks = *geclient;
tempGrab.genericMasks->next = NULL;
}
}
(*inputInfo.pointer->deviceGrab.ActivateGrab)(pDev, &tempGrab, (*inputInfo.pointer->deviceGrab.ActivateGrab)(pDev, &tempGrab,
currentTime, currentTime,
TRUE | ImplicitGrabMask); TRUE | ImplicitGrabMask);
@ -3264,21 +3281,15 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
{ {
/* find evmask for event's extension */ /* find evmask for event's extension */
xGenericEvent* ge = ((xGenericEvent*)xE); xGenericEvent* ge = ((xGenericEvent*)xE);
GenericMaskPtr gemask = grab->genericMasks; GenericMaskPtr gemask = grab->genericMasks;
while(gemask)
{
if (gemask->extension == ge->extension)
break;
gemask = gemask->next;
}
if (!gemask) if (!gemask->eventMask[GEEXTIDX(ge)])
return; return;
if (GEEventFill(xE)) if (GEEventFill(xE))
GEEventFill(xE)(ge, thisDev, grab->window, grab); GEEventFill(xE)(ge, thisDev, grab->window, grab);
deliveries = TryClientEvents(rClient(grab), xE, count, deliveries = TryClientEvents(rClient(grab), xE, count,
gemask->mask, gemask->eventMask[GEEXTIDX(ge)],
generic_filters[GEEXTIDX(ge)][ge->evtype], generic_filters[GEEXTIDX(ge)][ge->evtype],
grab); grab);
} else } else
@ -4161,7 +4172,6 @@ FocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin)
xEvent event; xEvent event;
int* numFoci; /* no of foci the window has already */ int* numFoci; /* no of foci the window has already */
Bool sendevent = FALSE; Bool sendevent = FALSE;
FocusSemaphoresPtr focus;
if (dev != inputInfo.keyboard) if (dev != inputInfo.keyboard)
DeviceFocusEvent(dev, type, mode, detail, pWin); DeviceFocusEvent(dev, type, mode, detail, pWin);
@ -5914,21 +5924,9 @@ ExtGrabDevice(ClientPtr client,
if (ge_masks) if (ge_masks)
{ {
GenericMaskPtr last;
newGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec)); newGrab.genericMasks = xcalloc(1, sizeof(GenericMaskRec));
*newGrab.genericMasks = *ge_masks; *newGrab.genericMasks = *ge_masks;
newGrab.genericMasks->next = NULL; newGrab.genericMasks->next = NULL;
ge_masks = ge_masks->next;
last = newGrab.genericMasks;
while(ge_masks)
{
last->next = xcalloc(1, sizeof(GenericMaskRec));
last = last->next;
*last = *ge_masks;
last->next = NULL;
ge_masks = ge_masks->next;
}
} }
if (IsPointerDevice(dev)) if (IsPointerDevice(dev))

View File

@ -3751,7 +3751,8 @@ MakeWindowOptional (WindowPtr pWin)
#endif #endif
optional->deviceCursors = NULL; optional->deviceCursors = NULL;
optional->geMasks = (GEEventMasksPtr)xalloc(sizeof(GEEventMasksRec)); optional->geMasks =
(GenericClientMasksPtr)xalloc(sizeof(GenericClientMasksRec));
if (!optional->geMasks) if (!optional->geMasks)
{ {
xfree(optional); xfree(optional);

View File

@ -52,6 +52,7 @@ SOFTWARE.
#include "window.h" #include "window.h"
#include "input.h" #include "input.h"
#include "cursor.h" #include "cursor.h"
#include "geext.h"
#include <X11/extensions/XI.h> #include <X11/extensions/XI.h>
#define EARLIER -1 #define EARLIER -1

View File

@ -53,6 +53,7 @@ SOFTWARE.
#include "window.h" #include "window.h"
#include "dixstruct.h" #include "dixstruct.h"
#include "cursorstr.h" #include "cursorstr.h"
#include "geext.h"
#define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7))) #define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
@ -102,12 +103,6 @@ typedef struct _DetailRec { /* Grab details may be bit masks */
Mask *pMask; Mask *pMask;
} DetailRec; } DetailRec;
typedef struct _GenericMaskRec {
int extension;
Mask mask;
struct _GenericMaskRec* next;
} GenericMaskRec;
/** /**
* Central struct for device grabs. * Central struct for device grabs.
* The same struct is used for both core grabs and device grabs, with * The same struct is used for both core grabs and device grabs, with
@ -139,7 +134,7 @@ typedef struct _GrabRec {
CursorPtr cursor; /* always NULL for keyboards */ CursorPtr cursor; /* always NULL for keyboards */
Mask eventMask; Mask eventMask;
Mask deviceMask; Mask deviceMask;
GenericMaskPtr genericMasks; /* null terminated list */ GenericMaskPtr genericMasks;
} GrabRec; } GrabRec;
typedef struct _KeyClassRec { typedef struct _KeyClassRec {

View File

@ -243,7 +243,6 @@ typedef struct pixman_box16 *BoxPtr;
typedef struct _xEvent *xEventPtr; typedef struct _xEvent *xEventPtr;
typedef struct _xRectangle *xRectanglePtr; typedef struct _xRectangle *xRectanglePtr;
typedef struct _GrabRec *GrabPtr; typedef struct _GrabRec *GrabPtr;
typedef struct _GenericMaskRec *GenericMaskPtr;
/* typedefs from other places - duplicated here to minimize the amount /* typedefs from other places - duplicated here to minimize the amount
* of unnecessary junk that one would normally have to include to get * of unnecessary junk that one would normally have to include to get

View File

@ -77,17 +77,15 @@ typedef struct _DevCursorNode {
struct _DevCursorNode* next; struct _DevCursorNode* next;
} DevCursNodeRec, *DevCursNodePtr, *DevCursorList; } DevCursNodeRec, *DevCursNodePtr, *DevCursorList;
typedef struct _GEClientRec { /* Mask structure for GE extension as stored on the window.
Mask eventMask[MAXEXTENSIONS]; * Allows one mask per extension.
ClientPtr client; * .eventMask - Summary mask for all clients, used for quick checking.
struct _GEClientRec* next; * .geClients - list of clients with their specific mask.
} GEClientRec, *GEClientPtr; */
typedef struct _GenericClientMasks {
/* Mask structure for GE extension. Allows one mask per extension. */ Mask eventMasks[MAXEXTENSIONS];
typedef struct _GEEventMasks { GenericMaskPtr geClients;
Mask eventMasks[MAXEXTENSIONS]; } GenericClientMasksRec, *GenericClientMasksPtr;
struct _GEClientRec* geClients;
} GEEventMasksRec, *GEEventMasksPtr;
typedef struct _WindowAccessRec { typedef struct _WindowAccessRec {
int defaultRule; /* WindowAccessDenyAll */ int defaultRule; /* WindowAccessDenyAll */
@ -117,7 +115,7 @@ typedef struct _WindowOpt {
struct _OtherInputMasks *inputMasks; /* default: NULL */ struct _OtherInputMasks *inputMasks; /* default: NULL */
#endif #endif
DevCursorList deviceCursors; /* default: NULL */ DevCursorList deviceCursors; /* default: NULL */
struct _GEEventMasks* geMasks; /* default: NULL */ struct _GenericClientMasks *geMasks;/* default: NULL */
WindowAccessRec access; WindowAccessRec access;
} WindowOptRec, *WindowOptPtr; } WindowOptRec, *WindowOptPtr;