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:
parent
a5f439dcd2
commit
5eb985e353
|
@ -39,6 +39,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
|
#include "mi.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "servermd.h"
|
#include "servermd.h"
|
||||||
#include "pixmapstr.h"
|
#include "pixmapstr.h"
|
||||||
|
@ -1738,3 +1739,16 @@ xf86UpdateDesktopDimensions(void)
|
||||||
{
|
{
|
||||||
update_desktop_dimensions();
|
update_desktop_dimensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
xf86AddInputEventDrainCallback(CallbackProcPtr callback, void *param)
|
||||||
|
{
|
||||||
|
mieqAddCallbackOnDrained(callback, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xf86RemoveInputEventDrainCallback(CallbackProcPtr callback, void *param)
|
||||||
|
{
|
||||||
|
mieqRemoveCallbackOnDrained(callback, param);
|
||||||
|
}
|
||||||
|
|
|
@ -199,6 +199,11 @@ xf86VIDrvMsgVerb(InputInfoPtr dev,
|
||||||
MessageType type, int verb, const char *format, va_list args)
|
MessageType type, int verb, const char *format, va_list args)
|
||||||
_X_ATTRIBUTE_PRINTF(4, 0);
|
_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 */
|
/* xf86Option.c */
|
||||||
extern _X_EXPORT void
|
extern _X_EXPORT void
|
||||||
xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts);
|
xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts);
|
||||||
|
|
6
mi/mi.h
6
mi/mi.h
|
@ -205,6 +205,12 @@ extern _X_EXPORT void mieqProcessDeviceEvent(DeviceIntPtr /* dev */ ,
|
||||||
extern _X_EXPORT void mieqProcessInputEvents(void
|
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 */ ,
|
extern DeviceIntPtr CopyGetMasterEvent(DeviceIntPtr /* sdev */ ,
|
||||||
InternalEvent * /* original */ ,
|
InternalEvent * /* original */ ,
|
||||||
InternalEvent * /* copy */
|
InternalEvent * /* copy */
|
||||||
|
|
18
mi/mieq.c
18
mi/mieq.c
|
@ -87,6 +87,8 @@ typedef struct _EventQueue {
|
||||||
|
|
||||||
static EventQueueRec miEventQueue;
|
static EventQueueRec miEventQueue;
|
||||||
|
|
||||||
|
static CallbackListPtr miCallbacksWhenDrained = NULL;
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
mieqNumEnqueued(EventQueuePtr eventQueue)
|
mieqNumEnqueued(EventQueuePtr eventQueue)
|
||||||
{
|
{
|
||||||
|
@ -565,5 +567,21 @@ mieqProcessInputEvents(void)
|
||||||
|
|
||||||
inProcessInputEvents = FALSE;
|
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();
|
input_unlock();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue