#include <X11/Xlib.h>
#include "Xlibint.h"
#include "Xutil.h"
#include "Xlcint.h"
#include "Ximint.h"
extern Bool _XimRegisterDispatcher();
Public Bool
#if NeedFunctionPrototypes
_XimRegProtoIntrCallback(
Xim im,
CARD16 major_code,
CARD16 minor_code,
Bool (*proc)(
#if NeedNestedPrototypes
Xim, INT16, XPointer, XPointer
#endif
),
XPointer call_data)
#else
_XimRegProtoIntrCallback(im, major_code, minor_code, proc, call_data)
Xim im;
CARD16 major_code;
CARD16 minor_code;
Bool (*proc)();
XPointer call_data;
#endif
{
XimProtoIntrRec *rec;
if (!(rec = (XimProtoIntrRec *)Xmalloc(sizeof(XimProtoIntrRec))))
return False;
rec->func = proc;
rec->major_code = major_code;
rec->minor_code = minor_code;
rec->call_data = call_data;
rec->next = im->private.proto.intrproto;
im->private.proto.intrproto = rec;
return True;
}
Public void
_XimFreeProtoIntrCallback(im)
Xim im;
{
register XimProtoIntrRec *rec, *next;
for (rec = im->private.proto.intrproto; rec;) {
next = rec->next;
Xfree(rec);
rec = next;
}
im->private.proto.intrproto = NULL;
return;
}
Private Bool
#if NeedFunctionPrototypes
_XimTransportIntr(
Xim im,
INT16 len,
XPointer data,
XPointer call_data)
#else
_XimTransportIntr(im, len, data, call_data)
Xim im;
INT16 len;
XPointer data;
XPointer call_data;
#endif
{
Xim call_im = (Xim)call_data;
XimProtoIntrRec *rec = call_im->private.proto.intrproto;
CARD8 major_opcode = *((CARD8 *)data);
CARD8 minor_opcode = *((CARD8 *)data + 1);
for (; rec; rec = rec->next) {
if ((major_opcode == (CARD8)rec->major_code)
&& (minor_opcode == (CARD8)rec->minor_code))
if ((*rec->func)(call_im, len, data, rec->call_data))
return True;
}
return False;
}
Public Bool
_XimDispatchInit(im)
Xim im;
{
if (_XimRegisterDispatcher(im, _XimTransportIntr, (XPointer)im))
return True;
return False;
}