#include <X11/Xlibint.h>
#include <X11/Xos.h>
#include <stdio.h>
XExtCodes *XInitExtension (
Display *dpy,
_Xconst char *name)
{
XExtCodes codes;
register _XExtension *ext;
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);
ext->next = dpy->ext_procs;
dpy->ext_procs = ext;
UnlockDisplay (dpy);
return (&ext->codes);
}
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++;
ext->next = dpy->ext_procs;
dpy->ext_procs = ext;
UnlockDisplay (dpy);
return (&ext->codes);
}
static _XExtension *XLookupExtension (
register Display *dpy,
register int extension)
{
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;
}
int
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;
}
CreateGCType XESetCreateGC(dpy, extension, proc)
Display *dpy;
int extension;
CreateGCType proc;
{
register _XExtension *e;
register CreateGCType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->create_GC;
e->create_GC = proc;
UnlockDisplay(dpy);
return (CreateGCType)oldproc;
}
CopyGCType XESetCopyGC(dpy, extension, proc)
Display *dpy;
int extension;
CopyGCType proc;
{
register _XExtension *e;
register CopyGCType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->copy_GC;
e->copy_GC = proc;
UnlockDisplay(dpy);
return (CopyGCType)oldproc;
}
FlushGCType XESetFlushGC(dpy, extension, proc)
Display *dpy;
int extension;
FlushGCType proc;
{
register _XExtension *e;
register FlushGCType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->flush_GC;
e->flush_GC = proc;
UnlockDisplay(dpy);
return (FlushGCType)oldproc;
}
FreeGCType XESetFreeGC(dpy, extension, proc)
Display *dpy;
int extension;
FreeGCType proc;
{
register _XExtension *e;
register FreeGCType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->free_GC;
e->free_GC = proc;
UnlockDisplay(dpy);
return (FreeGCType)oldproc;
}
CreateFontType XESetCreateFont(dpy, extension, proc)
Display *dpy;
int extension;
CreateFontType proc;
{
register _XExtension *e;
register CreateFontType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->create_Font;
e->create_Font = proc;
UnlockDisplay(dpy);
return (CreateFontType)oldproc;
}
FreeFontType XESetFreeFont(dpy, extension, proc)
Display *dpy;
int extension;
FreeFontType proc;
{
register _XExtension *e;
register FreeFontType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->free_Font;
e->free_Font = proc;
UnlockDisplay(dpy);
return (FreeFontType)oldproc;
}
CloseDisplayType XESetCloseDisplay(dpy, extension, proc)
Display *dpy;
int extension;
CloseDisplayType proc;
{
register _XExtension *e;
register CloseDisplayType 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) (
Display* ,
XEvent* ,
xEvent*
);
WireToEventType XESetWireToEvent(dpy, event_number, proc)
Display *dpy;
WireToEventType proc;
int event_number;
{
register WireToEventType 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) (
Display* ,
XEvent* ,
xEvent*
);
EventToWireType XESetEventToWire(dpy, event_number, proc)
Display *dpy;
EventToWireType proc;
int event_number;
{
register EventToWireType 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) (
Display* ,
XErrorEvent* ,
xError*
);
WireToErrorType XESetWireToError(dpy, error_number, proc)
Display *dpy;
WireToErrorType proc;
int error_number;
{
register WireToErrorType oldproc = NULL;
if (proc == NULL) proc = (WireToErrorType)_XDefaultWireError;
LockDisplay (dpy);
if (!dpy->error_vec) {
int i;
dpy->error_vec = 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;
}
ErrorType XESetError(dpy, extension, proc)
Display *dpy;
int extension;
ErrorType proc;
{
register _XExtension *e;
register ErrorType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->error;
e->error = proc;
UnlockDisplay(dpy);
return (ErrorType)oldproc;
}
ErrorStringType XESetErrorString(dpy, extension, proc)
Display *dpy;
int extension;
ErrorStringType proc;
{
register _XExtension *e;
register ErrorStringType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->error_string;
e->error_string = proc;
UnlockDisplay(dpy);
return (ErrorStringType)oldproc;
}
PrintErrorType XESetPrintErrorValues(dpy, extension, proc)
Display *dpy;
int extension;
PrintErrorType proc;
{
register _XExtension *e;
register PrintErrorType oldproc;
if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
LockDisplay(dpy);
oldproc = e->error_values;
e->error_values = proc;
UnlockDisplay(dpy);
return (PrintErrorType)oldproc;
}
BeforeFlushType XESetBeforeFlush(dpy, extension, proc)
Display *dpy;
int extension;
BeforeFlushType proc;
{
register _XExtension *e;
register BeforeFlushType 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;
}