devPrivates rework: register an offset for every resource type, use
signed values so -1 actually works correctly, and provide a macro for adding an offset to a pointer.
This commit is contained in:
parent
0003ccfcdf
commit
57907e0943
|
@ -35,6 +35,7 @@ from The Open Group.
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include "privates.h"
|
#include "privates.h"
|
||||||
#include "gcstruct.h"
|
#include "gcstruct.h"
|
||||||
|
#include "cursorstr.h"
|
||||||
#include "colormapst.h"
|
#include "colormapst.h"
|
||||||
#include "inputstr.h"
|
#include "inputstr.h"
|
||||||
|
|
||||||
|
@ -174,21 +175,34 @@ dixRegisterPrivateDeleteFunc(const DevPrivateKey key,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Table of devPrivates offsets */
|
/* Table of devPrivates offsets */
|
||||||
static unsigned *offsets = NULL;
|
static const int offsetDefaults[] = {
|
||||||
static unsigned offsetsSize = 0;
|
-1, /* RT_NONE */
|
||||||
|
offsetof(WindowRec, devPrivates), /* RT_WINDOW */
|
||||||
|
offsetof(PixmapRec, devPrivates), /* RT_PIXMAP */
|
||||||
|
offsetof(GC, devPrivates), /* RT_GC */
|
||||||
|
-1, /* RT_FONT */
|
||||||
|
offsetof(CursorRec, devPrivates), /* RT_CURSOR */
|
||||||
|
offsetof(ColormapRec, devPrivates), /* RT_COLORMAP */
|
||||||
|
-1, /* RT_CMAPENTRY */
|
||||||
|
-1, /* RT_OTHERCLIENT */
|
||||||
|
-1 /* RT_PASSIVEGRAB */
|
||||||
|
};
|
||||||
|
|
||||||
|
static int *offsets = NULL;
|
||||||
|
static int offsetsSize = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Specify where the devPrivates field is located in a structure type
|
* Specify where the devPrivates field is located in a structure type
|
||||||
*/
|
*/
|
||||||
_X_EXPORT int
|
_X_EXPORT int
|
||||||
dixRegisterPrivateOffset(RESTYPE type, unsigned offset)
|
dixRegisterPrivateOffset(RESTYPE type, int offset)
|
||||||
{
|
{
|
||||||
type = type & TypeMask;
|
type = type & TypeMask;
|
||||||
|
|
||||||
/* resize offsets table if necessary */
|
/* resize offsets table if necessary */
|
||||||
while (type >= offsetsSize) {
|
while (type >= offsetsSize) {
|
||||||
unsigned i = offsetsSize * 2 * sizeof(int);
|
unsigned i = offsetsSize * 2 * sizeof(int);
|
||||||
offsets = (unsigned *)xrealloc(offsets, i);
|
offsets = (int *)xrealloc(offsets, i);
|
||||||
if (!offsets) {
|
if (!offsets) {
|
||||||
offsetsSize = 0;
|
offsetsSize = 0;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -214,7 +228,6 @@ int
|
||||||
dixResetPrivates(void)
|
dixResetPrivates(void)
|
||||||
{
|
{
|
||||||
PrivateDescRec *next;
|
PrivateDescRec *next;
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
/* reset internal structures */
|
/* reset internal structures */
|
||||||
while (items) {
|
while (items) {
|
||||||
|
@ -224,20 +237,11 @@ dixResetPrivates(void)
|
||||||
}
|
}
|
||||||
if (offsets)
|
if (offsets)
|
||||||
xfree(offsets);
|
xfree(offsets);
|
||||||
offsetsSize = 16;
|
offsetsSize = sizeof(offsetDefaults);
|
||||||
offsets = (unsigned *)xalloc(offsetsSize * sizeof(unsigned));
|
offsets = (int *)xalloc(offsetsSize);
|
||||||
|
offsetsSize /= sizeof(int);
|
||||||
if (!offsets)
|
if (!offsets)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
for (i=0; i < offsetsSize; i++)
|
memcpy(offsets, offsetDefaults, sizeof(offsetDefaults));
|
||||||
offsets[i] = -1;
|
return TRUE;
|
||||||
|
|
||||||
/* register basic resource offsets */
|
|
||||||
return dixRegisterPrivateOffset(RT_WINDOW,
|
|
||||||
offsetof(WindowRec, devPrivates)) &&
|
|
||||||
dixRegisterPrivateOffset(RT_PIXMAP,
|
|
||||||
offsetof(PixmapRec, devPrivates)) &&
|
|
||||||
dixRegisterPrivateOffset(RT_GC,
|
|
||||||
offsetof(GC, devPrivates)) &&
|
|
||||||
dixRegisterPrivateOffset(RT_COLORMAP,
|
|
||||||
offsetof(ColormapRec, devPrivates));
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,6 +225,8 @@ CreateNewResourceType(DeleteType deleteFunc)
|
||||||
(next + 1) * sizeof(DeleteType));
|
(next + 1) * sizeof(DeleteType));
|
||||||
if (!funcs)
|
if (!funcs)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!dixRegisterPrivateOffset(next, -1))
|
||||||
|
return 0;
|
||||||
|
|
||||||
#ifdef XResExtension
|
#ifdef XResExtension
|
||||||
{
|
{
|
||||||
|
|
|
@ -143,8 +143,15 @@ dixLookupPrivateOffset(RESTYPE type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Specifies the offset where the devPrivates field is located.
|
* Specifies the offset where the devPrivates field is located.
|
||||||
|
* A negative value indicates no devPrivates field is available.
|
||||||
*/
|
*/
|
||||||
extern int
|
extern int
|
||||||
dixRegisterPrivateOffset(RESTYPE type, unsigned offset);
|
dixRegisterPrivateOffset(RESTYPE type, int offset);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convenience macro for adding an offset to an object pointer
|
||||||
|
* when making a call to one of the devPrivates functions
|
||||||
|
*/
|
||||||
|
#define DEVPRIV_AT(ptr, offset) ((PrivateRec **)((char *)ptr + offset))
|
||||||
|
|
||||||
#endif /* PRIVATES_H */
|
#endif /* PRIVATES_H */
|
||||||
|
|
Loading…
Reference in New Issue