f0ab104f070bc7f569404826fea1828ed985638cvboxsync/***********************************************************
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncAUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync******************************************************************/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#ifndef PRIVATES_H
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define PRIVATES_H 1
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <X11/Xdefs.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <X11/Xosdefs.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include <X11/Xfuncproto.h>
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "misc.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*****************************************************************
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * STUFF FOR PRIVATES
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *****************************************************************/
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _Private PrivateRec, *PrivatePtr;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef enum {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* XSELinux uses the same private keys for numerous objects */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_XSELINUX,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* Otherwise, you get a private in just the requested structure
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* These can have objects created before all of the keys are registered */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_SCREEN,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_EXTENSION,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_COLORMAP,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* These cannot have any objects before all relevant keys are registered */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_DEVICE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_CLIENT,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_PROPERTY,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_SELECTION,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_WINDOW,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_PIXMAP,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_GC,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_CURSOR,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_CURSOR_BITS,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* extension privates */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_DBE_WINDOW,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_DAMAGE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_GLYPH,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_GLYPHSET,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_PICTURE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_SYNC_FENCE,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync /* last private type */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync PRIVATE_LAST,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} DevPrivateType;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _DevPrivateKeyRec {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int offset;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync int size;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Bool initialized;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync Bool allocated;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync DevPrivateType type;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync struct _DevPrivateKeyRec *next;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} DevPrivateKeyRec, *DevPrivateKey;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsynctypedef struct _DevScreenPrivateKeyRec {
f0ab104f070bc7f569404826fea1828ed985638cvboxsync DevPrivateKeyRec screenKey;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync} DevScreenPrivateKeyRec, *DevScreenPrivateKey;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Let drivers know how to initialize private keys
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define HAS_DEVPRIVATEKEYREC 1
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define HAS_DIXREGISTERPRIVATEKEY 1
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Register a new private index for the private type.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * This initializes the specified key and optionally requests pre-allocated
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * private space for your driver/module. If you request no extra space, you
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * may set and get a single pointer value using this private key. Otherwise,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * you can get the address of the extra space and store whatever data you like
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * there.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * You may call dixRegisterPrivateKey more than once on the same key, but the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * size and type must match or the server will abort.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * dixRegisterPrivateKey returns FALSE if it fails to allocate memory
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * during its operation.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT Bool
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixRegisterPrivateKey(DevPrivateKey key, DevPrivateType type, unsigned size);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Check whether a private key has been registered
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline Bool
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixPrivateKeyRegistered(DevPrivateKey key)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return key->initialized;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Get the address of the private storage.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * For keys with pre-defined storage, this gets the base of that storage
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Otherwise, it returns the place where the private pointer is stored.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixGetPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync assert(key->initialized);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return (char *) (*privates) + key->offset;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Fetch a private pointer stored in the object
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Returns the pointer stored with dixSetPrivate.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * This must only be used with keys that have
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * no pre-defined storage
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixGetPrivate(PrivatePtr *privates, const DevPrivateKey key)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync assert (key->size == 0);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return *(void **) dixGetPrivateAddr(privates, key);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Associate 'val' with 'key' in 'privates' so that later calls to
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * dixLookupPrivate(privates, key) will return 'val'.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixSetPrivate(PrivatePtr *privates, const DevPrivateKey key, pointer val)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync assert (key->size == 0);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *(pointer *) dixGetPrivateAddr(privates, key) = val;
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "dix.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#include "resource.h"
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Lookup a pointer to the private record.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * For privates with defined storage, return the address of the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * storage. For privates without defined storage, return the pointer
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * contents
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline pointer
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixLookupPrivate(PrivatePtr *privates, const DevPrivateKey key)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync if (key->size)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixGetPrivateAddr(privates, key);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync else
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixGetPrivate(privates, key);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Look up the address of the pointer to the storage
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * This returns the place where the private pointer is stored,
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * which is only valid for privates without predefined storage.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline pointer *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixLookupPrivateAddr(PrivatePtr *privates, const DevPrivateKey key)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync assert (key->size == 0);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return (pointer *)dixGetPrivateAddr(privates, key);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT Bool
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixRegisterScreenPrivateKey(DevScreenPrivateKey key, ScreenPtr pScreen, DevPrivateType type, unsigned size);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT DevPrivateKey
f0ab104f070bc7f569404826fea1828ed985638cvboxsync_dixGetScreenPrivateKey(const DevScreenPrivateKey key, ScreenPtr pScreen);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixGetScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixGetPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixGetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixGetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline void
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixSetScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen, pointer val)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync dixSetPrivate(privates, _dixGetScreenPrivateKey(key, pScreen), val);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline pointer
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixLookupScreenPrivate(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixLookupPrivate(privates, _dixGetScreenPrivateKey(key, pScreen));
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncstatic inline pointer *
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixLookupScreenPrivateAddr(PrivatePtr *privates, const DevScreenPrivateKey key, ScreenPtr pScreen)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync{
f0ab104f070bc7f569404826fea1828ed985638cvboxsync return dixLookupPrivateAddr(privates, _dixGetScreenPrivateKey(key, pScreen));
f0ab104f070bc7f569404826fea1828ed985638cvboxsync}
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Allocates private data separately from main object.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * For objects created during server initialization, this allows those
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * privates to be re-allocated as new private keys are registered.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * This includes screens, the serverClient, default colormaps and
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * extensions entries.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT Bool
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixAllocatePrivates(PrivatePtr *privates, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Frees separately allocated private data
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixFreePrivates(PrivatePtr privates, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Initialize privates by zeroing them
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void
f0ab104f070bc7f569404826fea1828ed985638cvboxsync_dixInitPrivates(PrivatePtr *privates, void *addr, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define dixInitPrivates(o, v, type) _dixInitPrivates(&(o)->devPrivates, (v), type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Clean up privates
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void
f0ab104f070bc7f569404826fea1828ed985638cvboxsync_dixFiniPrivates(PrivatePtr privates, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define dixFiniPrivates(o,t) _dixFiniPrivates((o)->devPrivates,t)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Allocates private data at object creation time. Required
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * for almost all objects, except for the list described
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * above for dixAllocatePrivates.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync_dixAllocateObjectWithPrivates(unsigned size, unsigned clear, unsigned offset, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define dixAllocateObjectWithPrivates(t, type) (t *) _dixAllocateObjectWithPrivates(sizeof(t), sizeof(t), offsetof(t, devPrivates), type)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void
f0ab104f070bc7f569404826fea1828ed985638cvboxsync_dixFreeObjectWithPrivates(void *object, PrivatePtr privates, DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define dixFreeObjectWithPrivates(o,t) _dixFreeObjectWithPrivates(o, (o)->devPrivates, t)
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Return size of privates for the specified type
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT int
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixPrivatesSize(DevPrivateType type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Dump out private stats to ErrorF
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern void
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixPrivateUsage(void);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Resets the privates subsystem. dixResetPrivates is called from the main loop
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * before each server generation. This function must only be called by main().
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT void
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixResetPrivates(void);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Looks up the offset where the devPrivates field is located.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync *
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Returns -1 if the specified resource has no dev privates.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * The position of the devPrivates field varies by structure
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * and calling code might only know the resource type, not the
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * structure definition.
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncextern _X_EXPORT int
f0ab104f070bc7f569404826fea1828ed985638cvboxsyncdixLookupPrivateOffset(RESTYPE type);
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync/*
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * Convenience macro for adding an offset to an object pointer
f0ab104f070bc7f569404826fea1828ed985638cvboxsync * when making a call to one of the devPrivates functions
f0ab104f070bc7f569404826fea1828ed985638cvboxsync */
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#define DEVPRIV_AT(ptr, offset) ((PrivatePtr *)((char *)(ptr) + offset))
f0ab104f070bc7f569404826fea1828ed985638cvboxsync
f0ab104f070bc7f569404826fea1828ed985638cvboxsync#endif /* PRIVATES_H */