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:
parent
47f136ed6f
commit
36583a4996
|
@ -392,10 +392,8 @@ ProcXTestFakeInput(ClientPtr client)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
OsBlockSignals();
|
|
||||||
for (i = 0; i < nevents; i++)
|
for (i = 0; i < nevents; i++)
|
||||||
mieqEnqueue(dev, (events+i)->event);
|
mieqProcessDeviceEvent(dev, (events+i)->event, NULL);
|
||||||
OsReleaseSignals();
|
|
||||||
|
|
||||||
return client->noClientException;
|
return client->noClientException;
|
||||||
}
|
}
|
||||||
|
|
6
mi/mi.h
6
mi/mi.h
|
@ -211,6 +211,12 @@ extern _X_EXPORT void mieqSwitchScreen(
|
||||||
Bool /*fromDIX*/
|
Bool /*fromDIX*/
|
||||||
);
|
);
|
||||||
|
|
||||||
|
extern _X_EXPORT void mieqProcessDeviceEvent(
|
||||||
|
DeviceIntPtr /* dev*/,
|
||||||
|
InternalEvent* /* event */,
|
||||||
|
ScreenPtr /* screen*/
|
||||||
|
);
|
||||||
|
|
||||||
extern _X_EXPORT void mieqProcessInputEvents(
|
extern _X_EXPORT void mieqProcessInputEvents(
|
||||||
void
|
void
|
||||||
);
|
);
|
||||||
|
|
93
mi/mieq.c
93
mi/mieq.c
|
@ -322,14 +322,64 @@ CopyGetMasterEvent(DeviceIntPtr mdev, DeviceIntPtr sdev,
|
||||||
FixUpEventForMaster(mdev, sdev, original, mevent);
|
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(). */
|
/* Call this from ProcessInputEvents(). */
|
||||||
void
|
void
|
||||||
mieqProcessInputEvents(void)
|
mieqProcessInputEvents(void)
|
||||||
{
|
{
|
||||||
mieqHandler handler;
|
|
||||||
EventRec *e = NULL;
|
EventRec *e = NULL;
|
||||||
int x = 0, y = 0;
|
int evlen;
|
||||||
int type, evlen, i;
|
|
||||||
ScreenPtr screen;
|
ScreenPtr screen;
|
||||||
static InternalEvent *event = NULL;
|
static InternalEvent *event = NULL;
|
||||||
static size_t event_size = 0;
|
static size_t event_size = 0;
|
||||||
|
@ -361,8 +411,7 @@ mieqProcessInputEvents(void)
|
||||||
#ifdef XQUARTZ
|
#ifdef XQUARTZ
|
||||||
pthread_mutex_unlock(&miEventQueueMutex);
|
pthread_mutex_unlock(&miEventQueueMutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
type = event->u.any.type;
|
|
||||||
master = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
|
master = (!dev->isMaster && dev->u.master) ? dev->u.master : NULL;
|
||||||
|
|
||||||
if (screenIsSaved == SCREEN_SAVER_ON)
|
if (screenIsSaved == SCREEN_SAVER_ON)
|
||||||
|
@ -375,39 +424,7 @@ mieqProcessInputEvents(void)
|
||||||
DPMSSet(serverClient, DPMSModeOn);
|
DPMSSet(serverClient, DPMSModeOn);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Custom event handler */
|
mieqProcessDeviceEvent(dev, event, screen);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the sprite now. Next event may be from different device. */
|
/* Update the sprite now. Next event may be from different device. */
|
||||||
if (event->u.any.type == ET_Motion && (master || dev->isMaster))
|
if (event->u.any.type == ET_Motion && (master || dev->isMaster))
|
||||||
|
|
Loading…
Reference in New Issue