summaryrefslogtreecommitdiff
path: root/dix
diff options
context:
space:
mode:
authorEamon Walsh <ewalsh@tycho.nsa.gov>2007-10-11 14:17:17 -0400
committerEamon Walsh <ewalsh@moss-charon.epoch.ncsc.mil>2007-10-11 14:18:59 -0400
commit6adeba17301a309be2f34cd51eca84a13d5503fd (patch)
tree432bd4dbbb07a77945380cfcf7b976b0cc202678 /dix
parent8f23d40068151ad85cde239d07031284f0b2c4dc (diff)
dix: Add a new "registry" mechanism for registering string names of things.
Supports protocol requests, events, and errors, and resource names. Modify XRES extension to use it.
Diffstat (limited to 'dix')
-rw-r--r--dix/Makefile.am1
-rw-r--r--dix/main.c2
-rw-r--r--dix/registry.c375
-rw-r--r--dix/resource.c33
4 files changed, 380 insertions, 31 deletions
diff --git a/dix/Makefile.am b/dix/Makefile.am
index 827243a71..65c387c31 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -27,6 +27,7 @@ libdix_la_SOURCES = \
pixmap.c \
privates.c \
property.c \
+ registry.c \
resource.c \
swaprep.c \
swapreq.c \
diff --git a/dix/main.c b/dix/main.c
index 119828bd7..ca0028a39 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -102,6 +102,7 @@ Equipment Corporation.
#include "dixfont.h"
#include "extnsionst.h"
#include "privates.h"
+#include "registry.h"
#ifdef XPRINT
#include "DiPrint.h"
#endif
@@ -354,6 +355,7 @@ main(int argc, char *argv[], char *envp[])
InitGlyphCaching();
if (!dixResetPrivates())
FatalError("couldn't init private data storage");
+ dixResetRegistry();
ResetFontPrivateIndex();
InitCallbackManager();
InitVisualWrap();
diff --git a/dix/registry.c b/dix/registry.c
new file mode 100644
index 000000000..7b521b55d
--- /dev/null
+++ b/dix/registry.c
@@ -0,0 +1,375 @@
+/************************************************************
+
+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
+
+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)
+{
+ 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, "CreateWindow");
+ RegisterRequestName(X_ChangeWindowAttributes, 0, "ChangeWindowAttributes");
+ RegisterRequestName(X_GetWindowAttributes, 0, "GetWindowAttributes");
+ RegisterRequestName(X_DestroyWindow, 0, "DestroyWindow");
+ RegisterRequestName(X_DestroySubwindows, 0, "DestroySubwindows");
+ RegisterRequestName(X_ChangeSaveSet, 0, "ChangeSaveSet");
+ RegisterRequestName(X_ReparentWindow, 0, "ReparentWindow");
+ RegisterRequestName(X_MapWindow, 0, "MapWindow");
+ RegisterRequestName(X_MapSubwindows, 0, "MapSubwindows");
+ RegisterRequestName(X_UnmapWindow, 0, "UnmapWindow");
+ RegisterRequestName(X_UnmapSubwindows, 0, "UnmapSubwindows");
+ RegisterRequestName(X_ConfigureWindow, 0, "ConfigureWindow");
+ RegisterRequestName(X_CirculateWindow, 0, "CirculateWindow");
+ RegisterRequestName(X_GetGeometry, 0, "GetGeometry");
+ RegisterRequestName(X_QueryTree, 0, "QueryTree");
+ RegisterRequestName(X_InternAtom, 0, "InternAtom");
+ RegisterRequestName(X_GetAtomName, 0, "GetAtomName");
+ RegisterRequestName(X_ChangeProperty, 0, "ChangeProperty");
+ RegisterRequestName(X_DeleteProperty, 0, "DeleteProperty");
+ RegisterRequestName(X_GetProperty, 0, "GetProperty");
+ RegisterRequestName(X_ListProperties, 0, "ListProperties");
+ RegisterRequestName(X_SetSelectionOwner, 0, "SetSelectionOwner");
+ RegisterRequestName(X_GetSelectionOwner, 0, "GetSelectionOwner");
+ RegisterRequestName(X_ConvertSelection, 0, "ConvertSelection");
+ RegisterRequestName(X_SendEvent, 0, "SendEvent");
+ RegisterRequestName(X_GrabPointer, 0, "GrabPointer");
+ RegisterRequestName(X_UngrabPointer, 0, "UngrabPointer");
+ RegisterRequestName(X_GrabButton, 0, "GrabButton");
+ RegisterRequestName(X_UngrabButton, 0, "UngrabButton");
+ RegisterRequestName(X_ChangeActivePointerGrab, 0, "ChangeActivePointerGrab");
+ RegisterRequestName(X_GrabKeyboard, 0, "GrabKeyboard");
+ RegisterRequestName(X_UngrabKeyboard, 0, "UngrabKeyboard");
+ RegisterRequestName(X_GrabKey, 0, "GrabKey");
+ RegisterRequestName(X_UngrabKey, 0, "UngrabKey");
+ RegisterRequestName(X_AllowEvents, 0, "AllowEvents");
+ RegisterRequestName(X_GrabServer, 0, "GrabServer");
+ RegisterRequestName(X_UngrabServer, 0, "UngrabServer");
+ RegisterRequestName(X_QueryPointer, 0, "QueryPointer");
+ RegisterRequestName(X_GetMotionEvents, 0, "GetMotionEvents");
+ RegisterRequestName(X_TranslateCoords, 0, "TranslateCoords");
+ RegisterRequestName(X_WarpPointer, 0, "WarpPointer");
+ RegisterRequestName(X_SetInputFocus, 0, "SetInputFocus");
+ RegisterRequestName(X_GetInputFocus, 0, "GetInputFocus");
+ RegisterRequestName(X_QueryKeymap, 0, "QueryKeymap");
+ RegisterRequestName(X_OpenFont, 0, "OpenFont");
+ RegisterRequestName(X_CloseFont, 0, "CloseFont");
+ RegisterRequestName(X_QueryFont, 0, "QueryFont");
+ RegisterRequestName(X_QueryTextExtents, 0, "QueryTextExtents");
+ RegisterRequestName(X_ListFonts, 0, "ListFonts");
+ RegisterRequestName(X_ListFontsWithInfo, 0, "ListFontsWithInfo");
+ RegisterRequestName(X_SetFontPath, 0, "SetFontPath");
+ RegisterRequestName(X_GetFontPath, 0, "GetFontPath");
+ RegisterRequestName(X_CreatePixmap, 0, "CreatePixmap");
+ RegisterRequestName(X_FreePixmap, 0, "FreePixmap");
+ RegisterRequestName(X_CreateGC, 0, "CreateGC");
+ RegisterRequestName(X_ChangeGC, 0, "ChangeGC");
+ RegisterRequestName(X_CopyGC, 0, "CopyGC");
+ RegisterRequestName(X_SetDashes, 0, "SetDashes");
+ RegisterRequestName(X_SetClipRectangles, 0, "SetClipRectangles");
+ RegisterRequestName(X_FreeGC, 0, "FreeGC");
+ RegisterRequestName(X_ClearArea, 0, "ClearArea");
+ RegisterRequestName(X_CopyArea, 0, "CopyArea");
+ RegisterRequestName(X_CopyPlane, 0, "CopyPlane");
+ RegisterRequestName(X_PolyPoint, 0, "PolyPoint");
+ RegisterRequestName(X_PolyLine, 0, "PolyLine");
+ RegisterRequestName(X_PolySegment, 0, "PolySegment");
+ RegisterRequestName(X_PolyRectangle, 0, "PolyRectangle");
+ RegisterRequestName(X_PolyArc, 0, "PolyArc");
+ RegisterRequestName(X_FillPoly, 0, "FillPoly");
+ RegisterRequestName(X_PolyFillRectangle, 0, "PolyFillRectangle");
+ RegisterRequestName(X_PolyFillArc, 0, "PolyFillArc");
+ RegisterRequestName(X_PutImage, 0, "PutImage");
+ RegisterRequestName(X_GetImage, 0, "GetImage");
+ RegisterRequestName(X_PolyText8, 0, "PolyText8");
+ RegisterRequestName(X_PolyText16, 0, "PolyText16");
+ RegisterRequestName(X_ImageText8, 0, "ImageText8");
+ RegisterRequestName(X_ImageText16, 0, "ImageText16");
+ RegisterRequestName(X_CreateColormap, 0, "CreateColormap");
+ RegisterRequestName(X_FreeColormap, 0, "FreeColormap");
+ RegisterRequestName(X_CopyColormapAndFree, 0, "CopyColormapAndFree");
+ RegisterRequestName(X_InstallColormap, 0, "InstallColormap");
+ RegisterRequestName(X_UninstallColormap, 0, "UninstallColormap");
+ RegisterRequestName(X_ListInstalledColormaps, 0, "ListInstalledColormaps");
+ RegisterRequestName(X_AllocColor, 0, "AllocColor");
+ RegisterRequestName(X_AllocNamedColor, 0, "AllocNamedColor");
+ RegisterRequestName(X_AllocColorCells, 0, "AllocColorCells");
+ RegisterRequestName(X_AllocColorPlanes, 0, "AllocColorPlanes");
+ RegisterRequestName(X_FreeColors, 0, "FreeColors");
+ RegisterRequestName(X_StoreColors, 0, "StoreColors");
+ RegisterRequestName(X_StoreNamedColor, 0, "StoreNamedColor");
+ RegisterRequestName(X_QueryColors, 0, "QueryColors");
+ RegisterRequestName(X_LookupColor, 0, "LookupColor");
+ RegisterRequestName(X_CreateCursor, 0, "CreateCursor");
+ RegisterRequestName(X_CreateGlyphCursor, 0, "CreateGlyphCursor");
+ RegisterRequestName(X_FreeCursor, 0, "FreeCursor");
+ RegisterRequestName(X_RecolorCursor, 0, "RecolorCursor");
+ RegisterRequestName(X_QueryBestSize, 0, "QueryBestSize");
+ RegisterRequestName(X_QueryExtension, 0, "QueryExtension");
+ RegisterRequestName(X_ListExtensions, 0, "ListExtensions");
+ RegisterRequestName(X_ChangeKeyboardMapping, 0, "ChangeKeyboardMapping");
+ RegisterRequestName(X_GetKeyboardMapping, 0, "GetKeyboardMapping");
+ RegisterRequestName(X_ChangeKeyboardControl, 0, "ChangeKeyboardControl");
+ RegisterRequestName(X_GetKeyboardControl, 0, "GetKeyboardControl");
+ RegisterRequestName(X_Bell, 0, "Bell");
+ RegisterRequestName(X_ChangePointerControl, 0, "ChangePointerControl");
+ RegisterRequestName(X_GetPointerControl, 0, "GetPointerControl");
+ RegisterRequestName(X_SetScreenSaver, 0, "SetScreenSaver");
+ RegisterRequestName(X_GetScreenSaver, 0, "GetScreenSaver");
+ RegisterRequestName(X_ChangeHosts, 0, "ChangeHosts");
+ RegisterRequestName(X_ListHosts, 0, "ListHosts");
+ RegisterRequestName(X_SetAccessControl, 0, "SetAccessControl");
+ RegisterRequestName(X_SetCloseDownMode, 0, "SetCloseDownMode");
+ RegisterRequestName(X_KillClient, 0, "KillClient");
+ RegisterRequestName(X_RotateProperties, 0, "RotateProperties");
+ RegisterRequestName(X_ForceScreenSaver, 0, "ForceScreenSaver");
+ RegisterRequestName(X_SetPointerMapping, 0, "SetPointerMapping");
+ RegisterRequestName(X_GetPointerMapping, 0, "GetPointerMapping");
+ RegisterRequestName(X_SetModifierMapping, 0, "SetModifierMapping");
+ RegisterRequestName(X_GetModifierMapping, 0, "GetModifierMapping");
+ RegisterRequestName(X_NoOperation, 0, "NoOperation");
+
+ RegisterErrorName(Success, "Success");
+ RegisterErrorName(BadRequest, "BadRequest");
+ RegisterErrorName(BadValue, "BadValue");
+ RegisterErrorName(BadWindow, "BadWindow");
+ RegisterErrorName(BadPixmap, "BadPixmap");
+ RegisterErrorName(BadAtom, "BadAtom");
+ RegisterErrorName(BadCursor, "BadCursor");
+ RegisterErrorName(BadFont, "BadFont");
+ RegisterErrorName(BadMatch, "BadMatch");
+ RegisterErrorName(BadDrawable, "BadDrawable");
+ RegisterErrorName(BadAccess, "BadAccess");
+ RegisterErrorName(BadAlloc, "BadAlloc");
+ RegisterErrorName(BadColor, "BadColor");
+ RegisterErrorName(BadGC, "BadGC");
+ RegisterErrorName(BadIDChoice, "BadIDChoice");
+ RegisterErrorName(BadName, "BadName");
+ RegisterErrorName(BadLength, "BadLength");
+ RegisterErrorName(BadImplementation, "BadImplementation");
+
+ RegisterEventName(X_Error, "Error");
+ RegisterEventName(X_Reply, "Reply");
+ RegisterEventName(KeyPress, "KeyPress");
+ RegisterEventName(KeyRelease, "KeyRelease");
+ RegisterEventName(ButtonPress, "ButtonPress");
+ RegisterEventName(ButtonRelease, "ButtonRelease");
+ RegisterEventName(MotionNotify, "MotionNotify");
+ RegisterEventName(EnterNotify, "EnterNotify");
+ RegisterEventName(LeaveNotify, "LeaveNotify");
+ RegisterEventName(FocusIn, "FocusIn");
+ RegisterEventName(FocusOut, "FocusOut");
+ RegisterEventName(KeymapNotify, "KeymapNotify");
+ RegisterEventName(Expose, "Expose");
+ RegisterEventName(GraphicsExpose, "GraphicsExpose");
+ RegisterEventName(NoExpose, "NoExpose");
+ RegisterEventName(VisibilityNotify, "VisibilityNotify");
+ RegisterEventName(CreateNotify, "CreateNotify");
+ RegisterEventName(DestroyNotify, "DestroyNotify");
+ RegisterEventName(UnmapNotify, "UnmapNotify");
+ RegisterEventName(MapNotify, "MapNotify");
+ RegisterEventName(MapRequest, "MapRequest");
+ RegisterEventName(ReparentNotify, "ReparentNotify");
+ RegisterEventName(ConfigureNotify, "ConfigureNotify");
+ RegisterEventName(ConfigureRequest, "ConfigureRequest");
+ RegisterEventName(GravityNotify, "GravityNotify");
+ RegisterEventName(ResizeRequest, "ResizeRequest");
+ RegisterEventName(CirculateNotify, "CirculateNotify");
+ RegisterEventName(CirculateRequest, "CirculateRequest");
+ RegisterEventName(PropertyNotify, "PropertyNotify");
+ RegisterEventName(SelectionClear, "SelectionClear");
+ RegisterEventName(SelectionRequest, "SelectionRequest");
+ RegisterEventName(SelectionNotify, "SelectionNotify");
+ RegisterEventName(ColormapNotify, "ColormapNotify");
+ RegisterEventName(ClientMessage, "ClientMessage");
+ RegisterEventName(MappingNotify, "MappingNotify");
+}
+
+#endif /* XREGISTRY */
diff --git a/dix/resource.c b/dix/resource.c
index c892cf96b..857776dc5 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -151,10 +151,11 @@ Equipment Corporation.
#ifdef XSERVER_DTRACE
#include <sys/types.h>
+#include "registry.h"
typedef const char *string;
#include "Xserver-dtrace.h"
-#define TypeNameString(t) NameForAtom(ResourceNames[t & TypeMask])
+#define TypeNameString(t) LookupResourceName(t)
#endif
static void RebuildTable(
@@ -202,17 +203,6 @@ CallResourceStateCallback(ResourceState state, ResourceRec *res)
}
}
-#ifdef XResExtension
-
-_X_EXPORT Atom * ResourceNames = NULL;
-
-_X_EXPORT void RegisterResourceName (RESTYPE type, char *name)
-{
- ResourceNames[type & TypeMask] = MakeAtom(name, strlen(name), TRUE);
-}
-
-#endif
-
_X_EXPORT RESTYPE
CreateNewResourceType(DeleteType deleteFunc)
{
@@ -228,17 +218,6 @@ CreateNewResourceType(DeleteType deleteFunc)
if (!dixRegisterPrivateOffset(next, -1))
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;
@@ -291,14 +270,6 @@ InitClientResources(ClientPtr 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));