input: move DeviceChangedEvent conversion into eventconvert.c
The version in eventconvert.c was half broken and for some reason we ended up with a second version in exevents.c (which works). Move it over to where it belongs and call EventToXI2 instad of having a custom function for it. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
33eb6f7081
commit
fe045820f1
123
Xi/exevents.c
123
Xi/exevents.c
|
@ -674,69 +674,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
AppendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info)
|
|
||||||
{
|
|
||||||
uint32_t *kc;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
info->type = KeyClass;
|
|
||||||
info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1;
|
|
||||||
info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
|
|
||||||
info->sourceid = dce->deviceid;
|
|
||||||
|
|
||||||
kc = (uint32_t*)&info[1];
|
|
||||||
for (i = 0; i < info->num_keycodes; i++)
|
|
||||||
*kc++ = i + dce->keys.min_keycode;
|
|
||||||
|
|
||||||
return info->length * 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
AppendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info)
|
|
||||||
{
|
|
||||||
unsigned char *bits;
|
|
||||||
int mask_len;
|
|
||||||
|
|
||||||
mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons));
|
|
||||||
|
|
||||||
info->type = ButtonClass;
|
|
||||||
info->num_buttons = dce->buttons.num_buttons;
|
|
||||||
info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
|
|
||||||
info->num_buttons + mask_len;
|
|
||||||
info->sourceid = dce->deviceid;
|
|
||||||
|
|
||||||
bits = (unsigned char*)&info[1];
|
|
||||||
memset(bits, 0, mask_len * 4);
|
|
||||||
/* FIXME: is_down? */
|
|
||||||
|
|
||||||
bits += mask_len * 4;
|
|
||||||
memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom));
|
|
||||||
|
|
||||||
return info->length * 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
AppendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber)
|
|
||||||
{
|
|
||||||
info->type = ValuatorClass;
|
|
||||||
info->length = sizeof(xXIValuatorInfo)/4;
|
|
||||||
info->label = dce->valuators[axisnumber].name;
|
|
||||||
info->min.integral = dce->valuators[axisnumber].min;
|
|
||||||
info->min.frac = 0;
|
|
||||||
info->max.integral = dce->valuators[axisnumber].max;
|
|
||||||
info->max.frac = 0;
|
|
||||||
/* FIXME: value */
|
|
||||||
info->value.integral = 0;
|
|
||||||
info->value.frac = 0;
|
|
||||||
info->resolution = dce->valuators[axisnumber].resolution;
|
|
||||||
info->number = axisnumber;
|
|
||||||
info->mode = dce->valuators[axisnumber].mode; /* Server doesn't have per-axis mode yet */
|
|
||||||
info->sourceid = dce->deviceid;
|
|
||||||
|
|
||||||
return info->length * 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send an XI2 DeviceChangedEvent to all interested clients.
|
* Send an XI2 DeviceChangedEvent to all interested clients.
|
||||||
*/
|
*/
|
||||||
|
@ -744,69 +681,19 @@ void
|
||||||
XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
|
XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce)
|
||||||
{
|
{
|
||||||
xXIDeviceChangedEvent *dcce;
|
xXIDeviceChangedEvent *dcce;
|
||||||
int len = sizeof(xXIDeviceChangedEvent);
|
int rc;
|
||||||
int nkeys;
|
|
||||||
char *ptr;
|
|
||||||
|
|
||||||
if (dce->buttons.num_buttons)
|
rc = EventToXI2((InternalEvent*)dce, (xEvent**)&dcce);
|
||||||
|
if (rc != Success)
|
||||||
{
|
{
|
||||||
len += sizeof(xXIButtonInfo);
|
ErrorF("[Xi] event conversion from DCE failed with code %d\n", rc);
|
||||||
len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
|
|
||||||
len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
|
|
||||||
}
|
|
||||||
if (dce->num_valuators)
|
|
||||||
len += sizeof(xXIValuatorInfo) * dce->num_valuators;
|
|
||||||
|
|
||||||
nkeys = (dce->keys.max_keycode > 0) ?
|
|
||||||
dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
|
|
||||||
if (nkeys > 0)
|
|
||||||
{
|
|
||||||
len += sizeof(xXIKeyInfo);
|
|
||||||
len += sizeof(CARD32) * nkeys; /* keycodes */
|
|
||||||
}
|
|
||||||
|
|
||||||
dcce = xcalloc(1, len);
|
|
||||||
if (!dcce)
|
|
||||||
{
|
|
||||||
ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dcce->type = GenericEvent;
|
|
||||||
dcce->extension = IReqCode;
|
|
||||||
dcce->evtype = XI_DeviceChanged;
|
|
||||||
dcce->time = GetTimeInMillis();
|
|
||||||
dcce->deviceid = master->id;
|
|
||||||
dcce->sourceid = device->id;
|
|
||||||
dcce->reason = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
|
|
||||||
dcce->num_classes = 0;
|
|
||||||
dcce->length = bytes_to_int32(len - sizeof(xEvent));
|
|
||||||
|
|
||||||
ptr = (char*)&dcce[1];
|
|
||||||
if (dce->buttons.num_buttons)
|
|
||||||
{
|
|
||||||
dcce->num_classes++;
|
|
||||||
ptr += AppendButtonInfo(dce, (xXIButtonInfo*)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nkeys)
|
|
||||||
{
|
|
||||||
dcce->num_classes++;
|
|
||||||
ptr += AppendKeyInfo(dce, (xXIKeyInfo*)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dce->num_valuators)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
dcce->num_classes += dce->num_valuators;
|
|
||||||
for (i = 0; i < dce->num_valuators; i++)
|
|
||||||
ptr += AppendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we don't actually swap if there's a NullClient, swapping is done
|
/* we don't actually swap if there's a NullClient, swapping is done
|
||||||
* later when event is delivered. */
|
* later when event is delivered. */
|
||||||
SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
|
SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1);
|
||||||
|
xfree(dcce);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -340,38 +340,135 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv)
|
||||||
return (num_valuators + 5) / 6;
|
return (num_valuators + 5) / 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **xi)
|
appendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info)
|
||||||
{
|
{
|
||||||
int len = sizeof(xEvent);
|
uint32_t *kc;
|
||||||
DeviceIntPtr slave;
|
int i;
|
||||||
int rc;
|
|
||||||
xXIDeviceChangedEvent *dce;
|
|
||||||
|
|
||||||
rc = dixLookupDevice(&slave, ev->new_slaveid,
|
info->type = KeyClass;
|
||||||
serverClient, DixReadAccess);
|
info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1;
|
||||||
|
info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes;
|
||||||
|
info->sourceid = dce->deviceid;
|
||||||
|
|
||||||
if (rc != Success)
|
kc = (uint32_t*)&info[1];
|
||||||
return rc;
|
for (i = 0; i < info->num_keycodes; i++)
|
||||||
|
*kc++ = i + dce->keys.min_keycode;
|
||||||
|
|
||||||
len += SizeDeviceClasses(slave);
|
return info->length * 4;
|
||||||
|
}
|
||||||
|
|
||||||
*xi = xcalloc(1, len);
|
static int
|
||||||
if (!(*xi))
|
appendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info)
|
||||||
|
{
|
||||||
|
unsigned char *bits;
|
||||||
|
int mask_len;
|
||||||
|
|
||||||
|
mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons));
|
||||||
|
|
||||||
|
info->type = ButtonClass;
|
||||||
|
info->num_buttons = dce->buttons.num_buttons;
|
||||||
|
info->length = bytes_to_int32(sizeof(xXIButtonInfo)) +
|
||||||
|
info->num_buttons + mask_len;
|
||||||
|
info->sourceid = dce->deviceid;
|
||||||
|
|
||||||
|
bits = (unsigned char*)&info[1];
|
||||||
|
memset(bits, 0, mask_len * 4);
|
||||||
|
/* FIXME: is_down? */
|
||||||
|
|
||||||
|
bits += mask_len * 4;
|
||||||
|
memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom));
|
||||||
|
|
||||||
|
return info->length * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber)
|
||||||
|
{
|
||||||
|
info->type = ValuatorClass;
|
||||||
|
info->length = sizeof(xXIValuatorInfo)/4;
|
||||||
|
info->label = dce->valuators[axisnumber].name;
|
||||||
|
info->min.integral = dce->valuators[axisnumber].min;
|
||||||
|
info->min.frac = 0;
|
||||||
|
info->max.integral = dce->valuators[axisnumber].max;
|
||||||
|
info->max.frac = 0;
|
||||||
|
/* FIXME: value */
|
||||||
|
info->value.integral = 0;
|
||||||
|
info->value.frac = 0;
|
||||||
|
info->resolution = dce->valuators[axisnumber].resolution;
|
||||||
|
info->number = axisnumber;
|
||||||
|
info->mode = dce->valuators[axisnumber].mode; /* Server doesn't have per-axis mode yet */
|
||||||
|
info->sourceid = dce->deviceid;
|
||||||
|
|
||||||
|
return info->length * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
|
||||||
|
{
|
||||||
|
xXIDeviceChangedEvent *dcce;
|
||||||
|
int len = sizeof(xXIDeviceChangedEvent);
|
||||||
|
int nkeys;
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
if (dce->buttons.num_buttons)
|
||||||
|
{
|
||||||
|
len += sizeof(xXIButtonInfo);
|
||||||
|
len += dce->buttons.num_buttons * sizeof(Atom); /* button names */
|
||||||
|
len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
|
||||||
|
}
|
||||||
|
if (dce->num_valuators)
|
||||||
|
len += sizeof(xXIValuatorInfo) * dce->num_valuators;
|
||||||
|
|
||||||
|
nkeys = (dce->keys.max_keycode > 0) ?
|
||||||
|
dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
|
||||||
|
if (nkeys > 0)
|
||||||
|
{
|
||||||
|
len += sizeof(xXIKeyInfo);
|
||||||
|
len += sizeof(CARD32) * nkeys; /* keycodes */
|
||||||
|
}
|
||||||
|
|
||||||
|
dcce = xcalloc(1, len);
|
||||||
|
if (!dcce)
|
||||||
|
{
|
||||||
|
ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n");
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
|
}
|
||||||
|
|
||||||
dce = (xXIDeviceChangedEvent*)(*xi);
|
dcce->type = GenericEvent;
|
||||||
dce->type = GenericEvent;
|
dcce->extension = IReqCode;
|
||||||
dce->extension = IReqCode;
|
dcce->evtype = XI_DeviceChanged;
|
||||||
dce->evtype = XI_DeviceChanged;
|
dcce->time = dce->time;
|
||||||
dce->time = GetTimeInMillis();
|
dcce->deviceid = dce->deviceid;
|
||||||
dce->sourceid = slave->id;
|
dcce->sourceid = dce->deviceid;
|
||||||
dce->reason = XISlaveSwitch;
|
dcce->reason = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch;
|
||||||
dce->length = (len - sizeof(xEvent))/4;
|
dcce->num_classes = 0;
|
||||||
|
dcce->length = bytes_to_int32(len - sizeof(xEvent));
|
||||||
|
|
||||||
/* FIXME: this should come from the event, not from the device. See
|
ptr = (char*)&dcce[1];
|
||||||
* CreateClassesChangedEvent */
|
if (dce->buttons.num_buttons)
|
||||||
ListDeviceClasses(slave, (char*)&dce[1], &dce->num_classes);
|
{
|
||||||
|
dcce->num_classes++;
|
||||||
|
ptr += appendButtonInfo(dce, (xXIButtonInfo*)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nkeys)
|
||||||
|
{
|
||||||
|
dcce->num_classes++;
|
||||||
|
ptr += appendKeyInfo(dce, (xXIKeyInfo*)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dce->num_valuators)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
dcce->num_classes += dce->num_valuators;
|
||||||
|
for (i = 0; i < dce->num_valuators; i++)
|
||||||
|
ptr += appendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
*xi = (xEvent*)dcce;
|
||||||
|
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue