From 43bd35fcf85b51b7e5714844bade90184dbd746f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 1 Mar 2007 17:19:37 +1030 Subject: [PATCH] dix: Remove InitSprite, work can be done by InitializeSprite. Free sprite struct if a spriteOwner is paired. xfree86: Use PairDevices instead of passing booleans around when creating a sprite. Xext: Switch back to using LookupPointer/KeyboardDevice instead of inputInfo.xyz. --- Xext/xtest.c | 8 ++++---- autogen.sh | 2 +- dix/devices.c | 11 +++++++++-- dix/events.c | 21 +++++++++++++++++---- hw/xfree86/common/xf86Xinput.c | 6 +++++- hw/xfree86/os-support/linux/lnx_agp.c | 1 + include/inputstr.h | 2 +- 7 files changed, 38 insertions(+), 13 deletions(-) diff --git a/Xext/xtest.c b/Xext/xtest.c index d46d6e7d9..cb7b5b83b 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -316,7 +316,7 @@ ProcXTestFakeInput(client) #ifdef XINPUT if (!extension) #endif /* XINPUT */ - dev = inputInfo.keyboard; + dev = (DeviceIntPtr)LookupKeyboardDevice(); if (ev->u.u.detail < dev->key->curKeySyms.minKeyCode || ev->u.u.detail > dev->key->curKeySyms.maxKeyCode) { @@ -361,7 +361,7 @@ ProcXTestFakeInput(client) } #endif /* XINPUT */ if (!dev) - dev = inputInfo.pointer; + dev = (DeviceIntPtr*)LookupPointerDevice(); if (ev->u.keyButtonPointer.root == None) root = GetCurrentRootWindow(); else @@ -427,7 +427,7 @@ ProcXTestFakeInput(client) #ifdef PANORAMIX if ((!noPanoramiXExtension && root->drawable.pScreen->myNum - != XineramaGetCursorScreen(inputInfo.pointer)) + != XineramaGetCursorScreen(dev)) || (noPanoramiXExtension && root != GetCurrentRootWindow())) #else @@ -451,7 +451,7 @@ ProcXTestFakeInput(client) #ifdef XINPUT if (!extension) #endif /* XINPUT */ - dev = inputInfo.pointer; + dev = (DeviceIntPtr*)LookupPointerDevice(); if (!ev->u.u.detail || ev->u.u.detail > dev->button->numButtons) { client->errorValue = ev->u.u.detail; diff --git a/autogen.sh b/autogen.sh index 904cd6746..1176abd5b 100755 --- a/autogen.sh +++ b/autogen.sh @@ -9,4 +9,4 @@ cd $srcdir autoreconf -v --install || exit 1 cd $ORIGDIR || exit $? -$srcdir/configure --enable-maintainer-mode "$@" +$srcdir/configure --enable-maintainer-mode --disable-dmx "$@" diff --git a/dix/devices.c b/dix/devices.c index ad5cd5042..747d7822b 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -1937,14 +1937,21 @@ ProcQueryKeymap(ClientPtr client) * pointer sprite. */ int -PairDevices(ClientPtr client, DeviceIntPtr pointer, DeviceIntPtr keyboard) +PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd) { if (!pairingClient) RegisterPairingClient(client); else if (pairingClient != client) return BadAccess; - keyboard->pSprite = pointer->pSprite; + if (kbd->spriteOwner) + { + xfree(kbd->pSprite); + kbd->pSprite = NULL; + kbd->spriteOwner = FALSE; + } + + kbd->pSprite = ptr->pSprite; return Success; } diff --git a/dix/events.c b/dix/events.c index 5ea9a65c2..a1e72f187 100644 --- a/dix/events.c +++ b/dix/events.c @@ -240,7 +240,6 @@ static WindowPtr *spriteTrace = (WindowPtr *)NULL; static int spriteTraceSize = 0; static int spriteTraceGood; - /** * True if device owns a cursor, false if device shares a cursor sprite with * another device. @@ -2212,8 +2211,16 @@ void InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin) { SpritePtr pSprite; - ScreenPtr pScreen = pWin->drawable.pScreen; + ScreenPtr pScreen; + if (!pDev->pSprite) + { + pDev->pSprite = (SpritePtr)xcalloc(1, sizeof(SpriteRec)); + if (!pDev->pSprite) + FatalError("InitializeSprite: failed to allocate sprite struct"); + } + + pScreen = (pWin) ? pWin->drawable.pScreen : (ScreenPtr)NULL; pSprite = pDev->pSprite; pSprite->hotPhys.pScreen = pScreen; pSprite->hotPhys.x = pScreen->width / 2; @@ -2222,8 +2229,12 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin) pSprite->hotLimits.x2 = pScreen->width; pSprite->hotLimits.y2 = pScreen->height; pSprite->win = pWin; - pSprite->current = wCursor (pWin); - pSprite->current->refcnt++; + if (pWin) + { + pSprite->current = wCursor(pWin); + pSprite->current->refcnt++; + } else + pSprite->current = NullCursor; (*pScreen->CursorLimits) ( pDev, pScreen, pSprite->current, &pSprite->hotLimits, &pSprite->physLimits); @@ -2252,6 +2263,8 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin) REGION_NULL(pScreen, &pSprite->Reg2); } #endif + + pDev->spriteOwner = TRUE; } /* diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 608fa9bb2..41118c043 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -187,7 +187,11 @@ xf86ActivateDevice(LocalDevicePtr local) #endif /* Only create a new sprite if it's a non-shared pointer */ - InitSprite(dev, IsPointerDevice(dev) && dev->isMPDev); + if (IsPointerDevice(dev) && dev->isMPDev) + InitializeSprite(pDev, NullWindow); + else + PairDevices(pairingClient, inputInfo.pointer, pDev); + RegisterOtherDevice(dev); if (serverGeneration == 1) diff --git a/hw/xfree86/os-support/linux/lnx_agp.c b/hw/xfree86/os-support/linux/lnx_agp.c index ded9e0fae..300b08df6 100644 --- a/hw/xfree86/os-support/linux/lnx_agp.c +++ b/hw/xfree86/os-support/linux/lnx_agp.c @@ -10,6 +10,7 @@ #ifdef HAVE_XORG_CONFIG_H #include +#include #endif #include diff --git a/include/inputstr.h b/include/inputstr.h index c4a2d1855..90a985b5f 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -355,7 +355,7 @@ typedef struct _DeviceIntRec { int nPrivates; DeviceUnwrapProc unwrapProc; Bool isMPDev; /* TRUE if multipointer device */ - /* Each devices has a sprite. However, keyboards and shared pointers do + /* Each device has a sprite. However, keyboards and shared pointers do not in fact own a sprite but rather have their pointer set to the sprite of another device. pSprite always has to point to a valid sprite. spriteOwner indicates whether it is the device's sprite. */