forked from pool/xorg-x11-server
- U_0001-animcur-Use-fixed-size-screen-private.patch,
U_0002-animcur-Return-the-next-interval-directly-from-the-t.patch, U_0003-animcur-Run-the-timer-from-the-device-not-the-screen.patch, U_0004-animcur-Fix-transitions-between-animated-cursors.patch * There is a bug in version 1.19 of the X.org X server that can cause an infinite recursion in the animated cursor code, which has been fixed by these patches (boo#1080312) - supersedes u_cursors-animation.patch (boo#1020061) OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=690
This commit is contained in:
parent
8cd24ac05c
commit
3da29b8c96
71
U_0001-animcur-Use-fixed-size-screen-private.patch
Normal file
71
U_0001-animcur-Use-fixed-size-screen-private.patch
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
From 26841b2c9ea03fda8b2d0da254e0344fd2a3afce Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Thu, 26 Oct 2017 13:40:57 -0400
|
||||||
|
Subject: [PATCH] animcur: Use fixed-size screen private
|
||||||
|
|
||||||
|
Reviewed-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Tested-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
(cherry picked from commit 3abbdb7318018584a27220737bd92081ce8ee67c)
|
||||||
|
---
|
||||||
|
render/animcur.c | 16 ++++------------
|
||||||
|
1 file changed, 4 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/render/animcur.c b/render/animcur.c
|
||||||
|
index 52e6b8b79..3f85f9a4f 100644
|
||||||
|
--- a/render/animcur.c
|
||||||
|
+++ b/render/animcur.c
|
||||||
|
@@ -77,12 +77,9 @@ static CursorBits animCursorBits = {
|
||||||
|
|
||||||
|
static DevPrivateKeyRec AnimCurScreenPrivateKeyRec;
|
||||||
|
|
||||||
|
-#define AnimCurScreenPrivateKey (&AnimCurScreenPrivateKeyRec)
|
||||||
|
-
|
||||||
|
#define IsAnimCur(c) ((c) && ((c)->bits == &animCursorBits))
|
||||||
|
#define GetAnimCur(c) ((AnimCurPtr) ((((char *)(c) + CURSOR_REC_SIZE))))
|
||||||
|
-#define GetAnimCurScreen(s) ((AnimCurScreenPtr)dixLookupPrivate(&(s)->devPrivates, AnimCurScreenPrivateKey))
|
||||||
|
-#define SetAnimCurScreen(s,p) dixSetPrivate(&(s)->devPrivates, AnimCurScreenPrivateKey, p)
|
||||||
|
+#define GetAnimCurScreen(s) ((AnimCurScreenPtr)dixLookupPrivate(&(s)->devPrivates, &AnimCurScreenPrivateKeyRec))
|
||||||
|
|
||||||
|
#define Wrap(as,s,elt,func) (((as)->elt = (s)->elt), (s)->elt = func)
|
||||||
|
#define Unwrap(as,s,elt) ((s)->elt = (as)->elt)
|
||||||
|
@@ -101,9 +98,7 @@ AnimCurCloseScreen(ScreenPtr pScreen)
|
||||||
|
Unwrap(as, pScreen, RealizeCursor);
|
||||||
|
Unwrap(as, pScreen, UnrealizeCursor);
|
||||||
|
Unwrap(as, pScreen, RecolorCursor);
|
||||||
|
- SetAnimCurScreen(pScreen, 0);
|
||||||
|
ret = (*pScreen->CloseScreen) (pScreen);
|
||||||
|
- free(as);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -308,15 +303,13 @@ AnimCurInit(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
AnimCurScreenPtr as;
|
||||||
|
|
||||||
|
- if (!dixRegisterPrivateKey(&AnimCurScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
|
||||||
|
+ if (!dixRegisterPrivateKey(&AnimCurScreenPrivateKeyRec, PRIVATE_SCREEN,
|
||||||
|
+ sizeof(AnimCurScreenRec)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
- as = (AnimCurScreenPtr) malloc(sizeof(AnimCurScreenRec));
|
||||||
|
- if (!as)
|
||||||
|
- return FALSE;
|
||||||
|
+ as = GetAnimCurScreen(pScreen);
|
||||||
|
as->timer = TimerSet(NULL, TimerAbsolute, 0, AnimCurTimerNotify, pScreen);
|
||||||
|
if (!as->timer) {
|
||||||
|
- free(as);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
as->timer_set = FALSE;
|
||||||
|
@@ -329,7 +322,6 @@ AnimCurInit(ScreenPtr pScreen)
|
||||||
|
Wrap(as, pScreen, RealizeCursor, AnimCurRealizeCursor);
|
||||||
|
Wrap(as, pScreen, UnrealizeCursor, AnimCurUnrealizeCursor);
|
||||||
|
Wrap(as, pScreen, RecolorCursor, AnimCurRecolorCursor);
|
||||||
|
- SetAnimCurScreen(pScreen, as);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
@ -0,0 +1,38 @@
|
|||||||
|
From 354c48304d27f75b7c33c03a0adb050c37788ccf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Thu, 26 Oct 2017 13:53:06 -0400
|
||||||
|
Subject: [PATCH] animcur: Return the next interval directly from the timer
|
||||||
|
callback
|
||||||
|
|
||||||
|
If the return value is non-zero here, DoTimer() will automatically rearm
|
||||||
|
the timer for the new (relative) delay. 'soonest' is in absolute time,
|
||||||
|
so subtract off 'now' and return that.
|
||||||
|
|
||||||
|
Reviewed-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Tested-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
(cherry picked from commit cc3241a712684f8c7147f5688e9ee3ecb5a93b87)
|
||||||
|
---
|
||||||
|
render/animcur.c | 5 ++---
|
||||||
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/render/animcur.c b/render/animcur.c
|
||||||
|
index 3f85f9a4f..26a6026ae 100644
|
||||||
|
--- a/render/animcur.c
|
||||||
|
+++ b/render/animcur.c
|
||||||
|
@@ -169,10 +169,9 @@ AnimCurTimerNotify(OsTimerPtr timer, CARD32 now, void *arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeDevice)
|
||||||
|
- TimerSet(as->timer, TimerAbsolute, soonest, AnimCurTimerNotify, pScreen);
|
||||||
|
- else
|
||||||
|
- as->timer_set = FALSE;
|
||||||
|
+ return soonest - now;
|
||||||
|
|
||||||
|
+ as->timer_set = FALSE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
@ -0,0 +1,188 @@
|
|||||||
|
From 693f0e21d55d6e9fe792d91e76e4168aa813db71 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Thu, 26 Oct 2017 15:24:39 -0400
|
||||||
|
Subject: [PATCH] animcur: Run the timer from the device, not the screen
|
||||||
|
|
||||||
|
This is very slightly more efficient since the callback now doesn't need
|
||||||
|
to walk every input device, instead we know exactly which device's
|
||||||
|
cursor is being updated. AnimCurTimerNotify() gets outdented nicely as a
|
||||||
|
result. A more important side effect is that we can stop using the
|
||||||
|
TimerAbsolute mode and just pass in the relative delay.
|
||||||
|
|
||||||
|
In AnimCurSetCursorPosition, we no longer need to rearm the timer with
|
||||||
|
the new screen; it is enough to update the device's state. In
|
||||||
|
AnimCurDisplayCursor we need to notice when we're switching from
|
||||||
|
animated cursor to regular and cancel the existing timer.
|
||||||
|
|
||||||
|
Reviewed-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Tested-by: Robert Morell <rmorell@nvidia.com>
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
(cherry picked from commit 094a63d56fbfb9e23210cc9ac538fb198af37cee)
|
||||||
|
---
|
||||||
|
render/animcur.c | 87 +++++++++++++++++++-------------------------------------
|
||||||
|
1 file changed, 29 insertions(+), 58 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/render/animcur.c b/render/animcur.c
|
||||||
|
index 26a6026ae..9393b4018 100644
|
||||||
|
--- a/render/animcur.c
|
||||||
|
+++ b/render/animcur.c
|
||||||
|
@@ -55,6 +55,7 @@ typedef struct _AnimCurElt {
|
||||||
|
typedef struct _AnimCur {
|
||||||
|
int nelt; /* number of elements in the elts array */
|
||||||
|
AnimCurElt *elts; /* actually allocated right after the structure */
|
||||||
|
+ OsTimerPtr timer;
|
||||||
|
} AnimCurRec, *AnimCurPtr;
|
||||||
|
|
||||||
|
typedef struct _AnimScrPriv {
|
||||||
|
@@ -65,8 +66,6 @@ typedef struct _AnimScrPriv {
|
||||||
|
RealizeCursorProcPtr RealizeCursor;
|
||||||
|
UnrealizeCursorProcPtr UnrealizeCursor;
|
||||||
|
RecolorCursorProcPtr RecolorCursor;
|
||||||
|
- OsTimerPtr timer;
|
||||||
|
- Bool timer_set;
|
||||||
|
} AnimCurScreenRec, *AnimCurScreenPtr;
|
||||||
|
|
||||||
|
static unsigned char empty[4];
|
||||||
|
@@ -130,49 +129,27 @@ AnimCurCursorLimits(DeviceIntPtr pDev,
|
||||||
|
static CARD32
|
||||||
|
AnimCurTimerNotify(OsTimerPtr timer, CARD32 now, void *arg)
|
||||||
|
{
|
||||||
|
- ScreenPtr pScreen = arg;
|
||||||
|
+ DeviceIntPtr dev = arg;
|
||||||
|
+ ScreenPtr pScreen = dev->spriteInfo->anim.pScreen;
|
||||||
|
AnimCurScreenPtr as = GetAnimCurScreen(pScreen);
|
||||||
|
- DeviceIntPtr dev;
|
||||||
|
- Bool activeDevice = FALSE;
|
||||||
|
- CARD32 soonest = ~0; /* earliest time to wakeup again */
|
||||||
|
-
|
||||||
|
- for (dev = inputInfo.devices; dev; dev = dev->next) {
|
||||||
|
- if (IsPointerDevice(dev) && pScreen == dev->spriteInfo->anim.pScreen) {
|
||||||
|
- if (!activeDevice)
|
||||||
|
- activeDevice = TRUE;
|
||||||
|
-
|
||||||
|
- if ((INT32) (now - dev->spriteInfo->anim.time) >= 0) {
|
||||||
|
- AnimCurPtr ac = GetAnimCur(dev->spriteInfo->anim.pCursor);
|
||||||
|
- int elt = (dev->spriteInfo->anim.elt + 1) % ac->nelt;
|
||||||
|
- DisplayCursorProcPtr DisplayCursor;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Not a simple Unwrap/Wrap as this
|
||||||
|
- * isn't called along the DisplayCursor
|
||||||
|
- * wrapper chain.
|
||||||
|
- */
|
||||||
|
- DisplayCursor = pScreen->DisplayCursor;
|
||||||
|
- pScreen->DisplayCursor = as->DisplayCursor;
|
||||||
|
- (void) (*pScreen->DisplayCursor) (dev,
|
||||||
|
- pScreen,
|
||||||
|
- ac->elts[elt].pCursor);
|
||||||
|
- as->DisplayCursor = pScreen->DisplayCursor;
|
||||||
|
- pScreen->DisplayCursor = DisplayCursor;
|
||||||
|
-
|
||||||
|
- dev->spriteInfo->anim.elt = elt;
|
||||||
|
- dev->spriteInfo->anim.time = now + ac->elts[elt].delay;
|
||||||
|
- }
|
||||||
|
|
||||||
|
- if (soonest > dev->spriteInfo->anim.time)
|
||||||
|
- soonest = dev->spriteInfo->anim.time;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ AnimCurPtr ac = GetAnimCur(dev->spriteInfo->anim.pCursor);
|
||||||
|
+ int elt = (dev->spriteInfo->anim.elt + 1) % ac->nelt;
|
||||||
|
+ DisplayCursorProcPtr DisplayCursor = pScreen->DisplayCursor;
|
||||||
|
|
||||||
|
- if (activeDevice)
|
||||||
|
- return soonest - now;
|
||||||
|
+ /*
|
||||||
|
+ * Not a simple Unwrap/Wrap as this isn't called along the DisplayCursor
|
||||||
|
+ * wrapper chain.
|
||||||
|
+ */
|
||||||
|
+ pScreen->DisplayCursor = as->DisplayCursor;
|
||||||
|
+ (void) (*pScreen->DisplayCursor) (dev, pScreen, ac->elts[elt].pCursor);
|
||||||
|
+ as->DisplayCursor = pScreen->DisplayCursor;
|
||||||
|
+ pScreen->DisplayCursor = DisplayCursor;
|
||||||
|
|
||||||
|
- as->timer_set = FALSE;
|
||||||
|
- return 0;
|
||||||
|
+ dev->spriteInfo->anim.elt = elt;
|
||||||
|
+ dev->spriteInfo->anim.time = now + ac->elts[elt].delay;
|
||||||
|
+
|
||||||
|
+ return ac->elts[elt].delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
@@ -198,17 +175,19 @@ AnimCurDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
|
||||||
|
pDev->spriteInfo->anim.pCursor = pCursor;
|
||||||
|
pDev->spriteInfo->anim.pScreen = pScreen;
|
||||||
|
|
||||||
|
- if (!as->timer_set) {
|
||||||
|
- TimerSet(as->timer, TimerAbsolute, pDev->spriteInfo->anim.time,
|
||||||
|
- AnimCurTimerNotify, pScreen);
|
||||||
|
- as->timer_set = TRUE;
|
||||||
|
- }
|
||||||
|
+ ac->timer = TimerSet(ac->timer, 0, ac->elts[0].delay,
|
||||||
|
+ AnimCurTimerNotify, pDev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
+ CursorPtr old = pDev->spriteInfo->anim.pCursor;
|
||||||
|
+
|
||||||
|
+ if (old && IsAnimCur(old))
|
||||||
|
+ TimerCancel(GetAnimCur(old)->timer);
|
||||||
|
+
|
||||||
|
pDev->spriteInfo->anim.pCursor = 0;
|
||||||
|
pDev->spriteInfo->anim.pScreen = 0;
|
||||||
|
ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
|
||||||
|
@@ -227,12 +206,6 @@ AnimCurSetCursorPosition(DeviceIntPtr pDev,
|
||||||
|
Unwrap(as, pScreen, SetCursorPosition);
|
||||||
|
if (pDev->spriteInfo->anim.pCursor) {
|
||||||
|
pDev->spriteInfo->anim.pScreen = pScreen;
|
||||||
|
-
|
||||||
|
- if (!as->timer_set) {
|
||||||
|
- TimerSet(as->timer, TimerAbsolute, pDev->spriteInfo->anim.time,
|
||||||
|
- AnimCurTimerNotify, pScreen);
|
||||||
|
- as->timer_set = TRUE;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
|
||||||
|
Wrap(as, pScreen, SetCursorPosition, AnimCurSetCursorPosition);
|
||||||
|
@@ -307,11 +280,6 @@ AnimCurInit(ScreenPtr pScreen)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
as = GetAnimCurScreen(pScreen);
|
||||||
|
- as->timer = TimerSet(NULL, TimerAbsolute, 0, AnimCurTimerNotify, pScreen);
|
||||||
|
- if (!as->timer) {
|
||||||
|
- return FALSE;
|
||||||
|
- }
|
||||||
|
- as->timer_set = FALSE;
|
||||||
|
|
||||||
|
Wrap(as, pScreen, CloseScreen, AnimCurCloseScreen);
|
||||||
|
|
||||||
|
@@ -359,10 +327,14 @@ AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor,
|
||||||
|
|
||||||
|
pCursor->id = cid;
|
||||||
|
|
||||||
|
+ ac = GetAnimCur(pCursor);
|
||||||
|
+ ac->timer = TimerSet(NULL, 0, 0, AnimCurTimerNotify, NULL);
|
||||||
|
+
|
||||||
|
/* security creation/labeling check */
|
||||||
|
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR, pCursor,
|
||||||
|
RT_NONE, NULL, DixCreateAccess);
|
||||||
|
if (rc != Success) {
|
||||||
|
+ TimerFree(ac->timer);
|
||||||
|
dixFiniPrivates(pCursor, PRIVATE_CURSOR);
|
||||||
|
free(pCursor);
|
||||||
|
return rc;
|
||||||
|
@@ -372,7 +344,6 @@ AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor,
|
||||||
|
* Fill in the AnimCurRec
|
||||||
|
*/
|
||||||
|
animCursorBits.refcnt++;
|
||||||
|
- ac = GetAnimCur(pCursor);
|
||||||
|
ac->nelt = ncursor;
|
||||||
|
ac->elts = (AnimCurElt *) (ac + 1);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
From 5e83ebd76738455c443a66024b0b5eb92930b36c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adam Jackson <ajax@redhat.com>
|
||||||
|
Date: Tue, 9 Jan 2018 10:54:05 -0500
|
||||||
|
Subject: [PATCH] animcur: Fix transitions between animated cursors
|
||||||
|
|
||||||
|
We weren't cancelling the old timer when changing cursors, making things
|
||||||
|
go all crashy. Logically we could always cancel the timer first, but
|
||||||
|
then we'd have to call TimerSet to re-arm ourselves, and GetTimeInMillis
|
||||||
|
is potentially expensive.
|
||||||
|
|
||||||
|
Reported-by: https://devtalk.nvidia.com/default/topic/1028172/linux/titan-v-ubuntu-16-04lts-and-387-34-driver-crashes-badly/post/5230967/#5230967
|
||||||
|
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
||||||
|
Reviewed-by: Aaron Plattner <aplattner@nvidia.com>
|
||||||
|
Tested-by: Aaron Plattner <aplattner@nvidia.com>
|
||||||
|
(cherry picked from commit de60245e05c0d2528d4ff42557a044387e53315c)
|
||||||
|
---
|
||||||
|
render/animcur.c | 25 +++++++++++++++----------
|
||||||
|
1 file changed, 15 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/render/animcur.c b/render/animcur.c
|
||||||
|
index 9393b4018..e585a8f23 100644
|
||||||
|
--- a/render/animcur.c
|
||||||
|
+++ b/render/animcur.c
|
||||||
|
@@ -152,11 +152,20 @@ AnimCurTimerNotify(OsTimerPtr timer, CARD32 now, void *arg)
|
||||||
|
return ac->elts[elt].delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+AnimCurCancelTimer(DeviceIntPtr pDev)
|
||||||
|
+{
|
||||||
|
+ CursorPtr cur = pDev->spriteInfo->anim.pCursor;
|
||||||
|
+
|
||||||
|
+ if (IsAnimCur(cur))
|
||||||
|
+ TimerCancel(GetAnimCur(cur)->timer);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static Bool
|
||||||
|
AnimCurDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
|
||||||
|
{
|
||||||
|
AnimCurScreenPtr as = GetAnimCurScreen(pScreen);
|
||||||
|
- Bool ret;
|
||||||
|
+ Bool ret = TRUE;
|
||||||
|
|
||||||
|
if (IsFloating(pDev))
|
||||||
|
return FALSE;
|
||||||
|
@@ -166,8 +175,10 @@ AnimCurDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
|
||||||
|
if (pCursor != pDev->spriteInfo->anim.pCursor) {
|
||||||
|
AnimCurPtr ac = GetAnimCur(pCursor);
|
||||||
|
|
||||||
|
- ret = (*pScreen->DisplayCursor)
|
||||||
|
- (pDev, pScreen, ac->elts[0].pCursor);
|
||||||
|
+ AnimCurCancelTimer(pDev);
|
||||||
|
+ ret = (*pScreen->DisplayCursor) (pDev, pScreen,
|
||||||
|
+ ac->elts[0].pCursor);
|
||||||
|
+
|
||||||
|
if (ret) {
|
||||||
|
pDev->spriteInfo->anim.elt = 0;
|
||||||
|
pDev->spriteInfo->anim.time =
|
||||||
|
@@ -179,15 +190,9 @@ AnimCurDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
|
||||||
|
AnimCurTimerNotify, pDev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- else
|
||||||
|
- ret = TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
- CursorPtr old = pDev->spriteInfo->anim.pCursor;
|
||||||
|
-
|
||||||
|
- if (old && IsAnimCur(old))
|
||||||
|
- TimerCancel(GetAnimCur(old)->timer);
|
||||||
|
-
|
||||||
|
+ AnimCurCancelTimer(pDev);
|
||||||
|
pDev->spriteInfo->anim.pCursor = 0;
|
||||||
|
pDev->spriteInfo->anim.pScreen = 0;
|
||||||
|
ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
Author: Илья Индиго <ilya@ilya.pp.ua>
|
|
||||||
Subject: [PATCH] render: Reset animated cursor timer when sprite changes.
|
|
||||||
Patch-Mainline: To be upstreamed
|
|
||||||
Git-commit: 1c4545021f835f077362e7364d28752b7d6e968e
|
|
||||||
References: boo#1020061
|
|
||||||
Signed-off-by: Michal Srb <msrb@suse.com>
|
|
||||||
|
|
||||||
Previously the timer would not reset if the sprite changed and timer from a
|
|
||||||
previous animated cursor was pending. That caused trouble with non-looped
|
|
||||||
animated cursors that use very long delay on the last frame to prevent looping.
|
|
||||||
No animation played after such non-looped animation played once.
|
|
||||||
---
|
|
||||||
render/animcur.c | 8 +++-----
|
|
||||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/render/animcur.c b/render/animcur.c
|
|
||||||
index 52e6b8b79..4216c3a40 100644
|
|
||||||
--- a/render/animcur.c
|
|
||||||
+++ b/render/animcur.c
|
|
||||||
@@ -204,11 +204,9 @@ AnimCurDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
|
|
||||||
pDev->spriteInfo->anim.pCursor = pCursor;
|
|
||||||
pDev->spriteInfo->anim.pScreen = pScreen;
|
|
||||||
|
|
||||||
- if (!as->timer_set) {
|
|
||||||
- TimerSet(as->timer, TimerAbsolute, pDev->spriteInfo->anim.time,
|
|
||||||
- AnimCurTimerNotify, pScreen);
|
|
||||||
- as->timer_set = TRUE;
|
|
||||||
- }
|
|
||||||
+ TimerSet(as->timer, TimerAbsolute, pDev->spriteInfo->anim.time,
|
|
||||||
+ AnimCurTimerNotify, pScreen);
|
|
||||||
+ as->timer_set = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
@ -1,3 +1,15 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Feb 9 15:13:00 UTC 2018 - sndirsch@suse.com
|
||||||
|
|
||||||
|
- U_0001-animcur-Use-fixed-size-screen-private.patch,
|
||||||
|
U_0002-animcur-Return-the-next-interval-directly-from-the-t.patch,
|
||||||
|
U_0003-animcur-Run-the-timer-from-the-device-not-the-screen.patch,
|
||||||
|
U_0004-animcur-Fix-transitions-between-animated-cursors.patch
|
||||||
|
* There is a bug in version 1.19 of the X.org X server that can
|
||||||
|
cause an infinite recursion in the animated cursor code, which
|
||||||
|
has been fixed by these patches (boo#1080312)
|
||||||
|
- supersedes u_cursors-animation.patch (boo#1020061)
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue Jan 9 16:30:28 UTC 2018 - mwilck@suse.com
|
Tue Jan 9 16:30:28 UTC 2018 - mwilck@suse.com
|
||||||
|
|
||||||
|
@ -198,7 +198,6 @@ Patch9: u_xorg-wrapper-build-Build-position-independent-code.patch
|
|||||||
Patch100: u_01-Improved-ConfineToShape.patch
|
Patch100: u_01-Improved-ConfineToShape.patch
|
||||||
Patch101: u_02-DIX-ConfineTo-Don-t-bother-about-the-bounding-box-when-grabbing-a-shaped-window.patch
|
Patch101: u_02-DIX-ConfineTo-Don-t-bother-about-the-bounding-box-when-grabbing-a-shaped-window.patch
|
||||||
# PATCH-FIX-UPSTREAM u_x86emu-include-order.patch schwab@suse.de -- Change include order to avoid conflict with system header, remove duplicate definitions
|
# PATCH-FIX-UPSTREAM u_x86emu-include-order.patch schwab@suse.de -- Change include order to avoid conflict with system header, remove duplicate definitions
|
||||||
Patch103: u_cursors-animation.patch
|
|
||||||
Patch104: u_xorg-server-xdmcp.patch
|
Patch104: u_xorg-server-xdmcp.patch
|
||||||
Patch112: u_render-Cast-color-masks-to-unsigned-long-before-shifting-them.patch
|
Patch112: u_render-Cast-color-masks-to-unsigned-long-before-shifting-them.patch
|
||||||
|
|
||||||
@ -222,6 +221,11 @@ Patch1162: b_cache-xkbcomp-output-for-fast-start-up.patch
|
|||||||
Patch1211: b_0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
|
Patch1211: b_0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
|
||||||
Patch1222: b_sync-fix.patch
|
Patch1222: b_sync-fix.patch
|
||||||
|
|
||||||
|
Patch1301: U_0001-animcur-Use-fixed-size-screen-private.patch
|
||||||
|
Patch1302: U_0002-animcur-Return-the-next-interval-directly-from-the-t.patch
|
||||||
|
Patch1303: U_0003-animcur-Run-the-timer-from-the-device-not-the-screen.patch
|
||||||
|
Patch1304: U_0004-animcur-Fix-transitions-between-animated-cursors.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
This package contains the X.Org Server.
|
This package contains the X.Org Server.
|
||||||
|
|
||||||
@ -331,7 +335,6 @@ sh %{SOURCE92} --verify . %{SOURCE91}
|
|||||||
#
|
#
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
#%patch101 -p1
|
#%patch101 -p1
|
||||||
%patch103 -p1
|
|
||||||
%patch104 -p1
|
%patch104 -p1
|
||||||
|
|
||||||
%patch112 -p1
|
%patch112 -p1
|
||||||
@ -362,6 +365,11 @@ sh %{SOURCE92} --verify . %{SOURCE91}
|
|||||||
### patch222 might not be applicable anymore
|
### patch222 might not be applicable anymore
|
||||||
#%patch1222 -p1
|
#%patch1222 -p1
|
||||||
|
|
||||||
|
%patch1301 -p1
|
||||||
|
%patch1302 -p1
|
||||||
|
%patch1303 -p1
|
||||||
|
%patch1304 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
test -e source-file-list || \
|
test -e source-file-list || \
|
||||||
find -L . -type f \! -name '*.orig' \! -path ./source-file-list > \
|
find -L . -type f \! -name '*.orig' \! -path ./source-file-list > \
|
||||||
|
Loading…
Reference in New Issue
Block a user