#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h>
#include <X11/Xlibint.h>
#include <X11/extensions/XInput.h>
#include <X11/extensions/extutil.h>
#include "XIint.h"
int
XChangeFeedbackControl (dpy, dev, mask, f)
register Display *dpy;
XDevice *dev;
unsigned long mask;
XFeedbackControl *f;
{
int length;
xChangeFeedbackControlReq *req;
XExtDisplayInfo *info = XInput_find_display (dpy);
LockDisplay (dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
return (NoSuchExtension);
GetReq(ChangeFeedbackControl,req);
req->reqType = info->codes->major_opcode;
req->ReqType = X_ChangeFeedbackControl;
req->deviceid = dev->device_id;
req->mask = mask;
req->feedbackid = f->class;
if (f->class == KbdFeedbackClass)
{
XKbdFeedbackControl *K;
xKbdFeedbackCtl k;
K = (XKbdFeedbackControl *) f;
k.class = KbdFeedbackClass;
k.length = sizeof (xKbdFeedbackCtl);
k.id = K->id;
k.click = K->click;
k.percent = K->percent;
k.pitch = K->pitch;
k.duration = K->duration;
k.led_mask = K->led_mask;
k.led_values = K->led_value;
k.key = K->key;
k.auto_repeat_mode = K->auto_repeat_mode;
length = ((unsigned)(k.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &k, length);
}
else if (f->class == PtrFeedbackClass)
{
XPtrFeedbackControl *P;
xPtrFeedbackCtl p;
P = (XPtrFeedbackControl *) f;
p.class = PtrFeedbackClass;
p.length = sizeof (xPtrFeedbackCtl);
p.id = P->id;
p.num = P->accelNum;
p.denom = P->accelDenom;
p.thresh = P->threshold;
length = ((unsigned)(p.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &p, length);
}
else if (f->class == IntegerFeedbackClass)
{
XIntegerFeedbackControl *I;
xIntegerFeedbackCtl i;
I = (XIntegerFeedbackControl *) f;
i.class = IntegerFeedbackClass;
i.length = sizeof (xIntegerFeedbackCtl);
i.id = I->id;
i.int_to_display = I->int_to_display;
length = ((unsigned)(i.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &i, length);
}
else if (f->class == StringFeedbackClass)
{
XStringFeedbackControl *S;
xStringFeedbackCtl s;
S = (XStringFeedbackControl *) f;
s.class = StringFeedbackClass;
s.length = sizeof (xStringFeedbackCtl) +
(S->num_keysyms * sizeof (KeySym));
s.id = S->id;
s.num_keysyms = S->num_keysyms;
req->length += ((unsigned)(s.length + 3) >> 2);
length = sizeof (xStringFeedbackCtl);
Data (dpy, (char *) &s, length);
length = (s.num_keysyms * sizeof (KeySym));
Data (dpy, (char *) S->syms_to_display, length);
}
else if (f->class == BellFeedbackClass)
{
XBellFeedbackControl *B;
xBellFeedbackCtl b;
B = (XBellFeedbackControl *) f;
b.class = BellFeedbackClass;
b.length = sizeof (xBellFeedbackCtl);
b.id = B->id;
b.percent = B->percent;
b.pitch = B->pitch;
b.duration = B->duration;
length = ((unsigned)(b.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &b, length);
}
else if (f->class == LedFeedbackClass)
{
XLedFeedbackControl *L;
xLedFeedbackCtl l;
L = (XLedFeedbackControl *) f;
l.class = LedFeedbackClass;
l.length = sizeof (xLedFeedbackCtl);
l.id = L->id;
l.led_mask = L->led_mask;
l.led_values = L->led_values;
length = ((unsigned)(l.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &l, length);
}
else
{
xFeedbackCtl u;
u.class = f->class;
u.length = f->length - sizeof (int);
u.id = f->id;
length = ((unsigned)(u.length + 3) >> 2);
req->length += length;
length <<= 2;
Data (dpy, (char *) &u, length);
}
UnlockDisplay(dpy);
SyncHandle();
return (Success);
}