summaryrefslogtreecommitdiff
path: root/xserver/mi/midispcur.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2010-07-27 19:02:39 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2010-07-27 19:02:39 +0000
commit269d40cbcc43b41f621ca6d91c182952f60ec48e (patch)
tree872f2fddd3f2207e57a28595e73886713ce4a77a /xserver/mi/midispcur.c
parent917a2249b787451cad3f9697872aeccfd0da3324 (diff)
Update to xserver 1.8. Tested by many. Ok oga@, todd@.
Diffstat (limited to 'xserver/mi/midispcur.c')
-rw-r--r--xserver/mi/midispcur.c285
1 files changed, 115 insertions, 170 deletions
diff --git a/xserver/mi/midispcur.c b/xserver/mi/midispcur.c
index 05352fc89..1d2491904 100644
--- a/xserver/mi/midispcur.c
+++ b/xserver/mi/midispcur.c
@@ -34,7 +34,6 @@ in this Software without prior written authorization from The Open Group.
#include <dix-config.h>
#endif
-#define NEED_EVENTS
# include <X11/X.h>
# include "misc.h"
# include "input.h"
@@ -52,7 +51,7 @@ in this Software without prior written authorization from The Open Group.
# include "picturestr.h"
#endif
-# include "inputstr.h" /* for MAX_DEVICES */
+# include "inputstr.h"
/* per-screen private data */
static int miDCScreenKeyIndex;
@@ -60,9 +59,9 @@ static DevPrivateKey miDCScreenKey = &miDCScreenKeyIndex;
static Bool miDCCloseScreen(int index, ScreenPtr pScreen);
-/* per device private data */
-static int miDCSpriteKeyIndex;
-static DevPrivateKey miDCSpriteKey = &miDCSpriteKeyIndex;
+/* per device per-screen private data */
+static int miDCSpriteKeyIndex[MAXSCREENS];
+static DevPrivateKey miDCSpriteKey = miDCSpriteKeyIndex;
typedef struct {
GCPtr pSourceGC, pMaskGC;
@@ -76,10 +75,10 @@ typedef struct {
#endif
} miDCBufferRec, *miDCBufferPtr;
-#define MIDCBUFFER(dev) \
+#define MIDCBUFFER(dev, screen) \
((DevHasCursor(dev)) ? \
- (miDCBufferPtr)dixLookupPrivate(&dev->devPrivates, miDCSpriteKey) : \
- (miDCBufferPtr)dixLookupPrivate(&dev->u.master->devPrivates, miDCSpriteKey))
+ (miDCBufferPtr)dixLookupPrivate(&dev->devPrivates, miDCSpriteKey + (screen)->myNum) : \
+ (miDCBufferPtr)dixLookupPrivate(&dev->u.master->devPrivates, miDCSpriteKey + (screen)->myNum))
/*
* The core pointer buffer will point to the index of the virtual core pointer
@@ -136,12 +135,12 @@ static miSpriteCursorFuncRec miDCFuncs = {
miDCDeviceCleanup
};
-_X_EXPORT Bool
+Bool
miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
{
miDCScreenPtr pScreenPriv;
- pScreenPriv = (miDCScreenPtr) xalloc (sizeof (miDCScreenRec));
+ pScreenPriv = xalloc (sizeof (miDCScreenRec));
if (!pScreenPriv)
return FALSE;
@@ -159,10 +158,6 @@ miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
return TRUE;
}
-#define tossGC(gc) (gc ? FreeGC (gc, (GContext) 0) : 0)
-#define tossPix(pix) (pix ? (*pScreen->DestroyPixmap) (pix) : TRUE)
-#define tossPict(pict) (pict ? FreePicture (pict, 0) : 0)
-
static Bool
miDCCloseScreen (int index, ScreenPtr pScreen)
{
@@ -230,9 +225,9 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
GCPtr pGC;
XID gcvals[3];
- pPriv = (miDCCursorPtr) xalloc (sizeof (miDCCursorRec));
+ pPriv = xalloc (sizeof (miDCCursorRec));
if (!pPriv)
- return (miDCCursorPtr)NULL;
+ return NULL;
#ifdef ARGB_CURSOR
if (pCursor->bits->argb)
{
@@ -244,7 +239,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
if (!pFormat)
{
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
pPriv->sourceBits = 0;
@@ -255,14 +250,14 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
if (!pPixmap)
{
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
pGC = GetScratchGC (32, pScreen);
if (!pGC)
{
(*pScreen->DestroyPixmap) (pPixmap);
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
ValidateGC (&pPixmap->drawable, pGC);
(*pGC->ops->PutImage) (&pPixmap->drawable, pGC, 32,
@@ -276,7 +271,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
if (!pPriv->pPicture)
{
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
dixSetPrivate(&pCursor->bits->devPrivates, CursorScreenKey(pScreen), pPriv);
return pPriv;
@@ -287,14 +282,14 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
if (!pPriv->sourceBits)
{
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
pPriv->maskBits = (*pScreen->CreatePixmap) (pScreen, pCursor->bits->width, pCursor->bits->height, 1, 0);
if (!pPriv->maskBits)
{
(*pScreen->DestroyPixmap) (pPriv->sourceBits);
xfree ((pointer) pPriv);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
dixSetPrivate(&pCursor->bits->devPrivates, CursorScreenKey(pScreen), pPriv);
@@ -304,7 +299,7 @@ miDCRealize (ScreenPtr pScreen, CursorPtr pCursor)
if (!pGC)
{
(void) miDCUnrealizeCursor (pScreen, pCursor);
- return (miDCCursorPtr)NULL;
+ return NULL;
}
ValidateGC ((DrawablePtr)pPriv->sourceBits, pGC);
@@ -416,12 +411,8 @@ miDCPutBits (
(*maskGC->ops->PushPixels) (maskGC, pPriv->maskBits, pDrawable, w, h, x, y);
}
-#define EnsureGC(gc,win) (gc || miDCMakeGC(&gc, win))
-
static GCPtr
-miDCMakeGC(
- GCPtr *ppGC,
- WindowPtr pWin)
+miDCMakeGC(WindowPtr pWin)
{
GCPtr pGC;
int status;
@@ -432,7 +423,6 @@ miDCMakeGC(
pGC = CreateGC((DrawablePtr)pWin,
GCSubwindowMode|GCGraphicsExposures, gcvals, &status,
(XID)0, serverClient);
- *ppGC = pGC;
return pGC;
}
@@ -457,20 +447,11 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
miDCScreenKey);
pWin = WindowTable[pScreen->myNum];
- pBuffer = MIDCBUFFER(pDev);
+ pBuffer = MIDCBUFFER(pDev, pScreen);
#ifdef ARGB_CURSOR
if (pPriv->pPicture)
{
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pRootPicture &&
- pBuffer->pRootPicture->pDrawable &&
- pBuffer->pRootPicture->pDrawable->pScreen != pScreen)
- {
- tossPict(pBuffer->pRootPicture);
- pBuffer->pRootPicture = NULL;
- }
-
if (!EnsurePicture(pBuffer->pRootPicture, &pWin->drawable, pWin))
return FALSE;
CompositePicture (PictOpOver,
@@ -485,33 +466,6 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
else
#endif
{
- /**
- * XXX: Before MPX, the sourceGC and maskGC were attached to the
- * screen, and would switch as the screen switches. With mpx we have
- * the GC's attached to the device now, so each time we switch screen
- * we need to make sure the GC's are allocated on the new screen.
- * This is ... not optimal. (whot)
- */
- if (pBuffer->pSourceGC && pScreen != pBuffer->pSourceGC->pScreen)
- {
- tossGC(pBuffer->pSourceGC);
- pBuffer->pSourceGC = NULL;
- }
-
- if (pBuffer->pMaskGC && pScreen != pBuffer->pMaskGC->pScreen)
- {
- tossGC(pBuffer->pMaskGC);
- pBuffer->pMaskGC = NULL;
- }
-
- if (!EnsureGC(pBuffer->pSourceGC, pWin))
- return FALSE;
- if (!EnsureGC(pBuffer->pMaskGC, pWin))
- {
- FreeGC (pBuffer->pSourceGC, (GContext) 0);
- pBuffer->pSourceGC = 0;
- return FALSE;
- }
miDCPutBits ((DrawablePtr)pWin, pPriv,
pBuffer->pSourceGC, pBuffer->pMaskGC,
x, y, pCursor->bits->width, pCursor->bits->height,
@@ -532,7 +486,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
miDCScreenKey);
- pBuffer = MIDCBUFFER(pDev);
+ pBuffer = MIDCBUFFER(pDev, pScreen);
pSave = pBuffer->pSave;
pWin = WindowTable[pScreen->myNum];
@@ -545,14 +499,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
if (!pSave)
return FALSE;
}
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pSaveGC && pBuffer->pSaveGC->pScreen != pScreen)
- {
- tossGC(pBuffer->pSaveGC);
- pBuffer->pSaveGC = NULL;
- }
- if (!EnsureGC(pBuffer->pSaveGC, pWin))
- return FALSE;
+
pGC = pBuffer->pSaveGC;
if (pSave->drawable.serialNumber != pGC->serialNumber)
ValidateGC ((DrawablePtr) pSave, pGC);
@@ -573,20 +520,13 @@ miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
miDCScreenKey);
- pBuffer = MIDCBUFFER(pDev);
+ pBuffer = MIDCBUFFER(pDev, pScreen);
pSave = pBuffer->pSave;
pWin = WindowTable[pScreen->myNum];
if (!pSave)
return FALSE;
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
- {
- tossGC(pBuffer->pRestoreGC);
- pBuffer->pRestoreGC = NULL;
- }
- if (!EnsureGC(pBuffer->pRestoreGC, pWin))
- return FALSE;
+
pGC = pBuffer->pRestoreGC;
if (pWin->drawable.serialNumber != pGC->serialNumber)
ValidateGC ((DrawablePtr) pWin, pGC);
@@ -608,7 +548,7 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
miDCScreenKey);
- pBuffer = MIDCBUFFER(pDev);
+ pBuffer = MIDCBUFFER(pDev, pScreen);
pSave = pBuffer->pSave;
pWin = WindowTable[pScreen->myNum];
@@ -617,14 +557,7 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
*/
if (!pSave)
return FALSE;
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
- {
- tossGC(pBuffer->pRestoreGC);
- pBuffer->pRestoreGC = NULL;
- }
- if (!EnsureGC(pBuffer->pRestoreGC, pWin))
- return FALSE;
+
pGC = pBuffer->pRestoreGC;
if (pWin->drawable.serialNumber != pGC->serialNumber)
ValidateGC ((DrawablePtr) pWin, pGC);
@@ -663,14 +596,7 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
(*pGC->ops->CopyArea) ((DrawablePtr) pSave, (DrawablePtr) pWin, pGC,
0, sourcey, -dx, copyh, x + dx, desty);
}
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pSaveGC && pBuffer->pSaveGC->pScreen != pScreen)
- {
- tossGC(pBuffer->pSaveGC);
- pBuffer->pSaveGC = NULL;
- }
- if (!EnsureGC(pBuffer->pSaveGC, pWin))
- return FALSE;
+
pGC = pBuffer->pSaveGC;
if (pSave->drawable.serialNumber != pGC->serialNumber)
ValidateGC ((DrawablePtr) pSave, pGC);
@@ -767,7 +693,7 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
miDCScreenKey);
pWin = WindowTable[pScreen->myNum];
- pBuffer = MIDCBUFFER(pDev);
+ pBuffer = MIDCBUFFER(pDev, pScreen);
pTemp = pBuffer->pTemp;
if (!pTemp ||
@@ -810,15 +736,6 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
#ifdef ARGB_CURSOR
if (pPriv->pPicture)
{
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pTempPicture &&
- pBuffer->pTempPicture->pDrawable &&
- pBuffer->pTempPicture->pDrawable->pScreen != pScreen)
- {
- tossPict(pBuffer->pTempPicture);
- pBuffer->pTempPicture = NULL;
- }
-
if (!EnsurePicture(pBuffer->pTempPicture, &pTemp->drawable, pWin))
return FALSE;
CompositePicture (PictOpOver,
@@ -833,38 +750,12 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
else
#endif
{
- if (!pBuffer->pPixSourceGC)
- {
- pBuffer->pPixSourceGC = CreateGC ((DrawablePtr)pTemp,
- GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
- if (!pBuffer->pPixSourceGC)
- return FALSE;
- }
- if (!pBuffer->pPixMaskGC)
- {
- pBuffer->pPixMaskGC = CreateGC ((DrawablePtr)pTemp,
- GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
- if (!pBuffer->pPixMaskGC)
- return FALSE;
- }
miDCPutBits ((DrawablePtr)pTemp, pPriv,
pBuffer->pPixSourceGC, pBuffer->pPixMaskGC,
dx, dy, pCursor->bits->width, pCursor->bits->height,
source, mask);
}
- /* see comment in miDCPutUpCursor */
- if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
- {
- tossGC(pBuffer->pRestoreGC);
- pBuffer->pRestoreGC = NULL;
- }
- /*
- * copy the temporary pixmap onto the screen
- */
-
- if (!EnsureGC(pBuffer->pRestoreGC, pWin))
- return FALSE;
pGC = pBuffer->pRestoreGC;
if (pWin->drawable.serialNumber != pGC->serialNumber)
ValidateGC ((DrawablePtr) pWin, pGC);
@@ -878,51 +769,105 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
static Bool
miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
{
- miDCBufferPtr pBuffer;
-
- pBuffer = xalloc(sizeof(miDCBufferRec));
- dixSetPrivate(&pDev->devPrivates, miDCSpriteKey, pBuffer);
-
- pBuffer->pSourceGC =
- pBuffer->pMaskGC =
- pBuffer->pSaveGC =
- pBuffer->pRestoreGC =
- pBuffer->pMoveGC =
- pBuffer->pPixSourceGC =
- pBuffer->pPixMaskGC = NULL;
+ miDCBufferPtr pBuffer;
+ WindowPtr pWin;
+ XID gcval = FALSE;
+ int status;
+ int i;
+
+ if (!DevHasCursor(pDev))
+ return TRUE;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+
+ pBuffer = xcalloc(1, sizeof(miDCBufferRec));
+ if (!pBuffer)
+ goto failure;
+
+ dixSetPrivate(&pDev->devPrivates, miDCSpriteKey + pScreen->myNum, pBuffer);
+ pWin = WindowTable[pScreen->myNum];
+
+ pBuffer->pSourceGC = miDCMakeGC(pWin);
+ if (!pBuffer->pSourceGC)
+ goto failure;
+
+ pBuffer->pMaskGC = miDCMakeGC(pWin);
+ if (!pBuffer->pMaskGC)
+ goto failure;
+
+ pBuffer->pSaveGC = miDCMakeGC(pWin);
+ if (!pBuffer->pSaveGC)
+ goto failure;
+
+ pBuffer->pRestoreGC = miDCMakeGC(pWin);
+ if (!pBuffer->pRestoreGC)
+ goto failure;
+
+ pBuffer->pMoveGC = CreateGC ((DrawablePtr)pWin,
+ GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
+ if (!pBuffer->pMoveGC)
+ goto failure;
+
+ pBuffer->pPixSourceGC = CreateGC ((DrawablePtr)pWin,
+ GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
+ if (!pBuffer->pPixSourceGC)
+ goto failure;
+
+ pBuffer->pPixMaskGC = CreateGC ((DrawablePtr)pWin,
+ GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
+ if (!pBuffer->pPixMaskGC)
+ goto failure;
+
#ifdef ARGB_CURSOR
- pBuffer->pRootPicture = NULL;
- pBuffer->pTempPicture = NULL;
+ pBuffer->pRootPicture = NULL;
+ pBuffer->pTempPicture = NULL;
#endif
- pBuffer->pSave = pBuffer->pTemp = NULL;
+
+ // these get (re)allocated lazily depending on the cursor size
+ pBuffer->pSave = pBuffer->pTemp = NULL;
+ }
return TRUE;
+
+failure:
+
+ miDCDeviceCleanup(pDev, pScreen);
+
+ return FALSE;
}
static void
miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
{
miDCBufferPtr pBuffer;
+ int i;
if (DevHasCursor(pDev))
{
- pBuffer = MIDCBUFFER(pDev);
- tossGC (pBuffer->pSourceGC);
- tossGC (pBuffer->pMaskGC);
- tossGC (pBuffer->pSaveGC);
- tossGC (pBuffer->pRestoreGC);
- tossGC (pBuffer->pMoveGC);
- tossGC (pBuffer->pPixSourceGC);
- tossGC (pBuffer->pPixMaskGC);
- tossPix (pBuffer->pSave);
- tossPix (pBuffer->pTemp);
-#ifdef ARGB_CURSOR
-#if 0 /* This has been free()d before */
- tossPict (pScreenPriv->pRootPicture);
-#endif
- tossPict (pBuffer->pTempPicture);
-#endif
- xfree(pBuffer);
- dixSetPrivate(&pDev->devPrivates, miDCSpriteKey, NULL);
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+
+ pBuffer = MIDCBUFFER(pDev, pScreen);
+
+ if (pBuffer)
+ {
+ if (pBuffer->pSourceGC) FreeGC(pBuffer->pSourceGC, (GContext) 0);
+ if (pBuffer->pMaskGC) FreeGC(pBuffer->pMaskGC, (GContext) 0);
+ if (pBuffer->pSaveGC) FreeGC(pBuffer->pSaveGC, (GContext) 0);
+ if (pBuffer->pRestoreGC) FreeGC(pBuffer->pRestoreGC, (GContext) 0);
+ if (pBuffer->pMoveGC) FreeGC(pBuffer->pMoveGC, (GContext) 0);
+ if (pBuffer->pPixSourceGC) FreeGC(pBuffer->pPixSourceGC, (GContext) 0);
+ if (pBuffer->pPixMaskGC) FreeGC(pBuffer->pPixMaskGC, (GContext) 0);
+
+ if (pBuffer->pSave) (*pScreen->DestroyPixmap)(pBuffer->pSave);
+ if (pBuffer->pTemp) (*pScreen->DestroyPixmap)(pBuffer->pTemp);
+
+ xfree(pBuffer);
+ dixSetPrivate(&pDev->devPrivates, miDCSpriteKey + pScreen->myNum, NULL);
+ }
+ }
}
}