privates.h revision 9ace9065
14642e01fSmrg/***********************************************************
24642e01fSmrg
34642e01fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44642e01fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
54642e01fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
64642e01fSmrgAUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
74642e01fSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
84642e01fSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
94642e01fSmrg
104642e01fSmrg******************************************************************/
114642e01fSmrg
124642e01fSmrg#ifndef PRIVATES_H
134642e01fSmrg#define PRIVATES_H 1
144642e01fSmrg
156747b715Smrg#include <X11/Xdefs.h>
166747b715Smrg#include <X11/Xosdefs.h>
176747b715Smrg#include <X11/Xfuncproto.h>
186747b715Smrg#include "misc.h"
194642e01fSmrg
204642e01fSmrg/*****************************************************************
214642e01fSmrg * STUFF FOR PRIVATES
224642e01fSmrg *****************************************************************/
234642e01fSmrg
246747b715Smrgtypedef struct _Private PrivateRec, *PrivatePtr;
256747b715Smrg
266747b715Smrgtypedef enum {
276747b715Smrg    /* XSELinux uses the same private keys for numerous objects */
286747b715Smrg    PRIVATE_XSELINUX,
296747b715Smrg
306747b715Smrg    /* Otherwise, you get a private in just the requested structure
316747b715Smrg     */
326747b715Smrg    /* These can have objects created before all of the keys are registered */
336747b715Smrg    PRIVATE_SCREEN,
346747b715Smrg    PRIVATE_EXTENSION,
356747b715Smrg    PRIVATE_COLORMAP,
366747b715Smrg
376747b715Smrg    /* These cannot have any objects before all relevant keys are registered */
386747b715Smrg    PRIVATE_DEVICE,
396747b715Smrg    PRIVATE_CLIENT,
406747b715Smrg    PRIVATE_PROPERTY,
416747b715Smrg    PRIVATE_SELECTION,
426747b715Smrg    PRIVATE_WINDOW,
436747b715Smrg    PRIVATE_PIXMAP,
446747b715Smrg    PRIVATE_GC,
456747b715Smrg    PRIVATE_CURSOR,
466747b715Smrg    PRIVATE_CURSOR_BITS,
476747b715Smrg
486747b715Smrg    /* extension privates */
496747b715Smrg    PRIVATE_DBE_WINDOW,
506747b715Smrg    PRIVATE_DAMAGE,
516747b715Smrg    PRIVATE_GLYPH,
526747b715Smrg    PRIVATE_GLYPHSET,
536747b715Smrg    PRIVATE_PICTURE,
549ace9065Smrg    PRIVATE_SYNC_FENCE,
556747b715Smrg
566747b715Smrg    /* last private type */
576747b715Smrg    PRIVATE_LAST,
586747b715Smrg} DevPrivateType;
596747b715Smrg
606747b715Smrgtypedef struct _DevPrivateKeyRec {
616747b715Smrg    int			offset;
626747b715Smrg    int			size;
636747b715Smrg    Bool		initialized;
646747b715Smrg    Bool		allocated;
656747b715Smrg    DevPrivateType	type;
666747b715Smrg    struct _DevPrivateKeyRec	*next;
676747b715Smrg} DevPrivateKeyRec, *DevPrivateKey;
686747b715Smrg
699ace9065Smrgtypedef struct _DevScreenPrivateKeyRec {
709ace9065Smrg    DevPrivateKeyRec	screenKey;
719ace9065Smrg} DevScreenPrivateKeyRec, *DevScreenPrivateKey;
729ace9065Smrg
736747b715Smrg/*
746747b715Smrg * Let drivers know how to initialize private keys
756747b715Smrg */
766747b715Smrg
776747b715Smrg#define HAS_DEVPRIVATEKEYREC		1
786747b715Smrg#define HAS_DIXREGISTERPRIVATEKEY	1
794642e01fSmrg
804642e01fSmrg/*
816747b715Smrg * Register a new private index for the private type.
826747b715Smrg *
836747b715Smrg * This initializes the specified key and optionally requests pre-allocated
846747b715Smrg * private space for your driver/module. If you request no extra space, you
856747b715Smrg * may set and get a single pointer value using this private key. Otherwise,
866747b715Smrg * you can get the address of the extra space and store whatever data you like
876747b715Smrg * there.
886747b715Smrg *
896747b715Smrg * You may call dixRegisterPrivateKey more than once on the same key, but the
906747b715Smrg * size and type must match or the server will abort.
916747b715Smrg *
926747b715Smrg * dixRegisterPrivateKey returns FALSE if it fails to allocate memory
936747b715Smrg * during its operation.
944642e01fSmrg */
956747b715Smrgextern _X_EXPORT Bool
966747b715SmrgdixRegisterPrivateKey(DevPrivateKey key, DevPrivateType type, unsigned size);
974642e01fSmrg
984642e01fSmrg/*
996747b715Smrg * Check whether a private key has been registered
1004642e01fSmrg */
1016747b715Smrgstatic inline Bool
1026747b715SmrgdixPrivateKeyRegistered(DevPrivateKey key)
1036747b715Smrg{
1046747b715Smrg    return key->initialized;
1056747b715Smrg}
1064642e01fSmrg
1074642e01fSmrg/*
1086747b715Smrg * Get the address of the private storage.
1096747b715Smrg *
1106747b715Smrg * For keys with pre-defined storage, this gets the base of that storage
1116747b715Smrg * Otherwise, it returns the place where the private pointer is stored.
1124642e01fSmrg */
1136747b715Smrgstatic inline void *
1146747b715SmrgdixGetPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1156747b715Smrg{
1166747b715Smrg    assert(key->initialized);
1176747b715Smrg    return (char *) (*privates) + key->offset;
1186747b715Smrg}
1194642e01fSmrg
1204642e01fSmrg/*
1216747b715Smrg * Fetch a private pointer stored in the object
1226747b715Smrg *
1236747b715Smrg * Returns the pointer stored with dixSetPrivate.
1246747b715Smrg * This must only be used with keys that have
1256747b715Smrg * no pre-defined storage
1264642e01fSmrg */
1276747b715Smrgstatic inline void *
1286747b715SmrgdixGetPrivate(PrivatePtr *privates, const DevPrivateKey key)
1296747b715Smrg{
1306747b715Smrg    assert (key->size == 0);
1316747b715Smrg    return *(void **) dixGetPrivateAddr(privates, key);
1326747b715Smrg}
1334642e01fSmrg
1344642e01fSmrg/*
1356747b715Smrg * Associate 'val' with 'key' in 'privates' so that later calls to
1366747b715Smrg * dixLookupPrivate(privates, key) will return 'val'.
1374642e01fSmrg */
1386747b715Smrgstatic inline void
1396747b715SmrgdixSetPrivate(PrivatePtr *privates, const DevPrivateKey key, pointer val)
1406747b715Smrg{
1416747b715Smrg    assert (key->size == 0);
1426747b715Smrg    *(pointer *) dixGetPrivateAddr(privates, key) = val;
1436747b715Smrg}
1444642e01fSmrg
1456747b715Smrg#include "dix.h"
1466747b715Smrg#include "resource.h"
1474642e01fSmrg
1486747b715Smrg/*
1496747b715Smrg * Lookup a pointer to the private record.
1506747b715Smrg *
1516747b715Smrg * For privates with defined storage, return the address of the
1526747b715Smrg * storage. For privates without defined storage, return the pointer
1536747b715Smrg * contents
1546747b715Smrg */
1556747b715Smrgstatic inline pointer
1566747b715SmrgdixLookupPrivate(PrivatePtr *privates, const DevPrivateKey key)
1576747b715Smrg{
1586747b715Smrg    if (key->size)
1596747b715Smrg	return dixGetPrivateAddr(privates, key);
1606747b715Smrg    else
1616747b715Smrg	return dixGetPrivate(privates, key);
1626747b715Smrg}
1634642e01fSmrg
1644642e01fSmrg/*
1656747b715Smrg * Look up the address of the pointer to the storage
1666747b715Smrg *
1676747b715Smrg * This returns the place where the private pointer is stored,
1686747b715Smrg * which is only valid for privates without predefined storage.
1694642e01fSmrg */
1706747b715Smrgstatic inline pointer *
1716747b715SmrgdixLookupPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1726747b715Smrg{
1736747b715Smrg    assert (key->size == 0);
1746747b715Smrg    return (pointer *)dixGetPrivateAddr(privates, key);
1756747b715Smrg}
1764642e01fSmrg
1779ace9065Smrgextern _X_EXPORT Bool
1789ace9065SmrgdixRegisterScreenPrivateKey(DevScreenPrivateKey key, ScreenPtr pScreen, DevPrivateType type, unsigned size);
1799ace9065Smrg
1809ace9065Smrgextern _X_EXPORT DevPrivateKey
1819ace9065Smrg_dixGetScreenPrivateKey(const DevScreenPrivateKey key, ScreenPtr pScreen);
1829ace9065Smrg
1839ace9065Smrgstatic inline void *
1849ace9065SmrgdixGetScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
1859ace9065Smrg{
1869ace9065Smrg    return dixGetPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
1879ace9065Smrg}
1889ace9065Smrg
1899ace9065Smrgstatic inline void *
1909ace9065SmrgdixGetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
1919ace9065Smrg{
1929ace9065Smrg    return dixGetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
1939ace9065Smrg}
1949ace9065Smrg
1959ace9065Smrgstatic inline void
1969ace9065SmrgdixSetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen, pointer val)
1979ace9065Smrg{
1989ace9065Smrg    dixSetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen), val);
1999ace9065Smrg}
2009ace9065Smrg
2019ace9065Smrgstatic inline pointer
2029ace9065SmrgdixLookupScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
2039ace9065Smrg{
2049ace9065Smrg    return dixLookupPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
2059ace9065Smrg}
2069ace9065Smrg
2079ace9065Smrgstatic inline pointer *
2089ace9065SmrgdixLookupScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
2099ace9065Smrg{
2109ace9065Smrg    return dixLookupPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
2119ace9065Smrg}
2129ace9065Smrg
2134642e01fSmrg/*
2146747b715Smrg * Allocates private data separately from main object.
2156747b715Smrg *
2166747b715Smrg * For objects created during server initialization, this allows those
2176747b715Smrg * privates to be re-allocated as new private keys are registered.
2186747b715Smrg *
2196747b715Smrg * This includes screens, the serverClient, default colormaps and
2206747b715Smrg * extensions entries.
2214642e01fSmrg */
2226747b715Smrgextern _X_EXPORT Bool
2236747b715SmrgdixAllocatePrivates(PrivatePtr *privates, DevPrivateType type);
2244642e01fSmrg
2254642e01fSmrg/*
2266747b715Smrg * Frees separately allocated private data
2274642e01fSmrg */
2286747b715Smrgextern _X_EXPORT void
2296747b715SmrgdixFreePrivates(PrivatePtr privates, DevPrivateType type);
2304642e01fSmrg
2314642e01fSmrg/*
2326747b715Smrg * Initialize privates by zeroing them
2334642e01fSmrg */
2346747b715Smrgextern _X_EXPORT void
2356747b715Smrg_dixInitPrivates(PrivatePtr *privates, void *addr, DevPrivateType type);
2366747b715Smrg
2376747b715Smrg#define dixInitPrivates(o, v, type) _dixInitPrivates(&(o)->devPrivates, (v), type);
2386747b715Smrg
2396747b715Smrg/*
2406747b715Smrg * Clean up privates
2416747b715Smrg */
2426747b715Smrgextern _X_EXPORT void
2436747b715Smrg_dixFiniPrivates(PrivatePtr privates, DevPrivateType type);
2446747b715Smrg
2456747b715Smrg#define dixFiniPrivates(o,t)	_dixFiniPrivates((o)->devPrivates,t)
2466747b715Smrg
2476747b715Smrg/*
2486747b715Smrg * Allocates private data at object creation time. Required
2496747b715Smrg * for almost all objects, except for the list described
2506747b715Smrg * above for dixAllocatePrivates.
2516747b715Smrg */
2526747b715Smrgextern _X_EXPORT void *
2536747b715Smrg_dixAllocateObjectWithPrivates(unsigned size, unsigned clear, unsigned offset, DevPrivateType type);
2546747b715Smrg
2556747b715Smrg#define dixAllocateObjectWithPrivates(t, type) (t *) _dixAllocateObjectWithPrivates(sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
2566747b715Smrg
2576747b715Smrgextern _X_EXPORT void
2586747b715Smrg_dixFreeObjectWithPrivates(void *object, PrivatePtr privates, DevPrivateType type);
2596747b715Smrg
2606747b715Smrg#define dixFreeObjectWithPrivates(o,t) _dixFreeObjectWithPrivates(o, (o)->devPrivates, t)
2616747b715Smrg
2626747b715Smrg/*
2636747b715Smrg * Return size of privates for the specified type
2646747b715Smrg */
2656747b715Smrgextern _X_EXPORT int
2666747b715SmrgdixPrivatesSize(DevPrivateType type);
2676747b715Smrg
2686747b715Smrg/*
2696747b715Smrg * Dump out private stats to ErrorF
2706747b715Smrg */
2716747b715Smrgextern void
2726747b715SmrgdixPrivateUsage(void);
2734642e01fSmrg
2744642e01fSmrg/*
2756747b715Smrg * Resets the privates subsystem.  dixResetPrivates is called from the main loop
2766747b715Smrg * before each server generation.  This function must only be called by main().
2774642e01fSmrg */
2786747b715Smrgextern _X_EXPORT void
2796747b715SmrgdixResetPrivates(void);
2806747b715Smrg
2816747b715Smrg/*
2826747b715Smrg * Looks up the offset where the devPrivates field is located.
2836747b715Smrg *
2846747b715Smrg * Returns -1 if the specified resource has no dev privates.
2856747b715Smrg * The position of the devPrivates field varies by structure
2866747b715Smrg * and calling code might only know the resource type, not the
2876747b715Smrg * structure definition.
2886747b715Smrg */
2896747b715Smrgextern _X_EXPORT int
2906747b715SmrgdixLookupPrivateOffset(RESTYPE type);
2914642e01fSmrg
2924642e01fSmrg/*
2934642e01fSmrg * Convenience macro for adding an offset to an object pointer
2944642e01fSmrg * when making a call to one of the devPrivates functions
2954642e01fSmrg */
2966747b715Smrg#define DEVPRIV_AT(ptr, offset) ((PrivatePtr *)((char *)(ptr) + offset))
2974642e01fSmrg
2984642e01fSmrg#endif /* PRIVATES_H */
299