#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#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 (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(XEDataObject object)
{
return *(XExtData ***)&object;
}
int
XAddToExtensionList(
XExtData **structure,
XExtData *ext_data)
{
ext_data->next = *structure;
*structure = ext_data;
return 1;
}
XExtData *XFindOnExtensionList(
XExtData **structure,
int number)
{
XExtData *ext;
ext = *structure;
while (ext && (ext->number != number))
ext = ext->next;
return ext;
}
CreateGCType XESetCreateGC(
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(
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(
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(
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(
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(
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(
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(
Display *dpy,
int event_number,
WireToEventType proc)
{
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(
Display *dpy,
int event_number,
EventToWireType proc)
{
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(
Display *dpy,
int error_number,
WireToErrorType proc)
{
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(
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(
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(
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(
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;
}