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