xserver-multidpi/dix/registry.c

377 lines
15 KiB
C

/************************************************************
Author: Eamon Walsh <ewalsh@epoch.ncsc.mil>
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
this permission notice appear in supporting documentation. This permission
notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
********************************************************/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#ifdef XREGISTRY
#include <X11/X.h>
#include <X11/Xproto.h>
#include "resource.h"
#include "registry.h"
#define BASE_SIZE 16
#define CORE "X11:"
static const char ***requests, **events, **errors, **resources;
static unsigned nmajor, *nminor, nevent, nerror, nresource;
static int double_size(void *p, unsigned n, unsigned size)
{
char **ptr = (char **)p;
unsigned s, f;
if (n) {
s = n * size;
n *= 2 * size;
f = n;
} else {
s = 0;
n = f = BASE_SIZE * size;
}
*ptr = xrealloc(*ptr, n);
if (!*ptr) {
dixResetRegistry();
return FALSE;
}
memset(*ptr + s, 0, f - s);
return TRUE;
}
/*
* Registration functions
*/
void
RegisterRequestName(unsigned major, unsigned minor, const char *name)
{
while (major >= nmajor) {
if (!double_size(&requests, nmajor, sizeof(const char **)))
return;
if (!double_size(&nminor, nmajor, sizeof(unsigned)))
return;
nmajor = nmajor ? nmajor * 2 : BASE_SIZE;
}
while (minor >= nminor[major]) {
if (!double_size(requests+major, nminor[major], sizeof(const char *)))
return;
nminor[major] = nminor[major] ? nminor[major] * 2 : BASE_SIZE;
}
requests[major][minor] = name;
}
void
RegisterEventName(unsigned event, const char *name) {
while (event >= nevent) {
if (!double_size(&events, nevent, sizeof(const char *)))
return;
nevent = nevent ? nevent * 2 : BASE_SIZE;
}
events[event] = name;
}
void
RegisterErrorName(unsigned error, const char *name) {
while (error >= nerror) {
if (!double_size(&errors, nerror, sizeof(const char *)))
return;
nerror = nerror ? nerror * 2 : BASE_SIZE;
}
errors[error] = name;
}
void
RegisterResourceName(RESTYPE resource, const char *name)
{
resource &= TypeMask;
while (resource >= nresource) {
if (!double_size(&resources, nresource, sizeof(const char *)))
return;
nresource = nresource ? nresource * 2 : BASE_SIZE;
}
resources[resource] = name;
}
/*
* Lookup functions
*/
const char *
LookupRequestName(int major, int minor)
{
if (major >= nmajor)
return XREGISTRY_UNKNOWN;
if (minor >= nminor[major])
return XREGISTRY_UNKNOWN;
return requests[major][minor] ? requests[major][minor] : XREGISTRY_UNKNOWN;
}
const char *
LookupEventName(int event)
{
event &= 127;
if (event >= nevent)
return XREGISTRY_UNKNOWN;
return events[event] ? events[event] : XREGISTRY_UNKNOWN;
}
const char *
LookupErrorName(int error)
{
if (error >= nerror)
return XREGISTRY_UNKNOWN;
return errors[error] ? errors[error] : XREGISTRY_UNKNOWN;
}
const char *
LookupResourceName(RESTYPE resource)
{
resource &= TypeMask;
if (resource >= nresource)
return XREGISTRY_UNKNOWN;
return resources[resource] ? resources[resource] : XREGISTRY_UNKNOWN;
}
/*
* Setup and teardown
*/
void
dixResetRegistry(void)
{
/* Free all memory */
while (nmajor)
xfree(requests[--nmajor]);
xfree(requests);
xfree(nminor);
xfree(events);
xfree(errors);
xfree(resources);
requests = NULL;
nminor = NULL;
events = NULL;
errors = NULL;
resources = NULL;
nmajor = nevent = nerror = nresource = 0;
/* Add built-in resources */
RegisterResourceName(RT_NONE, "NONE");
RegisterResourceName(RT_WINDOW, "WINDOW");
RegisterResourceName(RT_PIXMAP, "PIXMAP");
RegisterResourceName(RT_GC, "GC");
RegisterResourceName(RT_FONT, "FONT");
RegisterResourceName(RT_CURSOR, "CURSOR");
RegisterResourceName(RT_COLORMAP, "COLORMAP");
RegisterResourceName(RT_CMAPENTRY, "COLORMAP ENTRY");
RegisterResourceName(RT_OTHERCLIENT, "OTHER CLIENT");
RegisterResourceName(RT_PASSIVEGRAB, "PASSIVE GRAB");
/* Add the core protocol */
RegisterRequestName(X_CreateWindow, 0, CORE "CreateWindow");
RegisterRequestName(X_ChangeWindowAttributes, 0, CORE "ChangeWindowAttributes");
RegisterRequestName(X_GetWindowAttributes, 0, CORE "GetWindowAttributes");
RegisterRequestName(X_DestroyWindow, 0, CORE "DestroyWindow");
RegisterRequestName(X_DestroySubwindows, 0, CORE "DestroySubwindows");
RegisterRequestName(X_ChangeSaveSet, 0, CORE "ChangeSaveSet");
RegisterRequestName(X_ReparentWindow, 0, CORE "ReparentWindow");
RegisterRequestName(X_MapWindow, 0, CORE "MapWindow");
RegisterRequestName(X_MapSubwindows, 0, CORE "MapSubwindows");
RegisterRequestName(X_UnmapWindow, 0, CORE "UnmapWindow");
RegisterRequestName(X_UnmapSubwindows, 0, CORE "UnmapSubwindows");
RegisterRequestName(X_ConfigureWindow, 0, CORE "ConfigureWindow");
RegisterRequestName(X_CirculateWindow, 0, CORE "CirculateWindow");
RegisterRequestName(X_GetGeometry, 0, CORE "GetGeometry");
RegisterRequestName(X_QueryTree, 0, CORE "QueryTree");
RegisterRequestName(X_InternAtom, 0, CORE "InternAtom");
RegisterRequestName(X_GetAtomName, 0, CORE "GetAtomName");
RegisterRequestName(X_ChangeProperty, 0, CORE "ChangeProperty");
RegisterRequestName(X_DeleteProperty, 0, CORE "DeleteProperty");
RegisterRequestName(X_GetProperty, 0, CORE "GetProperty");
RegisterRequestName(X_ListProperties, 0, CORE "ListProperties");
RegisterRequestName(X_SetSelectionOwner, 0, CORE "SetSelectionOwner");
RegisterRequestName(X_GetSelectionOwner, 0, CORE "GetSelectionOwner");
RegisterRequestName(X_ConvertSelection, 0, CORE "ConvertSelection");
RegisterRequestName(X_SendEvent, 0, CORE "SendEvent");
RegisterRequestName(X_GrabPointer, 0, CORE "GrabPointer");
RegisterRequestName(X_UngrabPointer, 0, CORE "UngrabPointer");
RegisterRequestName(X_GrabButton, 0, CORE "GrabButton");
RegisterRequestName(X_UngrabButton, 0, CORE "UngrabButton");
RegisterRequestName(X_ChangeActivePointerGrab, 0, CORE "ChangeActivePointerGrab");
RegisterRequestName(X_GrabKeyboard, 0, CORE "GrabKeyboard");
RegisterRequestName(X_UngrabKeyboard, 0, CORE "UngrabKeyboard");
RegisterRequestName(X_GrabKey, 0, CORE "GrabKey");
RegisterRequestName(X_UngrabKey, 0, CORE "UngrabKey");
RegisterRequestName(X_AllowEvents, 0, CORE "AllowEvents");
RegisterRequestName(X_GrabServer, 0, CORE "GrabServer");
RegisterRequestName(X_UngrabServer, 0, CORE "UngrabServer");
RegisterRequestName(X_QueryPointer, 0, CORE "QueryPointer");
RegisterRequestName(X_GetMotionEvents, 0, CORE "GetMotionEvents");
RegisterRequestName(X_TranslateCoords, 0, CORE "TranslateCoords");
RegisterRequestName(X_WarpPointer, 0, CORE "WarpPointer");
RegisterRequestName(X_SetInputFocus, 0, CORE "SetInputFocus");
RegisterRequestName(X_GetInputFocus, 0, CORE "GetInputFocus");
RegisterRequestName(X_QueryKeymap, 0, CORE "QueryKeymap");
RegisterRequestName(X_OpenFont, 0, CORE "OpenFont");
RegisterRequestName(X_CloseFont, 0, CORE "CloseFont");
RegisterRequestName(X_QueryFont, 0, CORE "QueryFont");
RegisterRequestName(X_QueryTextExtents, 0, CORE "QueryTextExtents");
RegisterRequestName(X_ListFonts, 0, CORE "ListFonts");
RegisterRequestName(X_ListFontsWithInfo, 0, CORE "ListFontsWithInfo");
RegisterRequestName(X_SetFontPath, 0, CORE "SetFontPath");
RegisterRequestName(X_GetFontPath, 0, CORE "GetFontPath");
RegisterRequestName(X_CreatePixmap, 0, CORE "CreatePixmap");
RegisterRequestName(X_FreePixmap, 0, CORE "FreePixmap");
RegisterRequestName(X_CreateGC, 0, CORE "CreateGC");
RegisterRequestName(X_ChangeGC, 0, CORE "ChangeGC");
RegisterRequestName(X_CopyGC, 0, CORE "CopyGC");
RegisterRequestName(X_SetDashes, 0, CORE "SetDashes");
RegisterRequestName(X_SetClipRectangles, 0, CORE "SetClipRectangles");
RegisterRequestName(X_FreeGC, 0, CORE "FreeGC");
RegisterRequestName(X_ClearArea, 0, CORE "ClearArea");
RegisterRequestName(X_CopyArea, 0, CORE "CopyArea");
RegisterRequestName(X_CopyPlane, 0, CORE "CopyPlane");
RegisterRequestName(X_PolyPoint, 0, CORE "PolyPoint");
RegisterRequestName(X_PolyLine, 0, CORE "PolyLine");
RegisterRequestName(X_PolySegment, 0, CORE "PolySegment");
RegisterRequestName(X_PolyRectangle, 0, CORE "PolyRectangle");
RegisterRequestName(X_PolyArc, 0, CORE "PolyArc");
RegisterRequestName(X_FillPoly, 0, CORE "FillPoly");
RegisterRequestName(X_PolyFillRectangle, 0, CORE "PolyFillRectangle");
RegisterRequestName(X_PolyFillArc, 0, CORE "PolyFillArc");
RegisterRequestName(X_PutImage, 0, CORE "PutImage");
RegisterRequestName(X_GetImage, 0, CORE "GetImage");
RegisterRequestName(X_PolyText8, 0, CORE "PolyText8");
RegisterRequestName(X_PolyText16, 0, CORE "PolyText16");
RegisterRequestName(X_ImageText8, 0, CORE "ImageText8");
RegisterRequestName(X_ImageText16, 0, CORE "ImageText16");
RegisterRequestName(X_CreateColormap, 0, CORE "CreateColormap");
RegisterRequestName(X_FreeColormap, 0, CORE "FreeColormap");
RegisterRequestName(X_CopyColormapAndFree, 0, CORE "CopyColormapAndFree");
RegisterRequestName(X_InstallColormap, 0, CORE "InstallColormap");
RegisterRequestName(X_UninstallColormap, 0, CORE "UninstallColormap");
RegisterRequestName(X_ListInstalledColormaps, 0, CORE "ListInstalledColormaps");
RegisterRequestName(X_AllocColor, 0, CORE "AllocColor");
RegisterRequestName(X_AllocNamedColor, 0, CORE "AllocNamedColor");
RegisterRequestName(X_AllocColorCells, 0, CORE "AllocColorCells");
RegisterRequestName(X_AllocColorPlanes, 0, CORE "AllocColorPlanes");
RegisterRequestName(X_FreeColors, 0, CORE "FreeColors");
RegisterRequestName(X_StoreColors, 0, CORE "StoreColors");
RegisterRequestName(X_StoreNamedColor, 0, CORE "StoreNamedColor");
RegisterRequestName(X_QueryColors, 0, CORE "QueryColors");
RegisterRequestName(X_LookupColor, 0, CORE "LookupColor");
RegisterRequestName(X_CreateCursor, 0, CORE "CreateCursor");
RegisterRequestName(X_CreateGlyphCursor, 0, CORE "CreateGlyphCursor");
RegisterRequestName(X_FreeCursor, 0, CORE "FreeCursor");
RegisterRequestName(X_RecolorCursor, 0, CORE "RecolorCursor");
RegisterRequestName(X_QueryBestSize, 0, CORE "QueryBestSize");
RegisterRequestName(X_QueryExtension, 0, CORE "QueryExtension");
RegisterRequestName(X_ListExtensions, 0, CORE "ListExtensions");
RegisterRequestName(X_ChangeKeyboardMapping, 0, CORE "ChangeKeyboardMapping");
RegisterRequestName(X_GetKeyboardMapping, 0, CORE "GetKeyboardMapping");
RegisterRequestName(X_ChangeKeyboardControl, 0, CORE "ChangeKeyboardControl");
RegisterRequestName(X_GetKeyboardControl, 0, CORE "GetKeyboardControl");
RegisterRequestName(X_Bell, 0, CORE "Bell");
RegisterRequestName(X_ChangePointerControl, 0, CORE "ChangePointerControl");
RegisterRequestName(X_GetPointerControl, 0, CORE "GetPointerControl");
RegisterRequestName(X_SetScreenSaver, 0, CORE "SetScreenSaver");
RegisterRequestName(X_GetScreenSaver, 0, CORE "GetScreenSaver");
RegisterRequestName(X_ChangeHosts, 0, CORE "ChangeHosts");
RegisterRequestName(X_ListHosts, 0, CORE "ListHosts");
RegisterRequestName(X_SetAccessControl, 0, CORE "SetAccessControl");
RegisterRequestName(X_SetCloseDownMode, 0, CORE "SetCloseDownMode");
RegisterRequestName(X_KillClient, 0, CORE "KillClient");
RegisterRequestName(X_RotateProperties, 0, CORE "RotateProperties");
RegisterRequestName(X_ForceScreenSaver, 0, CORE "ForceScreenSaver");
RegisterRequestName(X_SetPointerMapping, 0, CORE "SetPointerMapping");
RegisterRequestName(X_GetPointerMapping, 0, CORE "GetPointerMapping");
RegisterRequestName(X_SetModifierMapping, 0, CORE "SetModifierMapping");
RegisterRequestName(X_GetModifierMapping, 0, CORE "GetModifierMapping");
RegisterRequestName(X_NoOperation, 0, CORE "NoOperation");
RegisterErrorName(Success, CORE "Success");
RegisterErrorName(BadRequest, CORE "BadRequest");
RegisterErrorName(BadValue, CORE "BadValue");
RegisterErrorName(BadWindow, CORE "BadWindow");
RegisterErrorName(BadPixmap, CORE "BadPixmap");
RegisterErrorName(BadAtom, CORE "BadAtom");
RegisterErrorName(BadCursor, CORE "BadCursor");
RegisterErrorName(BadFont, CORE "BadFont");
RegisterErrorName(BadMatch, CORE "BadMatch");
RegisterErrorName(BadDrawable, CORE "BadDrawable");
RegisterErrorName(BadAccess, CORE "BadAccess");
RegisterErrorName(BadAlloc, CORE "BadAlloc");
RegisterErrorName(BadColor, CORE "BadColor");
RegisterErrorName(BadGC, CORE "BadGC");
RegisterErrorName(BadIDChoice, CORE "BadIDChoice");
RegisterErrorName(BadName, CORE "BadName");
RegisterErrorName(BadLength, CORE "BadLength");
RegisterErrorName(BadImplementation, CORE "BadImplementation");
RegisterEventName(X_Error, CORE "Error");
RegisterEventName(X_Reply, CORE "Reply");
RegisterEventName(KeyPress, CORE "KeyPress");
RegisterEventName(KeyRelease, CORE "KeyRelease");
RegisterEventName(ButtonPress, CORE "ButtonPress");
RegisterEventName(ButtonRelease, CORE "ButtonRelease");
RegisterEventName(MotionNotify, CORE "MotionNotify");
RegisterEventName(EnterNotify, CORE "EnterNotify");
RegisterEventName(LeaveNotify, CORE "LeaveNotify");
RegisterEventName(FocusIn, CORE "FocusIn");
RegisterEventName(FocusOut, CORE "FocusOut");
RegisterEventName(KeymapNotify, CORE "KeymapNotify");
RegisterEventName(Expose, CORE "Expose");
RegisterEventName(GraphicsExpose, CORE "GraphicsExpose");
RegisterEventName(NoExpose, CORE "NoExpose");
RegisterEventName(VisibilityNotify, CORE "VisibilityNotify");
RegisterEventName(CreateNotify, CORE "CreateNotify");
RegisterEventName(DestroyNotify, CORE "DestroyNotify");
RegisterEventName(UnmapNotify, CORE "UnmapNotify");
RegisterEventName(MapNotify, CORE "MapNotify");
RegisterEventName(MapRequest, CORE "MapRequest");
RegisterEventName(ReparentNotify, CORE "ReparentNotify");
RegisterEventName(ConfigureNotify, CORE "ConfigureNotify");
RegisterEventName(ConfigureRequest, CORE "ConfigureRequest");
RegisterEventName(GravityNotify, CORE "GravityNotify");
RegisterEventName(ResizeRequest, CORE "ResizeRequest");
RegisterEventName(CirculateNotify, CORE "CirculateNotify");
RegisterEventName(CirculateRequest, CORE "CirculateRequest");
RegisterEventName(PropertyNotify, CORE "PropertyNotify");
RegisterEventName(SelectionClear, CORE "SelectionClear");
RegisterEventName(SelectionRequest, CORE "SelectionRequest");
RegisterEventName(SelectionNotify, CORE "SelectionNotify");
RegisterEventName(ColormapNotify, CORE "ColormapNotify");
RegisterEventName(ClientMessage, CORE "ClientMessage");
RegisterEventName(MappingNotify, CORE "MappingNotify");
}
#endif /* XREGISTRY */