dix: hide the sequenceNumber key repeat hack behind two functions.

Just in case we figure out a better way to do it in the future.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2009-08-21 16:38:53 +10:00
parent bfb219f532
commit 219ae5b628
2 changed files with 37 additions and 7 deletions

View File

@ -55,6 +55,35 @@ static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
static int eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **dcce);
static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
/* Do not use, read comments below */
BOOL EventIsKeyRepeat(xEvent *event);
/**
* Hack to allow detectable autorepeat for core and XI1 events.
* The sequence number is unused until we send to the client and can be
* misused to store data. More or less, anyway.
*
* Do not use this. It may change any time without warning, eat your babies
* and piss on your cat.
*/
static void
EventSetKeyRepeatFlag(xEvent *event, BOOL on)
{
event->u.u.sequenceNumber = on;
}
/**
* Check if the event was marked as a repeat event before.
* NOTE: This is a nasty hack and should NOT be used by anyone else but
* TryClientEvents.
*/
BOOL
EventIsKeyRepeat(xEvent *event)
{
return !!event->u.u.sequenceNumber;
}
/**
* Convert the given event to the respective core event.
*
@ -90,8 +119,7 @@ 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;
EventSetKeyRepeatFlag(core, (e->type == ET_KeyPress && e->key_repeat));
}
break;
case ET_ProximityIn:
@ -239,8 +267,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;
EventSetKeyRepeatFlag((xEvent*)kbp,
(ev->type == ET_KeyPress && ev->key_repeat));
if (num_events > 1)
kbp->deviceid |= MORE_EVENTS;

View File

@ -226,6 +226,9 @@ static Bool CheckPassiveGrabsOnWindow(WindowPtr pWin,
DeviceEvent *event,
BOOL checkCore);
/** Key repeat hack. Do not use but in TryClientEvents */
extern BOOL EventIsKeyRepeat(xEvent *event);
/**
* Main input device struct.
* inputInfo.pointer
@ -1948,8 +1951,7 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
return 1;
} else if (type == KeyPress)
{
/* sequenceNumber == 1 if autorepeat is set */
if (pEvents->u.u.sequenceNumber)
if (EventIsKeyRepeat(pEvents))
{
if (!_XkbWantsDetectableAutoRepeat(client))
{
@ -1970,7 +1972,7 @@ TryClientEvents (ClientPtr client, DeviceIntPtr dev, xEvent *pEvents,
} else if (type == DeviceKeyPress)
{
if (((deviceKeyButtonPointer *)pEvents)->sequenceNumber)
if (EventIsKeyRepeat(pEvents))
{
if (!_XkbWantsDetectableAutoRepeat(client))
{