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:
parent
c1a16bdcfe
commit
5ccc09b182
14
Xext/geext.c
14
Xext/geext.c
|
@ -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)
|
||||||
|
|
16
Xext/geext.h
16
Xext/geext.h
|
@ -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];
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
42
dix/events.c
42
dix/events.c
|
@ -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;
|
||||||
|
|
||||||
|
/* get the XGE event mask.
|
||||||
|
* FIXME: needs to be freed somewhere too.
|
||||||
|
*/
|
||||||
|
if (!pWin->optional || !pWin->optional->geMasks)
|
||||||
tempGrab.genericMasks = NULL;
|
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);
|
||||||
|
@ -3265,20 +3282,14 @@ 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))
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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. */
|
|
||||||
typedef struct _GEEventMasks {
|
|
||||||
Mask eventMasks[MAXEXTENSIONS];
|
Mask eventMasks[MAXEXTENSIONS];
|
||||||
struct _GEClientRec* geClients;
|
GenericMaskPtr geClients;
|
||||||
} GEEventMasksRec, *GEEventMasksPtr;
|
} GenericClientMasksRec, *GenericClientMasksPtr;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue