mi: Add a callback to notify driver about input event submission

This is useful for mock input drivers that control the server in
integration tests. Given that input submission happens on a different
thread than processing, it's otherwise impossible for the driver to
synchronize with the completion of the processing of submitted events.

Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
This commit is contained in:
Povilas Kanapickas 2020-09-17 00:55:17 +03:00 committed by Adam Jackson
parent a5f439dcd2
commit 5eb985e353
4 changed files with 43 additions and 0 deletions

View File

@ -39,6 +39,7 @@
#endif
#include <X11/X.h>
#include "mi.h"
#include "os.h"
#include "servermd.h"
#include "pixmapstr.h"
@ -1738,3 +1739,16 @@ xf86UpdateDesktopDimensions(void)
{
update_desktop_dimensions();
}
void
xf86AddInputEventDrainCallback(CallbackProcPtr callback, void *param)
{
mieqAddCallbackOnDrained(callback, param);
}
void
xf86RemoveInputEventDrainCallback(CallbackProcPtr callback, void *param)
{
mieqRemoveCallbackOnDrained(callback, param);
}

View File

@ -199,6 +199,11 @@ xf86VIDrvMsgVerb(InputInfoPtr dev,
MessageType type, int verb, const char *format, va_list args)
_X_ATTRIBUTE_PRINTF(4, 0);
extern _X_EXPORT void xf86AddInputEventDrainCallback(CallbackProcPtr callback,
void *param);
extern _X_EXPORT void xf86RemoveInputEventDrainCallback(CallbackProcPtr callback,
void *param);
/* xf86Option.c */
extern _X_EXPORT void
xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts);

View File

@ -205,6 +205,12 @@ extern _X_EXPORT void mieqProcessDeviceEvent(DeviceIntPtr /* dev */ ,
extern _X_EXPORT void mieqProcessInputEvents(void
);
extern _X_EXPORT void mieqAddCallbackOnDrained(CallbackProcPtr callback,
void *param);
extern _X_EXPORT void mieqRemoveCallbackOnDrained(CallbackProcPtr callback,
void *param);
extern DeviceIntPtr CopyGetMasterEvent(DeviceIntPtr /* sdev */ ,
InternalEvent * /* original */ ,
InternalEvent * /* copy */

View File

@ -87,6 +87,8 @@ typedef struct _EventQueue {
static EventQueueRec miEventQueue;
static CallbackListPtr miCallbacksWhenDrained = NULL;
static size_t
mieqNumEnqueued(EventQueuePtr eventQueue)
{
@ -565,5 +567,21 @@ mieqProcessInputEvents(void)
inProcessInputEvents = FALSE;
CallCallbacks(&miCallbacksWhenDrained, NULL);
input_unlock();
}
void mieqAddCallbackOnDrained(CallbackProcPtr callback, void *param)
{
input_lock();
AddCallback(&miCallbacksWhenDrained, callback, param);
input_unlock();
}
void mieqRemoveCallbackOnDrained(CallbackProcPtr callback, void *param)
{
input_lock();
DeleteCallback(&miCallbacksWhenDrained, callback, param);
input_unlock();
}