diff --git a/cursor.cpp b/cursor.cpp index 4678633605..880f46b9cb 100644 --- a/cursor.cpp +++ b/cursor.cpp @@ -536,8 +536,11 @@ InputRedirectionCursor::~InputRedirectionCursor() void InputRedirectionCursor::doSetPos() { - // no support for pointer warping - reset to true position + if (input()->supportsPointerWarping()) { + input()->warpPointer(currentPos()); + } slotPosChanged(input()->globalPointer()); + emit posChanged(currentPos()); } void InputRedirectionCursor::slotPosChanged(const QPointF &pos) diff --git a/input.cpp b/input.cpp index 05cdc0fe3b..ea97147b6f 100644 --- a/input.cpp +++ b/input.cpp @@ -286,6 +286,7 @@ void InputRedirection::setupLibInput() m_libInput = conn; if (conn) { conn->setup(); + m_pointerWarping = true; connect(conn, &LibInput::Connection::pointerButtonChanged, this, &InputRedirection::processPointerButton); connect(conn, &LibInput::Connection::pointerAxisChanged, this, &InputRedirection::processPointerAxis); connect(conn, &LibInput::Connection::keyChanged, this, &InputRedirection::processKeyboardKey); @@ -1046,4 +1047,11 @@ void InputRedirection::updatePointerAfterScreenChange() emit globalPointerChanged(m_globalPointer); } +void InputRedirection::warpPointer(const QPointF &pos) +{ + if (m_pointerWarping) { + updatePointerPosition(pos); + } +} + } // namespace diff --git a/input.h b/input.h index 345319d7eb..7525039960 100644 --- a/input.h +++ b/input.h @@ -139,6 +139,9 @@ public: void cancelTouch(); void touchFrame(); + bool supportsPointerWarping() const; + void warpPointer(const QPointF &pos); + static uint8_t toXPointerButton(uint32_t button); static uint8_t toXPointerButton(PointerAxis axis, qreal delta); @@ -219,6 +222,8 @@ private: LibInput::Connection *m_libInput = nullptr; + bool m_pointerWarping = false; + KWIN_SINGLETON(InputRedirection) friend InputRedirection *input(); }; @@ -282,6 +287,12 @@ void InputRedirection::registerShortcut(const QKeySequence &shortcut, QAction *a connect(action, &QAction::triggered, receiver, slot); } +inline +bool InputRedirection::supportsPointerWarping() const +{ + return m_pointerWarping; +} + #if HAVE_XKB inline Qt::KeyboardModifiers Xkb::modifiers() const diff --git a/kcmkwin/kwinrules/kwinsrc.cpp b/kcmkwin/kwinrules/kwinsrc.cpp index d19d8ee30a..5002f46cda 100644 --- a/kcmkwin/kwinrules/kwinsrc.cpp +++ b/kcmkwin/kwinrules/kwinsrc.cpp @@ -38,3 +38,7 @@ Qt::KeyboardModifiers KWin::InputRedirection::keyboardModifiers() const { return Qt::NoModifier; } + +void KWin::InputRedirection::warpPointer(const QPointF&) +{ +}