Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 7 additions & 14 deletions src/input/PointerInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,51 +14,46 @@

#include <QEvent>

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;
Expand All @@ -75,7 +70,5 @@ bool PointerInput::tabletToolEvent(KWin::TabletEvent* event) {
}
break;
}

return false;
}
#endif
19 changes: 11 additions & 8 deletions src/input/PointerInput.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,30 @@

#pragma once

#include <input.h>
#include <input_event_spy.h>

#include <QPoint>

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:
Expand Down
5 changes: 3 additions & 2 deletions src/plugin/KandoKWinIntegrationPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include <effect/effecthandler.h>
#include <effect/effectwindow.h>
#include <input.h>

#include <QDBusConnection>
#include <QDBusError>
Expand All @@ -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();

Expand All @@ -46,7 +47,7 @@ KandoKWinIntegrationPlugin::~KandoKWinIntegrationPlugin() {
bus.unregisterObject(kObjectPath);
bus.unregisterService(kServiceName);

KWin::input()->uninstallInputEventFilter(&mPointerInput);
KWin::input()->uninstallInputEventSpy(&mPointerInput);
}

QVariantMap KandoKWinIntegrationPlugin::getWMInfo() const {
Expand Down