summaryrefslogtreecommitdiff
path: root/src/InitExt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/InitExt.c')
-rw-r--r--src/InitExt.c473
1 files changed, 473 insertions, 0 deletions
diff --git a/src/InitExt.c b/src/InitExt.c
new file mode 100644
index 0000000..c24d449
--- /dev/null
+++ b/src/InitExt.c
@@ -0,0 +1,473 @@
+/* $Xorg: InitExt.c,v 1.4 2001/02/09 02:03:34 xorgcvs Exp $ */
+/*
+
+Copyright 1987, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and 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 OPEN GROUP 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.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#include <X11/Xlibint.h>
+#include <X11/Xos.h>
+#include <stdio.h>
+
+extern Bool _XUnknownWireEvent();
+extern Status _XUnknownNativeEvent();
+extern Bool _XDefaultWireError();
+
+/*
+ * This routine is used to link a extension in so it will be called
+ * at appropriate times.
+ */
+
+#if NeedFunctionPrototypes
+XExtCodes *XInitExtension (
+ Display *dpy,
+ _Xconst char *name)
+#else
+XExtCodes *XInitExtension (dpy, name)
+ Display *dpy;
+ char *name;
+#endif
+{
+ XExtCodes codes; /* temp. place for extension information. */
+ register _XExtension *ext;/* need a place to build it all */
+ if (!XQueryExtension(dpy, name,
+ &codes.major_opcode, &codes.first_event,
+ &codes.first_error)) return (NULL);
+
+ LockDisplay (dpy);
+ if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension))) ||
+ ! (ext->name = Xmalloc((unsigned) strlen(name) + 1))) {
+ if (ext) Xfree((char *) ext);
+ UnlockDisplay(dpy);
+ return (XExtCodes *) NULL;
+ }
+ codes.extension = dpy->ext_number++;
+ ext->codes = codes;
+ (void) strcpy(ext->name, name);
+
+ /* chain it onto the display list */
+ ext->next = dpy->ext_procs;
+ dpy->ext_procs = ext;
+ UnlockDisplay (dpy);
+
+ return (&ext->codes); /* tell him which extension */
+}
+
+XExtCodes *XAddExtension (dpy)
+ Display *dpy;
+{
+ register _XExtension *ext;
+
+ LockDisplay (dpy);
+ if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension)))) {
+ UnlockDisplay(dpy);
+ return (XExtCodes *) NULL;
+ }
+ ext->codes.extension = dpy->ext_number++;
+
+ /* chain it onto the display list */
+ ext->next = dpy->ext_procs;
+ dpy->ext_procs = ext;
+ UnlockDisplay (dpy);
+
+ return (&ext->codes); /* tell him which extension */
+}
+
+static _XExtension *XLookupExtension (dpy, extension)
+ register Display *dpy; /* display */
+ register int extension; /* extension number */
+{
+ register _XExtension *ext;
+ for (ext = dpy->ext_procs; ext; ext = ext->next)
+ if (ext->codes.extension == extension) return (ext);
+ return (NULL);
+}
+
+XExtData **XEHeadOfExtensionList(object)
+ XEDataObject object;
+{
+ return *(XExtData ***)&object;
+}
+
+XAddToExtensionList(structure, ext_data)
+ XExtData **structure;
+ XExtData *ext_data;
+{
+ ext_data->next = *structure;
+ *structure = ext_data;
+ return 1;
+}
+
+XExtData *XFindOnExtensionList(structure, number)
+ XExtData **structure;
+ int number;
+{
+ XExtData *ext;
+
+ ext = *structure;
+ while (ext && (ext->number != number))
+ ext = ext->next;
+ return ext;
+}
+
+typedef int (*CreateGCType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ GC /* gc */,
+ XExtCodes* /* codes */
+#endif
+);
+
+/*
+ * Routines to hang procs on the extension structure.
+ */
+CreateGCType XESetCreateGC(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ CreateGCType proc; /* routine to call when GC created */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->create_GC;
+ e->create_GC = proc;
+ UnlockDisplay(dpy);
+ return (CreateGCType)oldproc;
+}
+
+typedef int (*CopyGCType)(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ GC /* gc */,
+ XExtCodes* /* codes */
+#endif
+);
+
+CopyGCType XESetCopyGC(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ CopyGCType proc; /* routine to call when GC copied */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->copy_GC;
+ e->copy_GC = proc;
+ UnlockDisplay(dpy);
+ return (CopyGCType)oldproc;
+}
+
+typedef int (*FlushGCType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ GC /* gc */,
+ XExtCodes* /* codes */
+#endif
+);
+
+FlushGCType XESetFlushGC(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ FlushGCType proc; /* routine to call when GC copied */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->flush_GC;
+ e->flush_GC = proc;
+ UnlockDisplay(dpy);
+ return (FlushGCType)oldproc;
+}
+
+typedef int (*FreeGCType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ GC /* gc */,
+ XExtCodes* /* codes */
+#endif
+);
+
+FreeGCType XESetFreeGC(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ FreeGCType proc; /* routine to call when GC freed */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->free_GC;
+ e->free_GC = proc;
+ UnlockDisplay(dpy);
+ return (FreeGCType)oldproc;
+}
+
+typedef int (*CreateFontType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XFontStruct* /* fs */,
+ XExtCodes* /* codes */
+#endif
+);
+
+CreateFontType XESetCreateFont(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ CreateFontType proc; /* routine to call when font created */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->create_Font;
+ e->create_Font = proc;
+ UnlockDisplay(dpy);
+ return (CreateFontType)oldproc;
+}
+
+typedef int (*FreeFontType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XFontStruct* /* fs */,
+ XExtCodes* /* codes */
+#endif
+);
+
+FreeFontType XESetFreeFont(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ FreeFontType proc; /* routine to call when font freed */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->free_Font;
+ e->free_Font = proc;
+ UnlockDisplay(dpy);
+ return (FreeFontType)oldproc;
+}
+
+typedef int (*CloseDisplayType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XExtCodes* /* codes */
+#endif
+);
+
+CloseDisplayType XESetCloseDisplay(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ CloseDisplayType proc; /* routine to call when display closed */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->close_display;
+ e->close_display = proc;
+ UnlockDisplay(dpy);
+ return (CloseDisplayType)oldproc;
+}
+
+typedef Bool (*WireToEventType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XEvent* /* re */,
+ xEvent* /* event */
+#endif
+);
+
+WireToEventType XESetWireToEvent(dpy, event_number, proc)
+ Display *dpy; /* display */
+ WireToEventType proc; /* routine to call when converting event */
+ int event_number; /* event routine to replace */
+{
+ register Bool (*oldproc)();
+ if (proc == NULL) proc = (WireToEventType)_XUnknownWireEvent;
+ LockDisplay (dpy);
+ oldproc = dpy->event_vec[event_number];
+ dpy->event_vec[event_number] = proc;
+ UnlockDisplay (dpy);
+ return (WireToEventType)oldproc;
+}
+
+typedef Status (*EventToWireType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XEvent* /* re */,
+ xEvent* /* event */
+#endif
+);
+
+EventToWireType XESetEventToWire(dpy, event_number, proc)
+ Display *dpy; /* display */
+ EventToWireType proc; /* routine to call when converting event */
+ int event_number; /* event routine to replace */
+{
+ register Status (*oldproc)();
+ if (proc == NULL) proc = (EventToWireType) _XUnknownNativeEvent;
+ LockDisplay (dpy);
+ oldproc = dpy->wire_vec[event_number];
+ dpy->wire_vec[event_number] = proc;
+ UnlockDisplay(dpy);
+ return (EventToWireType)oldproc;
+}
+
+typedef Bool (*WireToErrorType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XErrorEvent* /* he */,
+ xError* /* we */
+#endif
+);
+
+WireToErrorType XESetWireToError(dpy, error_number, proc)
+ Display *dpy; /* display */
+ WireToErrorType proc; /* routine to call when converting error */
+ int error_number; /* error routine to replace */
+{
+ register Bool (*oldproc)();
+ if (proc == NULL) proc = (WireToErrorType)_XDefaultWireError;
+ LockDisplay (dpy);
+ if (!dpy->error_vec) {
+ int i;
+ dpy->error_vec = (Bool (**)())Xmalloc(256 * sizeof(oldproc));
+ for (i = 1; i < 256; i++)
+ dpy->error_vec[i] = _XDefaultWireError;
+ }
+ if (dpy->error_vec) {
+ oldproc = dpy->error_vec[error_number];
+ dpy->error_vec[error_number] = proc;
+ }
+ UnlockDisplay (dpy);
+ return (WireToErrorType)oldproc;
+}
+
+typedef int (*ErrorType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ xError* /* err */,
+ XExtCodes* /* codes */,
+ int* /* ret_code */
+#endif
+);
+
+ErrorType XESetError(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ ErrorType proc; /* routine to call when X error happens */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register int (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->error;
+ e->error = proc;
+ UnlockDisplay(dpy);
+ return (ErrorType)oldproc;
+}
+
+typedef char* (*ErrorStringType) (
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* code */,
+ XExtCodes* /* codes */,
+ char* /* buffer */,
+ int /* nbytes */
+#endif
+);
+
+ErrorStringType XESetErrorString(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ ErrorStringType proc; /* routine to call when I/O error happens */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register char *(*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->error_string;
+ e->error_string = proc;
+ UnlockDisplay(dpy);
+ return (ErrorStringType)oldproc;
+}
+
+typedef void (*PrintErrorType)(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XErrorEvent* /* ev */,
+ void* /* fp */
+#endif
+);
+
+PrintErrorType XESetPrintErrorValues(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ PrintErrorType proc; /* routine to call to print */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register void (*oldproc)();
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->error_values;
+ e->error_values = proc;
+ UnlockDisplay(dpy);
+ return (PrintErrorType)oldproc;
+}
+
+typedef void (*BeforeFlushType)(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XExtCodes* /* codes */,
+ char* /* data */,
+ long /* len */
+#endif
+);
+
+BeforeFlushType XESetBeforeFlush(dpy, extension, proc)
+ Display *dpy; /* display */
+ int extension; /* extension number */
+ BeforeFlushType proc; /* routine to call on flush */
+{
+ register _XExtension *e; /* for lookup of extension */
+ register void (*oldproc)();
+ register _XExtension *ext;
+ if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+ LockDisplay(dpy);
+ oldproc = e->before_flush;
+ e->before_flush = proc;
+ for (ext = dpy->flushes; ext && ext != e; ext = ext->next)
+ ;
+ if (!ext) {
+ e->next_flush = dpy->flushes;
+ dpy->flushes = e;
+ }
+ UnlockDisplay(dpy);
+ return (BeforeFlushType)oldproc;
+}