Add patch to fix focus follows mouse (#1960208)
parent
4613fda105
commit
cd20a4a868
@ -0,0 +1,89 @@
|
|||||||
|
From 073b6efc144d8aabef2eea8f64b84ffdca87b6b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||||
|
Date: Mon, 3 May 2021 11:24:22 +0300
|
||||||
|
Subject: [PATCH] wayland: Fix focus follows mouse policy
|
||||||
|
|
||||||
|
We want to update the input focus only if the pointer is moved. Due to
|
||||||
|
that, AbstractClient::enterEvent() checks the last seen pointer position
|
||||||
|
to decide whether the window needs to be focused.
|
||||||
|
|
||||||
|
The issue is that when the pointer moves from a decoration to a surface,
|
||||||
|
the cached pointer position will be updated to the current pointer
|
||||||
|
position, and thus the check in AbstractClient::enterEvent() will fail.
|
||||||
|
|
||||||
|
We need to update the cached pointer position only if there is a focused
|
||||||
|
decoration.
|
||||||
|
---
|
||||||
|
src/input.cpp | 26 +++++++++++++-------------
|
||||||
|
src/pointer_input.cpp | 2 --
|
||||||
|
2 files changed, 13 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/input.cpp b/src/input.cpp
|
||||||
|
index 9377e9334..b1b961e39 100644
|
||||||
|
--- a/input.cpp
|
||||||
|
+++ b/input.cpp
|
||||||
|
@@ -2846,6 +2846,7 @@ void InputDeviceHandler::update()
|
||||||
|
setAt(toplevel);
|
||||||
|
|
||||||
|
if (focusUpdatesBlocked()) {
|
||||||
|
+ workspace()->updateFocusMousePosition(position().toPoint());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2860,21 +2861,20 @@ void InputDeviceHandler::update()
|
||||||
|
// went onto or off from decoration, update focus
|
||||||
|
updateFocus();
|
||||||
|
}
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- updateInternalWindow(nullptr);
|
||||||
|
+ } else {
|
||||||
|
+ updateInternalWindow(nullptr);
|
||||||
|
|
||||||
|
- if (m_focus.focus != m_at.at) {
|
||||||
|
- // focus change
|
||||||
|
- updateDecoration();
|
||||||
|
- updateFocus();
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- // check if switched to/from decoration while staying on the same Toplevel
|
||||||
|
- if (updateDecoration()) {
|
||||||
|
- // went onto or off from decoration, update focus
|
||||||
|
- updateFocus();
|
||||||
|
+ if (m_focus.focus != m_at.at) {
|
||||||
|
+ // focus change
|
||||||
|
+ updateDecoration();
|
||||||
|
+ updateFocus();
|
||||||
|
+ } else if (updateDecoration()) {
|
||||||
|
+ // went onto or off from decoration, update focus
|
||||||
|
+ updateFocus();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ workspace()->updateFocusMousePosition(position().toPoint());
|
||||||
|
}
|
||||||
|
|
||||||
|
Toplevel *InputDeviceHandler::at() const
|
||||||
|
diff --git a/src/pointer_input.cpp b/src/pointer_input.cpp
|
||||||
|
index bf59197d3..a93c2cf55 100644
|
||||||
|
--- a/pointer_input.cpp
|
||||||
|
+++ b/pointer_input.cpp
|
||||||
|
@@ -473,7 +473,6 @@ void PointerInputRedirection::cleanupDecoration(Decoration::DecoratedClientImpl
|
||||||
|
{
|
||||||
|
disconnect(m_decorationGeometryConnection);
|
||||||
|
m_decorationGeometryConnection = QMetaObject::Connection();
|
||||||
|
- workspace()->updateFocusMousePosition(position().toPoint());
|
||||||
|
|
||||||
|
if (old) {
|
||||||
|
// send leave event to old decoration
|
||||||
|
@@ -524,7 +523,6 @@ void PointerInputRedirection::focusUpdate(Toplevel *focusOld, Toplevel *focusNow
|
||||||
|
|
||||||
|
if (AbstractClient *ac = qobject_cast<AbstractClient*>(focusNow)) {
|
||||||
|
ac->enterEvent(m_pos.toPoint());
|
||||||
|
- workspace()->updateFocusMousePosition(m_pos.toPoint());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (internalWindow()) {
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
Loading…
Reference in new issue