summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-29 15:33:32 +0100
committerDave Airlie <airlied@redhat.com>2012-05-29 15:33:32 +0100
commitcbe403acc508905e6db0d8de5a7a4dbcacf34d2f (patch)
treea5b68c6a6ece1c3a06750feae228322d406c8c90
parent6d33d6151b568021960dbbab0d72b468010f2977 (diff)
mipointer: iterate across cursors on all slave screens as wellplatform-usb-hotplug-101
-rw-r--r--mi/mipointer.c85
1 files changed, 72 insertions, 13 deletions
diff --git a/mi/mipointer.c b/mi/mipointer.c
index a56838ead..781a9941e 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -166,18 +166,18 @@ miPointerCloseScreen(ScreenPtr pScreen)
}
/*
- * DIX/DDX interface routines
+ * wrappers for slave screens
*/
static Bool
-miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+miPointerRealizeCursor_screen(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
{
SetupScreen(pScreen);
return (*pScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCursor);
}
static Bool
-miPointerUnrealizeCursor(DeviceIntPtr pDev,
+miPointerUnrealizeCursor_screen(DeviceIntPtr pDev,
ScreenPtr pScreen, CursorPtr pCursor)
{
SetupScreen(pScreen);
@@ -186,6 +186,67 @@ miPointerUnrealizeCursor(DeviceIntPtr pDev,
}
static Bool
+miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ Bool ret;
+ ScreenPtr iter;
+
+ ret = miPointerRealizeCursor_screen(pDev, pScreen, pCursor);
+ xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head)
+ ret = miPointerRealizeCursor_screen(pDev, iter, pCursor);
+ return ret;
+}
+
+static Bool
+miPointerUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
+{
+ Bool ret;
+ ScreenPtr iter;
+
+ ret = miPointerUnrealizeCursor_screen(pDev, pScreen, pCursor);
+ xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head)
+ ret = miPointerUnrealizeCursor_screen(pDev, iter, pCursor);
+ return ret;
+}
+
+static void
+DoSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
+ int x, int y)
+{
+ ScreenPtr iter;
+ miPointerScreenPtr pScreenPriv;
+
+ pScreenPriv = GetScreenPrivate(pScreen);
+ (*pScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, pCurs, x, y);
+
+ xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ pScreenPriv = GetScreenPrivate(iter);
+ (*pScreenPriv->spriteFuncs->SetCursor)(pDev, iter, pCurs, x, y);
+ }
+}
+
+static void
+DoMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+ ScreenPtr iter;
+ miPointerScreenPtr pScreenPriv;
+
+ pScreenPriv = GetScreenPrivate(pScreen);
+ (*pScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
+
+ xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
+ pScreenPriv = GetScreenPrivate(iter);
+ (*pScreenPriv->spriteFuncs->MoveCursor)(pDev, iter, x, y);
+ }
+}
+
+
+/*
+ * DIX/DDX interface routines
+ */
+
+
+static Bool
miPointerDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
{
miPointerPtr pPointer;
@@ -424,16 +485,14 @@ miPointerUpdateSprite(DeviceIntPtr pDev)
miPointerScreenPtr pOldPriv;
pOldPriv = GetScreenPrivate(pPointer->pSpriteScreen);
- if (pPointer->pCursor) {
- (*pOldPriv->spriteFuncs->SetCursor)
- (pDev, pPointer->pSpriteScreen, NullCursor, 0, 0);
- }
+ if (pPointer->pCursor)
+ DoSetCursor(pDev, pPointer->pSpriteScreen, NullCursor, 0, 0);
+
(*pOldPriv->screenFuncs->CrossScreen) (pPointer->pSpriteScreen,
FALSE);
}
(*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE);
- (*pScreenPriv->spriteFuncs->SetCursor)
- (pDev, pScreen, pPointer->pCursor, x, y);
+ DoSetCursor(pDev, pScreen, pPointer->pCursor, x, y);
pPointer->devx = x;
pPointer->devy = y;
pPointer->pSpriteCursor = pPointer->pCursor;
@@ -447,8 +506,8 @@ miPointerUpdateSprite(DeviceIntPtr pDev)
if (!pCursor ||
(pCursor->bits->emptyMask && !pScreenPriv->showTransparent))
pCursor = NullCursor;
- (*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y);
-
+ DoSetCursor(pDev, pScreen, pCursor, x, y);
+
pPointer->devx = x;
pPointer->devy = y;
pPointer->pSpriteCursor = pPointer->pCursor;
@@ -457,7 +516,7 @@ miPointerUpdateSprite(DeviceIntPtr pDev)
pPointer->devx = x;
pPointer->devy = y;
if (pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
- (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+ DoMoveCursor(pDev, pScreen, x, y);
}
}
@@ -541,7 +600,7 @@ miPointerMoveNoEvent(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
pPointer->devx = x;
pPointer->devy = y;
if (pPointer->pCursor && !pPointer->pCursor->bits->emptyMask)
- (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+ DoMoveCursor(pDev, pScreen, x, y);
}
pPointer->x = x;