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;
|
|
|
|
|
2010-04-27 02:22:21 +02:00
|
|
|
DevPrivateKeyRec xf86CursorScreenKeyRec;
|
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);
|
|
|
|
|
Rework symbol visibility for easier maintenance
Save in a few special cases, _X_EXPORT should not be used in C source
files. Instead, it should be used in headers, and the proper C source
include that header. Some special cases are symbols that need to be
shared between modules, but not expected to be used by external drivers,
and symbols that are accessible via LoaderSymbol/dlopen.
This patch also adds conditionally some new sdk header files, depending
on extensions enabled. These files were added to match pattern for
other extensions/modules, that is, have the headers "deciding" symbol
visibility in the sdk. These headers are:
o Xext/panoramiXsrv.h, Xext/panoramiX.h
o fbpict.h (unconditionally)
o vidmodeproc.h
o mioverlay.h (unconditionally, used only by xaa)
o xfixes.h (unconditionally, symbols required by dri2)
LoaderSymbol and similar functions now don't have different prototypes,
in loaderProcs.h and xf86Module.h, so that both headers can be included,
without the need of defining IN_LOADER.
xf86NewInputDevice() device prototype readded to xf86Xinput.h, but
not exported (and with a comment about it).
2008-12-03 08:43:34 +01:00
|
|
|
Bool
|
2003-11-14 17:48:57 +01:00
|
|
|
xf86InitCursor(
|
|
|
|
ScreenPtr pScreen,
|
|
|
|
xf86CursorInfoPtr infoPtr
|
|
|
|
)
|
|
|
|
{
|
|
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
|
|
|
xf86CursorScreenPtr ScreenPriv;
|
|
|
|
miPointerScreenPtr PointPriv;
|
|
|
|
|
|
|
|
if (!xf86InitHardwareCursor(pScreen, infoPtr))
|
|
|
|
return FALSE;
|
|
|
|
|
2010-04-27 02:22:21 +02:00
|
|
|
if (!dixRegisterPrivateKey(&xf86CursorScreenKeyRec, PRIVATE_SCREEN, 0))
|
|
|
|
return FALSE;
|
|
|
|
|
2010-05-05 20:44:06 +02:00
|
|
|
ScreenPriv = calloc(1, sizeof(xf86CursorScreenRec));
|
2003-11-14 17:48:57 +01:00
|
|
|
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);
|
|
|
|
|
2010-03-12 16:53:30 +01:00
|
|
|
if (ScreenPriv->CurrentCursor)
|
|
|
|
FreeCursor(ScreenPriv->CurrentCursor, None);
|
|
|
|
|
2003-11-14 17:48:57 +01:00
|
|
|
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;
|
|
|
|
|
2010-05-05 20:44:06 +02:00
|
|
|
free(ScreenPriv->transparentData);
|
|
|
|
free(ScreenPriv);
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
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);
|
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;
|
2010-06-04 04:00:53 +02:00
|
|
|
miPointerSetWaitForUpdate(pScreen, FALSE); /* Force cursor repaint */
|
2003-11-14 17:48:57 +01:00
|
|
|
|
|
|
|
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)
|
2010-09-17 02:27:59 +02:00
|
|
|
dixSetScreenPrivate(&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) {
|
2010-09-17 02:27:59 +02:00
|
|
|
free(dixLookupScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen));
|
|
|
|
dixSetScreenPrivate(&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
|
|
|
|
|
|
|
if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
|
2009-03-25 03:55:42 +01:00
|
|
|
if (ScreenPriv->SWCursor ||
|
2009-07-03 01:52:04 +02:00
|
|
|
!(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
|
2009-03-25 03:55:42 +01:00
|
|
|
(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
|
2008-05-14 19:49:09 +02:00
|
|
|
else if (ScreenPriv->isUp) {
|
|
|
|
xf86SetCursor(pScreen, NullCursor, x, y);
|
|
|
|
ScreenPriv->isUp = FALSE;
|
2008-05-16 12:19:29 +02:00
|
|
|
}
|
2010-04-30 21:18:09 +02:00
|
|
|
if (ScreenPriv->CurrentCursor)
|
|
|
|
FreeCursor(ScreenPriv->CurrentCursor, None);
|
2010-04-02 21:48:21 +02:00
|
|
|
ScreenPriv->CurrentCursor = NullCursor;
|
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. */
|
2011-02-18 02:55:51 +01:00
|
|
|
if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer)
|
2008-05-06 10:22:15 +02:00
|
|
|
{
|
2010-03-12 16:53:30 +01:00
|
|
|
pCurs->refcnt++;
|
|
|
|
if (ScreenPriv->CurrentCursor)
|
|
|
|
FreeCursor(ScreenPriv->CurrentCursor, None);
|
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;
|
2010-06-04 04:00:53 +02:00
|
|
|
|
|
|
|
miPointerSetWaitForUpdate(pScreen, !infoPtr->pScrn->silkenMouse);
|
2008-05-14 19:49:09 +02:00
|
|
|
return;
|
|
|
|
}
|
2008-05-06 07:21:23 +02:00
|
|
|
|
2010-06-04 04:00:53 +02:00
|
|
|
miPointerSetWaitForUpdate(pScreen, 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 */
|
2011-02-18 02:55:51 +01:00
|
|
|
if (GetMaster(pDev, MASTER_POINTER) == 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
|
|
|
}
|
|
|
|
|
Rework symbol visibility for easier maintenance
Save in a few special cases, _X_EXPORT should not be used in C source
files. Instead, it should be used in headers, and the proper C source
include that header. Some special cases are symbols that need to be
shared between modules, but not expected to be used by external drivers,
and symbols that are accessible via LoaderSymbol/dlopen.
This patch also adds conditionally some new sdk header files, depending
on extensions enabled. These files were added to match pattern for
other extensions/modules, that is, have the headers "deciding" symbol
visibility in the sdk. These headers are:
o Xext/panoramiXsrv.h, Xext/panoramiX.h
o fbpict.h (unconditionally)
o vidmodeproc.h
o mioverlay.h (unconditionally, used only by xaa)
o xfixes.h (unconditionally, symbols required by dri2)
LoaderSymbol and similar functions now don't have different prototypes,
in loaderProcs.h and xf86Module.h, so that both headers can be included,
without the need of defining IN_LOADER.
xf86NewInputDevice() device prototype readded to xf86Xinput.h, but
not exported (and with a comment about it).
2008-12-03 08:43:34 +01:00
|
|
|
void
|
2003-11-14 17:48:57 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Rework symbol visibility for easier maintenance
Save in a few special cases, _X_EXPORT should not be used in C source
files. Instead, it should be used in headers, and the proper C source
include that header. Some special cases are symbols that need to be
shared between modules, but not expected to be used by external drivers,
and symbols that are accessible via LoaderSymbol/dlopen.
This patch also adds conditionally some new sdk header files, depending
on extensions enabled. These files were added to match pattern for
other extensions/modules, that is, have the headers "deciding" symbol
visibility in the sdk. These headers are:
o Xext/panoramiXsrv.h, Xext/panoramiX.h
o fbpict.h (unconditionally)
o vidmodeproc.h
o mioverlay.h (unconditionally, used only by xaa)
o xfixes.h (unconditionally, symbols required by dri2)
LoaderSymbol and similar functions now don't have different prototypes,
in loaderProcs.h and xf86Module.h, so that both headers can be included,
without the need of defining IN_LOADER.
xf86NewInputDevice() device prototype readded to xf86Xinput.h, but
not exported (and with a comment about it).
2008-12-03 08:43:34 +01:00
|
|
|
xf86CursorInfoPtr
|
2003-11-14 17:48:57 +01:00
|
|
|
xf86CreateCursorInfoRec(void)
|
|
|
|
{
|
2010-05-05 20:44:06 +02:00
|
|
|
return calloc(1, sizeof(xf86CursorInfoRec));
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
|
|
|
|
Rework symbol visibility for easier maintenance
Save in a few special cases, _X_EXPORT should not be used in C source
files. Instead, it should be used in headers, and the proper C source
include that header. Some special cases are symbols that need to be
shared between modules, but not expected to be used by external drivers,
and symbols that are accessible via LoaderSymbol/dlopen.
This patch also adds conditionally some new sdk header files, depending
on extensions enabled. These files were added to match pattern for
other extensions/modules, that is, have the headers "deciding" symbol
visibility in the sdk. These headers are:
o Xext/panoramiXsrv.h, Xext/panoramiX.h
o fbpict.h (unconditionally)
o vidmodeproc.h
o mioverlay.h (unconditionally, used only by xaa)
o xfixes.h (unconditionally, symbols required by dri2)
LoaderSymbol and similar functions now don't have different prototypes,
in loaderProcs.h and xf86Module.h, so that both headers can be included,
without the need of defining IN_LOADER.
xf86NewInputDevice() device prototype readded to xf86Xinput.h, but
not exported (and with a comment about it).
2008-12-03 08:43:34 +01:00
|
|
|
void
|
2003-11-14 17:48:57 +01:00
|
|
|
xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
|
|
|
|
{
|
2010-05-05 20:44:06 +02:00
|
|
|
free(infoPtr);
|
2003-11-14 17:48:57 +01:00
|
|
|
}
|
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);
|
|
|
|
}
|
|
|
|
|