Xext: allocate a separate event list for XTest events (#23100)
XTest event processing may be interrupted by a SIGIO. If Xtest uses the same event list as the rest of the server, this list may be overwritten in-flight. X.Org Bug 23100 <http://bugs.freedesktop.org/show_bug.cgi?id=23100> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
8483b08152
commit
e46f02fa2d
17
Xext/xtest.c
17
Xext/xtest.c
|
@ -55,6 +55,11 @@
|
||||||
extern int DeviceValuator;
|
extern int DeviceValuator;
|
||||||
extern int DeviceMotionNotify;
|
extern int DeviceMotionNotify;
|
||||||
|
|
||||||
|
/* XTest events are sent during request processing and may be interruped by
|
||||||
|
* a SIGIO. We need a separate event list to avoid events overwriting each
|
||||||
|
* other's memory */
|
||||||
|
static EventListPtr xtest_evlist;
|
||||||
|
|
||||||
#ifdef PANORAMIX
|
#ifdef PANORAMIX
|
||||||
#include "panoramiX.h"
|
#include "panoramiX.h"
|
||||||
#include "panoramiXsrv.h"
|
#include "panoramiXsrv.h"
|
||||||
|
@ -82,6 +87,8 @@ XTestExtensionInit(INITARGS)
|
||||||
AddExtension(XTestExtensionName, 0, 0,
|
AddExtension(XTestExtensionName, 0, 0,
|
||||||
ProcXTestDispatch, SProcXTestDispatch,
|
ProcXTestDispatch, SProcXTestDispatch,
|
||||||
NULL, StandardMinorOpcode);
|
NULL, StandardMinorOpcode);
|
||||||
|
|
||||||
|
xtest_evlist = InitEventList(GetMaximumEventsNum());
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -155,7 +162,6 @@ ProcXTestFakeInput(ClientPtr client)
|
||||||
int valuators[MAX_VALUATORS] = {0};
|
int valuators[MAX_VALUATORS] = {0};
|
||||||
int numValuators = 0;
|
int numValuators = 0;
|
||||||
int firstValuator = 0;
|
int firstValuator = 0;
|
||||||
EventListPtr events;
|
|
||||||
int nevents = 0;
|
int nevents = 0;
|
||||||
int i;
|
int i;
|
||||||
int base = 0;
|
int base = 0;
|
||||||
|
@ -407,26 +413,25 @@ ProcXTestFakeInput(ClientPtr client)
|
||||||
if (screenIsSaved == SCREEN_SAVER_ON)
|
if (screenIsSaved == SCREEN_SAVER_ON)
|
||||||
dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
|
dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
|
||||||
|
|
||||||
GetEventList(&events);
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
nevents = GetPointerEvents(events, dev, type, 0, flags,
|
nevents = GetPointerEvents(xtest_evlist, dev, type, 0, flags,
|
||||||
firstValuator, numValuators, valuators);
|
firstValuator, numValuators, valuators);
|
||||||
break;
|
break;
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
nevents = GetPointerEvents(events, dev, type, ev->u.u.detail,
|
nevents = GetPointerEvents(xtest_evlist, dev, type, ev->u.u.detail,
|
||||||
flags, firstValuator,
|
flags, firstValuator,
|
||||||
numValuators, valuators);
|
numValuators, valuators);
|
||||||
break;
|
break;
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
case KeyRelease:
|
case KeyRelease:
|
||||||
nevents = GetKeyboardEvents(events, dev, type, ev->u.u.detail);
|
nevents = GetKeyboardEvents(xtest_evlist, dev, type, ev->u.u.detail);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nevents; i++)
|
for (i = 0; i < nevents; i++)
|
||||||
mieqProcessDeviceEvent(dev, (InternalEvent*)(events+i)->event, NULL);
|
mieqProcessDeviceEvent(dev, (InternalEvent*)(xtest_evlist+i)->event, NULL);
|
||||||
|
|
||||||
miPointerUpdateSprite(dev);
|
miPointerUpdateSprite(dev);
|
||||||
return client->noClientException;
|
return client->noClientException;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user