diff --git a/greeter/greeterapp.h b/greeter/greeterapp.h --- a/greeter/greeterapp.h +++ b/greeter/greeterapp.h @@ -50,6 +50,7 @@ class UnlockApp : public QGuiApplication { Q_OBJECT + Q_PROPERTY(bool cursorHidden READ cursorHidden WRITE setCursorHidden NOTIFY cursorHiddenChanged) public: explicit UnlockApp(int &argc, char **argv); ~UnlockApp() override; @@ -72,9 +73,17 @@ return m_supportsSeccomp; } + bool cursorHidden() const { + return m_cursorHidden; + } + void setCursorHidden(bool cursorHidden); + public Q_SLOTS: void desktopResized(); +Q_SIGNALS: + void cursorHiddenChanged(); + protected: bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE; @@ -106,6 +115,7 @@ Authenticator *m_authenticator; int m_graceTime; bool m_noLock; + bool m_cursorHidden; bool m_defaultToSwitchUser; bool m_canSuspend = false; diff --git a/greeter/greeterapp.cpp b/greeter/greeterapp.cpp --- a/greeter/greeterapp.cpp +++ b/greeter/greeterapp.cpp @@ -110,6 +110,7 @@ , m_immediateLock(false) , m_graceTime(0) , m_noLock(false) + , m_cursorHidden(false) , m_defaultToSwitchUser(false) , m_wallpaperIntegration(new WallpaperIntegration(this)) , m_lnfIntegration(new LnFIntegration(this)) @@ -305,6 +306,7 @@ context->setContextProperty(QStringLiteral("authenticator"), m_authenticator); context->setContextProperty(QStringLiteral("org_kde_plasma_screenlocker_greeter_interfaceVersion"), 2); context->setContextProperty(QStringLiteral("org_kde_plasma_screenlocker_greeter_view"), view); + context->setContextProperty(QStringLiteral("org_kde_plasma_screenlocker_greeter_app"), this); context->setContextProperty(QStringLiteral("defaultToSwitchUser"), m_defaultToSwitchUser); context->setContextProperty(QStringLiteral("config"), m_lnfIntegration->configuration()); @@ -458,6 +460,24 @@ } } +/* + * This functionality exists and is exposed to QML, because the QML part + * is not able to reliably hide the cursor via MouseArea. + * See: https://bugreports.qt.io/browse/QTBUG-41045 + */ +void UnlockApp::setCursorHidden(bool cursorHidden) { + if (m_cursorHidden == cursorHidden) { + return; + } + m_cursorHidden = cursorHidden; + if (cursorHidden) { + setOverrideCursor(Qt::BlankCursor); + } else { + restoreOverrideCursor(); + } + Q_EMIT cursorHiddenChanged(); +} + void UnlockApp::resetRequestIgnore() { m_ignoreRequests = false;