dix: If POINTER_CORE_ONLY is set, GetPointerEvents() only creates a core event

mi:	fix: Create motion event in miPointerMoved
This commit is contained in:
Peter Hutterer 2007-02-05 14:48:48 +10:30 committed by Peter Hutterer
parent a309c936bb
commit 7cd73b00a2
3 changed files with 46 additions and 9 deletions

View File

@ -481,6 +481,9 @@ GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
* events is not NULL-terminated; the return value is the number of events.
* The DDX is responsible for allocating the event structure in the first
* place via GetMaximumEventsNum(), and for freeing it.
*
* If flag has POINTER_CORE_ONLY set, no XI or valuator event will be
* generated.
*/
_X_EXPORT int
GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
@ -494,6 +497,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
DeviceIntPtr pointer = NULL;
int x = 0, y = 0;
Bool coreOnly = (flags & POINTER_CORE_ONLY);
/* Sanity checks. */
if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
@ -502,7 +506,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
if ((type == ButtonPress || type == ButtonRelease) && !pDev->button)
return 0;
if (pDev->coreEvents || pDev->isMPDev)
if (!coreOnly && (pDev->coreEvents || pDev->isMPDev))
num_events = 2;
else
num_events = 1;
@ -512,7 +516,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
}
/* Do we need to send a DeviceValuator event? */
if (sendValuators) {
if (!coreOnly & sendValuators) {
if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
num_valuators = MAX_VALUATOR_EVENTS * 6;
num_events += ((num_valuators - 1) / 6) + 1;
@ -608,16 +612,19 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
kbp->root_x = x;
kbp->root_y = y;
events++;
if (sendValuators) {
kbp->deviceid |= MORE_EVENTS;
clipValuators(pDev, first_valuator, num_valuators, valuators);
events = getValuatorEvents(events, pDev, first_valuator,
num_valuators, valuators);
if (!coreOnly)
{
events++;
if (sendValuators) {
kbp->deviceid |= MORE_EVENTS;
clipValuators(pDev, first_valuator, num_valuators, valuators);
events = getValuatorEvents(events, pDev, first_valuator,
num_valuators, valuators);
}
}
/* MPX devices always send core events */
if (pDev->coreEvents || pDev->isMPDev) {
if (coreOnly || pDev->coreEvents || pDev->isMPDev) {
events->u.u.type = type;
events->u.keyButtonPointer.time = ms;
events->u.keyButtonPointer.rootX = x;

View File

@ -62,6 +62,7 @@ SOFTWARE.
#define POINTER_RELATIVE (1 << 1)
#define POINTER_ABSOLUTE (1 << 2)
#define POINTER_ACCELERATE (1 << 3)
#define POINTER_CORE_ONLY (1 << 4) /* do not generate XI event */
#define MAP_LENGTH 256
#define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */

View File

@ -540,6 +540,10 @@ void
miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
unsigned long time)
{
xEvent* events;
int i, nevents;
int valuators[2];
int flags;
miPointerPtr pPointer = MIPOINTER(pDev);
SetupScreen(pScreen);
@ -556,4 +560,29 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
pPointer->x = x;
pPointer->y = y;
pPointer->pScreen = pScreen;
/* generate event here */
valuators[0] = x;
valuators[1] = y;
events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
if (!events)
{
FatalError("Could not allocate event store.\n");
return;
}
flags = POINTER_ABSOLUTE;
/* If called from ProcWarpCursor, pDev is the VCP and we must not generate
an XI event. */
if (pDev == inputInfo.pointer)
flags |= POINTER_CORE_ONLY;
nevents = GetPointerEvents(events, pDev, MotionNotify, 0,
flags, 0, 2, valuators);
for (i = 0; i < nevents; i++)
mieqEnqueue(pDev, &events[i]);
xfree(events);
}