Enable event delivery for multiple heads.
Requires moving the spriteTrace into the DeviceIntRec and adjusting a few functions to take in device argument, most notably XYToWindow(). Cursor rendering on the second screen is busted.
This commit is contained in:
parent
d61ed6c8a2
commit
82f97e1c0c
|
@ -102,7 +102,7 @@ globalref int_function XETrapProcVector[256L]; /* The "shadowed" ProcVector */
|
|||
#ifndef VECTORED_EVENTS
|
||||
globalref int_function EventProcVector[XETrapCoreEvents];
|
||||
#else
|
||||
extern WindowPtr GetCurrentRootWindow();
|
||||
extern WindowPtr GetCurrentRootWindow(DeviceIntPtr);
|
||||
globalref int_function EventProcVector[128L];
|
||||
#endif
|
||||
static int_function keybd_process_inp = NULL; /* Used for VECTORED_EVENTS */
|
||||
|
@ -1620,7 +1620,9 @@ int XETrapEventVector(ClientPtr client, xEvent *x_event)
|
|||
(x_event->u.u.type <= MotionNotify) &&
|
||||
(!x_event->u.keyButtonPointer.sameScreen)))
|
||||
{ /* we've moved/warped to another screen */
|
||||
WindowPtr root_win = GetCurrentRootWindow();
|
||||
/* XXX: we're getting the client's pointer root window.
|
||||
* is this correct? Should it be the client's keyboard? */
|
||||
WindowPtr root_win = GetCurrentRootWindow(PickPointer(client));
|
||||
current_screen = root_win->drawable.pScreen->myNum;
|
||||
}
|
||||
data.hdr.screen = current_screen;
|
||||
|
|
|
@ -463,7 +463,7 @@ XevieKbdProcessInputProc(xEvent *xE, DeviceIntPtr dev, int count)
|
|||
xevieModifiersOn = TRUE;
|
||||
|
||||
xE->u.keyButtonPointer.event = xeviewin->drawable.id;
|
||||
xE->u.keyButtonPointer.root = GetCurrentRootWindow()->drawable.id;
|
||||
xE->u.keyButtonPointer.root = GetCurrentRootWindow(dev)->drawable.id;
|
||||
xE->u.keyButtonPointer.child = (xeviewin->firstChild)
|
||||
? xeviewin->firstChild->drawable.id:0;
|
||||
xE->u.keyButtonPointer.rootX = xeviehot.x;
|
||||
|
|
|
@ -363,7 +363,7 @@ ProcXTestFakeInput(client)
|
|||
if (!dev)
|
||||
dev = PickPointer(client);
|
||||
if (ev->u.keyButtonPointer.root == None)
|
||||
root = GetCurrentRootWindow();
|
||||
root = GetCurrentRootWindow(dev);
|
||||
else
|
||||
{
|
||||
rc = dixLookupWindow(&root, ev->u.keyButtonPointer.root, client,
|
||||
|
@ -428,10 +428,10 @@ ProcXTestFakeInput(client)
|
|||
if ((!noPanoramiXExtension
|
||||
&& root->drawable.pScreen->myNum
|
||||
!= XineramaGetCursorScreen(dev))
|
||||
|| (noPanoramiXExtension && root != GetCurrentRootWindow()))
|
||||
|| (noPanoramiXExtension && root != GetCurrentRootWindow(dev)))
|
||||
|
||||
#else
|
||||
if (root != GetCurrentRootWindow())
|
||||
if (root != GetCurrentRootWindow(dev))
|
||||
#endif
|
||||
{
|
||||
NewCurrentScreen(dev, root->drawable.pScreen,
|
||||
|
|
|
@ -835,7 +835,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
|
|||
/* If the input focus is PointerRootWin, send the event to where
|
||||
* the pointer is if possible, then perhaps propogate up to root. */
|
||||
if (inputFocus == PointerRootWin)
|
||||
inputFocus = GetCurrentRootWindow();
|
||||
inputFocus = GetCurrentRootWindow(d);
|
||||
|
||||
if (IsParent(inputFocus, spriteWin)) {
|
||||
effectiveFocus = inputFocus;
|
||||
|
|
|
@ -107,7 +107,7 @@ ProcXQueryDevicePointer(ClientPtr client)
|
|||
rep.length = 0;
|
||||
rep.sequenceNumber = client->sequence;
|
||||
rep.mask = pDev->button->state | inputInfo.keyboard->key->state;
|
||||
rep.root = (GetCurrentRootWindow())->drawable.id;
|
||||
rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
|
||||
rep.rootX = pSprite->hot.x;
|
||||
rep.rootY = pSprite->hot.y;
|
||||
rep.child = None;
|
||||
|
|
|
@ -194,6 +194,14 @@ EnableDevice(DeviceIntPtr dev)
|
|||
*prev && (*prev != dev);
|
||||
prev = &(*prev)->next)
|
||||
;
|
||||
|
||||
/* Sprites will be initialized with their 'windows' just when inside the
|
||||
* DefineInitialRootWindow function! */
|
||||
if (IsPointerDevice(dev) && dev->spriteInfo->spriteOwner)
|
||||
InitializeSprite(dev, NullWindow);
|
||||
else
|
||||
PairDevices(NULL, inputInfo.pointer, dev);
|
||||
|
||||
if ((*prev != dev) || !dev->inited ||
|
||||
((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
|
||||
ErrorF("couldn't enable device %d\n", dev->id);
|
||||
|
@ -202,11 +210,6 @@ EnableDevice(DeviceIntPtr dev)
|
|||
dev->enabled = TRUE;
|
||||
*prev = dev->next;
|
||||
|
||||
if (IsPointerDevice(dev) && dev->spriteInfo->spriteOwner)
|
||||
InitializeSprite(dev, GetCurrentRootWindow());
|
||||
else
|
||||
PairDevices(NULL, inputInfo.pointer, dev);
|
||||
|
||||
for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
|
||||
;
|
||||
*prev = dev;
|
||||
|
@ -272,6 +275,11 @@ ActivateDevice(DeviceIntPtr dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
DeactivateDevice(DeviceIntPtr dev)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something)
|
||||
{
|
||||
|
@ -614,8 +622,10 @@ CloseDevice(DeviceIntPtr dev)
|
|||
XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
|
||||
#endif
|
||||
|
||||
if (DevHasCursor(dev))
|
||||
xfree((pointer)dev->spriteInfo->sprite);
|
||||
if (DevHasCursor(dev)) {
|
||||
xfree(dev->spriteInfo->sprite->spriteTrace);
|
||||
xfree(dev->spriteInfo->sprite);
|
||||
}
|
||||
|
||||
/* a client may have the device set as client pointer */
|
||||
for (j = 0; j < currentMaxClients; j++)
|
||||
|
|
137
dix/events.c
137
dix/events.c
|
@ -230,15 +230,7 @@ static struct {
|
|||
TimeStamp time;
|
||||
} syncEvents;
|
||||
|
||||
/*
|
||||
* The window trace information is used to avoid having to compute all the
|
||||
* windows between the root and the current pointer window each time a button
|
||||
* or key goes down. The grabs on each of those windows must be checked.
|
||||
*/
|
||||
static WindowPtr *spriteTrace = (WindowPtr *)NULL;
|
||||
#define ROOT spriteTrace[0]
|
||||
static int spriteTraceSize = 0;
|
||||
static int spriteTraceGood;
|
||||
#define RootWindow(dev) dev->spriteInfo->sprite->spriteTrace[0]
|
||||
|
||||
/**
|
||||
* True if device owns a cursor, false if device shares a cursor sprite with
|
||||
|
@ -284,6 +276,7 @@ static void DoEnterLeaveEvents(
|
|||
);
|
||||
|
||||
static WindowPtr XYToWindow(
|
||||
DeviceIntPtr pDev,
|
||||
int x,
|
||||
int y
|
||||
);
|
||||
|
@ -607,7 +600,7 @@ XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev)
|
|||
xeviehot.y = pSprite->hot.y;
|
||||
xeviewin =
|
||||
#endif
|
||||
pSprite->win = XYToWindow(pSprite->hot.x, pSprite->hot.y);
|
||||
pSprite->win = XYToWindow(pDev, pSprite->hot.x, pSprite->hot.y);
|
||||
|
||||
if (pSprite->win != prevSpriteWin)
|
||||
{
|
||||
|
@ -858,7 +851,7 @@ CheckVirtualMotion(
|
|||
xeviehot.x = pSprite->hot.x;
|
||||
xeviehot.y = pSprite->hot.y;
|
||||
#endif
|
||||
ROOT = WindowTable[pSprite->hot.pScreen->myNum];
|
||||
RootWindow(pDev) = WindowTable[pSprite->hot.pScreen->myNum];
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -973,10 +966,15 @@ PostNewCursor(DeviceIntPtr pDev)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param dev device which you want to know its current root window
|
||||
* @return root window where dev's sprite is located
|
||||
*/
|
||||
_X_EXPORT WindowPtr
|
||||
GetCurrentRootWindow(void)
|
||||
GetCurrentRootWindow(DeviceIntPtr dev)
|
||||
{
|
||||
return ROOT;
|
||||
return RootWindow(dev);
|
||||
}
|
||||
|
||||
_X_EXPORT WindowPtr
|
||||
|
@ -1201,10 +1199,11 @@ ComputeFreezes(void)
|
|||
count = replayDev->coreGrab.sync.evcount;
|
||||
syncEvents.replayDev = (DeviceIntPtr)NULL;
|
||||
|
||||
w = XYToWindow( XE_KBPTR.rootX, XE_KBPTR.rootY);
|
||||
for (i = 0; i < spriteTraceGood; i++)
|
||||
w = XYToWindow(replayDev, XE_KBPTR.rootX, XE_KBPTR.rootY);
|
||||
for (i = 0; i < replayDev->spriteInfo->sprite->spriteTraceGood; i++)
|
||||
{
|
||||
if (syncEvents.replayWin == spriteTrace[i])
|
||||
if (syncEvents.replayWin ==
|
||||
replayDev->spriteInfo->sprite->spriteTrace[i])
|
||||
{
|
||||
if (!CheckDeviceGrabs(replayDev, xE, i+1, count)) {
|
||||
if (replayDev->focus)
|
||||
|
@ -1365,7 +1364,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
|
|||
DoEnterLeaveEvents(mouse, grab->window,
|
||||
mouse->spriteInfo->sprite->win, NotifyUngrab);
|
||||
if (grab->confineTo)
|
||||
ConfineCursorToWindow(mouse, ROOT, FALSE, FALSE);
|
||||
ConfineCursorToWindow(mouse, RootWindow(mouse), FALSE, FALSE);
|
||||
PostNewCursor(mouse);
|
||||
if (grab->cursor)
|
||||
FreeCursor(grab->cursor, (Cursor)0);
|
||||
|
@ -1888,7 +1887,7 @@ FixUpEventFromWindow(
|
|||
|
||||
if (calcChild)
|
||||
{
|
||||
WindowPtr w=spriteTrace[spriteTraceGood-1];
|
||||
WindowPtr w= pSprite->spriteTrace[pSprite->spriteTraceGood-1];
|
||||
/* If the search ends up past the root should the child field be
|
||||
set to none or should the value in the argument be passed
|
||||
through. It probably doesn't matter since everyone calls
|
||||
|
@ -1913,7 +1912,7 @@ FixUpEventFromWindow(
|
|||
w = w->parent;
|
||||
}
|
||||
}
|
||||
XE_KBPTR.root = ROOT->drawable.id;
|
||||
XE_KBPTR.root = RootWindow(pDev)->drawable.id;
|
||||
XE_KBPTR.event = pWin->drawable.id;
|
||||
if (pSprite->hot.pScreen == pWin->drawable.pScreen)
|
||||
{
|
||||
|
@ -2064,13 +2063,15 @@ PointInBorderSize(WindowPtr pWin, int x, int y)
|
|||
}
|
||||
|
||||
static WindowPtr
|
||||
XYToWindow(int x, int y)
|
||||
XYToWindow(DeviceIntPtr pDev, int x, int y)
|
||||
{
|
||||
WindowPtr pWin;
|
||||
BoxRec box;
|
||||
SpritePtr pSprite;
|
||||
|
||||
spriteTraceGood = 1; /* root window still there */
|
||||
pWin = ROOT->firstChild;
|
||||
pSprite = pDev->spriteInfo->sprite;
|
||||
pSprite->spriteTraceGood = 1; /* root window still there */
|
||||
pWin = RootWindow(pDev)->firstChild;
|
||||
while (pWin)
|
||||
{
|
||||
if ((pWin->mapped) &&
|
||||
|
@ -2094,21 +2095,22 @@ XYToWindow(int x, int y)
|
|||
#endif
|
||||
)
|
||||
{
|
||||
if (spriteTraceGood >= spriteTraceSize)
|
||||
if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize)
|
||||
{
|
||||
spriteTraceSize += 10;
|
||||
pSprite->spriteTraceSize += 10;
|
||||
Must_have_memory = TRUE; /* XXX */
|
||||
spriteTrace = (WindowPtr *)xrealloc(
|
||||
spriteTrace, spriteTraceSize*sizeof(WindowPtr));
|
||||
pSprite->spriteTrace = (WindowPtr *)xrealloc(
|
||||
pSprite->spriteTrace,
|
||||
pSprite->spriteTraceSize*sizeof(WindowPtr));
|
||||
Must_have_memory = FALSE; /* XXX */
|
||||
}
|
||||
spriteTrace[spriteTraceGood++] = pWin;
|
||||
pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin;
|
||||
pWin = pWin->firstChild;
|
||||
}
|
||||
else
|
||||
pWin = pWin->nextSib;
|
||||
}
|
||||
return spriteTrace[spriteTraceGood-1];
|
||||
return pSprite->spriteTrace[pSprite->spriteTraceGood-1];
|
||||
}
|
||||
|
||||
Bool
|
||||
|
@ -2129,7 +2131,7 @@ CheckMotion(xEvent *xE, DeviceIntPtr pDev)
|
|||
if (pSprite->hot.pScreen != pSprite->hotPhys.pScreen)
|
||||
{
|
||||
pSprite->hot.pScreen = pSprite->hotPhys.pScreen;
|
||||
ROOT = WindowTable[pSprite->hot.pScreen->myNum];
|
||||
RootWindow(pDev) = WindowTable[pSprite->hot.pScreen->myNum];
|
||||
}
|
||||
pSprite->hot.x = XE_KBPTR.rootX;
|
||||
pSprite->hot.y = XE_KBPTR.rootY;
|
||||
|
@ -2166,7 +2168,7 @@ CheckMotion(xEvent *xE, DeviceIntPtr pDev)
|
|||
#ifdef XEVIE
|
||||
xeviewin =
|
||||
#endif
|
||||
pSprite->win = XYToWindow(pSprite->hot.x, pSprite->hot.y);
|
||||
pSprite->win = XYToWindow(pDev, pSprite->hot.x, pSprite->hot.y);
|
||||
#ifdef notyet
|
||||
if (!(pSprite->win->deliverableEvents &
|
||||
Motion_Filter(pDev->button))
|
||||
|
@ -2263,7 +2265,6 @@ DefineInitialRootWindow(WindowPtr win)
|
|||
#ifdef XEVIE
|
||||
xeviewin = win;
|
||||
#endif
|
||||
ROOT = win;
|
||||
|
||||
InitializeSprite(inputInfo.pointer, win);
|
||||
|
||||
|
@ -2312,8 +2313,25 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
|
|||
{
|
||||
pSprite->current = wCursor(pWin);
|
||||
pSprite->current->refcnt++;
|
||||
} else
|
||||
pSprite->spriteTrace = (WindowPtr *)xcalloc(1, 32*sizeof(WindowPtr));
|
||||
if (!pSprite->spriteTrace)
|
||||
FatalError("Failed to allocate spriteTrace");
|
||||
pSprite->spriteTraceSize = 32;
|
||||
|
||||
RootWindow(pDev) = pWin;
|
||||
pSprite->spriteTraceGood = 1;
|
||||
|
||||
pSprite->pEnqueueScreen = pScreen;
|
||||
pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
|
||||
|
||||
} else {
|
||||
pSprite->current = NullCursor;
|
||||
pSprite->spriteTrace = NULL;
|
||||
pSprite->spriteTraceSize = 0;
|
||||
pSprite->spriteTraceGood = 0;
|
||||
pSprite->pEnqueueScreen = screenInfo.screens[0];
|
||||
pSprite->pDequeueScreen = pSprite->pEnqueueScreen;
|
||||
}
|
||||
|
||||
if (pScreen)
|
||||
{
|
||||
|
@ -2768,14 +2786,15 @@ CheckDeviceGrabs(DeviceIntPtr device, xEvent *xE,
|
|||
}
|
||||
|
||||
if ((focus->win == NoneWin) ||
|
||||
(i >= spriteTraceGood) ||
|
||||
((i > checkFirst) && (pWin != spriteTrace[i-1])))
|
||||
(i >= device->spriteInfo->sprite->spriteTraceGood) ||
|
||||
((i > checkFirst) &&
|
||||
(pWin != device->spriteInfo->sprite->spriteTrace[i-1])))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (; i < spriteTraceGood; i++)
|
||||
for (; i < device->spriteInfo->sprite->spriteTraceGood; i++)
|
||||
{
|
||||
pWin = spriteTrace[i];
|
||||
pWin = device->spriteInfo->sprite->spriteTrace[i];
|
||||
if (pWin->optional &&
|
||||
CheckPassiveGrabsOnWindow(pWin, device, xE, count))
|
||||
return TRUE;
|
||||
|
@ -2946,7 +2965,7 @@ ProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
|
|||
{
|
||||
xeviekb = keybd;
|
||||
if(!rootWin) {
|
||||
rootWin = GetCurrentRootWindow()->drawable.id;
|
||||
rootWin = GetCurrentRootWindow(keybd)->drawable.id;
|
||||
}
|
||||
xE->u.keyButtonPointer.event = xeviewin->drawable.id;
|
||||
xE->u.keyButtonPointer.root = rootWin;
|
||||
|
@ -3806,8 +3825,8 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode)
|
|||
if ((fromWin == NullWindow) || (fromWin == PointerRootWin))
|
||||
{
|
||||
if (fromWin == PointerRootWin)
|
||||
FocusOutEvents(dev, pSprite->win, ROOT, mode,
|
||||
NotifyPointer, TRUE);
|
||||
FocusOutEvents(dev, pSprite->win, RootWindow(dev), mode,
|
||||
NotifyPointer, TRUE);
|
||||
/* Notify all the roots */
|
||||
#ifdef PANORAMIX
|
||||
if ( !noPanoramiXExtension )
|
||||
|
@ -3836,16 +3855,16 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode)
|
|||
for (i=0; i<screenInfo.numScreens; i++)
|
||||
FocusEvent(dev, FocusIn, mode, in, WindowTable[i]);
|
||||
if (toWin == PointerRootWin)
|
||||
(void)FocusInEvents(dev, ROOT, pSprite->win, NullWindow, mode,
|
||||
NotifyPointer, TRUE);
|
||||
(void)FocusInEvents(dev, RootWindow(dev), pSprite->win,
|
||||
NullWindow, mode, NotifyPointer, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((fromWin == NullWindow) || (fromWin == PointerRootWin))
|
||||
{
|
||||
if (fromWin == PointerRootWin)
|
||||
FocusOutEvents(dev, pSprite->win, ROOT, mode, NotifyPointer,
|
||||
TRUE);
|
||||
FocusOutEvents(dev, pSprite->win, RootWindow(dev), mode,
|
||||
NotifyPointer, TRUE);
|
||||
#ifdef PANORAMIX
|
||||
if ( !noPanoramiXExtension )
|
||||
FocusEvent(dev, FocusOut, mode, out, WindowTable[0]);
|
||||
|
@ -3854,7 +3873,7 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode)
|
|||
for (i=0; i<screenInfo.numScreens; i++)
|
||||
FocusEvent(dev, FocusOut, mode, out, WindowTable[i]);
|
||||
if (toWin->parent != NullWindow)
|
||||
(void)FocusInEvents(dev, ROOT, toWin, toWin, mode,
|
||||
(void)FocusInEvents(dev, RootWindow(dev), toWin, toWin, mode,
|
||||
NotifyNonlinearVirtual, TRUE);
|
||||
FocusEvent(dev, FocusIn, mode, NotifyNonlinear, toWin);
|
||||
if (IsParent(toWin, pSprite->win))
|
||||
|
@ -4130,7 +4149,7 @@ ProcGrabPointer(ClientPtr client)
|
|||
if (grab)
|
||||
{
|
||||
if (grab->confineTo && !confineTo)
|
||||
ConfineCursorToWindow(device, ROOT, FALSE, FALSE);
|
||||
ConfineCursorToWindow(device, RootWindow(device), FALSE, FALSE);
|
||||
oldCursor = grab->cursor;
|
||||
}
|
||||
tempGrab.cursor = cursor;
|
||||
|
@ -4351,7 +4370,7 @@ ProcQueryPointer(ClientPtr client)
|
|||
rep.sequenceNumber = client->sequence;
|
||||
rep.mask = mouse->button->state | inputInfo.keyboard->key->state;
|
||||
rep.length = 0;
|
||||
rep.root = (ROOT)->drawable.id;
|
||||
rep.root = (RootWindow(mouse))->drawable.id;
|
||||
rep.rootX = pSprite->hot.x;
|
||||
rep.rootY = pSprite->hot.y;
|
||||
rep.child = None;
|
||||
|
@ -4400,19 +4419,6 @@ InitEvents(void)
|
|||
inputInfo.off_devices = (DeviceIntPtr)NULL;
|
||||
inputInfo.keyboard = (DeviceIntPtr)NULL;
|
||||
inputInfo.pointer = (DeviceIntPtr)NULL;
|
||||
if (spriteTraceSize == 0)
|
||||
{
|
||||
spriteTraceSize = 32;
|
||||
spriteTrace = (WindowPtr *)xalloc(32*sizeof(WindowPtr));
|
||||
/* FIXME: spriteTrace[0] needs to be NULL, otherwise
|
||||
* GetCurrentRootWindow() in EnableDevice() may return a invalid
|
||||
* value. (whot)
|
||||
*/
|
||||
memset(spriteTrace, 0, 32 * sizeof(WindowPtr));
|
||||
if (!spriteTrace)
|
||||
FatalError("failed to allocate spriteTrace");
|
||||
}
|
||||
spriteTraceGood = 0;
|
||||
lastEventMask = OwnerGrabButtonMask;
|
||||
filters[MotionNotify] = PointerMotionMask;
|
||||
#ifdef XEVIE
|
||||
|
@ -4441,13 +4447,14 @@ InitEvents(void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
/**
|
||||
* This function is deprecated! It shouldn't be used anymore. It used to free
|
||||
* the spriteTraces, but now they are freed when the SpriteRec is freed.
|
||||
*/
|
||||
_X_DEPRECATED void
|
||||
CloseDownEvents(void)
|
||||
{
|
||||
xfree(spriteTrace);
|
||||
spriteTrace = NULL;
|
||||
spriteTraceSize = 0;
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -4497,7 +4504,7 @@ ProcSendEvent(ClientPtr client)
|
|||
/* If the input focus is PointerRootWin, send the event to where
|
||||
the pointer is if possible, then perhaps propogate up to root. */
|
||||
if (inputFocus == PointerRootWin)
|
||||
inputFocus = ROOT;
|
||||
inputFocus = pSprite->spriteTrace[0]; /* Root window! */
|
||||
|
||||
if (IsParent(inputFocus, pSprite->win))
|
||||
{
|
||||
|
|
|
@ -498,7 +498,6 @@ main(int argc, char *argv[], char *envp[])
|
|||
FreeScreen(screenInfo.screens[i]);
|
||||
screenInfo.numScreens = i;
|
||||
}
|
||||
CloseDownEvents();
|
||||
xfree(WindowTable);
|
||||
WindowTable = NULL;
|
||||
FreeFonts();
|
||||
|
|
|
@ -299,7 +299,9 @@ IsRaiseOnClick (WindowPtr pWin)
|
|||
|
||||
struct _Window *pwin;
|
||||
struct _Property *prop;
|
||||
WindowPtr pRoot = GetCurrentRootWindow ();
|
||||
/* XXX We're getting inputInfo.poniter here, but this might be really wrong.
|
||||
* Which pointer's current window do we want? */
|
||||
WindowPtr pRoot = GetCurrentRootWindow (inputInfo.pointer);
|
||||
|
||||
if (!pWin)
|
||||
{
|
||||
|
@ -352,7 +354,9 @@ IsMouseActive (WindowPtr pWin)
|
|||
|
||||
struct _Window *pwin;
|
||||
struct _Property *prop;
|
||||
WindowPtr pRoot = GetCurrentRootWindow ();
|
||||
/* XXX We're getting inputInfo.poniter here, but this might be really wrong.
|
||||
* Which pointer's current window do we want? */
|
||||
WindowPtr pRoot = GetCurrentRootWindow (inputInfo.pointer);
|
||||
|
||||
if (!pWin)
|
||||
{
|
||||
|
|
|
@ -357,7 +357,7 @@ extern Bool IsParent(
|
|||
WindowPtr /* maybeparent */,
|
||||
WindowPtr /* child */);
|
||||
|
||||
extern WindowPtr GetCurrentRootWindow(void);
|
||||
extern WindowPtr GetCurrentRootWindow(DeviceIntPtr pDev);
|
||||
|
||||
extern WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
|
||||
|
||||
|
|
|
@ -287,6 +287,18 @@ typedef struct {
|
|||
WindowPtr windows[MAXSCREENS];
|
||||
WindowPtr confineWin; /* confine window */
|
||||
#endif
|
||||
/* The window trace information is used at dix/events.c to avoid having
|
||||
* to compute all the windows between the root and the current pointer
|
||||
* window each time a button or key goes down. The grabs on each of those
|
||||
* windows must be checked.
|
||||
* spriteTraces should only be used at dix/events.c! */
|
||||
WindowPtr *spriteTrace;
|
||||
int spriteTraceSize;
|
||||
int spriteTraceGood;
|
||||
|
||||
ScreenPtr pEnqueueScreen; /* screen events are being delivered to */
|
||||
ScreenPtr pDequeueScreen; /* screen events are being dispatched to */
|
||||
|
||||
} SpriteRec, *SpritePtr;
|
||||
|
||||
/* states for devices */
|
||||
|
|
1
mi/mi.h
1
mi/mi.h
|
@ -158,6 +158,7 @@ extern void mieqEnqueue(
|
|||
);
|
||||
|
||||
extern void mieqSwitchScreen(
|
||||
DeviceIntPtr /* pDev */,
|
||||
ScreenPtr /*pScreen*/,
|
||||
Bool /*fromDIX*/
|
||||
);
|
||||
|
|
24
mi/mieq.c
24
mi/mieq.c
|
@ -67,6 +67,9 @@ in this Software without prior written authorization from The Open Group.
|
|||
|
||||
#define QUEUE_SIZE 512
|
||||
|
||||
#define EnqueueScreen(dev) dev->spriteInfo->sprite->pEnqueueScreen
|
||||
#define DequeueScreen(dev) dev->spriteInfo->sprite->pDequeueScreen
|
||||
|
||||
typedef struct _Event {
|
||||
xEvent event[7];
|
||||
int nevents;
|
||||
|
@ -79,8 +82,6 @@ typedef struct _EventQueue {
|
|||
CARD32 lastEventTime; /* to avoid time running backwards */
|
||||
int lastMotion; /* device ID if last event motion? */
|
||||
EventRec events[QUEUE_SIZE]; /* static allocation for signals */
|
||||
ScreenPtr pEnqueueScreen; /* screen events are being delivered to */
|
||||
ScreenPtr pDequeueScreen; /* screen events are being dispatched to */
|
||||
mieqHandler handlers[128]; /* custom event handler */
|
||||
} EventQueueRec, *EventQueuePtr;
|
||||
|
||||
|
@ -94,8 +95,6 @@ mieqInit(void)
|
|||
miEventQueue.head = miEventQueue.tail = 0;
|
||||
miEventQueue.lastEventTime = GetTimeInMillis ();
|
||||
miEventQueue.lastMotion = FALSE;
|
||||
miEventQueue.pEnqueueScreen = screenInfo.screens[0];
|
||||
miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
|
||||
for (i = 0; i < 128; i++)
|
||||
miEventQueue.handlers[i] = NULL;
|
||||
SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
|
||||
|
@ -179,18 +178,18 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
|
|||
|
||||
miEventQueue.lastEventTime =
|
||||
miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time;
|
||||
miEventQueue.events[oldtail].pScreen = miEventQueue.pEnqueueScreen;
|
||||
miEventQueue.events[oldtail].pScreen = EnqueueScreen(pDev);
|
||||
miEventQueue.events[oldtail].pDev = pDev;
|
||||
|
||||
miEventQueue.lastMotion = isMotion;
|
||||
}
|
||||
|
||||
void
|
||||
mieqSwitchScreen(ScreenPtr pScreen, Bool fromDIX)
|
||||
mieqSwitchScreen(DeviceIntPtr pDev, ScreenPtr pScreen, Bool fromDIX)
|
||||
{
|
||||
miEventQueue.pEnqueueScreen = pScreen;
|
||||
EnqueueScreen(pDev) = pScreen;
|
||||
if (fromDIX)
|
||||
miEventQueue.pDequeueScreen = pScreen;
|
||||
DequeueScreen(pDev) = pScreen;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -224,15 +223,15 @@ mieqProcessInputEvents(void)
|
|||
|
||||
e = &miEventQueue.events[miEventQueue.head];
|
||||
/* Assumption - screen switching can only occur on motion events. */
|
||||
if (e->pScreen != miEventQueue.pDequeueScreen) {
|
||||
miEventQueue.pDequeueScreen = e->pScreen;
|
||||
if (e->pScreen != DequeueScreen(e->pDev)) {
|
||||
DequeueScreen(e->pDev) = e->pScreen;
|
||||
x = e->event[0].u.keyButtonPointer.rootX;
|
||||
y = e->event[0].u.keyButtonPointer.rootY;
|
||||
if (miEventQueue.head == QUEUE_SIZE - 1)
|
||||
miEventQueue.head = 0;
|
||||
else
|
||||
++miEventQueue.head;
|
||||
NewCurrentScreen (e->pDev, miEventQueue.pDequeueScreen, x, y);
|
||||
NewCurrentScreen (e->pDev, DequeueScreen(e->pDev), x, y);
|
||||
}
|
||||
else {
|
||||
if (miEventQueue.head == QUEUE_SIZE - 1)
|
||||
|
@ -243,7 +242,8 @@ mieqProcessInputEvents(void)
|
|||
/* If someone's registered a custom event handler, let them
|
||||
* steal it. */
|
||||
if (miEventQueue.handlers[e->event->u.u.type]) {
|
||||
miEventQueue.handlers[e->event->u.u.type](miEventQueue.pDequeueScreen->myNum,
|
||||
miEventQueue.handlers[e->event->u.u.type](
|
||||
DequeueScreen(e->pDev)->myNum,
|
||||
e->event, dev,
|
||||
e->nevents);
|
||||
return;
|
||||
|
|
|
@ -351,7 +351,7 @@ miPointerWarpCursor (pDev, pScreen, x, y)
|
|||
SetupScreen (pScreen);
|
||||
|
||||
if (pPointer->pScreen != pScreen)
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, TRUE);
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, TRUE);
|
||||
|
||||
if (GenerateEvent)
|
||||
{
|
||||
|
@ -492,7 +492,7 @@ miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
|
|||
|
||||
pScreen = screenInfo.screens[screen_no];
|
||||
pScreenPriv = GetScreenPrivate (pScreen);
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, FALSE);
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen, FALSE);
|
||||
NewCurrentScreen (pDev, pScreen, x, y);
|
||||
|
||||
pPointer->limits.x2 = pScreen->width;
|
||||
|
@ -570,7 +570,8 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
|
|||
if (newScreen != pScreen)
|
||||
{
|
||||
pScreen = newScreen;
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, FALSE);
|
||||
(*pScreenPriv->screenFuncs->NewEventScreen) (pDev, pScreen,
|
||||
FALSE);
|
||||
pScreenPriv = GetScreenPrivate (pScreen);
|
||||
/* Smash the confine to the new screen */
|
||||
pPointer->limits.x2 = pScreen->width;
|
||||
|
|
|
@ -88,6 +88,7 @@ typedef struct _miPointerScreenFuncRec {
|
|||
xEventPtr /* event */
|
||||
);
|
||||
void (*NewEventScreen)(
|
||||
DeviceIntPtr /* pDev */,
|
||||
ScreenPtr /* pScr */,
|
||||
Bool /* fromDIX */
|
||||
);
|
||||
|
|
|
@ -135,10 +135,16 @@ RRPointerMoved (ScreenPtr pScreen, int x, int y)
|
|||
void
|
||||
RRPointerScreenConfigured (ScreenPtr pScreen)
|
||||
{
|
||||
WindowPtr pRoot = GetCurrentRootWindow ();
|
||||
WindowPtr pRoot = GetCurrentRootWindow (inputInfo.pointer);
|
||||
ScreenPtr pCurrentScreen = pRoot ? pRoot->drawable.pScreen : NULL;
|
||||
int x, y;
|
||||
|
||||
/* XXX: GetCurrentRootWindow revices an argument, It is inputInfo.pointer,
|
||||
* but I really think this is wrong... What do we do here? This was made so
|
||||
* that it can compile, but I don't think randr should assume there is just
|
||||
* one pointer. There might be more than one pointer on the screen! So, what
|
||||
* to do? What happens? */
|
||||
|
||||
if (pScreen != pCurrentScreen)
|
||||
return;
|
||||
GetSpritePosition(inputInfo.pointer, &x, &y);
|
||||
|
|
Loading…
Reference in New Issue