From 8bf479e35834f66cb1ac7b92965526acdf98f555 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Tue, 7 Feb 2017 10:47:39 +0100 Subject: [PATCH] [User Switcher] Ungrab keyboard before trying to lock the screen Otherwise it fails to lock the screen and since it waits for the lock screen to show up before switching, it never does it. BUG: 375941 FIXED-IN: 5.9.1 Differential Revision: https://phabricator.kde.org/D4470 --- components/sessionsprivate/sessionsmodel.cpp | 4 ++++ components/sessionsprivate/sessionsmodel.h | 1 + ksmserver/switchuserdialog.cpp | 7 +++++++ ksmserver/switchuserdialog.h | 3 +++ lookandfeel/contents/userswitcher/UserSwitcher.qml | 3 +++ 5 files changed, 18 insertions(+) diff --git a/components/sessionsprivate/sessionsmodel.cpp b/components/sessionsprivate/sessionsmodel.cpp index 6b71a8bdb..89fd51ed9 100644 --- a/components/sessionsprivate/sessionsmodel.cpp +++ b/components/sessionsprivate/sessionsmodel.cpp @@ -98,6 +98,8 @@ void SessionsModel::switchUser(int vt, bool shouldLock) } else { m_pendingReserve = false; m_pendingVt = vt; + + emit aboutToLockScreen(); m_screensaverInterface->Lock(); } }); @@ -123,6 +125,8 @@ void SessionsModel::startNewSession(bool shouldLock) } else { m_pendingReserve = true; m_pendingVt = 0; + + emit aboutToLockScreen(); m_screensaverInterface->Lock(); } }); diff --git a/components/sessionsprivate/sessionsmodel.h b/components/sessionsprivate/sessionsmodel.h index 6381b6287..01274bf64 100644 --- a/components/sessionsprivate/sessionsmodel.h +++ b/components/sessionsprivate/sessionsmodel.h @@ -95,6 +95,7 @@ signals: void switchedUser(int vt); void startedNewSession(); + void aboutToLockScreen(); private: void checkScreenLocked(const std::function &cb); diff --git a/ksmserver/switchuserdialog.cpp b/ksmserver/switchuserdialog.cpp index e7e4003fe..b959e9b14 100644 --- a/ksmserver/switchuserdialog.cpp +++ b/ksmserver/switchuserdialog.cpp @@ -112,6 +112,7 @@ void KSMSwitchUserDialog::init() } connect(rootObject(), SIGNAL(dismissed()), this, SIGNAL(dismissed())); + connect(rootObject(), SIGNAL(ungrab()), this, SLOT(ungrab())); connect(screen(), &QScreen::geometryChanged, this, [this] { setGeometry(screen()->geometry()); @@ -122,6 +123,7 @@ void KSMSwitchUserDialog::init() KWindowSystem::setState(winId(), NET::SkipTaskbar|NET::SkipPager); + // in case you change this make sure to adjust ungrab() also setKeyboardGrabEnabled(true); } @@ -163,3 +165,8 @@ void KSMSwitchUserDialog::setupWaylandIntegration() // maybe we need a dedicated type for it? m_shellSurface->setPosition(geometry().topLeft()); } + +void KSMSwitchUserDialog::ungrab() +{ + setKeyboardGrabEnabled(false); +} diff --git a/ksmserver/switchuserdialog.h b/ksmserver/switchuserdialog.h index 958cdd79d..d5b9145fa 100644 --- a/ksmserver/switchuserdialog.h +++ b/ksmserver/switchuserdialog.h @@ -50,6 +50,9 @@ signals: protected: bool event(QEvent *e) override; +private slots: + void ungrab(); + private: void setupWaylandIntegration(); diff --git a/lookandfeel/contents/userswitcher/UserSwitcher.qml b/lookandfeel/contents/userswitcher/UserSwitcher.qml index 265ddec57..7d1295295 100644 --- a/lookandfeel/contents/userswitcher/UserSwitcher.qml +++ b/lookandfeel/contents/userswitcher/UserSwitcher.qml @@ -33,6 +33,7 @@ PlasmaCore.ColorScope { colorGroup: PlasmaCore.Theme.ComplementaryColorGroup signal dismissed + signal ungrab height:screenGeometry.height width: screenGeometry.width @@ -52,6 +53,8 @@ PlasmaCore.ColorScope { // returned leaving us do nothing (Bug 356945) onStartedNewSession: root.dismissed() onSwitchedUser: root.dismissed() + + onAboutToLockScreen: root.ungrab() } Controls.Action {