From 757ed91a5dd20aaa835fb995f46f9ae94ce007eb Mon Sep 17 00:00:00 2001 From: Rohan Garg Date: Sun, 22 Apr 2018 15:17:53 +0200 Subject: [PATCH] Handle errors with drmModeSetCursor instead of silently failing Summary: Make sure we switch to a software cursor when drmModeSetCursor fails. Reviewers: #kwin, graesslin Subscribers: davidedmundson, bshah, graesslin, kwin, #kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D12447 --- plugins/platforms/drm/drm_backend.cpp | 8 ++++++-- plugins/platforms/drm/drm_output.cpp | 18 ++++++++++++------ plugins/platforms/drm/drm_output.h | 6 +++--- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp index 90ed4579e2..2bcc7c96b2 100644 --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -624,7 +624,9 @@ void DrmBackend::initCursor() } 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 @@ void DrmBackend::setCursor() { 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.cpp b/plugins/platforms/drm/drm_output.cpp index bd3dac1a8c..fb09ae1d27 100644 --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -96,24 +96,30 @@ void DrmOutput::releaseGbm() } } -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() diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h index 9e87b2e30a..2206bfac22 100644 --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -66,9 +66,9 @@ public: }; 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);