From 0e2109b1b41785535a59b7876f2f48e775bdd566 Mon Sep 17 00:00:00 2001 From: Wolfgang Müller Date: Sat, 19 Oct 2024 21:00:45 +0200 Subject: desktop-plasma: Add patches for kde-apps/dolphin to fix click behaviour All of these depend on each other and have not yet seen release in any stable version. In their entirety they fix an annoying behaviour where quickly tapping the Forward/Backward buttons on the mouse would be interpreted as double-clicks, thereby ignoring the second click made. A fix has been sent upstream at [1] and is contained here. [1] https://invent.kde.org/system/dolphin/-/merge_requests/842 --- ...ntroller-only-accept-doubleclick-for-left.patch | 106 +++++++++++++++++++++ ...-left-mouse-button-for-double-click-actio.patch | 32 +++++++ ...-Fix-double-click-view-background-feature.patch | 30 ++++++ ...ntroller-process-forward-back-buttons-whe.patch | 47 +++++++++ 4 files changed, 215 insertions(+) create mode 100644 desktop-plasma/patches/kde-apps/dolphin/0001-Kitemlistcontroller-only-accept-doubleclick-for-left.patch create mode 100644 desktop-plasma/patches/kde-apps/dolphin/0002-Only-accept-left-mouse-button-for-double-click-actio.patch create mode 100644 desktop-plasma/patches/kde-apps/dolphin/0003-Fix-double-click-view-background-feature.patch create mode 100644 desktop-plasma/patches/kde-apps/dolphin/0004-kitemlistcontroller-process-forward-back-buttons-whe.patch diff --git a/desktop-plasma/patches/kde-apps/dolphin/0001-Kitemlistcontroller-only-accept-doubleclick-for-left.patch b/desktop-plasma/patches/kde-apps/dolphin/0001-Kitemlistcontroller-only-accept-doubleclick-for-left.patch new file mode 100644 index 0000000..b8a53a1 --- /dev/null +++ b/desktop-plasma/patches/kde-apps/dolphin/0001-Kitemlistcontroller-only-accept-doubleclick-for-left.patch @@ -0,0 +1,106 @@ +From 531244611f11bfee9f6b9f2efd98ed418d860b3d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?M=C3=A9ven=20Car?= +Date: Wed, 31 Jul 2024 11:00:32 +0200 +Subject: [PATCH 1/4] Kitemlistcontroller: only accept doubleclick for left + mouse button + +Add test for double-click activation. + +BUG: 485295 +--- + src/kitemviews/kitemlistcontroller.cpp | 2 +- + src/tests/kitemlistcontrollertest.cpp | 58 ++++++++++++++++++++++++++ + 2 files changed, 59 insertions(+), 1 deletion(-) + +diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp +index 392dc410e..997e6623b 100644 +--- a/src/kitemviews/kitemlistcontroller.cpp ++++ b/src/kitemviews/kitemlistcontroller.cpp +@@ -713,7 +713,7 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event, + } + } + +- if (event->button() & Qt::RightButton) { ++ if (event->button() & ~Qt::LeftButton) { + return false; + } + +diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp +index cb921781d..18ad1186d 100644 +--- a/src/tests/kitemlistcontrollertest.cpp ++++ b/src/tests/kitemlistcontrollertest.cpp +@@ -620,6 +620,41 @@ void KItemListControllerTest::testMouseClickActivation() + mouseReleaseEvent.setButton(Qt::LeftButton); + mouseReleaseEvent.setButtons(Qt::NoButton); + ++ QGraphicsSceneMouseEvent mouseDoubleClickEvent(QEvent::GraphicsSceneMouseDoubleClick); ++ mouseDoubleClickEvent.setPos(pos); ++ mouseDoubleClickEvent.setButton(Qt::LeftButton); ++ mouseDoubleClickEvent.setButtons(Qt::LeftButton); ++ ++ QGraphicsSceneMouseEvent mouseRightPressEvent(QEvent::GraphicsSceneMousePress); ++ mouseRightPressEvent.setPos(pos); ++ mouseRightPressEvent.setButton(Qt::RightButton); ++ mouseRightPressEvent.setButtons(Qt::RightButton); ++ ++ QGraphicsSceneMouseEvent mouseRightReleaseEvent(QEvent::GraphicsSceneMouseRelease); ++ mouseRightReleaseEvent.setPos(pos); ++ mouseRightReleaseEvent.setButton(Qt::RightButton); ++ mouseRightReleaseEvent.setButtons(Qt::NoButton); ++ ++ QGraphicsSceneMouseEvent mouseRightDoubleClickEvent(QEvent::GraphicsSceneMouseDoubleClick); ++ mouseRightDoubleClickEvent.setPos(pos); ++ mouseRightDoubleClickEvent.setButton(Qt::RightButton); ++ mouseRightDoubleClickEvent.setButtons(Qt::RightButton); ++ ++ QGraphicsSceneMouseEvent mouseBackPressEvent(QEvent::GraphicsSceneMousePress); ++ mouseBackPressEvent.setPos(pos); ++ mouseBackPressEvent.setButton(Qt::BackButton); ++ mouseBackPressEvent.setButtons(Qt::BackButton); ++ ++ QGraphicsSceneMouseEvent mouseBackReleaseEvent(QEvent::GraphicsSceneMouseRelease); ++ mouseBackReleaseEvent.setPos(pos); ++ mouseBackReleaseEvent.setButton(Qt::BackButton); ++ mouseBackReleaseEvent.setButtons(Qt::NoButton); ++ ++ QGraphicsSceneMouseEvent mouseBackDoubleClickEvent(QEvent::GraphicsSceneMouseDoubleClick); ++ mouseBackDoubleClickEvent.setPos(pos); ++ mouseBackDoubleClickEvent.setButton(Qt::BackButton); ++ mouseBackDoubleClickEvent.setButtons(Qt::BackButton); ++ + QSignalSpy spyItemActivated(m_controller, &KItemListController::itemActivated); + + // Default setting: single click activation. +@@ -638,6 +673,29 @@ void KItemListControllerTest::testMouseClickActivation() + spyItemActivated.clear(); + QVERIFY(m_view->controller()->selectionManager()->hasSelection()); + ++ // emulation of double click according to https://doc.qt.io/qt-6/qgraphicsscene.html#mouseDoubleClickEvent ++ m_view->event(&mousePressEvent); ++ m_view->event(&mouseReleaseEvent); ++ m_view->event(&mouseDoubleClickEvent); ++ m_view->event(&mouseReleaseEvent); ++ QCOMPARE(spyItemActivated.count(), 1); ++ spyItemActivated.clear(); ++ QVERIFY2(!m_view->controller()->selectionManager()->hasSelection(), "An item should not be implicitly selected during activation. @see bug 424723"); ++ ++ // right mouse button should not trigger activation ++ m_view->event(&mouseRightPressEvent); ++ m_view->event(&mouseRightReleaseEvent); ++ m_view->event(&mouseRightDoubleClickEvent); ++ m_view->event(&mouseRightReleaseEvent); ++ QCOMPARE(spyItemActivated.count(), 0); ++ ++ // back mouse button should not trigger activation ++ m_view->event(&mouseBackPressEvent); ++ m_view->event(&mouseBackReleaseEvent); ++ m_view->event(&mouseBackDoubleClickEvent); ++ m_view->event(&mouseBackReleaseEvent); ++ QCOMPARE(spyItemActivated.count(), 0); ++ + // Enforce single click activation in the controller. + m_controller->setSingleClickActivationEnforced(true); + m_view->event(&mousePressEvent); +-- +2.47.0 + diff --git a/desktop-plasma/patches/kde-apps/dolphin/0002-Only-accept-left-mouse-button-for-double-click-actio.patch b/desktop-plasma/patches/kde-apps/dolphin/0002-Only-accept-left-mouse-button-for-double-click-actio.patch new file mode 100644 index 0000000..9fd79a6 --- /dev/null +++ b/desktop-plasma/patches/kde-apps/dolphin/0002-Only-accept-left-mouse-button-for-double-click-actio.patch @@ -0,0 +1,32 @@ +From fbdbe93e3d6b25fc4a40af4c9c3fe337794452ba Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?M=C3=A9ven=20Car?= +Date: Tue, 13 Aug 2024 11:01:43 +0200 +Subject: [PATCH 2/4] Only accept left mouse button for double click actions + +Such + * double click background + +BUG: 485295 +--- + src/dolphinmainwindow.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp +index 8bc066455..bf605fa96 100644 +--- a/src/dolphinmainwindow.cpp ++++ b/src/dolphinmainwindow.cpp +@@ -2922,7 +2922,10 @@ bool DolphinMainWindow::isItemVisibleInAnyView(const QString &urlOfItem) + + void DolphinMainWindow::slotDoubleClickViewBackground(Qt::MouseButton button) + { +- Q_UNUSED(button) // might be of use later ++ if (button == Qt::MouseButton::LeftButton) { ++ // only handle left mouse button for now ++ return; ++ } + + GeneralSettings *settings = GeneralSettings::self(); + QString clickAction = settings->doubleClickViewAction(); +-- +2.47.0 + diff --git a/desktop-plasma/patches/kde-apps/dolphin/0003-Fix-double-click-view-background-feature.patch b/desktop-plasma/patches/kde-apps/dolphin/0003-Fix-double-click-view-background-feature.patch new file mode 100644 index 0000000..ee6c343 --- /dev/null +++ b/desktop-plasma/patches/kde-apps/dolphin/0003-Fix-double-click-view-background-feature.patch @@ -0,0 +1,30 @@ +From 123eec787f0198b91c3bfdb17262df0c5e9a8c28 Mon Sep 17 00:00:00 2001 +From: Felix Ernst +Date: Mon, 14 Oct 2024 14:44:47 +0200 +Subject: [PATCH 3/4] Fix double-click view background feature + +c934e803647674b4692668f047b6ffa18121982a was meant to change the +double-click view background feature to only allow double-clicks +with the left mouse button. However, it mistakenly did the exact +opposite and allowed every double-click except ones with the left +mouse button to trigger the feature. This one-liner fixes this. +--- + src/dolphinmainwindow.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp +index bf605fa96..9b2c0f97e 100644 +--- a/src/dolphinmainwindow.cpp ++++ b/src/dolphinmainwindow.cpp +@@ -2922,7 +2922,7 @@ bool DolphinMainWindow::isItemVisibleInAnyView(const QString &urlOfItem) + + void DolphinMainWindow::slotDoubleClickViewBackground(Qt::MouseButton button) + { +- if (button == Qt::MouseButton::LeftButton) { ++ if (button != Qt::MouseButton::LeftButton) { + // only handle left mouse button for now + return; + } +-- +2.47.0 + diff --git a/desktop-plasma/patches/kde-apps/dolphin/0004-kitemlistcontroller-process-forward-back-buttons-whe.patch b/desktop-plasma/patches/kde-apps/dolphin/0004-kitemlistcontroller-process-forward-back-buttons-whe.patch new file mode 100644 index 0000000..d0fa8eb --- /dev/null +++ b/desktop-plasma/patches/kde-apps/dolphin/0004-kitemlistcontroller-process-forward-back-buttons-whe.patch @@ -0,0 +1,47 @@ +From dd38c471458760b1795ac2cc0017bc5b5924b70b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Wolfgang=20M=C3=BCller?= +Date: Mon, 14 Oct 2024 18:43:28 +0200 +Subject: [PATCH 4/4] kitemlistcontroller: process forward/back buttons when + double-clicking + +Tapping the forward or back mouse buttons quickly enough makes Dolphin +interpret the action as a double-click of the button in question and +handle it in mouseDoubleClickEvent() instead of its normal button +handler. This means that certain button presses might seem delayed or +"swallowed" when quickly navigating forwards or backwards through the +history. + +Since a double-click of the forward or back button is currently +meaningless, fix this by emitting a normal mouseButtonPressed event for +those buttons in the double-click handler and skipping any further event +processing. + +Co-authored-by: Felix Ernst +CCBUG: 485295 +--- + src/kitemviews/kitemlistcontroller.cpp | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp +index 997e6623b..821e1b75f 100644 +--- a/src/kitemviews/kitemlistcontroller.cpp ++++ b/src/kitemviews/kitemlistcontroller.cpp +@@ -700,6 +700,15 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event, + const QPointF pos = transform.map(event->pos()); + const std::optional index = m_view->itemAt(pos); + ++ if (event->button() & (Qt::ForwardButton | Qt::BackButton)) { ++ // "Forward" and "Back" are reserved for quickly navigating through the ++ // history. Double-clicking those buttons should be interpreted as two ++ // separate button presses. We arrive here for the second click, which ++ // we now react to just as we would for a singular click ++ Q_EMIT mouseButtonPressed(index.value_or(-1), event->button()); ++ return false; ++ } ++ + if (!index.has_value()) { + Q_EMIT doubleClickViewBackground(event->button()); + return false; +-- +2.47.0 + -- cgit v1.2.3-2-gb3c3