#define NEED_EVENTS
#define NEED_REPLIES
#include <stdio.h>
#include <X11/extensions/xtraplib.h>
#include <X11/extensions/xtraplibp.h>
#include <X11/extensions/Xext.h>
#include <X11/extensions/extutil.h>
#ifndef XETrapNumberErrors
#define XETrapNumberErrors 0
#endif
#ifdef UWS40
#define _XSetLastRequestRead _SetLastRequestRead
#endif
#ifndef vms
extern unsigned long _XSetLastRequestRead(Display *dpy, xGenericReply *rep);
#else
static unsigned long _XSetLastRequestRead(Display *dpy, xGenericReply *rep);
#endif
static XExtensionInfo *xtrap_info = NULL;
static char *xtrap_extension_name = XTrapExtName;
#define XTrapCheckExtension(dpy,i,val) \
XextCheckExtension(dpy, i, xtrap_extension_name, val)
#define XTrapSimpleCheckExtension(dpy,i) \
XextSimpleCheckExtension(dpy, i, xtrap_extension_name)
static XEXT_CLOSE_DISPLAY_PROTO(close_display);
static Bool wire_to_event(Display *dpy, XEvent *event, xEvent *wire_ev);
static Status event_to_wire(Display *dpy, XEvent *event, xEvent *wire_ev);
#ifdef X11R3
static int error_string();
#else
static XEXT_ERROR_STRING_PROTO(error_string);
#endif
static XExtensionHooks xtrap_extension_hooks = {
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
close_display,
wire_to_event,
event_to_wire,
NULL,
error_string
};
static char *xtrap_error_list[] = {
"BadTransport (I/O transport not available)",
"BadMailbox (Cannot connect/disconnect to mailbox)",
"BadIO (I/O error while reading/writing in extension)",
"BadHostname (Cannot locate requested host)",
"BadStatistics (Statistics not configured/available)",
"BadDevices (Devices not properly vectored)",
"BadSocket (Cannot connect to INTERNET socket)",
"BadScreen (Cannot send event to given screen)",
"BadSwapReq (Cannot trap extension requests for swapped client)",
};
static XEXT_GENERATE_FIND_DISPLAY (find_display, xtrap_info,
xtrap_extension_name,
&xtrap_extension_hooks,
XETrapNumberEvents, NULL)
static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xtrap_info)
static XEXT_GENERATE_ERROR_STRING (error_string, xtrap_extension_name,
XETrapNumErrors, xtrap_error_list)
static Bool event_to_wire(Display *dpy, XEvent *libevent, xEvent *netevent)
{
Bool status = False;
XExtDisplayInfo *info = find_display(dpy);
XTrapCheckExtension(dpy,info,False);
#if XETrapNumberErrors > 1
switch((netevent->u.u.type & 0x7f) - info->codes->first_event)
{ case XETrapData:
#endif
{
XETrapDataEvent *ev = (XETrapDataEvent *) libevent;
xETrapDataEvent *event = (xETrapDataEvent *) netevent;
event->type = ev->type;
event->detail = ev->detail;
event->sequenceNumber = (ev->serial & 0xFFFF);
event->idx = ev->idx;
(void)memcpy(event->data,ev->data,sizeof(event->data));
status = True;
}
#if XETrapNumberErrors > 1
}
#endif
return(status);
}
static Bool wire_to_event(Display *dpy, XEvent *libevent, xEvent *netevent)
{
Bool status = False;
XExtDisplayInfo *info = find_display(dpy);
XTrapCheckExtension(dpy,info,False);
#if XETrapNumberErrors > 1
switch((netevent->u.u.type & 0x7f) - info->codes->first_event)
{ case XETrapData:
#endif
{
XETrapDataEvent *ev = (XETrapDataEvent *) libevent;
xETrapDataEvent *event = (xETrapDataEvent *) netevent;
ev->type = event->type & 0x7F;
ev->detail = event->detail;
ev->serial = _XSetLastRequestRead(dpy,(xGenericReply *)netevent);
ev->synthetic = ((event->type & 0x80) != 0);
ev->display = dpy;
ev->idx = event->idx;
(void)memcpy(ev->data,event->data,sizeof(ev->data));
status = True;
}
#if XETrapNumberErrors > 1
}
#endif
return(status);
}
Bool XETrapQueryExtension(Display *dpy,INT32 *event_base_return,
INT32 *error_base_return, INT32 *opcode_return)
{
Bool status = True;
XExtDisplayInfo *info = find_display (dpy);
if (XextHasExtension (info))
{
*event_base_return = (INT32)(info->codes->first_event);
*error_base_return = (INT32)(info->codes->first_error);
*opcode_return = (INT32)(info->codes->major_opcode);
}
else
{
status = False;
}
return(status);
}
#ifdef vms
unsigned long _XSetLastRequestRead(Display *dpy, xGenericReply *rep)
{
register unsigned long newseq, lastseq;
if ((rep->type & 0x7f) == KeymapNotify)
return(dpy->last_request_read);
newseq = (dpy->last_request_read & ~((unsigned long)0xffff)) |
rep->sequenceNumber;
lastseq = dpy->last_request_read;
while (newseq < lastseq) {
newseq += 0x10000;
if (newseq > dpy->request) {
(void) fprintf (stderr,
"Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n",
newseq, dpy->request,
(unsigned int) rep->type);
newseq -= 0x10000;
break;
}
}
dpy->last_request_read = newseq;
return(newseq);
}
#endif