mieq: Allow event handlers for arbitrary events to be set
Allow arbitrary events to use mieq by letting custom handlers be set.
This commit is contained in:
parent
b8df961843
commit
80d29475b9
3
mi/mi.h
3
mi/mi.h
|
@ -186,6 +186,9 @@ extern void mieqProcessInputEvents(
|
||||||
void
|
void
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef void (*mieqHandler)(int, xEventPtr, DeviceIntPtr, int);
|
||||||
|
void mieqSetHandler(int event, mieqHandler handler);
|
||||||
|
|
||||||
/* miexpose.c */
|
/* miexpose.c */
|
||||||
|
|
||||||
extern RegionPtr miHandleExposures(
|
extern RegionPtr miHandleExposures(
|
||||||
|
|
24
mi/mieq.c
24
mi/mieq.c
|
@ -74,6 +74,7 @@ typedef struct _EventQueue {
|
||||||
EventRec events[QUEUE_SIZE]; /* static allocation for signals */
|
EventRec events[QUEUE_SIZE]; /* static allocation for signals */
|
||||||
ScreenPtr pEnqueueScreen; /* screen events are being delivered to */
|
ScreenPtr pEnqueueScreen; /* screen events are being delivered to */
|
||||||
ScreenPtr pDequeueScreen; /* screen events are being dispatched to */
|
ScreenPtr pDequeueScreen; /* screen events are being dispatched to */
|
||||||
|
mieqHandler handlers[128]; /* custom event handler */
|
||||||
} EventQueueRec, *EventQueuePtr;
|
} EventQueueRec, *EventQueuePtr;
|
||||||
|
|
||||||
static EventQueueRec miEventQueue;
|
static EventQueueRec miEventQueue;
|
||||||
|
@ -81,11 +82,15 @@ static EventQueueRec miEventQueue;
|
||||||
Bool
|
Bool
|
||||||
mieqInit()
|
mieqInit()
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
miEventQueue.head = miEventQueue.tail = 0;
|
miEventQueue.head = miEventQueue.tail = 0;
|
||||||
miEventQueue.lastEventTime = GetTimeInMillis ();
|
miEventQueue.lastEventTime = GetTimeInMillis ();
|
||||||
miEventQueue.lastMotion = FALSE;
|
miEventQueue.lastMotion = FALSE;
|
||||||
miEventQueue.pEnqueueScreen = screenInfo.screens[0];
|
miEventQueue.pEnqueueScreen = screenInfo.screens[0];
|
||||||
miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
|
miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
|
||||||
|
for (i = 0; i < 128; i++)
|
||||||
|
miEventQueue.handlers[i] = NULL;
|
||||||
SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
|
SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -178,6 +183,16 @@ mieqSwitchScreen(ScreenPtr pScreen, Bool fromDIX)
|
||||||
miEventQueue.pDequeueScreen = pScreen;
|
miEventQueue.pDequeueScreen = pScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mieqSetHandler(int event, mieqHandler handler)
|
||||||
|
{
|
||||||
|
if (handler && miEventQueue.handlers[event])
|
||||||
|
ErrorF("mieq: warning: overriding existing handler %p with %p for "
|
||||||
|
"event %d\n", miEventQueue.handlers[event], handler, event);
|
||||||
|
|
||||||
|
miEventQueue.handlers[event] = handler;
|
||||||
|
}
|
||||||
|
|
||||||
/* Call this from ProcessInputEvents(). */
|
/* Call this from ProcessInputEvents(). */
|
||||||
void
|
void
|
||||||
mieqProcessInputEvents()
|
mieqProcessInputEvents()
|
||||||
|
@ -215,6 +230,15 @@ mieqProcessInputEvents()
|
||||||
else
|
else
|
||||||
++miEventQueue.head;
|
++miEventQueue.head;
|
||||||
|
|
||||||
|
/* If someone's registered a custom event handler, let them
|
||||||
|
* steal it. */
|
||||||
|
if (miEventQueue.handlers[e->event->u.u.type]) {
|
||||||
|
miEventQueue.handlers[e->event->u.u.type](miEventQueue.pDequeueScreen->myNum,
|
||||||
|
e->event, dev,
|
||||||
|
e->nevents);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* If this is a core event, make sure our keymap, et al, is
|
/* If this is a core event, make sure our keymap, et al, is
|
||||||
* changed to suit. */
|
* changed to suit. */
|
||||||
if (e->event[0].u.u.type == KeyPress ||
|
if (e->event[0].u.u.type == KeyPress ||
|
||||||
|
|
Loading…
Reference in New Issue