#define NEED_REPLIES
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/Xlibint.h>
#include <X11/Xos.h>
Bool
_XAsyncErrorHandler(
register Display *dpy,
register xReply *rep,
char *buf,
int len,
XPointer data)
{
register _XAsyncErrorState *state;
state = (_XAsyncErrorState *)data;
if (rep->generic.type == X_Error &&
(!state->error_code ||
rep->error.errorCode == state->error_code) &&
(!state->major_opcode ||
rep->error.majorCode == state->major_opcode) &&
(!state->minor_opcode ||
rep->error.minorCode == state->minor_opcode) &&
(!state->min_sequence_number ||
(state->min_sequence_number <= dpy->last_request_read)) &&
(!state->max_sequence_number ||
(state->max_sequence_number >= dpy->last_request_read))) {
state->last_error_received = rep->error.errorCode;
state->error_count++;
return True;
}
return False;
}
void _XDeqAsyncHandler(
Display *dpy,
register _XAsyncHandler *handler)
{
register _XAsyncHandler **prev;
register _XAsyncHandler *async;
for (prev = &dpy->async_handlers;
(async = *prev) && (async != handler);
prev = &async->next)
;
if (async)
*prev = async->next;
}
char *
_XGetAsyncReply(
register Display *dpy,
register char *replbuf,
register xReply *rep,
char *buf,
int len,
int extra,
Bool discard)
{
if (extra == 0) {
if (discard && (rep->generic.length << 2) > len)
_XEatData (dpy, (rep->generic.length << 2) - len);
return (char *)rep;
}
if (extra <= rep->generic.length) {
int size = SIZEOF(xReply) + (extra << 2);
if (size > len) {
memcpy(replbuf, buf, len);
_XRead(dpy, replbuf + len, size - len);
buf = replbuf;
len = size;
#ifdef MUSTCOPY
} else {
memcpy(replbuf, buf, size);
buf = replbuf;
#endif
}
if (discard && rep->generic.length > extra &&
(rep->generic.length << 2) > len)
_XEatData (dpy, (rep->generic.length << 2) - len);
return buf;
}
if ((rep->generic.length << 2) > len)
_XEatData (dpy, (rep->generic.length << 2) - len);
_XIOError (dpy);
return (char *)rep;
}
void
_XGetAsyncData(
Display *dpy,
char *data,
char *buf,
int len,
int skip,
int datalen,
int discardtotal)
{
buf += skip;
len -= skip;
if (!data) {
if (datalen > len)
_XEatData(dpy, datalen - len);
} else if (datalen <= len) {
memcpy(data, buf, datalen);
} else {
memcpy(data, buf, len);
_XRead(dpy, data + len, datalen - len);
}
if (discardtotal > len) {
if (datalen > len)
len = datalen;
_XEatData(dpy, discardtotal - len);
}
}