merge XFree86 4.3.0.1 to -CURRENT

This commit is contained in:
Kaleb Keithley
2003-11-17 19:03:47 +00:00
parent 9508a382f8
commit c57959ad6a
615 changed files with 42990 additions and 101132 deletions

View File

@@ -47,6 +47,9 @@ SOFTWARE.
/* $Xorg: resource.c,v 1.5 2001/02/09 02:04:40 xorgcvs Exp $ */
/* $TOG: resource.c /main/41 1998/02/09 14:20:31 kaleb $ */
/* Routines to manage various kinds of resources:
*
* CreateNewResourceType, CreateNewResourceClass, InitClientResources,
@@ -69,7 +72,9 @@ SOFTWARE.
* 1, and an otherwise arbitrary ID in the low 22 bits, we can create a
* resource "owned" by the client.
*/
/* $XFree86: xc/programs/Xserver/dix/resource.c,v 3.12 2002/03/06 21:13:38 mvojkovi Exp $ */
#define NEED_EVENTS
#include "X.h"
#include "misc.h"
#include "os.h"
@@ -77,10 +82,18 @@ SOFTWARE.
#include "dixstruct.h"
#include "opaque.h"
#include "windowstr.h"
#include "dixfont.h"
#include "colormap.h"
#include "inputstr.h"
#include "dixevents.h"
#include "dixgrabs.h"
#include "cursor.h"
#ifdef PANORAMIX
#include "panoramiX.h"
#include "panoramiXsrv.h"
#endif
#include <assert.h>
extern WindowPtr *WindowTable;
static void RebuildTable(
#if NeedFunctionPrototypes
int /*client*/
@@ -111,12 +124,23 @@ typedef struct _ClientResource {
XID expectID;
} ClientResourceRec;
static RESTYPE lastResourceType;
RESTYPE lastResourceType;
static RESTYPE lastResourceClass;
static RESTYPE TypeMask;
RESTYPE TypeMask;
static DeleteType *DeleteFuncs = (DeleteType *)NULL;
#ifdef XResExtension
Atom * ResourceNames = NULL;
void RegisterResourceName (RESTYPE type, char *name)
{
ResourceNames[type & TypeMask] = MakeAtom(name, strlen(name), TRUE);
}
#endif
RESTYPE
CreateNewResourceType(deleteFunc)
DeleteType deleteFunc;
@@ -130,6 +154,18 @@ CreateNewResourceType(deleteFunc)
(next + 1) * sizeof(DeleteType));
if (!funcs)
return 0;
#ifdef XResExtension
{
Atom *newnames;
newnames = xrealloc(ResourceNames, (next + 1) * sizeof(Atom));
if(!newnames)
return 0;
ResourceNames = newnames;
ResourceNames[next] = 0;
}
#endif
lastResourceType = next;
DeleteFuncs = funcs;
DeleteFuncs[next] = deleteFunc;
@@ -164,11 +200,6 @@ InitClientResources(client)
if (client == serverClient)
{
extern int DeleteWindow(), dixDestroyPixmap(), FreeGC();
extern int CloseFont(), FreeCursor();
extern int FreeColormap(), FreeClientPixels();
extern int OtherClientGone(), DeletePassiveGrab();
lastResourceType = RT_LASTPREDEF;
lastResourceClass = RC_LASTPREDEF;
TypeMask = RC_LASTPREDEF - 1;
@@ -188,6 +219,14 @@ InitClientResources(client)
DeleteFuncs[RT_CMAPENTRY & TypeMask] = FreeClientPixels;
DeleteFuncs[RT_OTHERCLIENT & TypeMask] = OtherClientGone;
DeleteFuncs[RT_PASSIVEGRAB & TypeMask] = DeletePassiveGrab;
#ifdef XResExtension
if(ResourceNames)
xfree(ResourceNames);
ResourceNames = xalloc((lastResourceType + 1) * sizeof(Atom));
if(!ResourceNames)
return FALSE;
#endif
}
clientTable[i = client->index].resources =
(ResourcePtr *)xalloc(INITBUCKETS*sizeof(ResourcePtr));
@@ -212,10 +251,15 @@ InitClientResources(client)
return TRUE;
}
static int
#if NeedFunctionPrototypes
Hash(int client, register XID id)
#else
Hash(client, id)
int client;
register XID id;
#endif
{
id &= RESOURCE_ID_MASK;
switch (clientTable[client].hashsize)
@@ -237,9 +281,17 @@ Hash(client, id)
}
static XID
#if NeedFunctionPrototypes
AvailableID(
register int client,
register XID id,
register XID maxid,
register XID goodid)
#else
AvailableID(client, id, maxid, goodid)
register int client;
register XID id, maxid, goodid;
#endif
{
register ResourcePtr res;
@@ -507,7 +559,6 @@ FreeResourceByType(id, type, skipFree)
int cid;
register ResourcePtr res;
register ResourcePtr *prev, *head;
if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
{
head = &clientTable[cid].resources[Hash(cid, id)];
@@ -574,12 +625,12 @@ ChangeResourceValue (id, rtype, value)
*/
void
FindClientResourcesByType(client, type, func, cdata)
ClientPtr client;
RESTYPE type;
FindResType func;
pointer cdata;
{
FindClientResourcesByType(
ClientPtr client,
RESTYPE type,
FindResType func,
pointer cdata
){
register ResourcePtr *resources;
register ResourcePtr this, next;
int i, elements;
@@ -606,8 +657,64 @@ FindClientResourcesByType(client, type, func, cdata)
}
void
FreeClientNeverRetainResources(client)
ClientPtr client;
FindAllClientResources(
ClientPtr client,
FindAllRes func,
pointer cdata
){
register ResourcePtr *resources;
register ResourcePtr this, next;
int i, elements;
register int *eltptr;
if (!client)
client = serverClient;
resources = clientTable[client->index].resources;
eltptr = &clientTable[client->index].elements;
for (i = 0; i < clientTable[client->index].buckets; i++)
{
for (this = resources[i]; this; this = next)
{
next = this->next;
elements = *eltptr;
(*func)(this->value, this->id, this->type, cdata);
if (*eltptr != elements)
next = resources[i]; /* start over */
}
}
}
pointer
LookupClientResourceComplex(
ClientPtr client,
RESTYPE type,
FindComplexResType func,
pointer cdata
){
ResourcePtr *resources;
ResourcePtr this;
int i;
if (!client)
client = serverClient;
resources = clientTable[client->index].resources;
for (i = 0; i < clientTable[client->index].buckets; i++) {
for (this = resources[i]; this; this = this->next) {
if (!type || this->type == type) {
if((*func)(this->value, this->id, cdata))
return this->value;
}
}
}
return NULL;
}
void
FreeClientNeverRetainResources(ClientPtr client)
{
ResourcePtr *resources;
ResourcePtr this;
@@ -681,6 +788,7 @@ FreeClientResources(client)
}
}
xfree(clientTable[client->index].resources);
clientTable[client->index].resources = NULL;
clientTable[client->index].buckets = 0;
}
@@ -701,7 +809,19 @@ LegalNewID(id, client)
XID id;
register ClientPtr client;
{
return ((client->clientAsMask == (id & ~RESOURCE_ID_MASK)) &&
#ifdef PANORAMIX
XID minid, maxid;
if (!noPanoramiXExtension) {
minid = client->clientAsMask | (client->index ?
SERVER_BIT : SERVER_MINID);
maxid = (clientTable[client->index].fakeID | RESOURCE_ID_MASK) + 1;
if ((id >= minid) && (id <= maxid))
return TRUE;
}
#endif /* PANORAMIX */
return ((client->clientAsMask == (id & ~RESOURCE_ID_MASK)) &&
((clientTable[client->index].expectID <= id) ||
!LookupIDByClass(id, RC_ANY)));
}
@@ -757,7 +877,7 @@ SecurityLookupIDByClass(client, id, classes, mode)
Mask mode;
{
int cid;
register ResourcePtr res;
register ResourcePtr res = NULL;
pointer retval = NULL;
assert(client == NullClient ||