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