Accepting request 482096 from KDE:Frameworks5

(forwarded request 482045 from Vogtinator)

OBS-URL: https://build.opensuse.org/request/show/482096
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/kscreenlocker?expand=0&rev=24
This commit is contained in:
Yuchen Lin 2017-03-28 13:15:37 +00:00 committed by Git OBS Bridge
commit fcb54db181
5 changed files with 17 additions and 152 deletions

View File

@ -1,145 +0,0 @@
From f8043de10b5dd94b9b931a92f3aa7167188786c9 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
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<WindowInfo> m_windowInfo;
QList<WId> m_lockWindows;
QList<quint32> m_allowedWindows;
+ WId m_focusedLockWindow;
};
}
--
2.11.1

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2af875ce9112ef554ced3cb386d3274cb19300a3126b9478f407fc17ae7b9731
size 108104

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:92e26758b1ff0af00e4416f2a463e8690e59010de8bdd3c37ef82c551749c132
size 108844

View File

@ -1,3 +1,16 @@
-------------------------------------------------------------------
Tue Mar 21 19:21:45 CET 2017 - fabian@ritter-vogt.de
- Update to 5.9.4
* New bugfix release
* For more details please see:
* https://www.kde.org/announcements/plasma-5.9.4.php
- Changes since 5.9.3:
* fix merge
* Implement manual focus on click (kde#348789,kde#374289)
- Remove patches, now upstream:
* 0001-Implement-manual-focus-on-click.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Wed Mar 1 18:28:36 UTC 2017 - fabian@ritter-vogt.de Wed Mar 1 18:28:36 UTC 2017 - fabian@ritter-vogt.de

View File

@ -18,7 +18,7 @@
%bcond_without lang %bcond_without lang
Name: kscreenlocker Name: kscreenlocker
Version: 5.9.3 Version: 5.9.4
Release: 0 Release: 0
Summary: Library and components for secure lock screen architecture Summary: Library and components for secure lock screen architecture
License: GPL-2.0+ License: GPL-2.0+
@ -27,8 +27,6 @@ Url: https://projects.kde.org/kscreenlocker
Source: http://download.kde.org/stable/plasma/%{version}/kscreenlocker-%{version}.tar.xz 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 # PATCH-FIX-OPENSUSE fix-wayland-version-requirement.diff -- Changes wayland requirement from 1.3 to 1.2.1
Patch0: fix-wayland-version-requirement.diff 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: cmake >= 2.8.12
BuildRequires: extra-cmake-modules >= 1.8.0 BuildRequires: extra-cmake-modules >= 1.8.0
BuildRequires: kf5-filesystem BuildRequires: kf5-filesystem
@ -93,7 +91,6 @@ 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 # SLE12 has a patched 1.2.1 wayland with all features KDE needs from up to 1.7.0
%patch0 -p1 %patch0 -p1
%endif %endif
%patch100 -p1
%build %build
%cmake_kf5 -d build -- -DKDE4_COMMON_PAM_SERVICE=xdm -DCMAKE_INSTALL_LOCALEDIR=%{_kf5_localedir} %cmake_kf5 -d build -- -DKDE4_COMMON_PAM_SERVICE=xdm -DCMAKE_INSTALL_LOCALEDIR=%{_kf5_localedir}