160 lines
5.2 KiB
C
160 lines
5.2 KiB
C
/* SPDX-License-Identifier: MIT OR X11
|
|
*
|
|
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
|
|
*/
|
|
#ifndef _XSERVER_DIX_RESOURCE_PRIV_H
|
|
#define _XSERVER_DIX_RESOURCE_PRIV_H
|
|
|
|
#include <X11/Xdefs.h>
|
|
|
|
#include "include/dix.h"
|
|
#include "include/resource.h"
|
|
|
|
#define SameClient(obj,client) \
|
|
(CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
|
|
|
|
/*
|
|
* Resource IDs having that bit set still belonging to some client,
|
|
* but are server-internal, thus invisible to clients.
|
|
*/
|
|
#define SERVER_BIT (Mask)0x40000000 /* use illegal bit */
|
|
|
|
/* client field */
|
|
#define RESOURCE_CLIENT_MASK (((1 << ResourceClientBits()) - 1) << CLIENTOFFSET)
|
|
|
|
/* bits and fields within a resource id */
|
|
#define RESOURCE_AND_CLIENT_COUNT 29 /* 29 bits for XIDs */
|
|
#define CLIENTOFFSET (RESOURCE_AND_CLIENT_COUNT - ResourceClientBits())
|
|
|
|
/* extract the client mask from an XID */
|
|
#define CLIENT_BITS(id) ((id) & RESOURCE_CLIENT_MASK)
|
|
|
|
/* resource field */
|
|
#define RESOURCE_ID_MASK ((1 << CLIENTOFFSET) - 1)
|
|
|
|
/*
|
|
* @brief retrieve client that owns given window
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* @param WindowPtr to the window whose client shall be retrieved
|
|
* @return pointer to ClientRec structure or NullClient (NULL)
|
|
*/
|
|
ClientPtr dixClientForWindow(WindowPtr pWin);
|
|
|
|
/*
|
|
* @brief retrieve client that owns given grab
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* @param GrabPtr to the grab whose owning client shall be retrieved
|
|
* @return pointer to ClientRec structure or NullClient (NULL)
|
|
*/
|
|
ClientPtr dixClientForGrab(GrabPtr pGrab);
|
|
|
|
/*
|
|
* @brief retrieve client that owns InputClients
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* @param GrabPtr to the InputClients whose owning client shall be retrieved
|
|
* @return pointer to ClientRec structure or NullClient (NULL)
|
|
*/
|
|
ClientPtr dixClientForInputClients(InputClientsPtr pInputClients);
|
|
|
|
/*
|
|
* @brief retrieve client that owns OtherClients
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* @param GrabPtr to the OtherClients whose owning client shall be retrieved
|
|
* @return pointer to ClientRec structure or NullClient (NULL)
|
|
*/
|
|
ClientPtr dixClientForOtherClients(OtherClientsPtr pOtherClients);
|
|
|
|
/*
|
|
* @brief extract client ID from XID
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* This ID is frequently used as table index, eg. for client or resource lookup.
|
|
*
|
|
* @param XID the ID of the resource whose client is retrieved
|
|
* @return index of the client (within client or resource table)
|
|
*/
|
|
static inline int dixClientIdForXID(XID xid) {
|
|
return ((int)(CLIENT_BITS(xid) >> CLIENTOFFSET));
|
|
}
|
|
|
|
/*
|
|
* @brief retrieve client pointer from XID
|
|
*
|
|
* XIDs carry the ID of the client who created/owns the resource in upper bits.
|
|
* (every client so is assigned a range of XIDs it may use for resource creation)
|
|
*
|
|
* @param XID the ID of the resource whose client is retrieved
|
|
* @return pointer to ClientRec structure or NullClient (NULL)
|
|
*/
|
|
static inline ClientPtr dixClientForXID(XID xid) {
|
|
const int idx = dixClientIdForXID(xid);
|
|
if (idx < MAXCLIENTS)
|
|
return clients[idx];
|
|
return NullClient;
|
|
}
|
|
|
|
/*
|
|
* @brief check whether resource is owned by server
|
|
*
|
|
* @param XID the ID of the resource to check
|
|
* @return TRUE if resource is server owned
|
|
*/
|
|
static inline Bool dixResouceIsServerOwned(XID xid) {
|
|
return (dixClientForXID(xid) == serverClient);
|
|
}
|
|
|
|
/*
|
|
* @brief hash a XID for using as hashtable index
|
|
*
|
|
* @param id the XID to hash
|
|
* @param numBits number of bits in the resulting hash (>=0)
|
|
* @result the computed hash value
|
|
*
|
|
* @note This function is really only for handling
|
|
* INITHASHSIZE..MAXHASHSIZE bit hashes, but will handle any number
|
|
* of bits by either masking numBits lower bits of the ID or by
|
|
* providing at most MAXHASHSIZE hashes.
|
|
*/
|
|
int HashResourceID(XID id, unsigned int numBits);
|
|
|
|
/*
|
|
* @brief scan for free XIDs for client
|
|
*
|
|
* @param pClient the client to scan
|
|
* @param count maximum size of items to return
|
|
* @param pids pointer to XID where to return found free XIDs
|
|
* @result number of free XIDs
|
|
*/
|
|
unsigned int GetXIDList(ClientPtr pClient,
|
|
unsigned int count,
|
|
XID *pids);
|
|
|
|
/*
|
|
* @brief retrieve a range of free XIDs for given client
|
|
*
|
|
* @param client the client to scan
|
|
* @param server TRUE if scanning for free server XIDs
|
|
* @param minp pointer to result buffer: minimum XID of found range
|
|
* @param maxp pointer to result buffer: maximum XID of found range
|
|
*/
|
|
void GetXIDRange(int client,
|
|
Bool server,
|
|
XID *minp,
|
|
XID *maxp);
|
|
|
|
#endif /* _XSERVER_DIX_RESOURCE_PRIV_H */
|