drmmode: fix showing cursor when it is loaded
When using drm planes it is not possible to update a hidden cursor's
position since drmModeSetPlane() always makes a plane visible.
Instead of tracking the cursor visibility status in the driver, we use
the xf86 provided cursor_shown variable. However, this is only updated
*after* xf86 calls the DDX's ->show_cursor(). Thus, if the cursor was
currently hidden when a cursor image update occurred, when show_cursor()
called ->drmmode_set_cursor_position(), cursor_shown was still false, and
we wouldn't actually show the cursor.
Instead, refactor drmmode_set_plane() out of drmmode_set_cursor_position()
and call it unconditionally in show_cursor(), and only call it from
drmmode_set_cursor_position() if the cursor is presently visible.
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
BUG=chromium:379942
TEST=(1)
Move pointer one pixel to the left of a UI element that uses a different
cursor. For, example, next to the "shutdown button" on the peach_pi
login screen:
xdotool mousemove -- 14 1054
Move pointer one pixel to the right
xdotool mousemove_relative -- 1 0
=> cursor should change and stay visible (previously it would be hidden)
TEST=(2)
Press a key to hide cursor
xdotool key 'L'
Move one pixel to reshow cursor (also switches back to previous cursor)
xdotool mousemove_relative -- -1 0
TEST=powerd_dbus_suspend w/ cursor visible & not visible
TEST=slowly mouse over a link; cursor changes shape, but stays visible
Change-Id: I064c064a043b0c7dc6363e0bf978e669f656fed5
Reviewed-on: https://chromium-review.googlesource.com/203235
Reviewed-by: Dominik Behr <dbehr@chromium.org>
Commit-Queue: Daniel Kurtz <djkurtz@chromium.org>
Tested-by: Daniel Kurtz <djkurtz@chromium.org>
1 file changed