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