diff --git a/0001-Implement-manual-focus-on-click.patch b/0001-Implement-manual-focus-on-click.patch new file mode 100644 index 0000000..246ad30 --- /dev/null +++ b/0001-Implement-manual-focus-on-click.patch @@ -0,0 +1,145 @@ +From f8043de10b5dd94b9b931a92f3aa7167188786c9 Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Mon, 27 Feb 2017 16:29:29 +0100 +Subject: [PATCH] Implement manual focus on click + +Summary: +Currently only the first created screenlock window gets focus. +On clicks, no focus events are sent, which makes it impossible to input +passwords. This patch now makes it possible to focus to a different +screenlock window (on a different monitor, for example) using a mouse +button press. +This should also fix newly created screenlock windows stealing the focus +of already displayed ones as only the first window gains automatic focus. + +BUG: 348789 +BUG: 374289 + +Test Plan: +Locked the screen, now I can use the password input on the secondary screen +as well. + +Reviewers: #plasma, graesslin, broulik + +Reviewed By: #plasma, graesslin + +Subscribers: hein, plasma-devel + +Tags: #plasma + +Differential Revision: https://phabricator.kde.org/D4821 +--- + greeter/greeterapp.cpp | 1 - + x11locker.cpp | 26 ++++++++++++++++++++++++-- + x11locker.h | 2 ++ + 3 files changed, 26 insertions(+), 3 deletions(-) + +diff --git a/greeter/greeterapp.cpp b/greeter/greeterapp.cpp +index 47fcb03..bcfcbdf 100644 +--- a/greeter/greeterapp.cpp ++++ b/greeter/greeterapp.cpp +@@ -372,7 +372,6 @@ void UnlockApp::getFocus() + // this loop is required to make the qml/graphicsscene properly handle the shared keyboard input + // ie. "type something into the box of every greeter" + foreach (KQuickAddons::QuickViewSharedEngine *view, m_views) { +- view->requestActivate(); + if (!m_testing) { + view->setKeyboardGrabEnabled(true); // TODO - check whether this still works in master! + } +diff --git a/x11locker.cpp b/x11locker.cpp +index b2d2ea4..6967a67 100644 +--- a/x11locker.cpp ++++ b/x11locker.cpp +@@ -51,6 +51,7 @@ namespace ScreenLocker + X11Locker::X11Locker(QObject *parent) + : AbstractLocker(parent) + , QAbstractNativeEventFilter() ++ , m_focusedLockWindow(XCB_WINDOW_NONE) + { + initialize(); + } +@@ -229,8 +230,12 @@ void X11Locker::removeVRoot(Window win) + XDeleteProperty (QX11Info::display(), win, gXA_VROOT); + } + +-static void fakeFocusIn( WId window ) ++void X11Locker::fakeFocusIn( WId window ) + { ++ if (window == m_focusedLockWindow) { ++ return; ++ } ++ + // We have keyboard grab, so this application will + // get keyboard events even without having focus. + // Fake FocusIn to make Qt realize it has the active +@@ -244,6 +249,8 @@ static void fakeFocusIn( WId window ) + ev.xfocus.detail = NotifyAncestor; + XSendEvent( QX11Info::display(), window, False, NoEventMask, &ev ); + XFlush(QX11Info::display()); ++ ++ m_focusedLockWindow = window; + } + + template< typename T> +@@ -308,6 +315,11 @@ bool X11Locker::nativeEventFilter(const QByteArray &eventType, void *message, lo + (x>=x_return && x<=x_return+(int)width_return) + && + (y>=y_return && y<=y_return+(int)height_return) ) { ++ // We need to do our own focus handling (see comment in fakeFocusIn). ++ // For now: Focus on clicks inside the window ++ if (responseType == XCB_BUTTON_PRESS) { ++ fakeFocusIn(window); ++ } + const int targetX = x - x_return; + const int targetY = y - y_return; + if (responseType == XCB_KEY_PRESS || responseType == XCB_KEY_RELEASE) { +@@ -386,6 +398,10 @@ bool X11Locker::nativeEventFilter(const QByteArray &eventType, void *message, lo + else + qDebug() << "Unknown toplevel for MapNotify"; + m_lockWindows.removeAll(xu->event); ++ if (m_focusedLockWindow == xu->event && !m_lockWindows.empty()) { ++ // The currently focused window vanished, just focus the first one in the list ++ fakeFocusIn(m_lockWindows[0]); ++ } + ret = true; + } + break; +@@ -508,8 +524,14 @@ void X11Locker::addAllowedWindow(quint32 window) + // not yet shown and we have a lock window, so we show our own window + m_background->show(); + } ++ ++ if (m_lockWindows.empty()) { ++ // Make sure to focus the first window ++ m_focusedLockWindow = XCB_WINDOW_NONE; ++ fakeFocusIn(window); ++ } ++ + m_lockWindows.prepend(window); +- fakeFocusIn(window); + stayOnTop(); + } + } +diff --git a/x11locker.h b/x11locker.h +index 9a14699..d8e83d6 100644 +--- a/x11locker.h ++++ b/x11locker.h +@@ -60,6 +60,7 @@ private: + void setVRoot(Window win, Window vr); + void removeVRoot(Window win); + int findWindowInfo(Window w); ++ void fakeFocusIn(WId window); + void stayOnTop() override; + struct WindowInfo + { +@@ -69,6 +70,7 @@ private: + QList m_windowInfo; + QList m_lockWindows; + QList m_allowedWindows; ++ WId m_focusedLockWindow; + }; + } + +-- +2.11.1 + diff --git a/kscreenlocker-5.9.2.tar.xz b/kscreenlocker-5.9.2.tar.xz deleted file mode 100644 index 0ef0e54..0000000 --- a/kscreenlocker-5.9.2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69c264e7c9f0fa5c826b912a5ebe5f1e582d338bd93214df8ece064bb4e7bcfd -size 108180 diff --git a/kscreenlocker-5.9.3.tar.xz b/kscreenlocker-5.9.3.tar.xz new file mode 100644 index 0000000..de18100 --- /dev/null +++ b/kscreenlocker-5.9.3.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2af875ce9112ef554ced3cb386d3274cb19300a3126b9478f407fc17ae7b9731 +size 108104 diff --git a/kscreenlocker.changes b/kscreenlocker.changes index 2b70101..a236275 100644 --- a/kscreenlocker.changes +++ b/kscreenlocker.changes @@ -1,3 +1,20 @@ +------------------------------------------------------------------- +Wed Mar 1 18:28:36 UTC 2017 - fabian@ritter-vogt.de + +- Add upstream patch to fix screenlocker focus on multiscreen systems: + * 0001-Implement-manual-focus-on-click.patch + +------------------------------------------------------------------- +Tue Feb 28 19:54:41 CET 2017 - fabian@ritter-vogt.de + +- Update to 5.9.3 + * New bugfix release + * For more details please see: + * https://www.kde.org/announcements/plasma-5.9.3.php +- Changes since 5.9.2: + * Merge Plasma/5.8 + * Fix crash in Screen Locker KCM on teardown + ------------------------------------------------------------------- Tue Feb 14 17:58:12 CET 2017 - fabian@ritter-vogt.de diff --git a/kscreenlocker.spec b/kscreenlocker.spec index aca2f72..248ccc0 100644 --- a/kscreenlocker.spec +++ b/kscreenlocker.spec @@ -18,7 +18,7 @@ %bcond_without lang Name: kscreenlocker -Version: 5.9.2 +Version: 5.9.3 Release: 0 Summary: Library and components for secure lock screen architecture License: GPL-2.0+ @@ -27,6 +27,8 @@ Url: https://projects.kde.org/kscreenlocker Source: http://download.kde.org/stable/plasma/%{version}/kscreenlocker-%{version}.tar.xz # PATCH-FIX-OPENSUSE fix-wayland-version-requirement.diff -- Changes wayland requirement from 1.3 to 1.2.1 Patch0: fix-wayland-version-requirement.diff +# PATCH-FIX-UPSTREAM 0001-Implement-manual-focus-on-click.patch +Patch100: 0001-Implement-manual-focus-on-click.patch BuildRequires: cmake >= 2.8.12 BuildRequires: extra-cmake-modules >= 1.8.0 BuildRequires: kf5-filesystem @@ -91,6 +93,7 @@ Development files for Library and components for secure lock screen architecture # SLE12 has a patched 1.2.1 wayland with all features KDE needs from up to 1.7.0 %patch0 -p1 %endif +%patch100 -p1 %build %cmake_kf5 -d build -- -DKDE4_COMMON_PAM_SERVICE=xdm -DCMAKE_INSTALL_LOCALEDIR=%{_kf5_localedir}