xserver: Branch 'mpx' - 7 commits
Peter Hutterer
whot at kemper.freedesktop.org
Wed May 21 04:59:48 PDT 2008
hw/xfree86/ramdac/xf86Cursor.c | 135 +++++++++++++++--------------------------
mi/mipointer.c | 6 +
2 files changed, 55 insertions(+), 86 deletions(-)
New commits:
commit 7509fb498c02fe1cebe4139612b8871ec877c130
Merge: 2ae3bed... dfb7de6...
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Wed May 21 16:25:35 2008 +0930
Merge branch 'hwcursor' into mpx
commit dfb7de6571345061d1cd88ab915064fc376529fd
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Fri May 16 20:56:04 2008 +0930
mi: don't call from miPointerMoved into the spriteFuncs for anything but VCP.
Calling ->MoveCursor for anything but the HW-rendered VCP causes the
SW-rendered cursor routines to be started, including mallocs, etc. Since
miPointerMoved is called during SIGIO, this is a bad idea.
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 484947d..6f39bcb 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -530,7 +530,11 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
pPointer = MIPOINTER(pDev);
- if (pDev && pDev->coreEvents
+ /* Hack: We mustn't call into ->MoveCursor for anything but the
+ * VCP, as this may cause a non-HW rendered cursor to be rendered during
+ * SIGIO. This again leads to allocs during SIGIO which leads to SIGABRT.
+ */
+ if ((pDev == inputInfo.pointer || (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
&& !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
{
pPointer->devx = x;
commit f611719edce2ae51dca8e53947a3938b53c20b00
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Fri May 16 19:49:29 2008 +0930
xfree86: always render first cursor in HW, all others in SW.
diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 50f8fb7..7695962 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -20,8 +20,6 @@ extern InputInfo inputInfo;
DevPrivateKey xf86CursorScreenKey = &xf86CursorScreenKey;
-#define XF86_FORCE_SW_CURSOR (1 << 7)
-
/* sprite functions */
static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
@@ -304,14 +302,14 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
- if (ScreenPriv->SWCursor)
+ if (ScreenPriv->SWCursor || pDev != inputInfo.pointer)
(*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
x, y);
else if (ScreenPriv->isUp) {
xf86SetCursor(pScreen, NullCursor, x, y);
ScreenPriv->isUp = FALSE;
- }
- return;
+ }
+ return;
}
/* only update for VCP, otherwise we get cursor jumps when removing a
@@ -324,13 +322,10 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
ScreenPriv->CursorToRestore = NULL;
ScreenPriv->HotX = pCurs->bits->xhot;
ScreenPriv->HotY = pCurs->bits->yhot;
- }
- if (!infoPtr->pScrn->vtSema)
- ScreenPriv->SavedCursor = pCurs;
+ if (!infoPtr->pScrn->vtSema)
+ ScreenPriv->SavedCursor = pCurs;
- if (!(ScreenPriv->SWCursor & XF86_FORCE_SW_CURSOR))
- {
if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
#ifdef ARGB_CURSOR
pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
@@ -352,22 +347,22 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
return;
}
- }
+ PointPriv->waitForUpdate = TRUE;
- PointPriv->waitForUpdate = TRUE;
+ 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;
+ }
+ }
- 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;
- }
- }
+ if (!ScreenPriv->SWCursor)
+ ScreenPriv->SWCursor = TRUE;
- if (!ScreenPriv->SWCursor)
- ScreenPriv->SWCursor = TRUE;
+ }
if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
pCurs = NullCursor;
@@ -384,18 +379,19 @@ xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
/* 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 ||
- (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+ !pDev->isMaster && pDev->u.master == inputInfo.pointer)
{
ScreenPriv->x = x;
ScreenPriv->y = y;
- }
- 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);
+ 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);
}
void
@@ -455,13 +451,6 @@ xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
/* Init SW cursor */
ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
- if (pDev != inputInfo.pointer)
- {
- ScreenPriv->spriteFuncs->SetCursor(inputInfo.pointer, pScreen,
- ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
- ScreenPriv->SWCursor = TRUE | XF86_FORCE_SW_CURSOR;
- }
-
return ret;
}
@@ -475,21 +464,7 @@ xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
&pScreen->devPrivates, xf86CursorScreenKey);
- for (it = inputInfo.devices; it; it = it->next)
- {
- if (it->isMaster && it != inputInfo.pointer && it !=
- inputInfo.keyboard)
- break;
- }
-
- if (!it) /* no other sprites except VCP. restore HW rendering */
- {
- ScreenPriv->SWCursor = TRUE;
- xf86CursorSetCursor(inputInfo.pointer, pScreen,
- ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
- }
-
- /* Clean up SW cursor */
+ /* Clean up SW cursor */
(*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
}
commit 48ba58feacedf9781db81c82adbb37197d9a5cd1
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Fri May 16 19:22:32 2008 +0930
mi: remove miPointerUpdate() -> replaced by miPointerUpdateSprite().
In the xnest and vfb DDX we don't need the call anyway, it's performed by
mieqProcessInputEvent.
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 393698f..3b001ee 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -52,7 +52,6 @@ void
ProcessInputEvents()
{
mieqProcessInputEvents();
- miPointerUpdate();
}
void DDXRingBell(int volume, int pitch, int duration)
diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c
index 02ff27b..f7a551c 100644
--- a/hw/xnest/Events.c
+++ b/hw/xnest/Events.c
@@ -49,7 +49,6 @@ void
ProcessInputEvents()
{
mieqProcessInputEvents();
- miPointerUpdate();
}
int
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 2c226dc..484947d 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -374,18 +374,12 @@ miPointerWarpCursor (pDev, pScreen, x, y)
*/
/*
- * miPointerUpdate
+ * miPointerUpdateSprite
*
* Syncronize the sprite with the cursor - called from ProcessInputEvents
*/
void
-miPointerUpdate ()
-{
- miPointerUpdateSprite(inputInfo.pointer);
-}
-
-void
miPointerUpdateSprite (DeviceIntPtr pDev)
{
ScreenPtr pScreen;
diff --git a/mi/mipointer.h b/mi/mipointer.h
index 5cbf527..fccbfa0 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -122,11 +122,6 @@ extern int miPointerGetMotionEvents(
ScreenPtr /*pScreen*/
);
-/* Deprecated in favour of miPointerUpdateSprite. */
-extern void miPointerUpdate(
- void
-) _X_DEPRECATED;
-
/* Deprecated in favour of miSetPointerPosition. */
extern void miPointerDeltaCursor(
int /*dx*/,
commit 622d7c1d899a6146773a2ebd1d632a805f24025e
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date: Wed May 14 14:49:09 2008 -0300
Restructure and organize the code.
It was removed and simplified some conditionals. We don't need test for
pDev->isMaster inside xf86CursorSetCursor() because only MD enters there.
In the last chunk, ScreenPriv fields were being assigned without need, so
that code was wrapped inside the conditional to avoid it.
I also tried to make the identation more sane in some parts that I touched.
Signed-off-by: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Minor modification, part of the original patch led to cursors not being
updated properly when controlled through XTest.
Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>
diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 2d69074..50f8fb7 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -299,43 +299,36 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
&pScreen->devPrivates, xf86CursorScreenKey);
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
- miPointerScreenPtr PointPriv;
+ miPointerScreenPtr PointPriv = (miPointerScreenPtr)dixLookupPrivate(
+ &pScreen->devPrivates, miPointerScreenKey);
+
+
+ if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
+ if (ScreenPriv->SWCursor)
+ (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
+ x, y);
+ else if (ScreenPriv->isUp) {
+ xf86SetCursor(pScreen, NullCursor, x, y);
+ ScreenPriv->isUp = FALSE;
+ }
+ return;
+ }
/* only update for VCP, otherwise we get cursor jumps when removing a
sprite. The second cursor is never HW rendered anyway. */
- if (pDev == inputInfo.pointer ||
- (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
+ if (pDev == inputInfo.pointer)
{
ScreenPriv->CurrentCursor = pCurs;
ScreenPriv->x = x;
ScreenPriv->y = y;
ScreenPriv->CursorToRestore = NULL;
+ ScreenPriv->HotX = pCurs->bits->xhot;
+ ScreenPriv->HotY = pCurs->bits->yhot;
}
if (!infoPtr->pScrn->vtSema)
ScreenPriv->SavedCursor = pCurs;
- if (pCurs == NullCursor) { /* means we're supposed to remove the cursor */
- if (ScreenPriv->SWCursor)
- (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
- x, y);
- else if
- (ScreenPriv->isUp) {
- xf86SetCursor(pScreen, NullCursor, x, y);
- ScreenPriv->isUp = FALSE;
- }
- return;
- }
-
- if (pDev == inputInfo.pointer ||
- (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
- {
- ScreenPriv->HotX = pCurs->bits->xhot;
- ScreenPriv->HotY = pCurs->bits->yhot;
- }
-
- PointPriv = (miPointerScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
- miPointerScreenKey);
if (!(ScreenPriv->SWCursor & XF86_FORCE_SW_CURSOR))
{
if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
@@ -346,18 +339,18 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
#endif
(pCurs->bits->height <= infoPtr->MaxHeight) &&
(pCurs->bits->width <= infoPtr->MaxWidth) &&
- (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
+ (!infoPtr->UseHWCursor || (*infoPtr->UseHWCursor)(pScreen, pCurs))))))
{
- if (ScreenPriv->SWCursor) /* remove the SW cursor */
- (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
+ if (ScreenPriv->SWCursor) /* remove the SW cursor */
+ (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor, x, y);
- xf86SetCursor(pScreen, pCurs, x, y);
- ScreenPriv->SWCursor = FALSE;
- ScreenPriv->isUp = TRUE;
- PointPriv->waitForUpdate = !infoPtr->pScrn->silkenMouse;
- return;
- }
+ xf86SetCursor(pScreen, pCurs, x, y);
+ ScreenPriv->SWCursor = FALSE;
+ ScreenPriv->isUp = TRUE;
+ PointPriv->waitForUpdate = !infoPtr->pScrn->silkenMouse;
+ return;
+ }
}
commit 5af90025fee6a92e7d94642978feed21f902d0cb
Author: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Date: Wed May 14 02:45:49 2008 -0300
Remove redundancy.
The only function that cat set SWCursor before xf86DeviceCursorInitialize()
is xf86InitCursor() when VCP and is created.
Signed-off-by: Tiago Vignatti <vignatti at c3sl.ufpr.br>
Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>
diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
index 4d64f62..2d69074 100644
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ b/hw/xfree86/ramdac/xf86Cursor.c
@@ -464,11 +464,8 @@ xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
if (pDev != inputInfo.pointer)
{
- if (!ScreenPriv->SWCursor)
- {
ScreenPriv->spriteFuncs->SetCursor(inputInfo.pointer, pScreen,
ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
- }
ScreenPriv->SWCursor = TRUE | XF86_FORCE_SW_CURSOR;
}
commit 9fc94edfe3df4c4a84ad70714c0a4ef8bbf57fc9
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date: Fri May 16 16:59:34 2008 +0930
Xext: fix typo in condition.
Fall-out from dc3aba8a559d4304844ee1cc306c577a63b82762.
We must free the event if it is NOT an extension event.
diff --git a/Xext/xtest.c b/Xext/xtest.c
index 791f6a2..a42faa7 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -500,7 +500,7 @@ ProcXTestFakeInput(client)
xfree(master_event);
} else
(*dev->public.processInputProc)(ev, dev, nev);
- if (extension)
+ if (!extension)
xfree(ev);
return client->noClientException;
}
More information about the xorg-commit
mailing list