dix: moved sprite from static to be pointer of type SpritePtr

added SpriteRecs for MPX devices
	changed sprite dependency and added MPX functionality to parts
	of events.c (ConfineToShape, PostNewCursor, XineramaCheckMotion,
	CheckMotion, XineramaChangeToCursor, ChangeToCursor, CheckPhysLimits,
	PointerConfinedToScreen)
	added DeviceIntRec param to GetSpritePosition(). This required some
	minor changes in ddx, xtest, xkb and xfixes.

mi:	changed miPointer to pointer instead of static struct.
This commit is contained in:
Peter Hutterer 2006-11-21 18:15:04 +10:30 committed by Peter Hutterer
parent fd8b9a6eae
commit 9db851c22d
12 changed files with 658 additions and 501 deletions

View File

@ -34,6 +34,30 @@ Files:
TAG: MPX_BEFORE_DIX_API_BREAK TAG: MPX_BEFORE_DIX_API_BREAK
dix: moved sprite from static to be pointer of type SpritePtr
added SpriteRecs for MPX devices
changed sprite dependency and added MPX functionality to parts
of events.c (ConfineToShape, PostNewCursor, XineramaCheckMotion,
CheckMotion, XineramaChangeToCursor, ChangeToCursor, CheckPhysLimits,
PointerConfinedToScreen)
added DeviceIntRec param to GetSpritePosition(). This required some
minor changes in ddx, xtest, xkb and xfixes.
mi: changed miPointer to pointer instead of static struct.
Files:
dix/events.c
dix/exevents.c
Xext/xtest.c
ddx/ddxFakeBtn.c
ddx/ddxFakeMtn.c
ddx/ddxDevBtn.c
xkb/xkbActions.c
xfixes/cursor.c
mi/mieq.c
== 20.11.06 == == 20.11.06 ==
mi: moved core pointer information from miSpriteScreenRec into a mi: moved core pointer information from miSpriteScreenRec into a

View File

@ -379,7 +379,7 @@ ProcXTestFakeInput(client)
if (ev->u.u.detail == xTrue) if (ev->u.u.detail == xTrue)
{ {
int x, y; int x, y;
GetSpritePosition(&x, &y); GetSpritePosition(inputInfo.pointer, &x, &y);
ev->u.keyButtonPointer.rootX += x; ev->u.keyButtonPointer.rootX += x;
ev->u.keyButtonPointer.rootY += y; ev->u.keyButtonPointer.rootY += y;
} }

View File

@ -119,13 +119,17 @@ ProcessOtherEvent(xEventPtr xE, register DeviceIntPtr other, int count)
deviceValuator *xV = (deviceValuator *) xE; deviceValuator *xV = (deviceValuator *) xE;
if (xE->u.u.type != DeviceValuator) { if (xE->u.u.type != DeviceValuator) {
GetSpritePosition(&rootX, &rootY); GetSpritePosition(other, &rootX, &rootY);
xE->u.keyButtonPointer.rootX = rootX; xE->u.keyButtonPointer.rootX = rootX;
xE->u.keyButtonPointer.rootY = rootY; xE->u.keyButtonPointer.rootY = rootY;
key = xE->u.u.detail; key = xE->u.u.detail;
NoticeEventTime(xE); NoticeEventTime(xE);
xE->u.keyButtonPointer.state = inputInfo.keyboard->key->state | xE->u.keyButtonPointer.state = inputInfo.keyboard->key->state |
#ifdef MPX
other->button->state;
#else
inputInfo.pointer->button->state; inputInfo.pointer->button->state;
#endif
bit = 1 << (key & 7); bit = 1 << (key & 7);
} }
if (DeviceEventCallback) { if (DeviceEventCallback) {

File diff suppressed because it is too large Load Diff

View File

@ -59,6 +59,8 @@ SOFTWARE.
#define ARGB_CURSOR #define ARGB_CURSOR
#endif #endif
struct _DeviceIntRec;
typedef struct _Cursor *CursorPtr; typedef struct _Cursor *CursorPtr;
typedef struct _CursorMetric *CursorMetricPtr; typedef struct _CursorMetric *CursorMetricPtr;
@ -133,9 +135,10 @@ extern void NewCurrentScreen(
int /*x*/, int /*x*/,
int /*y*/); int /*y*/);
extern Bool PointerConfinedToScreen(void); extern Bool PointerConfinedToScreen(struct _DeviceIntRec* /* pDev */);
extern void GetSpritePosition( extern void GetSpritePosition(
struct _DeviceIntRec* /* pDev */,
int * /*px*/, int * /*px*/,
int * /*py*/); int * /*py*/);

View File

@ -239,11 +239,9 @@ mieqProcessInputEvents()
} }
#ifdef MPX #ifdef MPX
/* MPX devices send both core and Xi events. Depending on what /* MPX devices send both core and Xi events.
* event we have, dev is set to either the core pointer or the * Use dev to get the correct processing function but supply
* device. This gives us the right processing function but we need * e->pDev to pass the correct device
* to pass the right device in too.
* Any device that is not a MP device is processed as usual.
*/ */
if (e->pDev->isMPDev) if (e->pDev->isMPDev)
dev->public.processInputProc(e->event, e->pDev, e->nevents); dev->public.processInputProc(e->event, e->pDev, e->nevents);
@ -252,11 +250,7 @@ mieqProcessInputEvents()
dev->public.processInputProc(e->event, dev, e->nevents); dev->public.processInputProc(e->event, dev, e->nevents);
} }
#ifdef MPX #ifdef MPX
/* /* Update the sprite now. Next event may be from different device. */
* This is inefficient as we update the sprite for each event rather
* than at the end of the event queue. But we don't know if the
* next event is from the same device, so it's better to do it here.
*/
if (e->event[0].u.u.type == MotionNotify && if (e->event[0].u.u.type == MotionNotify &&
(e->pDev->isMPDev || e->pDev->coreEvents)) (e->pDev->isMPDev || e->pDev->coreEvents))
{ {

View File

@ -1,5 +1,5 @@
/* /*
* mipointer.c * miPointer->c
*/ */
@ -65,7 +65,7 @@ static unsigned long miPointerGeneration = 0;
* until more than one pointer device exists. * until more than one pointer device exists.
*/ */
static miPointerRec miPointer; static miPointerPtr miPointer;
#ifdef MPX #ifdef MPX
/* Multipointers */ /* Multipointers */
@ -144,19 +144,27 @@ miPointerInitialize (pScreen, spriteFuncs, screenFuncs, waitForUpdate)
/* /*
* set up the pointer object * set up the pointer object
*/ */
miPointer.pScreen = NULL; miPointer = (miPointerPtr)xalloc(sizeof(miPointerRec));
miPointer.pSpriteScreen = NULL; if (!miPointer)
miPointer.pCursor = NULL; {
miPointer.pSpriteCursor = NULL; xfree(pScreenPriv);
miPointer.limits.x1 = 0; return FALSE;
miPointer.limits.x2 = 32767; }
miPointer.limits.y1 = 0; miPointer->pScreen = NULL;
miPointer.limits.y2 = 32767; miPointer->pSpriteScreen = NULL;
miPointer.confined = FALSE; miPointer->pCursor = NULL;
miPointer.x = 0; miPointer->pSpriteCursor = NULL;
miPointer.y = 0; miPointer->limits.x1 = 0;
miPointer->limits.x2 = 32767;
miPointer->limits.y1 = 0;
miPointer->limits.y2 = 32767;
miPointer->confined = FALSE;
miPointer->x = 0;
miPointer->y = 0;
#ifdef MPX #ifdef MPX
xfree(miPointer);
miPointer = &miMPPointers[1];
/* /*
* Set up pointer objects for multipointer devices. * Set up pointer objects for multipointer devices.
*/ */
@ -188,10 +196,10 @@ miPointerCloseScreen (index, pScreen)
int mpPointerIdx = 0; int mpPointerIdx = 0;
SetupScreen(pScreen); SetupScreen(pScreen);
if (pScreen == miPointer.pScreen) if (pScreen == miPointer->pScreen)
miPointer.pScreen = 0; miPointer->pScreen = 0;
if (pScreen == miPointer.pSpriteScreen) if (pScreen == miPointer->pSpriteScreen)
miPointer.pSpriteScreen = 0; miPointer->pSpriteScreen = 0;
#ifdef MPX #ifdef MPX
while(mpPointerIdx < MAX_DEVICES) while(mpPointerIdx < MAX_DEVICES)
{ {
@ -249,8 +257,8 @@ miPointerDisplayCursor (pScreen, pCursor)
} }
#endif #endif
miPointer.pCursor = pCursor; miPointer->pCursor = pCursor;
miPointer.pScreen = pScreen; miPointer->pScreen = pScreen;
miPointerUpdateSprite(inputInfo.pointer); miPointerUpdateSprite(inputInfo.pointer);
return TRUE; return TRUE;
} }
@ -261,14 +269,13 @@ miPointerConstrainCursor (pDev, pScreen, pBox)
ScreenPtr pScreen; ScreenPtr pScreen;
BoxPtr pBox; BoxPtr pBox;
{ {
miPointerPtr pPointer = miPointer;
#ifdef MPX #ifdef MPX
if (IsMPDev(pDev)) if (IsMPDev(pDev))
{ pPointer = &miMPPointers[pDev->id];
miMPPointers[pDev->id].limits = *pBox;
}
#endif #endif
miPointer.limits = *pBox; pPointer->limits = *pBox;
miPointer.confined = PointerConfinedToScreen(); pPointer->confined = PointerConfinedToScreen(pDev);
} }
/*ARGSUSED*/ /*ARGSUSED*/
@ -320,7 +327,7 @@ miPointerWarpCursor (pScreen, x, y)
SetupScreen (pScreen); SetupScreen (pScreen);
if (miPointer.pScreen != pScreen) if (miPointer->pScreen != pScreen)
(*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, TRUE); (*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, TRUE);
if (GenerateEvent) if (GenerateEvent)
@ -331,16 +338,16 @@ miPointerWarpCursor (pScreen, x, y)
{ {
/* everything from miPointerMove except the event and history */ /* everything from miPointerMove except the event and history */
if (!pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen) if (!pScreenPriv->waitForUpdate && pScreen == miPointer->pSpriteScreen)
{ {
miPointer.devx = x; miPointer->devx = x;
miPointer.devy = y; miPointer->devy = y;
if(!miPointer.pCursor->bits->emptyMask) if(!miPointer->pCursor->bits->emptyMask)
(*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
} }
miPointer.x = x; miPointer->x = x;
miPointer.y = y; miPointer->y = y;
miPointer.pScreen = pScreen; miPointer->pScreen = pScreen;
} }
} }
@ -367,7 +374,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
miPointerScreenPtr pScreenPriv; miPointerScreenPtr pScreenPriv;
CursorPtr pCursor; CursorPtr pCursor;
int x, y, devx, devy; int x, y, devx, devy;
miPointerPtr pointer; miPointerPtr pPointer;
#ifdef MPX #ifdef MPX
if (!pDev || if (!pDev ||
@ -379,66 +386,66 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
#ifdef MPX #ifdef MPX
if (IsMPDev(pDev)) if (IsMPDev(pDev))
pointer = &miMPPointers[pDev->id]; pPointer = &miMPPointers[pDev->id];
else else
pointer = &miPointer; pPointer = miPointer;
#endif #endif
pScreen = pointer->pScreen; pScreen = pPointer->pScreen;
if (!pScreen) if (!pScreen)
return; return;
x = pointer->x; x = pPointer->x;
y = pointer->y; y = pPointer->y;
devx = pointer->devx; devx = pPointer->devx;
devy = pointer->devy; devy = pPointer->devy;
pScreenPriv = GetScreenPrivate (pScreen); pScreenPriv = GetScreenPrivate (pScreen);
/* /*
* if the cursor has switched screens, disable the sprite * if the cursor has switched screens, disable the sprite
* on the old screen * on the old screen
*/ */
if (pScreen != pointer->pSpriteScreen) if (pScreen != pPointer->pSpriteScreen)
{ {
if (pointer->pSpriteScreen) if (pPointer->pSpriteScreen)
{ {
miPointerScreenPtr pOldPriv; miPointerScreenPtr pOldPriv;
pOldPriv = GetScreenPrivate (pointer->pSpriteScreen); pOldPriv = GetScreenPrivate (pPointer->pSpriteScreen);
if (pointer->pCursor) if (pPointer->pCursor)
{ {
(*pOldPriv->spriteFuncs->SetCursor) (*pOldPriv->spriteFuncs->SetCursor)
(pDev, pointer->pSpriteScreen, NullCursor, 0, 0); (pDev, pPointer->pSpriteScreen, NullCursor, 0, 0);
} }
(*pOldPriv->screenFuncs->CrossScreen) (pointer->pSpriteScreen, FALSE); (*pOldPriv->screenFuncs->CrossScreen) (pPointer->pSpriteScreen, FALSE);
} }
(*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE); (*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE);
(*pScreenPriv->spriteFuncs->SetCursor) (*pScreenPriv->spriteFuncs->SetCursor)
(pDev, pScreen, pointer->pCursor, x, y); (pDev, pScreen, pPointer->pCursor, x, y);
pointer->devx = x; pPointer->devx = x;
pointer->devy = y; pPointer->devy = y;
pointer->pSpriteCursor = pointer->pCursor; pPointer->pSpriteCursor = pPointer->pCursor;
pointer->pSpriteScreen = pScreen; pPointer->pSpriteScreen = pScreen;
} }
/* /*
* if the cursor has changed, display the new one * if the cursor has changed, display the new one
*/ */
else if (pointer->pCursor != pointer->pSpriteCursor) else if (pPointer->pCursor != pPointer->pSpriteCursor)
{ {
pCursor = pointer->pCursor; pCursor = pPointer->pCursor;
if (pCursor->bits->emptyMask && !pScreenPriv->showTransparent) if (pCursor->bits->emptyMask && !pScreenPriv->showTransparent)
pCursor = NullCursor; pCursor = NullCursor;
(*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y); (*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y);
pointer->devx = x; pPointer->devx = x;
pointer->devy = y; pPointer->devy = y;
pointer->pSpriteCursor = pointer->pCursor; pPointer->pSpriteCursor = pPointer->pCursor;
} }
else if (x != devx || y != devy) else if (x != devx || y != devy)
{ {
pointer->devx = x; pPointer->devx = x;
pointer->devy = y; pPointer->devy = y;
if(!pointer->pCursor->bits->emptyMask) if(!pPointer->pCursor->bits->emptyMask)
(*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
} }
} }
@ -451,7 +458,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
void void
miPointerDeltaCursor (int dx, int dy, unsigned long time) miPointerDeltaCursor (int dx, int dy, unsigned long time)
{ {
int x = miPointer.x + dx, y = miPointer.y + dy; int x = miPointer->x + dx, y = miPointer->y + dy;
miPointerSetPosition(inputInfo.pointer, &x, &y, time); miPointerSetPosition(inputInfo.pointer, &x, &y, time);
} }
@ -480,8 +487,8 @@ miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
} }
#endif #endif
{ {
miPointer.limits.x2 = pScreen->width; miPointer->limits.x2 = pScreen->width;
miPointer.limits.y2 = pScreen->height; miPointer->limits.y2 = pScreen->height;
} }
} }
@ -498,7 +505,7 @@ miPointerGetScreen(DeviceIntPtr pDev)
if (IsMPDev(pDev)) if (IsMPDev(pDev))
return miMPPointers[pDev->id].pScreen; return miMPPointers[pDev->id].pScreen;
#endif #endif
return miPointer.pScreen; return miPointer->pScreen;
} }
/* Move the pointer to x, y on the current screen, update the sprite, and /* Move the pointer to x, y on the current screen, update the sprite, and
@ -517,15 +524,15 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
ScreenPtr pScreen; ScreenPtr pScreen;
ScreenPtr newScreen; ScreenPtr newScreen;
miPointerPtr pointer; miPointerPtr pPointer;
#ifdef MPX #ifdef MPX
if (IsMPDev(pDev)) if (IsMPDev(pDev))
pointer = &(miMPPointers[pDev->id]); pPointer = &(miMPPointers[pDev->id]);
else else
#endif #endif
pointer = &miPointer; pPointer = miPointer;
pScreen = pointer->pScreen; pScreen = pPointer->pScreen;
if (!pScreen) if (!pScreen)
return; /* called before ready */ return; /* called before ready */
@ -540,7 +547,7 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height) if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height)
{ {
pScreenPriv = GetScreenPrivate (pScreen); pScreenPriv = GetScreenPrivate (pScreen);
if (!pointer->confined) if (!pPointer->confined)
{ {
newScreen = pScreen; newScreen = pScreen;
(*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y); (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y);
@ -550,23 +557,24 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
(*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, FALSE); (*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, FALSE);
pScreenPriv = GetScreenPrivate (pScreen); pScreenPriv = GetScreenPrivate (pScreen);
/* Smash the confine to the new screen */ /* Smash the confine to the new screen */
pointer->limits.x2 = pScreen->width; pPointer->limits.x2 = pScreen->width;
pointer->limits.y2 = pScreen->height; pPointer->limits.y2 = pScreen->height;
} }
} }
} }
/* Constrain the sprite to the current limits. */ /* Constrain the sprite to the current limits. */
if (*x < pointer->limits.x1) if (*x < pPointer->limits.x1)
*x = pointer->limits.x1; *x = pPointer->limits.x1;
if (*x >= pointer->limits.x2) if (*x >= pPointer->limits.x2)
*x = pointer->limits.x2 - 1; *x = pPointer->limits.x2 - 1;
if (*y < pointer->limits.y1) if (*y < pPointer->limits.y1)
*y = pointer->limits.y1; *y = pPointer->limits.y1;
if (*y >= pointer->limits.y2) if (*y >= pPointer->limits.y2)
*y = pointer->limits.y2 - 1; *y = pPointer->limits.y2 - 1;
if (pointer->x == *x && pointer->y == *y && pointer->pScreen == pScreen) if (pPointer->x == *x && pPointer->y == *y &&
return; pPointer->pScreen == pScreen)
return;
miPointerMoved(pDev, pScreen, *x, *y, time); miPointerMoved(pDev, pScreen, *x, *y, time);
} }
@ -589,8 +597,8 @@ miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
else else
#endif #endif
{ {
*x = miPointer.x; *x = miPointer->x;
*y = miPointer.y; *y = miPointer->y;
} }
} }
@ -605,30 +613,30 @@ void
miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
unsigned long time) unsigned long time)
{ {
miPointerPtr pointer; miPointerPtr pPointer;
SetupScreen(pScreen); SetupScreen(pScreen);
#ifdef MPX #ifdef MPX
if (IsMPDev(pDev)) if (IsMPDev(pDev))
pointer = &miMPPointers[pDev->id]; pPointer = &miMPPointers[pDev->id];
else else
#endif #endif
pointer = &miPointer; pPointer = miPointer;
if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer
#ifdef MPX #ifdef MPX
|| pDev->isMPDev || pDev->isMPDev
#endif #endif
) && ) &&
!pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen) !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
{ {
pointer->devx = x; pPointer->devx = x;
pointer->devy = y; pPointer->devy = y;
if(!pointer->pCursor->bits->emptyMask) if(!pPointer->pCursor->bits->emptyMask)
(*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
} }
pointer->x = x; pPointer->x = x;
pointer->y = y; pPointer->y = y;
pointer->pScreen = pScreen; pPointer->pScreen = pScreen;
} }

View File

@ -355,7 +355,7 @@ ProcXFixesGetCursorImage (ClientPtr client)
pCursor = CursorCurrent; pCursor = CursorCurrent;
if (!pCursor) if (!pCursor)
return BadCursor; return BadCursor;
GetSpritePosition (&x, &y); GetSpritePosition (inputInfo.pointer, &x, &y);
width = pCursor->bits->width; width = pCursor->bits->width;
height = pCursor->bits->height; height = pCursor->bits->height;
npixels = width * height; npixels = width * height;
@ -503,7 +503,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client)
pCursor = CursorCurrent; pCursor = CursorCurrent;
if (!pCursor) if (!pCursor)
return BadCursor; return BadCursor;
GetSpritePosition (&x, &y); GetSpritePosition (inputInfo.pointer, &x, &y);
width = pCursor->bits->width; width = pCursor->bits->width;
height = pCursor->bits->height; height = pCursor->bits->height;
npixels = width * height; npixels = width * height;

View File

@ -60,7 +60,7 @@ int nAxes, i, count;
if (nAxes > 6) if (nAxes > 6)
nAxes = 6; nAxes = 6;
GetSpritePosition(&x,&y); GetSpritePosition(dev, &x,&y);
btn= (deviceKeyButtonPointer *) &events[0]; btn= (deviceKeyButtonPointer *) &events[0];
val= (deviceValuator *) &events[1]; val= (deviceValuator *) &events[1];
if (press) btn->type= DeviceButtonPress; if (press) btn->type= DeviceButtonPress;

View File

@ -49,7 +49,7 @@ DevicePtr ptr;
if ((ptr = LookupPointerDevice())==NULL) if ((ptr = LookupPointerDevice())==NULL)
return; return;
GetSpritePosition(&x,&y); GetSpritePosition(inputInfo.pointer, &x,&y);
ev.u.u.type = event; ev.u.u.type = event;
ev.u.u.detail = button; ev.u.u.detail = button;
ev.u.keyButtonPointer.time = GetTimeInMillis(); ev.u.keyButtonPointer.time = GetTimeInMillis();

View File

@ -53,7 +53,7 @@ XkbDDXFakePointerMotion(unsigned flags,int x,int y)
int oldX,oldY; int oldX,oldY;
ScreenPtr pScreen, oldScreen; ScreenPtr pScreen, oldScreen;
GetSpritePosition(&oldX, &oldY); GetSpritePosition(inputInfo.pointer, &oldX, &oldY);
pScreen = oldScreen = GetSpriteWindow()->drawable.pScreen; pScreen = oldScreen = GetSpriteWindow()->drawable.pScreen;
#ifdef PANORAMIX #ifdef PANORAMIX

View File

@ -875,7 +875,7 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
if ((filter->keycode!=0)&&(filter->keycode!=keycode)) if ((filter->keycode!=0)&&(filter->keycode!=keycode))
return 1; return 1;
GetSpritePosition(&x,&y); GetSpritePosition(inputInfo.pointer, &x,&y);
ev.u.keyButtonPointer.time = GetTimeInMillis(); ev.u.keyButtonPointer.time = GetTimeInMillis();
ev.u.keyButtonPointer.rootX = x; ev.u.keyButtonPointer.rootX = x;
ev.u.keyButtonPointer.rootY = y; ev.u.keyButtonPointer.rootY = y;