From 06fc00b4a9ad79f3ae2fc6c3ed23ff6e8afe25a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Fri, 5 Jun 2015 19:34:03 +0200 Subject: [PATCH] [wayland] Support pointer warping in the backends The X11 backend can warp the pointer. --- abstract_backend.cpp | 5 +++++ abstract_backend.h | 8 ++++++++ backends/x11/x11windowed_backend.cpp | 7 +++++++ backends/x11/x11windowed_backend.h | 1 + input.cpp | 17 ++++++++++++++++- input.h | 6 ------ kcmkwin/kwinrules/kwinsrc.cpp | 5 +++++ 7 files changed, 42 insertions(+), 7 deletions(-) diff --git a/abstract_backend.cpp b/abstract_backend.cpp index c0e8ec43db..28564e3e03 100644 --- a/abstract_backend.cpp +++ b/abstract_backend.cpp @@ -304,4 +304,9 @@ void AbstractBackend::setReady(bool ready) emit readyChanged(m_ready); } +void AbstractBackend::warpPointer(const QPointF &globalPos) +{ + Q_UNUSED(globalPos) +} + } diff --git a/abstract_backend.h b/abstract_backend.h index 6d8adeaec4..4efbac5165 100644 --- a/abstract_backend.h +++ b/abstract_backend.h @@ -43,6 +43,7 @@ public: virtual Screens *createScreens(QObject *parent = nullptr); virtual OpenGLBackend *createOpenGLBackend(); virtual QPainterBackend *createQPainterBackend(); + virtual void warpPointer(const QPointF &globalPos); bool usesSoftwareCursor() const { return m_softWareCursor; @@ -67,6 +68,9 @@ public: void setDeviceIdentifier(const QByteArray &identifier) { m_deviceIdentifier = identifier; } + bool supportsPointerWarping() const { + return m_pointerWarping; + } public Q_SLOTS: void pointerMotion(const QPointF &position, quint32 time); @@ -106,6 +110,9 @@ protected: QByteArray deviceIdentifier() const { return m_deviceIdentifier; } + void setSupportsPointerWarping(bool set) { + m_pointerWarping = set; + } private: void triggerCursorRepaint(); @@ -121,6 +128,7 @@ private: bool m_ready = false; QSize m_initialWindowSize; QByteArray m_deviceIdentifier; + bool m_pointerWarping = false; }; } diff --git a/backends/x11/x11windowed_backend.cpp b/backends/x11/x11windowed_backend.cpp index 7c015729bd..3ba9e5cd39 100644 --- a/backends/x11/x11windowed_backend.cpp +++ b/backends/x11/x11windowed_backend.cpp @@ -48,6 +48,7 @@ namespace KWin X11WindowedBackend::X11WindowedBackend(QObject *parent) : AbstractBackend(parent) { + setSupportsPointerWarping(true); } X11WindowedBackend::~X11WindowedBackend() @@ -339,4 +340,10 @@ QPainterBackend *X11WindowedBackend::createQPainterBackend() return new X11WindowedQPainterBackend(this); } +void X11WindowedBackend::warpPointer(const QPointF &globalPos) +{ + xcb_warp_pointer(m_connection, m_window, m_window, 0, 0, 0, 0, globalPos.x(), globalPos.y()); + xcb_flush(m_connection); +} + } diff --git a/backends/x11/x11windowed_backend.h b/backends/x11/x11windowed_backend.h index 66582f0e32..e8c3a01b19 100644 --- a/backends/x11/x11windowed_backend.h +++ b/backends/x11/x11windowed_backend.h @@ -69,6 +69,7 @@ public: Screens *createScreens(QObject *parent = nullptr) override; OpenGLBackend *createOpenGLBackend() override; QPainterBackend* createQPainterBackend() override; + void warpPointer(const QPointF &globalPos) override; Q_SIGNALS: void sizeChanged(); diff --git a/input.cpp b/input.cpp index ea97147b6f..b35728aac3 100644 --- a/input.cpp +++ b/input.cpp @@ -1049,9 +1049,24 @@ void InputRedirection::updatePointerAfterScreenChange() void InputRedirection::warpPointer(const QPointF &pos) { - if (m_pointerWarping) { + if (supportsPointerWarping()) { +#if HAVE_WAYLAND + if (waylandServer()) { + waylandServer()->backend()->warpPointer(pos); + } +#endif updatePointerPosition(pos); } } +bool InputRedirection::supportsPointerWarping() const +{ +#if HAVE_WAYLAND + if (waylandServer() && waylandServer()->backend()->supportsPointerWarping()) { + return true; + } +#endif + return m_pointerWarping; +} + } // namespace diff --git a/input.h b/input.h index 7525039960..01f32f470f 100644 --- a/input.h +++ b/input.h @@ -287,12 +287,6 @@ 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 5002f46cda..88a0ee68fd 100644 --- a/kcmkwin/kwinrules/kwinsrc.cpp +++ b/kcmkwin/kwinrules/kwinsrc.cpp @@ -42,3 +42,8 @@ Qt::KeyboardModifiers KWin::InputRedirection::keyboardModifiers() const void KWin::InputRedirection::warpPointer(const QPointF&) { } + +bool KWin::InputRedirection::supportsPointerWarping() const +{ + return false; +}