Created attachment 28183 [details]
GTK test program displaying an animated cursor.
Three broken cases identified, possibly linked to the same cause. Test
programs are attached. Busycursor is a gtk program that displays an animated
cursor (in the default Fedora GNOME theme anyway), hidecursor just calls
XFixesHideCursor/XFixesShowCursor until cancelled.
Test case 1:
1. run busycursor, click button, leave cursor in busycursor window
2. open terminal, run hidecursor while cursor is still in busycursor
3. ctrl+c hidecursor until exit
4. ctrl+c busycursor
Server crashes, but it seems to happen in different cases. Looks like some
cursor reference is still around after the cursor got freed.
Test case 2:
1. repeat steps 1 - 3 from above
The cursor is now animated everywhere, not just in the window.
Test case 3:
1. run busycursor, click button, move cursor outside of busycursor window
2. run hidecursor, ctrl+c hidecursor
Moving the cursor back into the busycursor window won't display a cursor at
Created attachment 28184 [details]
Simple X program calling XFixesHide/ShowCursor
Created attachment 28214 [details] [review]
The screen's DisplayCursor func is wrapped as
AnimCurDisplayCursor -> CursorDisplayCursor -> miPointerDisplayCursor.
Calling CursorDisplayCursor while an animated cursor was currently displayed
would remove AnimCurDisplayCursor from the wrap stack. Thus, the next call
to ChangeToCursor wouldn't update the animated cursor state. The block
handler for animated cursors would then continuously overwrite the actual
cursor, leaving an animated cursor everywhere on the screen.
pushed as 664ac92d8bbe956dd6fd80fac5dc3161028803b2