diff --git a/input.cpp b/input.cpp --- a/input.cpp +++ b/input.cpp @@ -1520,6 +1520,46 @@ } }; +/** + * Useful when there's no proper tablet support on the clients + */ +class FakeTabletInputFilter : public InputEventFilter +{ +public: + FakeTabletInputFilter() + { + } + + bool tabletToolEvent(QTabletEvent *event) override + { + if (!workspace()) { + return false; + } + + switch (event->type()) { + case QEvent::TabletMove: + case QEvent::TabletEnterProximity: + input()->pointer()->processMotion(event->globalPosF(), event->timestamp()); + break; + case QEvent::TabletPress: + input()->pointer()->processButton(KWin::qtMouseButtonToButton(Qt::LeftButton), + InputRedirection::PointerButtonPressed, event->timestamp()); + break; + case QEvent::TabletRelease: + input()->pointer()->processButton(KWin::qtMouseButtonToButton(Qt::LeftButton), + InputRedirection::PointerButtonReleased, event->timestamp()); + break; + case QEvent::TabletLeaveProximity: + break; + default: + qCWarning(KWIN_CORE) << "Unexpected tablet event type" << event; + break; + } + waylandServer()->simulateUserActivity(); + return true; + } +}; + class DragAndDropInputFilter : public InputEventFilter { public: @@ -1881,6 +1921,7 @@ if (waylandServer()) { installInputEventFilter(new WindowActionInputFilter); installInputEventFilter(new ForwardInputFilter); + installInputEventFilter(new FakeTabletInputFilter); } } diff --git a/pointer_input.h b/pointer_input.h --- a/pointer_input.h +++ b/pointer_input.h @@ -57,6 +57,8 @@ class Device; } +uint32_t qtMouseButtonToButton(Qt::MouseButton button); + class KWIN_EXPORT PointerInputRedirection : public InputDeviceHandler { Q_OBJECT diff --git a/pointer_input.cpp b/pointer_input.cpp --- a/pointer_input.cpp +++ b/pointer_input.cpp @@ -81,6 +81,11 @@ { 0x11f , Qt::ExtraButton13 }, }; +uint32_t qtMouseButtonToButton(Qt::MouseButton button) +{ + return s_buttonToQtMouseButton.key(button); +} + static Qt::MouseButton buttonToQtMouseButton(uint32_t button) { // all other values get mapped to ExtraButton24 @@ -91,7 +96,6 @@ // buttons are pressed is correct and that's all we care about. return s_buttonToQtMouseButton.value(button, Qt::ExtraButton24); } -} static bool screenContainsPos(const QPointF &pos) {