diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -624,7 +624,9 @@ } for (auto it = m_outputs.constBegin(); it != m_outputs.constEnd(); ++it) { if (m_cursorEnabled) { - (*it)->showCursor(); + if (!(*it)->showCursor()) { + setSoftWareCursor(true); + } } else { (*it)->hideCursor(); } @@ -653,7 +655,9 @@ { if (m_cursorEnabled) { for (auto it = m_outputs.constBegin(); it != m_outputs.constEnd(); ++it) { - (*it)->showCursor(); + if (!(*it)->showCursor()) { + setSoftWareCursor(true); + } } } markCursorAsRendered(); diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -66,9 +66,9 @@ }; virtual ~DrmOutput(); void releaseGbm(); - void showCursor(DrmDumbBuffer *buffer); - void showCursor(); - void hideCursor(); + bool showCursor(DrmDumbBuffer *buffer); + bool showCursor(); + bool hideCursor(); void updateCursor(); void moveCursor(const QPoint &globalPos); bool init(drmModeConnector *connector); diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -96,24 +96,30 @@ } } -void DrmOutput::hideCursor() +bool DrmOutput::hideCursor() { - drmModeSetCursor(m_backend->fd(), m_crtc->id(), 0, 0, 0); + return drmModeSetCursor(m_backend->fd(), m_crtc->id(), 0, 0, 0) == 0; } -void DrmOutput::showCursor(DrmDumbBuffer *c) +bool DrmOutput::showCursor(DrmDumbBuffer *c) { const QSize &s = c->size(); - drmModeSetCursor(m_backend->fd(), m_crtc->id(), c->handle(), s.width(), s.height()); + return drmModeSetCursor(m_backend->fd(), m_crtc->id(), c->handle(), s.width(), s.height()) == 0; } -void DrmOutput::showCursor() +bool DrmOutput::showCursor() { - showCursor(m_cursor[m_cursorIndex]); + const bool ret = showCursor(m_cursor[m_cursorIndex]); + if (!ret) { + return ret; + } + if (m_hasNewCursor) { m_cursorIndex = (m_cursorIndex + 1) % 2; m_hasNewCursor = false; } + + return ret; } void DrmOutput::updateCursor()