mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-16 00:19:55 +00:00
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:
parent
3d988e01e4
commit
bfb219f532
8 changed files with 155 additions and 181 deletions
|
|
@ -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;
|
||||
|
|
|
|||
53
dix/events.c
53
dix/events.c
|
|
@ -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 &&
|
||||
|
|
|
|||
Loading…
Reference in a new issue