From 073b6efc144d8aabef2eea8f64b84ffdca87b6b5 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii 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(focusNow)) { ac->enterEvent(m_pos.toPoint()); - workspace()->updateFocusMousePosition(m_pos.toPoint()); } if (internalWindow()) { -- GitLab