privates.h revision 1b5d61b8
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,
3635c4bbdfSmrg    PRIVATE_DEVICE,
376747b715Smrg
386747b715Smrg    /* These cannot have any objects before all relevant keys are registered */
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_GLYPH,
506747b715Smrg    PRIVATE_GLYPHSET,
516747b715Smrg    PRIVATE_PICTURE,
529ace9065Smrg    PRIVATE_SYNC_FENCE,
536747b715Smrg
546747b715Smrg    /* last private type */
556747b715Smrg    PRIVATE_LAST,
566747b715Smrg} DevPrivateType;
576747b715Smrg
586747b715Smrgtypedef struct _DevPrivateKeyRec {
5935c4bbdfSmrg    int offset;
6035c4bbdfSmrg    int size;
6135c4bbdfSmrg    Bool initialized;
6235c4bbdfSmrg    Bool allocated;
6335c4bbdfSmrg    DevPrivateType type;
6435c4bbdfSmrg    struct _DevPrivateKeyRec *next;
656747b715Smrg} DevPrivateKeyRec, *DevPrivateKey;
666747b715Smrg
6735c4bbdfSmrgtypedef struct _DevPrivateSetRec {
6835c4bbdfSmrg    DevPrivateKey key;
6935c4bbdfSmrg    unsigned offset;
7035c4bbdfSmrg    int created;
7135c4bbdfSmrg    int allocated;
7235c4bbdfSmrg} DevPrivateSetRec, *DevPrivateSetPtr;
7335c4bbdfSmrg
749ace9065Smrgtypedef struct _DevScreenPrivateKeyRec {
7535c4bbdfSmrg    DevPrivateKeyRec screenKey;
769ace9065Smrg} DevScreenPrivateKeyRec, *DevScreenPrivateKey;
779ace9065Smrg
786747b715Smrg/*
796747b715Smrg * Let drivers know how to initialize private keys
806747b715Smrg */
816747b715Smrg
826747b715Smrg#define HAS_DEVPRIVATEKEYREC		1
836747b715Smrg#define HAS_DIXREGISTERPRIVATEKEY	1
844642e01fSmrg
854642e01fSmrg/*
866747b715Smrg * Register a new private index for the private type.
876747b715Smrg *
886747b715Smrg * This initializes the specified key and optionally requests pre-allocated
896747b715Smrg * private space for your driver/module. If you request no extra space, you
906747b715Smrg * may set and get a single pointer value using this private key. Otherwise,
916747b715Smrg * you can get the address of the extra space and store whatever data you like
926747b715Smrg * there.
936747b715Smrg *
946747b715Smrg * You may call dixRegisterPrivateKey more than once on the same key, but the
956747b715Smrg * size and type must match or the server will abort.
966747b715Smrg *
976747b715Smrg * dixRegisterPrivateKey returns FALSE if it fails to allocate memory
986747b715Smrg * during its operation.
994642e01fSmrg */
1006747b715Smrgextern _X_EXPORT Bool
10135c4bbdfSmrg dixRegisterPrivateKey(DevPrivateKey key, DevPrivateType type, unsigned size);
1024642e01fSmrg
1034642e01fSmrg/*
1046747b715Smrg * Check whether a private key has been registered
1054642e01fSmrg */
1066747b715Smrgstatic inline Bool
1076747b715SmrgdixPrivateKeyRegistered(DevPrivateKey key)
1086747b715Smrg{
1096747b715Smrg    return key->initialized;
1106747b715Smrg}
1114642e01fSmrg
1124642e01fSmrg/*
1136747b715Smrg * Get the address of the private storage.
1146747b715Smrg *
1156747b715Smrg * For keys with pre-defined storage, this gets the base of that storage
1166747b715Smrg * Otherwise, it returns the place where the private pointer is stored.
1174642e01fSmrg */
1186747b715Smrgstatic inline void *
1196747b715SmrgdixGetPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1206747b715Smrg{
1216747b715Smrg    assert(key->initialized);
1226747b715Smrg    return (char *) (*privates) + key->offset;
1236747b715Smrg}
1244642e01fSmrg
1254642e01fSmrg/*
1266747b715Smrg * Fetch a private pointer stored in the object
1276747b715Smrg *
1286747b715Smrg * Returns the pointer stored with dixSetPrivate.
1296747b715Smrg * This must only be used with keys that have
1306747b715Smrg * no pre-defined storage
1314642e01fSmrg */
1326747b715Smrgstatic inline void *
1336747b715SmrgdixGetPrivate(PrivatePtr *privates, const DevPrivateKey key)
1346747b715Smrg{
13535c4bbdfSmrg    assert(key->size == 0);
1366747b715Smrg    return *(void **) dixGetPrivateAddr(privates, key);
1376747b715Smrg}
1384642e01fSmrg
1394642e01fSmrg/*
1406747b715Smrg * Associate 'val' with 'key' in 'privates' so that later calls to
1416747b715Smrg * dixLookupPrivate(privates, key) will return 'val'.
1424642e01fSmrg */
1436747b715Smrgstatic inline void
14435c4bbdfSmrgdixSetPrivate(PrivatePtr *privates, const DevPrivateKey key, void *val)
1456747b715Smrg{
14635c4bbdfSmrg    assert(key->size == 0);
14735c4bbdfSmrg    *(void **) dixGetPrivateAddr(privates, key) = val;
1486747b715Smrg}
1494642e01fSmrg
1506747b715Smrg#include "dix.h"
1516747b715Smrg#include "resource.h"
1524642e01fSmrg
1536747b715Smrg/*
1546747b715Smrg * Lookup a pointer to the private record.
1556747b715Smrg *
1566747b715Smrg * For privates with defined storage, return the address of the
1576747b715Smrg * storage. For privates without defined storage, return the pointer
1586747b715Smrg * contents
1596747b715Smrg */
16035c4bbdfSmrgstatic inline void *
1616747b715SmrgdixLookupPrivate(PrivatePtr *privates, const DevPrivateKey key)
1626747b715Smrg{
1636747b715Smrg    if (key->size)
16435c4bbdfSmrg        return dixGetPrivateAddr(privates, key);
1656747b715Smrg    else
16635c4bbdfSmrg        return dixGetPrivate(privates, key);
1676747b715Smrg}
1684642e01fSmrg
1694642e01fSmrg/*
1706747b715Smrg * Look up the address of the pointer to the storage
1716747b715Smrg *
1726747b715Smrg * This returns the place where the private pointer is stored,
1736747b715Smrg * which is only valid for privates without predefined storage.
1744642e01fSmrg */
17535c4bbdfSmrgstatic inline void **
1766747b715SmrgdixLookupPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
1776747b715Smrg{
17835c4bbdfSmrg    assert(key->size == 0);
17935c4bbdfSmrg    return (void **) dixGetPrivateAddr(privates, key);
1806747b715Smrg}
1814642e01fSmrg
1829ace9065Smrgextern _X_EXPORT Bool
18335c4bbdfSmrg
18435c4bbdfSmrgdixRegisterScreenPrivateKey(DevScreenPrivateKey key, ScreenPtr pScreen,
18535c4bbdfSmrg                            DevPrivateType type, unsigned size);
1869ace9065Smrg
1879ace9065Smrgextern _X_EXPORT DevPrivateKey
18835c4bbdfSmrg _dixGetScreenPrivateKey(const DevScreenPrivateKey key, ScreenPtr pScreen);
1899ace9065Smrg
1909ace9065Smrgstatic inline void *
19135c4bbdfSmrgdixGetScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key,
19235c4bbdfSmrg                        ScreenPtr pScreen)
1939ace9065Smrg{
1949ace9065Smrg    return dixGetPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
1959ace9065Smrg}
1969ace9065Smrg
1979ace9065Smrgstatic inline void *
19835c4bbdfSmrgdixGetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
19935c4bbdfSmrg                    ScreenPtr pScreen)
2009ace9065Smrg{
2019ace9065Smrg    return dixGetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
2029ace9065Smrg}
2039ace9065Smrg
2049ace9065Smrgstatic inline void
20535c4bbdfSmrgdixSetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
20635c4bbdfSmrg                    ScreenPtr pScreen, void *val)
2079ace9065Smrg{
2089ace9065Smrg    dixSetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen), val);
2099ace9065Smrg}
2109ace9065Smrg
21135c4bbdfSmrgstatic inline void *
21235c4bbdfSmrgdixLookupScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key,
21335c4bbdfSmrg                       ScreenPtr pScreen)
2149ace9065Smrg{
2159ace9065Smrg    return dixLookupPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
2169ace9065Smrg}
2179ace9065Smrg
21835c4bbdfSmrgstatic inline void **
21935c4bbdfSmrgdixLookupScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key,
22035c4bbdfSmrg                           ScreenPtr pScreen)
2219ace9065Smrg{
22235c4bbdfSmrg    return dixLookupPrivateAddr(privates,
22335c4bbdfSmrg                                _dixGetScreenPrivateKey(key, pScreen));
2249ace9065Smrg}
2259ace9065Smrg
22635c4bbdfSmrg/*
22735c4bbdfSmrg * These functions relate to allocations related to a specific screen;
22835c4bbdfSmrg * space will only be available for objects allocated for use on that
22935c4bbdfSmrg * screen. As such, only objects which are related directly to a specific
23035c4bbdfSmrg * screen are candidates for allocation this way, this includes
23135c4bbdfSmrg * windows, pixmaps, gcs, pictures and colormaps. This key is
23235c4bbdfSmrg * used just like any other key using dixGetPrivate and friends.
23335c4bbdfSmrg *
23435c4bbdfSmrg * This is distinctly different from the ScreenPrivateKeys above which
23535c4bbdfSmrg * allocate space in global objects like cursor bits for a specific
23635c4bbdfSmrg * screen, allowing multiple screen-related chunks of storage in a
23735c4bbdfSmrg * single global object.
23835c4bbdfSmrg */
23935c4bbdfSmrg
24035c4bbdfSmrg#define HAVE_SCREEN_SPECIFIC_PRIVATE_KEYS       1
24135c4bbdfSmrg
24235c4bbdfSmrgextern _X_EXPORT Bool
24335c4bbdfSmrgdixRegisterScreenSpecificPrivateKey(ScreenPtr pScreen, DevPrivateKey key,
24435c4bbdfSmrg                                    DevPrivateType type, unsigned size);
24535c4bbdfSmrg
24635c4bbdfSmrg/* Clean up screen-specific privates before CloseScreen */
24735c4bbdfSmrgextern void
24835c4bbdfSmrgdixFreeScreenSpecificPrivates(ScreenPtr pScreen);
24935c4bbdfSmrg
25035c4bbdfSmrg/* Initialize screen-specific privates in AddScreen */
25135c4bbdfSmrgextern void
25235c4bbdfSmrgdixInitScreenSpecificPrivates(ScreenPtr pScreen);
25335c4bbdfSmrg
2541b5d61b8Smrg/* is this private created - so hotplug can avoid crashing */
2551b5d61b8SmrgBool dixPrivatesCreated(DevPrivateType type);
2561b5d61b8Smrg
25735c4bbdfSmrgextern _X_EXPORT void *
25835c4bbdfSmrg_dixAllocateScreenObjectWithPrivates(ScreenPtr pScreen,
25935c4bbdfSmrg                                     unsigned size,
26035c4bbdfSmrg                                     unsigned clear,
26135c4bbdfSmrg                                     unsigned offset,
26235c4bbdfSmrg                                     DevPrivateType type);
26335c4bbdfSmrg
26435c4bbdfSmrg#define dixAllocateScreenObjectWithPrivates(s, t, type) _dixAllocateScreenObjectWithPrivates(s, sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
26535c4bbdfSmrg
26635c4bbdfSmrgextern _X_EXPORT int
26735c4bbdfSmrgdixScreenSpecificPrivatesSize(ScreenPtr pScreen, DevPrivateType type);
26835c4bbdfSmrg
26935c4bbdfSmrgextern _X_EXPORT void
27035c4bbdfSmrg_dixInitScreenPrivates(ScreenPtr pScreen, PrivatePtr *privates, void *addr, DevPrivateType type);
27135c4bbdfSmrg
27235c4bbdfSmrg#define dixInitScreenPrivates(s, o, v, type) _dixInitScreenPrivates(s, &(o)->devPrivates, (v), type);
27335c4bbdfSmrg
2744642e01fSmrg/*
2756747b715Smrg * Allocates private data separately from main object.
2766747b715Smrg *
2776747b715Smrg * For objects created during server initialization, this allows those
2786747b715Smrg * privates to be re-allocated as new private keys are registered.
2796747b715Smrg *
2806747b715Smrg * This includes screens, the serverClient, default colormaps and
2816747b715Smrg * extensions entries.
2824642e01fSmrg */
2836747b715Smrgextern _X_EXPORT Bool
28435c4bbdfSmrg dixAllocatePrivates(PrivatePtr *privates, DevPrivateType type);
2854642e01fSmrg
2864642e01fSmrg/*
2876747b715Smrg * Frees separately allocated private data
2884642e01fSmrg */
2896747b715Smrgextern _X_EXPORT void
29035c4bbdfSmrg dixFreePrivates(PrivatePtr privates, DevPrivateType type);
2914642e01fSmrg
2924642e01fSmrg/*
2936747b715Smrg * Initialize privates by zeroing them
2944642e01fSmrg */
2956747b715Smrgextern _X_EXPORT void
2966747b715Smrg_dixInitPrivates(PrivatePtr *privates, void *addr, DevPrivateType type);
2976747b715Smrg
2986747b715Smrg#define dixInitPrivates(o, v, type) _dixInitPrivates(&(o)->devPrivates, (v), type);
2996747b715Smrg
3006747b715Smrg/*
3016747b715Smrg * Clean up privates
3026747b715Smrg */
3036747b715Smrgextern _X_EXPORT void
30435c4bbdfSmrg _dixFiniPrivates(PrivatePtr privates, DevPrivateType type);
3056747b715Smrg
3066747b715Smrg#define dixFiniPrivates(o,t)	_dixFiniPrivates((o)->devPrivates,t)
3076747b715Smrg
3086747b715Smrg/*
3096747b715Smrg * Allocates private data at object creation time. Required
3106747b715Smrg * for almost all objects, except for the list described
3116747b715Smrg * above for dixAllocatePrivates.
3126747b715Smrg */
31335c4bbdfSmrgextern _X_EXPORT void *_dixAllocateObjectWithPrivates(unsigned size,
31435c4bbdfSmrg                                                      unsigned clear,
31535c4bbdfSmrg                                                      unsigned offset,
31635c4bbdfSmrg                                                      DevPrivateType type);
3176747b715Smrg
3186747b715Smrg#define dixAllocateObjectWithPrivates(t, type) (t *) _dixAllocateObjectWithPrivates(sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
3196747b715Smrg
3206747b715Smrgextern _X_EXPORT void
32135c4bbdfSmrg
32235c4bbdfSmrg_dixFreeObjectWithPrivates(void *object, PrivatePtr privates,
32335c4bbdfSmrg                           DevPrivateType type);
3246747b715Smrg
3256747b715Smrg#define dixFreeObjectWithPrivates(o,t) _dixFreeObjectWithPrivates(o, (o)->devPrivates, t)
3266747b715Smrg
3276747b715Smrg/*
3286747b715Smrg * Return size of privates for the specified type
3296747b715Smrg */
3306747b715Smrgextern _X_EXPORT int
33135c4bbdfSmrg dixPrivatesSize(DevPrivateType type);
3326747b715Smrg
3336747b715Smrg/*
3346747b715Smrg * Dump out private stats to ErrorF
3356747b715Smrg */
3366747b715Smrgextern void
33735c4bbdfSmrg dixPrivateUsage(void);
3384642e01fSmrg
3394642e01fSmrg/*
3406747b715Smrg * Resets the privates subsystem.  dixResetPrivates is called from the main loop
3416747b715Smrg * before each server generation.  This function must only be called by main().
3424642e01fSmrg */
3436747b715Smrgextern _X_EXPORT void
34435c4bbdfSmrg dixResetPrivates(void);
3456747b715Smrg
3466747b715Smrg/*
3476747b715Smrg * Looks up the offset where the devPrivates field is located.
3486747b715Smrg *
3496747b715Smrg * Returns -1 if the specified resource has no dev privates.
3506747b715Smrg * The position of the devPrivates field varies by structure
3516747b715Smrg * and calling code might only know the resource type, not the
3526747b715Smrg * structure definition.
3536747b715Smrg */
3546747b715Smrgextern _X_EXPORT int
35535c4bbdfSmrg dixLookupPrivateOffset(RESTYPE type);
3564642e01fSmrg
3574642e01fSmrg/*
3584642e01fSmrg * Convenience macro for adding an offset to an object pointer
3594642e01fSmrg * when making a call to one of the devPrivates functions
3604642e01fSmrg */
3616747b715Smrg#define DEVPRIV_AT(ptr, offset) ((PrivatePtr *)((char *)(ptr) + offset))
3624642e01fSmrg
36335c4bbdfSmrg#endif                          /* PRIVATES_H */
364