From eb73ca27276f899f7b3d7a38cd25151b130f84ae Mon Sep 17 00:00:00 2001 From: Simon Schneegans Date: Wed, 12 Aug 2026 05:37:20 +0200 Subject: [PATCH 1/2] :wrench: Use InputSpy instead of InputFilter --- src/input/PointerInput.cpp | 21 +++++++-------------- src/input/PointerInput.h | 19 +++++++++++-------- src/plugin/KandoKWinIntegrationPlugin.cpp | 5 +++-- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/input/PointerInput.cpp b/src/input/PointerInput.cpp index c891a93..eac0967 100644 --- a/src/input/PointerInput.cpp +++ b/src/input/PointerInput.cpp @@ -14,51 +14,46 @@ #include -PointerInput::PointerInput() : KWin::InputEventFilter(KWin::InputFilterOrder::Effects) {} +PointerInput::PointerInput() : KWin::InputEventSpy() {} QPointF const& PointerInput::lastPosition() const { return mLastPosition; } -bool PointerInput::pointerMotion(KWin::PointerMotionEvent* event) { +void PointerInput::pointerMotion(KWin::PointerMotionEvent* event) { mLastPosition = event->position; - return false; } #if defined(KANDO_KWIN_HAS_TABLET_TOOL_AXIS_PROXIMITY_STRUCT_EVENTS) -bool PointerInput::tabletToolAxisEvent(KWin::TabletToolAxisEvent* event) { +void PointerInput::tabletToolAxisEvent(KWin::TabletToolAxisEvent* event) { if (mStylusProximity) { mLastPosition = event->position; } - return false; } -bool PointerInput::tabletToolProximityEvent(KWin::TabletToolProximityEvent* event) { +void PointerInput::tabletToolProximityEvent(KWin::TabletToolProximityEvent* event) { if (event->type == KWin::TabletToolProximityEvent::EnterProximity) { mStylusProximity = true; mLastPosition = event->position; } else { mStylusProximity = false; } - return false; } #elif defined(KANDO_KWIN_HAS_TABLET_TOOL_AXIS_PROXIMITY_TABLET_EVENT) -bool PointerInput::tabletToolAxisEvent(KWin::TabletEvent* event) { +void PointerInput::tabletToolAxisEvent(KWin::TabletEvent* event) { if (mStylusProximity) { mLastPosition = event->globalPosition(); } - return false; } -bool PointerInput::tabletToolProximityEvent(KWin::TabletEvent* event) { +void PointerInput::tabletToolProximityEvent(KWin::TabletEvent* event) { if (event->type() == QEvent::TabletEnterProximity) { mStylusProximity = true; mLastPosition = event->globalPosition(); } else { mStylusProximity = false; } - return false; } #elif defined(KANDO_KWIN_HAS_TABLET_TOOL_EVENT) -bool PointerInput::tabletToolEvent(KWin::TabletEvent* event) { +void PointerInput::tabletToolEvent(KWin::TabletEvent* event) { switch (event->type()) { case QEvent::TabletEnterProximity: mStylusProximity = true; @@ -75,7 +70,5 @@ bool PointerInput::tabletToolEvent(KWin::TabletEvent* event) { } break; } - - return false; } #endif \ No newline at end of file diff --git a/src/input/PointerInput.h b/src/input/PointerInput.h index b87daca..2b7c2a2 100644 --- a/src/input/PointerInput.h +++ b/src/input/PointerInput.h @@ -10,27 +10,30 @@ #pragma once -#include +#include #include -class PointerInput : public KWin::InputEventFilter { +// An InputEventSpy sees every event before InputEventFilters do, so unlike a filter it +// still receives pointer motion while KWin's drag-and-drop filter has grabbed the +// pointer. +class PointerInput : public KWin::InputEventSpy { public: PointerInput(); ~PointerInput() override = default; QPointF const& lastPosition() const; - bool pointerMotion(KWin::PointerMotionEvent* event) override; + void pointerMotion(KWin::PointerMotionEvent* event) override; #if defined(KANDO_KWIN_HAS_TABLET_TOOL_AXIS_PROXIMITY_STRUCT_EVENTS) - bool tabletToolAxisEvent(KWin::TabletToolAxisEvent* event) override; - bool tabletToolProximityEvent(KWin::TabletToolProximityEvent* event) override; + void tabletToolAxisEvent(KWin::TabletToolAxisEvent* event) override; + void tabletToolProximityEvent(KWin::TabletToolProximityEvent* event) override; #elif defined(KANDO_KWIN_HAS_TABLET_TOOL_AXIS_PROXIMITY_TABLET_EVENT) - bool tabletToolAxisEvent(KWin::TabletEvent* event) override; - bool tabletToolProximityEvent(KWin::TabletEvent* event) override; + void tabletToolAxisEvent(KWin::TabletEvent* event) override; + void tabletToolProximityEvent(KWin::TabletEvent* event) override; #elif defined(KANDO_KWIN_HAS_TABLET_TOOL_EVENT) - bool tabletToolEvent(KWin::TabletEvent* event) override; + void tabletToolEvent(KWin::TabletEvent* event) override; #endif private: diff --git a/src/plugin/KandoKWinIntegrationPlugin.cpp b/src/plugin/KandoKWinIntegrationPlugin.cpp index e8577cc..f105c88 100644 --- a/src/plugin/KandoKWinIntegrationPlugin.cpp +++ b/src/plugin/KandoKWinIntegrationPlugin.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -26,7 +27,7 @@ const auto kObjectPath = QStringLiteral("/menu/kando/KWinIntegration"); KandoKWinIntegrationPlugin::KandoKWinIntegrationPlugin() : KWin::Effect(), mAdaptor(new KandoIntegrationAdaptor(this)) { - KWin::input()->installInputEventFilter(&mPointerInput); + KWin::input()->installInputEventSpy(&mPointerInput); auto bus = QDBusConnection::sessionBus(); @@ -46,7 +47,7 @@ KandoKWinIntegrationPlugin::~KandoKWinIntegrationPlugin() { bus.unregisterObject(kObjectPath); bus.unregisterService(kServiceName); - KWin::input()->uninstallInputEventFilter(&mPointerInput); + KWin::input()->uninstallInputEventSpy(&mPointerInput); } QVariantMap KandoKWinIntegrationPlugin::getWMInfo() const { From 16331c2d4b55ff2a0f0112c470c7739d64fd47ec Mon Sep 17 00:00:00 2001 From: Simon Schneegans Date: Wed, 12 Aug 2026 05:39:13 +0200 Subject: [PATCH 2/2] :memo: Add changelog entry --- changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.md b/changelog.md index 58edcf6..05ab277 100644 --- a/changelog.md +++ b/changelog.md @@ -5,6 +5,12 @@ SPDX-License-Identifier: CC-BY-4.0 # Changelog of the KWin Integration Plugin for Kando +## [KWin Integration 0.4.0](https://github.com/kando-menu/kwin-integration/releases/tag/v0.4.0) + +**Release Date:** TBD + +- The plugin now uses KWin's `InputSpy` instead of `InputFilter` to get the current pointer position. This allows getting the pointer position even during drag-and-drop operations, which was not possible before. + ## [KWin Integration 0.3.1](https://github.com/kando-menu/kwin-integration/releases/tag/v0.3.1) **Release Date:** 2026-08-07