mi: split EQ popping and event processing into two functions.

mieqProcessInputEvents() - pop an event off the EQ and pass it to
mieqProcessDeviceEvent() - process the event according to the MD/SD hierarchy.

This way, we can use mieqPDE() from Xtest, xkb, and others to post an event.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2009-02-10 12:45:49 +10:00
parent 47f136ed6f
commit 36583a4996
3 changed files with 62 additions and 41 deletions

View File

@ -392,10 +392,8 @@ ProcXTestFakeInput(ClientPtr client)
break;
}
OsBlockSignals();
for (i = 0; i < nevents; i++)
mieqEnqueue(dev, (events+i)->event);
OsReleaseSignals();
mieqProcessDeviceEvent(dev, (events+i)->event, NULL);
return client->noClientException;
}

View File

@ -211,6 +211,12 @@ extern _X_EXPORT void mieqSwitchScreen(
Bool /*fromDIX*/
);
extern _X_EXPORT void mieqProcessDeviceEvent(
DeviceIntPtr /* dev*/,
InternalEvent* /* event */,
ScreenPtr /* screen*/
);
extern _X_EXPORT void mieqProcessInputEvents(
void
);

View File

@ -322,14 +322,64 @@ CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev,
FixUpEventForMaster(mdev, sdev, original, mevent);
}
/**
* Post the given @event through the device hierarchy, as appropriate.
* Use this function if an event must be posted for a given device during the
* usual event processing cycle.
*/
void
mieqProcessDeviceEvent(DeviceIntPtr dev,
InternalEvent *event,
ScreenPtr screen)
{
mieqHandler handler;
int x = 0, y = 0;
DeviceIntPtr master;
/* Custom event handler */
handler = miEventQueue.handlers[event->u.any.type];
if (screen && screen != DequeueScreen(dev) && !handler) {
/* Assumption - screen switching can only occur on motion events. */
DequeueScreen(dev) = screen;
x = event->u.device.root_x;
y = event->u.device.root_y;
NewCurrentScreen (dev, DequeueScreen(dev), x, y);
}
else {
master = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
if (master)
CopyGetMasterEvent(master, dev, event, masterEvents);
/* If someone's registered a custom event handler, let them
* steal it. */
if (handler)
{
handler(DequeueScreen(dev)->myNum, event, dev);
if (master)
handler(DequeueScreen(master)->myNum,
(InternalEvent*)masterEvents->event, master);
} else
{
/* process slave first, then master */
dev->public.processInputProc(event, dev);
if (master)
master->public.processInputProc(
(InternalEvent*)masterEvents->event,
master);
}
}
}
/* Call this from ProcessInputEvents(). */
void
mieqProcessInputEvents(void)
{
mieqHandler handler;
EventRec *e = NULL;
int x = 0, y = 0;
int type, evlen, i;
int evlen;
ScreenPtr screen;
static InternalEvent *event = NULL;
static size_t event_size = 0;
@ -362,7 +412,6 @@ mieqProcessInputEvents(void)
pthread_mutex_unlock(&miEventQueueMutex);
#endif
type = event->u.any.type;
master = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
if (screenIsSaved == SCREEN_SAVER_ON)
@ -375,39 +424,7 @@ mieqProcessInputEvents(void)
DPMSSet(serverClient, DPMSModeOn);
#endif
/* Custom event handler */
handler = miEventQueue.handlers[type];
if (screen && screen != DequeueScreen(dev) && !handler) {
/* Assumption - screen switching can only occur on motion events. */
DequeueScreen(dev) = screen;
x = event->u.device.root_x;
y = event->u.device.root_y;
NewCurrentScreen (dev, DequeueScreen(dev), x, y);
}
else {
if (master)
CopyGetMasterEvent(master, dev, event, masterEvents);
/* If someone's registered a custom event handler, let them
* steal it. */
if (handler)
{
handler(DequeueScreen(dev)->myNum, event, dev);
if (master)
handler(DequeueScreen(master)->myNum,
(InternalEvent*)masterEvents->event, master);
} else
{
/* process slave first, then master */
dev->public.processInputProc(event, dev);
if (master)
master->public.processInputProc(
(InternalEvent*)masterEvents->event,
master);
}
}
mieqProcessDeviceEvent(dev, event, screen);
/* Update the sprite now. Next event may be from different device. */
if (event->u.any.type == ET_Motion && (master || dev->isMaster))