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>
18ed6184dfSmrg#include <assert.h>
196747b715Smrg#include "misc.h"
204642e01fSmrg
214642e01fSmrg/*****************************************************************
224642e01fSmrg * STUFF FOR PRIVATES
234642e01fSmrg *****************************************************************/
244642e01fSmrg
256747b715Smrgtypedef struct _Private PrivateRec, *PrivatePtr;
266747b715Smrg
276747b715Smrgtypedef enum {
286747b715Smrg    /* XSELinux uses the same private keys for numerous objects */
296747b715Smrg    PRIVATE_XSELINUX,
306747b715Smrg
316747b715Smrg    /* Otherwise, you get a private in just the requested structure
326747b715Smrg     */
336747b715Smrg    /* These can have objects created before all of the keys are registered */
346747b715Smrg    PRIVATE_SCREEN,
356747b715Smrg    PRIVATE_EXTENSION,
366747b715Smrg    PRIVATE_COLORMAP,
3735c4bbdfSmrg    PRIVATE_DEVICE,
386747b715Smrg
396747b715Smrg    /* These cannot have any objects before all relevant keys are registered */
406747b715Smrg    PRIVATE_CLIENT,
416747b715Smrg    PRIVATE_PROPERTY,
426747b715Smrg    PRIVATE_SELECTION,
436747b715Smrg    PRIVATE_WINDOW,
446747b715Smrg    PRIVATE_PIXMAP,
456747b715Smrg    PRIVATE_GC,
466747b715Smrg    PRIVATE_CURSOR,
476747b715Smrg    PRIVATE_CURSOR_BITS,
486747b715Smrg
496747b715Smrg    /* extension privates */
506747b715Smrg    PRIVATE_GLYPH,
516747b715Smrg    PRIVATE_GLYPHSET,
526747b715Smrg    PRIVATE_PICTURE,
539ace9065Smrg    PRIVATE_SYNC_FENCE,
546747b715Smrg
556747b715Smrg    /* last private type */
566747b715Smrg    PRIVATE_LAST,
576747b715Smrg} DevPrivateType;
586747b715Smrg
596747b715Smrgtypedef struct _DevPrivateKeyRec {
6035c4bbdfSmrg    int offset;
6135c4bbdfSmrg    int size;
6235c4bbdfSmrg    Bool initialized;
6335c4bbdfSmrg    Bool allocated;
6435c4bbdfSmrg    DevPrivateType type;
6535c4bbdfSmrg    struct _DevPrivateKeyRec *next;
666747b715Smrg} DevPrivateKeyRec, *DevPrivateKey;
676747b715Smrg
6835c4bbdfSmrgtypedef struct _DevPrivateSetRec {
6935c4bbdfSmrg    DevPrivateKey key;
7035c4bbdfSmrg    unsigned offset;
7135c4bbdfSmrg    int created;
7235c4bbdfSmrg    int allocated;
7335c4bbdfSmrg} DevPrivateSetRec, *DevPrivateSetPtr;
7435c4bbdfSmrg
759ace9065Smrgtypedef struct _DevScreenPrivateKeyRec {
7635c4bbdfSmrg    DevPrivateKeyRec screenKey;
779ace9065Smrg} DevScreenPrivateKeyRec, *DevScreenPrivateKey;
789ace9065Smrg
796747b715Smrg/*
806747b715Smrg * Let drivers know how to initialize private keys
816747b715Smrg */
826747b715Smrg
836747b715Smrg#define HAS_DEVPRIVATEKEYREC		1
846747b715Smrg#define HAS_DIXREGISTERPRIVATEKEY	1
854642e01fSmrg
864642e01fSmrg/*
876747b715Smrg * Register a new private index for the private type.
886747b715Smrg *
896747b715Smrg * This initializes the specified key and optionally requests pre-allocated
906747b715Smrg * private space for your driver/module. If you request no extra space, you
916747b715Smrg * may set and get a single pointer value using this private key. Otherwise,
926747b715Smrg * you can get the address of the extra space and store whatever data you like
936747b715Smrg * there.
946747b715Smrg *
956747b715Smrg * You may call dixRegisterPrivateKey more than once on the same key, but the
966747b715Smrg * size and type must match or the server will abort.
976747b715Smrg *
986747b715Smrg * dixRegisterPrivateKey returns FALSE if it fails to allocate memory
996747b715Smrg * during its operation.
1004642e01fSmrg */
1016747b715Smrgextern _X_EXPORT Bool
10235c4bbdfSmrg dixRegisterPrivateKey(DevPrivateKey key, DevPrivateType type, unsigned size);
1034642e01fSmrg
1044642e01fSmrg/*
1056747b715Smrg * Check whether a private key has been registered
1064642e01fSmrg */
1076747b715Smrgstatic inline Bool
1086747b715SmrgdixPrivateKeyRegistered(DevPrivateKey key)
1096747b715Smrg{
1106747b715Smrg    return key->initialized;
1116747b715Smrg}
1124642e01fSmrg
1134642e01fSmrg/*
1146747b715Smrg * Get the address of the private storage.
1156747b715Smrg *
1166747b715Smrg * For keys with pre-defined storage, this gets the base of that storage
1176747b715Smrg * Otherwise, it returns the place where the private pointer is stored.
1184642e01fSmrg */
1196747b715Smrgstatic inline void *
1206747b715SmrgdixGetPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1216747b715Smrg{
1226747b715Smrg    assert(key->initialized);
1236747b715Smrg    return (char *) (*privates) + key->offset;
1246747b715Smrg}
1254642e01fSmrg
1264642e01fSmrg/*
1276747b715Smrg * Fetch a private pointer stored in the object
1286747b715Smrg *
1296747b715Smrg * Returns the pointer stored with dixSetPrivate.
1306747b715Smrg * This must only be used with keys that have
1316747b715Smrg * no pre-defined storage
1324642e01fSmrg */
1336747b715Smrgstatic inline void *
1346747b715SmrgdixGetPrivate(PrivatePtr *privates, const DevPrivateKey key)
1356747b715Smrg{
13635c4bbdfSmrg    assert(key->size == 0);
1376747b715Smrg    return *(void **) dixGetPrivateAddr(privates, key);
1386747b715Smrg}
1394642e01fSmrg
1404642e01fSmrg/*
1416747b715Smrg * Associate 'val' with 'key' in 'privates' so that later calls to
1426747b715Smrg * dixLookupPrivate(privates, key) will return 'val'.
1434642e01fSmrg */
1446747b715Smrgstatic inline void
14535c4bbdfSmrgdixSetPrivate(PrivatePtr *privates, const DevPrivateKey key, void *val)
1466747b715Smrg{
14735c4bbdfSmrg    assert(key->size == 0);
14835c4bbdfSmrg    *(void **) dixGetPrivateAddr(privates, key) = val;
1496747b715Smrg}
1504642e01fSmrg
1516747b715Smrg#include "dix.h"
1526747b715Smrg#include "resource.h"
1534642e01fSmrg
1546747b715Smrg/*
1556747b715Smrg * Lookup a pointer to the private record.
1566747b715Smrg *
1576747b715Smrg * For privates with defined storage, return the address of the
1586747b715Smrg * storage. For privates without defined storage, return the pointer
1596747b715Smrg * contents
1606747b715Smrg */
16135c4bbdfSmrgstatic inline void *
1626747b715SmrgdixLookupPrivate(PrivatePtr *privates, const DevPrivateKey key)
1636747b715Smrg{
1646747b715Smrg    if (key->size)
16535c4bbdfSmrg        return dixGetPrivateAddr(privates, key);
1666747b715Smrg    else
16735c4bbdfSmrg        return dixGetPrivate(privates, key);
1686747b715Smrg}
1694642e01fSmrg
1704642e01fSmrg/*
1716747b715Smrg * Look up the address of the pointer to the storage
1726747b715Smrg *
1736747b715Smrg * This returns the place where the private pointer is stored,
1746747b715Smrg * which is only valid for privates without predefined storage.
1754642e01fSmrg */
17635c4bbdfSmrgstatic inline void **
1776747b715SmrgdixLookupPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1786747b715Smrg{
17935c4bbdfSmrg    assert(key->size == 0);
18035c4bbdfSmrg    return (void **) dixGetPrivateAddr(privates, key);
1816747b715Smrg}
1824642e01fSmrg
1839ace9065Smrgextern _X_EXPORT Bool
18435c4bbdfSmrg
18535c4bbdfSmrgdixRegisterScreenPrivateKey(DevScreenPrivateKey key, ScreenPtr pScreen,
18635c4bbdfSmrg                            DevPrivateType type, unsigned size);
1879ace9065Smrg
1889ace9065Smrgextern _X_EXPORT DevPrivateKey
18935c4bbdfSmrg _dixGetScreenPrivateKey(const DevScreenPrivateKey key, ScreenPtr pScreen);
1909ace9065Smrg
1919ace9065Smrgstatic inline void *
19235c4bbdfSmrgdixGetScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key,
19335c4bbdfSmrg                        ScreenPtr pScreen)
1949ace9065Smrg{
1959ace9065Smrg    return dixGetPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
1969ace9065Smrg}
1979ace9065Smrg
1989ace9065Smrgstatic inline void *
19935c4bbdfSmrgdixGetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
20035c4bbdfSmrg                    ScreenPtr pScreen)
2019ace9065Smrg{
2029ace9065Smrg    return dixGetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
2039ace9065Smrg}
2049ace9065Smrg
2059ace9065Smrgstatic inline void
20635c4bbdfSmrgdixSetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
20735c4bbdfSmrg                    ScreenPtr pScreen, void *val)
2089ace9065Smrg{
2099ace9065Smrg    dixSetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen), val);
2109ace9065Smrg}
2119ace9065Smrg
21235c4bbdfSmrgstatic inline void *
21335c4bbdfSmrgdixLookupScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
21435c4bbdfSmrg                       ScreenPtr pScreen)
2159ace9065Smrg{
2169ace9065Smrg    return dixLookupPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
2179ace9065Smrg}
2189ace9065Smrg
21935c4bbdfSmrgstatic inline void **
22035c4bbdfSmrgdixLookupScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key,
22135c4bbdfSmrg                           ScreenPtr pScreen)
2229ace9065Smrg{
22335c4bbdfSmrg    return dixLookupPrivateAddr(privates,
22435c4bbdfSmrg                                _dixGetScreenPrivateKey(key, pScreen));
2259ace9065Smrg}
2269ace9065Smrg
22735c4bbdfSmrg/*
22835c4bbdfSmrg * These functions relate to allocations related to a specific screen;
22935c4bbdfSmrg * space will only be available for objects allocated for use on that
23035c4bbdfSmrg * screen. As such, only objects which are related directly to a specific
23135c4bbdfSmrg * screen are candidates for allocation this way, this includes
23235c4bbdfSmrg * windows, pixmaps, gcs, pictures and colormaps. This key is
23335c4bbdfSmrg * used just like any other key using dixGetPrivate and friends.
23435c4bbdfSmrg *
23535c4bbdfSmrg * This is distinctly different from the ScreenPrivateKeys above which
23635c4bbdfSmrg * allocate space in global objects like cursor bits for a specific
23735c4bbdfSmrg * screen, allowing multiple screen-related chunks of storage in a
23835c4bbdfSmrg * single global object.
23935c4bbdfSmrg */
24035c4bbdfSmrg
24135c4bbdfSmrg#define HAVE_SCREEN_SPECIFIC_PRIVATE_KEYS       1
24235c4bbdfSmrg
24335c4bbdfSmrgextern _X_EXPORT Bool
24435c4bbdfSmrgdixRegisterScreenSpecificPrivateKey(ScreenPtr pScreen, DevPrivateKey key,
24535c4bbdfSmrg                                    DevPrivateType type, unsigned size);
24635c4bbdfSmrg
24735c4bbdfSmrg/* Clean up screen-specific privates before CloseScreen */
24835c4bbdfSmrgextern void
24935c4bbdfSmrgdixFreeScreenSpecificPrivates(ScreenPtr pScreen);
25035c4bbdfSmrg
25135c4bbdfSmrg/* Initialize screen-specific privates in AddScreen */
25235c4bbdfSmrgextern void
25335c4bbdfSmrgdixInitScreenSpecificPrivates(ScreenPtr pScreen);
25435c4bbdfSmrg
2551b5d61b8Smrg/* is this private created - so hotplug can avoid crashing */
2561b5d61b8SmrgBool dixPrivatesCreated(DevPrivateType type);
2571b5d61b8Smrg
25835c4bbdfSmrgextern _X_EXPORT void *
25935c4bbdfSmrg_dixAllocateScreenObjectWithPrivates(ScreenPtr pScreen,
26035c4bbdfSmrg                                     unsigned size,
26135c4bbdfSmrg                                     unsigned clear,
26235c4bbdfSmrg                                     unsigned offset,
26335c4bbdfSmrg                                     DevPrivateType type);
26435c4bbdfSmrg
26535c4bbdfSmrg#define dixAllocateScreenObjectWithPrivates(s, t, type) _dixAllocateScreenObjectWithPrivates(s, sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
26635c4bbdfSmrg
26735c4bbdfSmrgextern _X_EXPORT int
26835c4bbdfSmrgdixScreenSpecificPrivatesSize(ScreenPtr pScreen, DevPrivateType type);
26935c4bbdfSmrg
27035c4bbdfSmrgextern _X_EXPORT void
27135c4bbdfSmrg_dixInitScreenPrivates(ScreenPtr pScreen, PrivatePtr *privates, void *addr, DevPrivateType type);
27235c4bbdfSmrg
27335c4bbdfSmrg#define dixInitScreenPrivates(s, o, v, type) _dixInitScreenPrivates(s, &(o)->devPrivates, (v), type);
27435c4bbdfSmrg
2754642e01fSmrg/*
2766747b715Smrg * Allocates private data separately from main object.
2776747b715Smrg *
2786747b715Smrg * For objects created during server initialization, this allows those
2796747b715Smrg * privates to be re-allocated as new private keys are registered.
2806747b715Smrg *
2816747b715Smrg * This includes screens, the serverClient, default colormaps and
2826747b715Smrg * extensions entries.
2834642e01fSmrg */
2846747b715Smrgextern _X_EXPORT Bool
28535c4bbdfSmrg dixAllocatePrivates(PrivatePtr *privates, DevPrivateType type);
2864642e01fSmrg
2874642e01fSmrg/*
2886747b715Smrg * Frees separately allocated private data
2894642e01fSmrg */
2906747b715Smrgextern _X_EXPORT void
29135c4bbdfSmrg dixFreePrivates(PrivatePtr privates, DevPrivateType type);
2924642e01fSmrg
2934642e01fSmrg/*
2946747b715Smrg * Initialize privates by zeroing them
2954642e01fSmrg */
2966747b715Smrgextern _X_EXPORT void
2976747b715Smrg_dixInitPrivates(PrivatePtr *privates, void *addr, DevPrivateType type);
2986747b715Smrg
2996747b715Smrg#define dixInitPrivates(o, v, type) _dixInitPrivates(&(o)->devPrivates, (v), type);
3006747b715Smrg
3016747b715Smrg/*
3026747b715Smrg * Clean up privates
3036747b715Smrg */
3046747b715Smrgextern _X_EXPORT void
30535c4bbdfSmrg _dixFiniPrivates(PrivatePtr privates, DevPrivateType type);
3066747b715Smrg
3076747b715Smrg#define dixFiniPrivates(o,t)	_dixFiniPrivates((o)->devPrivates,t)
3086747b715Smrg
3096747b715Smrg/*
3106747b715Smrg * Allocates private data at object creation time. Required
3116747b715Smrg * for almost all objects, except for the list described
3126747b715Smrg * above for dixAllocatePrivates.
3136747b715Smrg */
31435c4bbdfSmrgextern _X_EXPORT void *_dixAllocateObjectWithPrivates(unsigned size,
31535c4bbdfSmrg                                                      unsigned clear,
31635c4bbdfSmrg                                                      unsigned offset,
31735c4bbdfSmrg                                                      DevPrivateType type);
3186747b715Smrg
3196747b715Smrg#define dixAllocateObjectWithPrivates(t, type) (t *) _dixAllocateObjectWithPrivates(sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
3206747b715Smrg
3216747b715Smrgextern _X_EXPORT void
32235c4bbdfSmrg
32335c4bbdfSmrg_dixFreeObjectWithPrivates(void *object, PrivatePtr privates,
32435c4bbdfSmrg                           DevPrivateType type);
3256747b715Smrg
3266747b715Smrg#define dixFreeObjectWithPrivates(o,t) _dixFreeObjectWithPrivates(o, (o)->devPrivates, t)
3276747b715Smrg
3286747b715Smrg/*
3296747b715Smrg * Return size of privates for the specified type
3306747b715Smrg */
3316747b715Smrgextern _X_EXPORT int
33235c4bbdfSmrg dixPrivatesSize(DevPrivateType type);
3336747b715Smrg
3346747b715Smrg/*
3356747b715Smrg * Dump out private stats to ErrorF
3366747b715Smrg */
3376747b715Smrgextern void
33835c4bbdfSmrg dixPrivateUsage(void);
3394642e01fSmrg
3404642e01fSmrg/*
3416747b715Smrg * Resets the privates subsystem.  dixResetPrivates is called from the main loop
3426747b715Smrg * before each server generation.  This function must only be called by main().
3434642e01fSmrg */
3446747b715Smrgextern _X_EXPORT void
34535c4bbdfSmrg dixResetPrivates(void);
3466747b715Smrg
3476747b715Smrg/*
3486747b715Smrg * Looks up the offset where the devPrivates field is located.
3496747b715Smrg *
3506747b715Smrg * Returns -1 if the specified resource has no dev privates.
3516747b715Smrg * The position of the devPrivates field varies by structure
3526747b715Smrg * and calling code might only know the resource type, not the
3536747b715Smrg * structure definition.
3546747b715Smrg */
3556747b715Smrgextern _X_EXPORT int
35635c4bbdfSmrg dixLookupPrivateOffset(RESTYPE type);
3574642e01fSmrg
3584642e01fSmrg/*
3594642e01fSmrg * Convenience macro for adding an offset to an object pointer
3604642e01fSmrg * when making a call to one of the devPrivates functions
3614642e01fSmrg */
3626747b715Smrg#define DEVPRIV_AT(ptr, offset) ((PrivatePtr *)((char *)(ptr) + offset))
3634642e01fSmrg
36435c4bbdfSmrg#endif                          /* PRIVATES_H */
365