2003-11-14 17:48:57 +01:00
|
|
|
|
2005-07-03 09:02:09 +02:00
|
|
|
#ifdef HAVE_XORG_CONFIG_H
|
|
|
|
#include <xorg-config.h>
|
|
|
|
#endif
|
|
|
|
|
2003-11-14 17:48:57 +01:00
|
|
|
#include "xf86.h"
|
|
|
|
#include "xf86CursorPriv.h"
|
|
|
|
#include "colormapst.h"
|
|
|
|
#include "cursorstr.h"
|
|
|
|
|
2006-11-17 05:40:37 +01:00
|
|
|
/* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for
|
|
|
|
* MPX.
|
|
|
|
* inputInfo is needed to pass the core pointer as the default argument into
|
|
|
|
* the cursor functions.
|
2008-01-03 07:34:54 +01:00
|
|
|
*
|
2006-11-17 05:40:37 +01:00
|
|
|
* Externing inputInfo is not the nice way to do it but it works.
|
|
|
|
*/
|
|
|
|
#include "inputstr.h"
|
|
|
|
extern InputInfo inputInfo;
|
|
|
|
|
2008-08-29 00:05:40 +02:00
|
|
|
static int xf86CursorScreenKeyIndex;
|
|
|
|
DevPrivateKey xf86CursorScreenKey = &xf86CursorScreenKeyIndex;
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
/* sprite functions */
|
|
|
|
|
2006-11-17 05:40:37 +01:00
|
|
|
static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
|
|
|
|
static Bool xf86CursorUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
|
|
|
|
static void xf86CursorSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
|
|
|
|
static void xf86CursorMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
|
2008-05-06 04:20:20 +02:00
|
|
|
static Bool xf86DeviceCursorInitialize(DeviceIntPtr, ScreenPtr);
|
|
|
|
static void xf86DeviceCursorCleanup(DeviceIntPtr, ScreenPtr);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
|
|
|
|
xf86CursorRealizeCursor,
|
|
|
|
xf86CursorUnrealizeCursor,
|
|
|
|
xf86CursorSetCursor,
|
2008-05-06 04:20:20 +02:00
|
|
|
xf86CursorMoveCursor,
|
|
|
|
xf86DeviceCursorInitialize,
|
2008-05-12 12:44:05 +02:00
|
|
|
xf86DeviceCursorCleanup
|
2003-11-14 17:48:57 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Screen functions */
|
|
|
|
|
|
|
|
static void xf86CursorInstallColormap(ColormapPtr);
|
2006-11-23 07:45:14 +01:00
|
|
|
static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr, Bool);
|
2003-11-14 17:48:57 +01:00
|
|
|
static Bool xf86CursorCloseScreen(int, ScreenPtr);
|
|
|
|
static void xf86CursorQueryBestSize(int, unsigned short*, unsigned short*,
|
|
|
|
ScreenPtr);
|
|
|
|
|
|
|
|
/* ScrnInfoRec functions */
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
static void xf86CursorEnableDisableFBAccess(int, Bool);
|
2003-11-14 17:48:57 +01:00
|
|
|
static Bool xf86CursorSwitchMode(int, DisplayModePtr,int);
|
|
|
|
|
|
|
|
Bool
|
|
|
|
xf86InitCursor(
|
|
|
|
ScreenPtr pScreen,
|
|
|
|
xf86CursorInfoPtr infoPtr
|
|
|
|
)
|
|
|
|
{
|
|
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
|
|
|
xf86CursorScreenPtr ScreenPriv;
|
|
|
|
miPointerScreenPtr PointPriv;
|
|
|
|
|
|
|
|
if (!xf86InitHardwareCursor(pScreen, infoPtr))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
ScreenPriv = xcalloc(1, sizeof(xf86CursorScreenRec));
|
|
|
|
if (!ScreenPriv)
|
|
|
|
return FALSE;
|
|
|
|
|
2007-08-28 15:28:25 +02:00
|
|
|
dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, ScreenPriv);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
ScreenPriv->SWCursor = TRUE;
|
|
|
|
ScreenPriv->isUp = FALSE;
|
|
|
|
ScreenPriv->CurrentCursor = NULL;
|
|
|
|
ScreenPriv->CursorInfoPtr = infoPtr;
|
|
|
|
ScreenPriv->PalettedCursor = FALSE;
|
|
|
|
ScreenPriv->pInstalledMap = NULL;
|
|
|
|
|
|
|
|
ScreenPriv->CloseScreen = pScreen->CloseScreen;
|
|
|
|
pScreen->CloseScreen = xf86CursorCloseScreen;
|
|
|
|
ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
|
|
|
|
pScreen->QueryBestSize = xf86CursorQueryBestSize;
|
|
|
|
ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
|
|
|
|
pScreen->RecolorCursor = xf86CursorRecolorCursor;
|
|
|
|
|
|
|
|
if ((infoPtr->pScrn->bitsPerPixel == 8) &&
|
|
|
|
!(infoPtr->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP)) {
|
|
|
|
ScreenPriv->InstallColormap = pScreen->InstallColormap;
|
|
|
|
pScreen->InstallColormap = xf86CursorInstallColormap;
|
|
|
|
ScreenPriv->PalettedCursor = TRUE;
|
|
|
|
}
|
|
|
|
|
2007-08-28 15:28:25 +02:00
|
|
|
PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
ScreenPriv->showTransparent = PointPriv->showTransparent;
|
|
|
|
if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT)
|
|
|
|
PointPriv->showTransparent = TRUE;
|
|
|
|
else
|
|
|
|
PointPriv->showTransparent = FALSE;
|
|
|
|
ScreenPriv->spriteFuncs = PointPriv->spriteFuncs;
|
|
|
|
PointPriv->spriteFuncs = &xf86CursorSpriteFuncs;
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
ScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
|
2003-11-14 17:48:57 +01:00
|
|
|
ScreenPriv->SwitchMode = pScrn->SwitchMode;
|
|
|
|
|
|
|
|
ScreenPriv->ForceHWCursorCount = 0;
|
|
|
|
ScreenPriv->HWCursorForced = FALSE;
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
pScrn->EnableDisableFBAccess = xf86CursorEnableDisableFBAccess;
|
2003-11-14 17:48:57 +01:00
|
|
|
if (pScrn->SwitchMode)
|
|
|
|
pScrn->SwitchMode = xf86CursorSwitchMode;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***** Screen functions *****/
|
|
|
|
|
|
|
|
static Bool
|
|
|
|
xf86CursorCloseScreen(int i, ScreenPtr pScreen)
|
|
|
|
{
|
|
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
2007-08-28 15:28:25 +02:00
|
|
|
miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, miPointerScreenKey);
|
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (ScreenPriv->isUp && pScrn->vtSema)
|
|
|
|
xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
|
|
|
|
|
|
|
|
pScreen->CloseScreen = ScreenPriv->CloseScreen;
|
|
|
|
pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
|
|
|
|
pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
|
|
|
|
if (ScreenPriv->InstallColormap)
|
|
|
|
pScreen->InstallColormap = ScreenPriv->InstallColormap;
|
|
|
|
|
|
|
|
PointPriv->spriteFuncs = ScreenPriv->spriteFuncs;
|
|
|
|
PointPriv->showTransparent = ScreenPriv->showTransparent;
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
pScrn->EnableDisableFBAccess = ScreenPriv->EnableDisableFBAccess;
|
2003-11-14 17:48:57 +01:00
|
|
|
pScrn->SwitchMode = ScreenPriv->SwitchMode;
|
|
|
|
|
|
|
|
xfree(ScreenPriv->transparentData);
|
|
|
|
xfree(ScreenPriv);
|
|
|
|
|
|
|
|
return (*pScreen->CloseScreen)(i, pScreen);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
xf86CursorQueryBestSize(
|
|
|
|
int class,
|
|
|
|
unsigned short *width,
|
|
|
|
unsigned short *height,
|
|
|
|
ScreenPtr pScreen)
|
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (class == CursorShape) {
|
|
|
|
if(*width > ScreenPriv->CursorInfoPtr->MaxWidth)
|
|
|
|
*width = ScreenPriv->CursorInfoPtr->MaxWidth;
|
|
|
|
if(*height > ScreenPriv->CursorInfoPtr->MaxHeight)
|
|
|
|
*height = ScreenPriv->CursorInfoPtr->MaxHeight;
|
|
|
|
} else
|
|
|
|
(*ScreenPriv->QueryBestSize)(class, width, height, pScreen);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
xf86CursorInstallColormap(ColormapPtr pMap)
|
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pMap->pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
ScreenPriv->pInstalledMap = pMap;
|
|
|
|
|
|
|
|
(*ScreenPriv->InstallColormap)(pMap);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
xf86CursorRecolorCursor(
|
2006-11-23 07:45:14 +01:00
|
|
|
DeviceIntPtr pDev,
|
2003-11-14 17:48:57 +01:00
|
|
|
ScreenPtr pScreen,
|
|
|
|
CursorPtr pCurs,
|
|
|
|
Bool displayed)
|
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (!displayed)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (ScreenPriv->SWCursor)
|
2006-11-23 07:45:14 +01:00
|
|
|
(*ScreenPriv->RecolorCursor)(pDev, pScreen, pCurs, displayed);
|
2003-11-14 17:48:57 +01:00
|
|
|
else
|
|
|
|
xf86RecolorCursor(pScreen, pCurs, displayed);
|
|
|
|
}
|
|
|
|
|
|
|
|
/***** ScrnInfoRec functions *********/
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
static void
|
|
|
|
xf86CursorEnableDisableFBAccess(
|
|
|
|
int index,
|
|
|
|
Bool enable)
|
|
|
|
{
|
2006-11-17 05:40:37 +01:00
|
|
|
DeviceIntPtr pDev = inputInfo.pointer;
|
|
|
|
|
2006-01-23 23:01:34 +01:00
|
|
|
ScreenPtr pScreen = screenInfo.screens[index];
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2006-01-23 23:01:34 +01:00
|
|
|
|
|
|
|
if (!enable && ScreenPriv->CurrentCursor != NullCursor) {
|
2007-03-05 03:07:17 +01:00
|
|
|
CursorPtr currentCursor = ScreenPriv->CurrentCursor;
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorSetCursor(pDev, pScreen, NullCursor, ScreenPriv->x,
|
|
|
|
ScreenPriv->y);
|
|
|
|
ScreenPriv->isUp = FALSE;
|
2006-01-23 23:01:34 +01:00
|
|
|
ScreenPriv->SWCursor = TRUE;
|
2007-02-16 05:36:20 +01:00
|
|
|
ScreenPriv->SavedCursor = currentCursor;
|
2006-01-23 23:01:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ScreenPriv->EnableDisableFBAccess)
|
|
|
|
(*ScreenPriv->EnableDisableFBAccess)(index, enable);
|
|
|
|
|
|
|
|
if (enable && ScreenPriv->SavedCursor)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Re-set current cursor so drivers can react to FB access having been
|
|
|
|
* temporarily disabled.
|
|
|
|
*/
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorSetCursor(pDev, pScreen, ScreenPriv->SavedCursor,
|
2006-01-23 23:01:34 +01:00
|
|
|
ScreenPriv->x, ScreenPriv->y);
|
|
|
|
ScreenPriv->SavedCursor = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-11-14 17:48:57 +01:00
|
|
|
static Bool
|
|
|
|
xf86CursorSwitchMode(int index, DisplayModePtr mode, int flags)
|
|
|
|
{
|
|
|
|
Bool ret;
|
|
|
|
ScreenPtr pScreen = screenInfo.screens[index];
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
|
|
|
miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, miPointerScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (ScreenPriv->isUp) {
|
|
|
|
xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
|
|
|
|
ScreenPriv->isUp = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = (*ScreenPriv->SwitchMode)(index, mode, flags);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cannot restore cursor here because the new frame[XY][01] haven't been
|
|
|
|
* calculated yet. However, because the hardware cursor was removed above,
|
|
|
|
* ensure the cursor is repainted by miPointerWarpCursor().
|
|
|
|
*/
|
|
|
|
ScreenPriv->CursorToRestore = ScreenPriv->CurrentCursor;
|
|
|
|
PointPriv->waitForUpdate = FALSE; /* Force cursor repaint */
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/****** miPointerSpriteFunctions *******/
|
|
|
|
|
|
|
|
static Bool
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
|
2003-11-14 17:48:57 +01:00
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (pCurs->refcnt <= 1)
|
2008-08-28 01:27:13 +02:00
|
|
|
dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2006-11-17 05:40:37 +01:00
|
|
|
return (*ScreenPriv->spriteFuncs->RealizeCursor)(pDev, pScreen, pCurs);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static Bool
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
|
|
|
|
CursorPtr pCurs)
|
2003-11-14 17:48:57 +01:00
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (pCurs->refcnt <= 1) {
|
2008-08-28 01:27:13 +02:00
|
|
|
xfree(dixLookupPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen)));
|
|
|
|
dixSetPrivate(&pCurs->devPrivates, CursorScreenKey(pScreen), NULL);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
2006-11-17 05:40:37 +01:00
|
|
|
return (*ScreenPriv->spriteFuncs->UnrealizeCursor)(pDev, pScreen, pCurs);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
|
|
|
|
int x, int y)
|
2003-11-14 17:48:57 +01:00
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
2008-05-14 19:49:09 +02:00
|
|
|
miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, miPointerScreenKey);
|
|
|
|
|
|
|
|
|
|
|
|
if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
|
2008-05-16 12:19:29 +02:00
|
|
|
if (ScreenPriv->SWCursor || pDev != inputInfo.pointer)
|
2008-05-14 19:49:09 +02:00
|
|
|
(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
|
|
|
|
x, y);
|
|
|
|
else if (ScreenPriv->isUp) {
|
|
|
|
xf86SetCursor(pScreen, NullCursor, x, y);
|
|
|
|
ScreenPriv->isUp = FALSE;
|
2008-05-16 12:19:29 +02:00
|
|
|
}
|
|
|
|
return;
|
2008-05-14 19:49:09 +02:00
|
|
|
}
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-06 10:22:15 +02:00
|
|
|
/* only update for VCP, otherwise we get cursor jumps when removing a
|
|
|
|
sprite. The second cursor is never HW rendered anyway. */
|
2008-05-14 19:49:09 +02:00
|
|
|
if (pDev == inputInfo.pointer)
|
2008-05-06 10:22:15 +02:00
|
|
|
{
|
|
|
|
ScreenPriv->CurrentCursor = pCurs;
|
|
|
|
ScreenPriv->x = x;
|
|
|
|
ScreenPriv->y = y;
|
|
|
|
ScreenPriv->CursorToRestore = NULL;
|
2008-05-14 19:49:09 +02:00
|
|
|
ScreenPriv->HotX = pCurs->bits->xhot;
|
|
|
|
ScreenPriv->HotY = pCurs->bits->yhot;
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
if (!infoPtr->pScrn->vtSema)
|
|
|
|
ScreenPriv->SavedCursor = pCurs;
|
2006-02-16 07:52:12 +01:00
|
|
|
|
2008-05-06 07:21:23 +02:00
|
|
|
if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
|
2003-11-14 17:48:57 +01:00
|
|
|
#ifdef ARGB_CURSOR
|
2008-05-06 07:21:23 +02:00
|
|
|
pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
|
|
|
|
(*infoPtr->UseHWCursorARGB) (pScreen, pCurs) ) || (
|
|
|
|
pCurs->bits->argb == 0 &&
|
2003-11-14 17:48:57 +01:00
|
|
|
#endif
|
2008-05-06 07:21:23 +02:00
|
|
|
(pCurs->bits->height <= infoPtr->MaxHeight) &&
|
|
|
|
(pCurs->bits->width <= infoPtr->MaxWidth) &&
|
2008-05-14 19:49:09 +02:00
|
|
|
(!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
|
2008-05-06 07:21:23 +02:00
|
|
|
{
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-14 19:49:09 +02:00
|
|
|
if (ScreenPriv->SWCursor) /* remove the SW cursor */
|
|
|
|
(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-14 19:49:09 +02:00
|
|
|
xf86SetCursor(pScreen, pCurs, x, y);
|
|
|
|
ScreenPriv->SWCursor = FALSE;
|
|
|
|
ScreenPriv->isUp = TRUE;
|
|
|
|
PointPriv->waitForUpdate = !infoPtr->pScrn->silkenMouse;
|
|
|
|
return;
|
|
|
|
}
|
2008-05-06 07:21:23 +02:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
PointPriv->waitForUpdate = TRUE;
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
if (ScreenPriv->isUp) {
|
|
|
|
/* Remove the HW cursor, or make it transparent */
|
|
|
|
if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
|
|
|
|
xf86SetTransparentCursor(pScreen);
|
|
|
|
} else {
|
|
|
|
xf86SetCursor(pScreen, NullCursor, x, y);
|
|
|
|
ScreenPriv->isUp = FALSE;
|
|
|
|
}
|
|
|
|
}
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
if (!ScreenPriv->SWCursor)
|
|
|
|
ScreenPriv->SWCursor = TRUE;
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
}
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
|
|
|
|
pCurs = NullCursor;
|
2008-05-06 07:21:23 +02:00
|
|
|
|
2006-11-17 05:40:37 +01:00
|
|
|
(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, pCurs, x, y);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
|
2003-11-14 17:48:57 +01:00
|
|
|
{
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-06 10:22:15 +02:00
|
|
|
/* only update coordinate state for first sprite, otherwise we get jumps
|
|
|
|
when removing a sprite. The second sprite is never HW rendered anyway */
|
|
|
|
if (pDev == inputInfo.pointer ||
|
2008-06-23 22:18:20 +02:00
|
|
|
(!pDev->isMaster && pDev->u.master == inputInfo.pointer))
|
2008-05-06 10:22:15 +02:00
|
|
|
{
|
|
|
|
ScreenPriv->x = x;
|
|
|
|
ScreenPriv->y = y;
|
2003-11-14 17:48:57 +01:00
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
if (ScreenPriv->CursorToRestore)
|
|
|
|
xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
|
|
|
|
else if (ScreenPriv->SWCursor)
|
|
|
|
(*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
|
|
|
|
else if (ScreenPriv->isUp)
|
|
|
|
xf86MoveCursor(pScreen, x, y);
|
|
|
|
} else
|
|
|
|
(*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
xf86ForceHWCursor (ScreenPtr pScreen, Bool on)
|
|
|
|
{
|
2006-11-17 05:40:37 +01:00
|
|
|
DeviceIntPtr pDev = inputInfo.pointer;
|
2007-08-28 15:28:25 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
if (on)
|
|
|
|
{
|
|
|
|
if (ScreenPriv->ForceHWCursorCount++ == 0)
|
|
|
|
{
|
|
|
|
if (ScreenPriv->SWCursor && ScreenPriv->CurrentCursor)
|
|
|
|
{
|
|
|
|
ScreenPriv->HWCursorForced = TRUE;
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
|
2003-11-14 17:48:57 +01:00
|
|
|
ScreenPriv->x, ScreenPriv->y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ScreenPriv->HWCursorForced = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (--ScreenPriv->ForceHWCursorCount == 0)
|
|
|
|
{
|
|
|
|
if (ScreenPriv->HWCursorForced && ScreenPriv->CurrentCursor)
|
2006-11-17 05:40:37 +01:00
|
|
|
xf86CursorSetCursor (pDev, pScreen, ScreenPriv->CurrentCursor,
|
2003-11-14 17:48:57 +01:00
|
|
|
ScreenPriv->x, ScreenPriv->y);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
xf86CursorInfoPtr
|
|
|
|
xf86CreateCursorInfoRec(void)
|
|
|
|
{
|
|
|
|
return xcalloc(1, sizeof(xf86CursorInfoRec));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
|
|
|
|
{
|
|
|
|
xfree(infoPtr);
|
|
|
|
}
|
2008-05-06 04:20:20 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* New cursor has been created. Do your initalizations here.
|
|
|
|
*/
|
|
|
|
static Bool
|
|
|
|
xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
|
|
|
|
{
|
2008-05-06 10:22:15 +02:00
|
|
|
int ret;
|
2008-05-06 04:20:20 +02:00
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
|
|
|
|
2008-05-06 10:22:15 +02:00
|
|
|
/* Init SW cursor */
|
|
|
|
ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
|
|
|
|
|
|
|
|
return ret;
|
2008-05-06 04:20:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cursor has been removed. Clean up after yourself.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
|
|
|
|
{
|
|
|
|
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
|
|
|
|
&pScreen->devPrivates, xf86CursorScreenKey);
|
|
|
|
|
2008-05-16 12:19:29 +02:00
|
|
|
/* Clean up SW cursor */
|
2008-05-06 04:20:20 +02:00
|
|
|
(*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
|
|
|
|
}
|
|
|
|
|