77 lines
2.5 KiB
Diff
77 lines
2.5 KiB
Diff
From 9ac63cdf132f430bf4bf33561b15298538db6070 Mon Sep 17 00:00:00 2001
|
|
From: Chris Wilson <chris@chris-wilson.co.uk>
|
|
Date: Mon, 16 Jan 2017 22:17:36 +0000
|
|
Subject: [PATCH xserver] xfree86: Take the input lock for xf86RecolorCursor
|
|
|
|
xf86RecolorCursor() may be called directly from XRecolorCursor as well
|
|
as from xf86ScreenSetCursor(). In the latter case, the input lock is
|
|
already held, but not for the former and so we need to add a wrapper
|
|
function that acquires the input lock before performing
|
|
xf86RecolorCursor()
|
|
|
|
References: https://bugs.freedesktop.org/show_bug.cgi?id=99358
|
|
---
|
|
hw/xfree86/ramdac/xf86HWCurs.c | 24 ++++++++++++++++++------
|
|
1 file changed, 18 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c
|
|
index 4481320..55d5861 100644
|
|
--- a/hw/xfree86/ramdac/xf86HWCurs.c
|
|
+++ b/hw/xfree86/ramdac/xf86HWCurs.c
|
|
@@ -22,6 +22,9 @@
|
|
|
|
#include "servermd.h"
|
|
|
|
+static void
|
|
+xf86RecolorCursor_locked(xf86CursorScreenPtr ScreenPriv, CursorPtr pCurs);
|
|
+
|
|
static CARD32
|
|
xf86ReverseBitOrder(CARD32 v)
|
|
{
|
|
@@ -204,7 +207,7 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
|
if (!xf86DriverLoadCursorImage (infoPtr, bits))
|
|
return FALSE;
|
|
|
|
- xf86RecolorCursor(pScreen, pCurs, 1);
|
|
+ xf86RecolorCursor_locked (ScreenPriv, pCurs);
|
|
|
|
(*infoPtr->SetCursorPosition) (infoPtr->pScrn, x, y);
|
|
|
|
@@ -312,12 +315,9 @@ xf86MoveCursor(ScreenPtr pScreen, int x, int y)
|
|
input_unlock();
|
|
}
|
|
|
|
-void
|
|
-xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
|
+static void
|
|
+xf86RecolorCursor_locked(xf86CursorScreenPtr ScreenPriv, CursorPtr pCurs)
|
|
{
|
|
- xf86CursorScreenPtr ScreenPriv =
|
|
- (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
|
- xf86CursorScreenKey);
|
|
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
|
|
|
/* recoloring isn't applicable to ARGB cursors and drivers
|
|
@@ -357,6 +357,18 @@ xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
|
}
|
|
}
|
|
|
|
+void
|
|
+xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
|
+{
|
|
+ xf86CursorScreenPtr ScreenPriv =
|
|
+ (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
|
+ xf86CursorScreenKey);
|
|
+
|
|
+ input_lock();
|
|
+ xf86RecolorCursor_locked (ScreenPriv, pCurs);
|
|
+ input_unlock();
|
|
+}
|
|
+
|
|
/* These functions assume that MaxWidth is a multiple of 32 */
|
|
static unsigned char *
|
|
RealizeCursorInterleave0(xf86CursorInfoPtr infoPtr, CursorPtr pCurs)
|
|
--
|
|
2.9.3
|
|
|