input: allow for detectable autorepeat.

For core and XI1 events, store the key_repeat flag in the sequence number
until TryClientEvents. The sequenceNumber is unset until TryClientEvents.

[Also thrown in, some random indentation changes. Thanks]

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Daniel Stone 2009-08-21 16:03:36 +10:00 • committed by Peter Hutterer
commit bfb219f532
8 changed files with 155 additions and 181 deletions

View file

@ -90,6 +90,8 @@ EventToCore(InternalEvent *event, xEvent *core)
core->u.keyButtonPointer.rootX = e->root_x;
core->u.keyButtonPointer.rootY = e->root_y;
core->u.keyButtonPointer.state = e->corestate;
if (e->type == ET_KeyPress && e->key_repeat)
core->u.u.sequenceNumber = 1;
}
break;
case ET_ProximityIn:
@ -237,6 +239,8 @@ eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count)
kbp->root_y = ev->root_y;
kbp->deviceid = ev->deviceid;
kbp->state = ev->corestate;
if (ev->type == ET_KeyPress && ev->key_repeat)
kbp->sequenceNumber = 1;
if (num_events > 1)
kbp->deviceid |= MORE_EVENTS;
@ -528,6 +532,9 @@ eventToDeviceEvent(DeviceEvent *ev, xEvent **xi)
xde->root_x = FP1616(ev->root_x, ev->root_x_frac);
xde->root_y = FP1616(ev->root_y, ev->root_y_frac);
if (ev->key_repeat)
xde->flags |= XIKeyRepeat;
xde->mods.base_mods = ev->mods.base;
xde->mods.latched_mods = ev->mods.latched;
xde->mods.locked_mods = ev->mods.locked;

View file

@ -1941,12 +1941,53 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
pEvents->u.u.detail = NotifyNormal;
}
}
else
else if (type == DeviceMotionNotify)
{
if ((type == DeviceMotionNotify) &&
MaybeSendDeviceMotionNotifyHint
((deviceKeyButtonPointer*)pEvents, mask) != 0)
if (MaybeSendDeviceMotionNotifyHint((deviceKeyButtonPointer*)pEvents,
mask) != 0)
return 1;
} else if (type == KeyPress)
{
/* sequenceNumber == 1 if autorepeat is set */
if (pEvents->u.u.sequenceNumber)
{
if (!_XkbWantsDetectableAutoRepeat(client))
{
xEvent release = *pEvents;
release.u.u.type = KeyRelease;
release.u.u.sequenceNumber = client->sequence;
WriteEventsToClient(client, 1, &release);
#ifdef DEBUG_EVENTS
ErrorF(" (plus fake core release for repeat)");
#endif
} else
{
#ifdef DEBUG_EVENTS
ErrorF(" (detectable autorepeat for core)");
#endif
}
}
} else if (type == DeviceKeyPress)
{
if (((deviceKeyButtonPointer *)pEvents)->sequenceNumber)
{
if (!_XkbWantsDetectableAutoRepeat(client))
{
deviceKeyButtonPointer release = *(deviceKeyButtonPointer *)pEvents;
release.type = DeviceKeyRelease;
release.sequenceNumber = client->sequence;
#ifdef DEBUG_EVENTS
ErrorF(" (plus fake xi1 release for repeat)");
#endif
WriteEventsToClient(client, 1, (xEvent *) &release);
}
else {
#ifdef DEBUG_EVENTS
ErrorF(" (detectable autorepeat for core)");
#endif
}
}
}
type &= 0177;
@ -5622,8 +5663,8 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
int i,
eventlength = sizeof(xEvent);
if (!XkbFilterEvents(pClient, count, events))
return;
/* Let XKB rewrite the state, as it depends on client preferences. */
XkbFilterEvents(pClient, count, events);
#ifdef PANORAMIX
if(!noPanoramiXExtension &&