diff --git a/kcms/touchpad/src/backends/kwin_wayland.cmake b/kcms/touchpad/src/backends/kwin_wayland.cmake --- a/kcms/touchpad/src/backends/kwin_wayland.cmake +++ b/kcms/touchpad/src/backends/kwin_wayland.cmake @@ -1,5 +1,6 @@ SET(backend_SRCS ${backend_SRCS} + backends/libinputcommon.cpp backends/kwin_wayland/kwinwaylandbackend.cpp backends/kwin_wayland/kwinwaylandtouchpad.cpp ) diff --git a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandbackend.cpp b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandbackend.cpp --- a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandbackend.cpp +++ b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandbackend.cpp @@ -40,6 +40,8 @@ QDBusConnection::sessionBus(), this); + setMode(TouchpadInputBackendMode::WaylandLibinput); + findTouchpads(); m_deviceManager->connection().connect(QStringLiteral("org.kde.KWin"), diff --git a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h --- a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h +++ b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h @@ -19,98 +19,15 @@ #ifndef KWINWAYLANDTOUCHPAD_H #define KWINWAYLANDTOUCHPAD_H -#include +#include #include class QDBusInterface; -class KWinWaylandTouchpad : public QObject +class KWinWaylandTouchpad : public LibinputCommon { Q_OBJECT - // - // general - Q_PROPERTY(QString name READ name CONSTANT) - Q_PROPERTY(bool supportsDisableEvents READ supportsDisableEvents CONSTANT) - Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) - - // - // advanced - Q_PROPERTY(Qt::MouseButtons supportedButtons READ supportedButtons CONSTANT) - - Q_PROPERTY(bool supportsLeftHanded READ supportsLeftHanded CONSTANT) - Q_PROPERTY(bool leftHandedEnabledByDefault READ leftHandedEnabledByDefault CONSTANT) - Q_PROPERTY(bool leftHanded READ isLeftHanded WRITE setLeftHanded NOTIFY leftHandedChanged) - - Q_PROPERTY(bool supportsDisableEventsOnExternalMouse READ supportsDisableEventsOnExternalMouse CONSTANT) - - Q_PROPERTY(bool supportsDisableWhileTyping READ supportsDisableWhileTyping CONSTANT) - Q_PROPERTY(bool disableWhileTypingEnabledByDefault READ disableWhileTypingEnabledByDefault CONSTANT) - Q_PROPERTY(bool disableWhileTyping READ isDisableWhileTyping WRITE setDisableWhileTyping NOTIFY disableWhileTypingChanged) - - Q_PROPERTY(bool supportsMiddleEmulation READ supportsMiddleEmulation CONSTANT) - Q_PROPERTY(bool middleEmulationEnabledByDefault READ middleEmulationEnabledByDefault CONSTANT) - Q_PROPERTY(bool middleEmulation READ isMiddleEmulation WRITE setMiddleEmulation NOTIFY middleEmulationChanged) - - // - // acceleration speed and profile - Q_PROPERTY(bool supportsPointerAcceleration READ supportsPointerAcceleration CONSTANT) - Q_PROPERTY(qreal pointerAcceleration READ pointerAcceleration WRITE setPointerAcceleration NOTIFY pointerAccelerationChanged) - - Q_PROPERTY(bool supportsPointerAccelerationProfileFlat READ supportsPointerAccelerationProfileFlat CONSTANT) - Q_PROPERTY(bool defaultPointerAccelerationProfileFlat READ defaultPointerAccelerationProfileFlat CONSTANT) - Q_PROPERTY(bool pointerAccelerationProfileFlat READ pointerAccelerationProfileFlat WRITE setPointerAccelerationProfileFlat NOTIFY pointerAccelerationProfileChanged) - - Q_PROPERTY(bool supportsPointerAccelerationProfileAdaptive READ supportsPointerAccelerationProfileAdaptive CONSTANT) - Q_PROPERTY(bool defaultPointerAccelerationProfileAdaptive READ defaultPointerAccelerationProfileAdaptive CONSTANT) - Q_PROPERTY(bool pointerAccelerationProfileAdaptive READ pointerAccelerationProfileAdaptive WRITE setPointerAccelerationProfileAdaptive NOTIFY pointerAccelerationProfileChanged) - - // - // tapping - Q_PROPERTY(int tapFingerCount READ tapFingerCount CONSTANT) - Q_PROPERTY(bool tapToClickEnabledByDefault READ tapToClickEnabledByDefault CONSTANT) - Q_PROPERTY(bool tapToClick READ isTapToClick WRITE setTapToClick NOTIFY tapToClickChanged) - - Q_PROPERTY(bool supportsLmrTapButtonMap READ supportsLmrTapButtonMap CONSTANT) - Q_PROPERTY(bool lmrTapButtonMapEnabledByDefault READ lmrTapButtonMapEnabledByDefault CONSTANT) - Q_PROPERTY(bool lmrTapButtonMap READ lmrTapButtonMap WRITE setLmrTapButtonMap NOTIFY lmrTapButtonMapChanged) - - Q_PROPERTY(bool tapAndDragEnabledByDefault READ tapAndDragEnabledByDefault CONSTANT) - Q_PROPERTY(bool tapAndDrag READ isTapAndDrag WRITE setTapAndDrag NOTIFY tapAndDragChanged) - - Q_PROPERTY(bool tapDragLockEnabledByDefault READ tapDragLockEnabledByDefault CONSTANT) - Q_PROPERTY(bool tapDragLock READ isTapDragLock WRITE setTapDragLock NOTIFY tapDragLockChanged) - - // - // scrolling - Q_PROPERTY(bool supportsNaturalScroll READ supportsNaturalScroll CONSTANT) - Q_PROPERTY(bool naturalScrollEnabledByDefault READ naturalScrollEnabledByDefault CONSTANT) - Q_PROPERTY(bool naturalScroll READ isNaturalScroll WRITE setNaturalScroll NOTIFY naturalScrollChanged) - - Q_PROPERTY(bool supportsScrollTwoFinger READ supportsScrollTwoFinger CONSTANT) - Q_PROPERTY(bool scrollTwoFingerEnabledByDefault READ scrollTwoFingerEnabledByDefault CONSTANT) - Q_PROPERTY(bool scrollTwoFinger READ isScrollTwoFinger WRITE setScrollTwoFinger NOTIFY scrollMethodChanged) - - Q_PROPERTY(bool supportsScrollEdge READ supportsScrollEdge CONSTANT) - Q_PROPERTY(bool scrollEdgeEnabledByDefault READ scrollEdgeEnabledByDefault CONSTANT) - Q_PROPERTY(bool scrollEdge READ isScrollEdge WRITE setScrollEdge NOTIFY scrollMethodChanged) - - Q_PROPERTY(bool supportsScrollOnButtonDown READ supportsScrollOnButtonDown CONSTANT) - Q_PROPERTY(bool scrollOnButtonDownEnabledByDefault READ scrollOnButtonDownEnabledByDefault CONSTANT) - Q_PROPERTY(bool scrollOnButtonDown READ isScrollOnButtonDown WRITE setScrollOnButtonDown NOTIFY scrollMethodChanged) - - Q_PROPERTY(quint32 defaultScrollButton READ defaultScrollButton CONSTANT) - Q_PROPERTY(quint32 scrollButton READ scrollButton WRITE setScrollButton NOTIFY scrollButtonChanged) - - // Click Methods - Q_PROPERTY(bool supportsClickMethodAreas READ supportsClickMethodAreas CONSTANT) - Q_PROPERTY(bool defaultClickMethodAreas READ defaultClickMethodAreas CONSTANT) - Q_PROPERTY(bool clickMethodAreas READ isClickMethodAreas WRITE setClickMethodAreas NOTIFY clickMethodChanged) - - Q_PROPERTY(bool supportsClickMethodClickfinger READ supportsClickMethodClickfinger CONSTANT) - Q_PROPERTY(bool defaultClickMethodClickfinger READ defaultClickMethodClickfinger CONSTANT) - Q_PROPERTY(bool clickMethodClickfinger READ isClickMethodClickfinger WRITE setClickMethodClickfinger NOTIFY clickMethodChanged) - public: KWinWaylandTouchpad(QString dbusName); ~KWinWaylandTouchpad() override; @@ -124,377 +41,102 @@ // // general - QString name() const { + QString name() const override { return m_name.val; } QString sysName() const { return m_sysName.val; } - bool supportsDisableEvents() const { + bool supportsDisableEvents() const override { return m_supportsDisableEvents.val; } - void setEnabled(bool enabled) { + void setEnabled(bool enabled) override { m_enabled.set(enabled); } - bool isEnabled() const { + bool isEnabled() const override { return m_enabled.val; } - Qt::MouseButtons supportedButtons() const { - return m_supportedButtons.val; - } - // // advanced - bool supportsLeftHanded() const { + bool supportsLeftHanded() const override { return m_supportsLeftHanded.val; } - bool leftHandedEnabledByDefault() const { - return m_leftHandedEnabledByDefault.val; - } - bool isLeftHanded() const { - return m_leftHanded.val; - } - void setLeftHanded(bool set) { - m_leftHanded.set(set); - } - - bool supportsDisableEventsOnExternalMouse() const { + bool supportsDisableEventsOnExternalMouse() const override { return m_supportsDisableEventsOnExternalMouse.val; } - - bool supportsDisableWhileTyping() const { + bool supportsDisableWhileTyping() const override { return m_supportsDisableWhileTyping.val; } - bool disableWhileTypingEnabledByDefault() const { - return m_disableWhileTypingEnabledByDefault.val; - } - bool isDisableWhileTyping() const { - return m_disableWhileTyping.val; - } - void setDisableWhileTyping(bool set) { - m_disableWhileTyping.set(set); - } - - bool supportsMiddleEmulation() const { + bool supportsMiddleEmulation() const override { return m_supportsMiddleEmulation.val; } - bool middleEmulationEnabledByDefault() const { - return m_middleEmulationEnabledByDefault.val; - } - bool isMiddleEmulation() const { - return m_middleEmulation.val; - } - void setMiddleEmulation(bool set) { - m_middleEmulation.set(set); + // + // tapping + void setLmrTapButtonMap(bool set) override { + m_lmrTapButtonMap.set(set); } - // // acceleration speed and profile - bool supportsPointerAcceleration() const { + bool supportsPointerAcceleration() const override { return m_supportsPointerAcceleration.val; } - qreal pointerAcceleration() const { - return m_pointerAcceleration.val; - } - void setPointerAcceleration(qreal acceleration) { - m_pointerAcceleration.set(acceleration); - } - - bool supportsPointerAccelerationProfileFlat() const { + bool supportsPointerAccelerationProfileFlat() const override { return m_supportsPointerAccelerationProfileFlat.val; } - bool defaultPointerAccelerationProfileFlat() const { - return m_defaultPointerAccelerationProfileFlat.val; - } - bool pointerAccelerationProfileFlat() const { - return m_pointerAccelerationProfileFlat.val; - } - void setPointerAccelerationProfileFlat(bool set) { - m_pointerAccelerationProfileFlat.set(set); - } - - bool supportsPointerAccelerationProfileAdaptive() const { + bool supportsPointerAccelerationProfileAdaptive() const override { return m_supportsPointerAccelerationProfileAdaptive.val; } - bool defaultPointerAccelerationProfileAdaptive() const { - return m_defaultPointerAccelerationProfileAdaptive.val; - } - bool pointerAccelerationProfileAdaptive() const { - return m_pointerAccelerationProfileAdaptive.val; - } - void setPointerAccelerationProfileAdaptive(bool set) { - m_pointerAccelerationProfileAdaptive.set(set); - } - - // - // tapping - int tapFingerCount() const { - return m_tapFingerCount.val; - } - bool tapToClickEnabledByDefault() const { - return m_tapToClickEnabledByDefault.val; - } - bool isTapToClick() const { - return m_tapToClick.val; - } - void setTapToClick(bool set) { - m_tapToClick.set(set); - } - - bool supportsLmrTapButtonMap() const { - return m_tapFingerCount.val > 1; - } - bool lmrTapButtonMapEnabledByDefault() const { - return m_lmrTapButtonMapEnabledByDefault.val; - } - bool lmrTapButtonMap() const { - return m_lmrTapButtonMap.val; - } - void setLmrTapButtonMap(bool set) { - m_lmrTapButtonMap.set(set); - } - - bool tapAndDragEnabledByDefault() const { - return m_tapAndDragEnabledByDefault.val; - } - bool isTapAndDrag() const { - return m_tapAndDrag.val; - } - void setTapAndDrag(bool set) { - m_tapAndDrag.set(set); - } - - bool tapDragLockEnabledByDefault() const { - return m_tapDragLockEnabledByDefault.val; - } - bool isTapDragLock() const { - return m_tapDragLock.val; - } - void setTapDragLock(bool set) { - m_tapDragLock.set(set); - } - // // scrolling - bool supportsNaturalScroll() const { + bool supportsNaturalScroll() const override { return m_supportsNaturalScroll.val; } - bool naturalScrollEnabledByDefault() const { - return m_naturalScrollEnabledByDefault.val; - } - bool isNaturalScroll() const { - return m_naturalScroll.val; + bool supportsHorizontalScrolling() const override { + return false; } - void setNaturalScroll(bool set) { - m_naturalScroll.set(set); - } - - bool supportsScrollTwoFinger() const { + bool supportsScrollTwoFinger() const override { return m_supportsScrollTwoFinger.val; } - bool scrollTwoFingerEnabledByDefault() const { - return m_scrollTwoFingerEnabledByDefault.val; - } - bool isScrollTwoFinger() const { - return m_isScrollTwoFinger.val; - } - void setScrollTwoFinger(bool set) { - m_isScrollTwoFinger.set(set); - } - - bool supportsScrollEdge() const { + bool supportsScrollEdge() const override { return m_supportsScrollEdge.val; } - bool scrollEdgeEnabledByDefault() const { - return m_scrollEdgeEnabledByDefault.val; - } - bool isScrollEdge() const { - return m_isScrollEdge.val; - } - void setScrollEdge(bool set) { - m_isScrollEdge.set(set); - } - - bool supportsScrollOnButtonDown() const { + bool supportsScrollOnButtonDown() const override { return m_supportsScrollOnButtonDown.val; } - bool scrollOnButtonDownEnabledByDefault() const { - return m_scrollOnButtonDownEnabledByDefault.val; - } - bool isScrollOnButtonDown() const { - return m_isScrollOnButtonDown.val; - } - void setScrollOnButtonDown(bool set) { - m_isScrollOnButtonDown.set(set); - } - - quint32 defaultScrollButton() const { - return m_defaultScrollButton.val; - } - quint32 scrollButton() const { - return m_scrollButton.val; - } - void setScrollButton(quint32 button) { - m_scrollButton.set(button); - } - - bool supportsClickMethodAreas() const { + // + // Click method + bool supportsClickMethodAreas() const override { return m_supportsClickMethodAreas.val; } - bool defaultClickMethodAreas() const { - return m_defaultClickMethodAreas.val; - } - bool isClickMethodAreas() const { - return m_clickMethodAreas.val; - } - void setClickMethodAreas(bool set) { - m_clickMethodAreas.set(set); - } - - bool supportsClickMethodClickfinger() const { + bool supportsClickMethodClickfinger() const override { return m_supportsClickMethodClickfinger.val; } - bool defaultClickMethodClickfinger() const { - return m_defaultClickMethodClickfinger.val; - } - bool isClickMethodClickfinger() const { - return m_clickMethodClickfinger.val; - } - void setClickMethodClickfinger(bool set) { - m_clickMethodClickfinger.set(set); - } - -Q_SIGNALS: - void leftHandedChanged(); - void pointerAccelerationChanged(); - void pointerAccelerationProfileChanged(); - void enabledChanged(); - void tapToClickChanged(); - void tapAndDragChanged(); - void tapDragLockChanged(); - void lmrTapButtonMapChanged(); - void disableWhileTypingChanged(); - void middleEmulationChanged(); - void naturalScrollChanged(); - void scrollMethodChanged(); - void scrollButtonChanged(); - void clickMethodChanged(); private: - template - struct Prop { - explicit Prop(const QByteArray &dbusName) - : dbus(dbusName) - {} - - void set(T newVal) { - if (avail && val != newVal) { - val = newVal; - } - } - void set(const Prop &p) { - if (avail && val != p.val) { - val = p.val; - } - } - bool changed() const { - return avail && (old != val); - } - - QByteArray dbus; - bool avail; - T old; - T val; - }; template bool valueLoader(Prop &prop); template QString valueWriter(const Prop &prop); - // // general Prop m_name = Prop("name"); Prop m_sysName = Prop("sysName"); - Prop m_supportsDisableEvents = Prop("supportsDisableEvents"); - Prop m_enabled = Prop("enabled"); // // advanced - Prop m_supportedButtons = Prop("supportedButtons"); - Prop m_supportsLeftHanded = Prop("supportsLeftHanded"); - Prop m_leftHandedEnabledByDefault = Prop("leftHandedEnabledByDefault"); - Prop m_leftHanded = Prop("leftHanded"); - - Prop m_supportsDisableEventsOnExternalMouse = Prop("supportsDisableEventsOnExternalMouse"); - Prop m_supportsDisableWhileTyping = Prop("supportsDisableWhileTyping"); - Prop m_disableWhileTypingEnabledByDefault = Prop("disableWhileTypingEnabledByDefault"); - Prop m_disableWhileTyping = Prop("disableWhileTyping"); - Prop m_supportsMiddleEmulation = Prop("supportsMiddleEmulation"); - Prop m_middleEmulationEnabledByDefault = Prop("middleEmulationEnabledByDefault"); - Prop m_middleEmulation = Prop("middleEmulation"); // // acceleration speed and profile Prop m_supportsPointerAcceleration = Prop("supportsPointerAcceleration"); - Prop m_defaultPointerAcceleration = Prop("defaultPointerAcceleration"); - Prop m_pointerAcceleration = Prop("pointerAcceleration"); - - Prop m_supportsPointerAccelerationProfileFlat = Prop("supportsPointerAccelerationProfileFlat"); - Prop m_defaultPointerAccelerationProfileFlat = Prop("defaultPointerAccelerationProfileFlat"); - Prop m_pointerAccelerationProfileFlat = Prop("pointerAccelerationProfileFlat"); - - Prop m_supportsPointerAccelerationProfileAdaptive = Prop("supportsPointerAccelerationProfileAdaptive"); - Prop m_defaultPointerAccelerationProfileAdaptive = Prop("defaultPointerAccelerationProfileAdaptive"); - Prop m_pointerAccelerationProfileAdaptive = Prop("pointerAccelerationProfileAdaptive"); - - // - // tapping - Prop m_tapFingerCount = Prop("tapFingerCount"); - Prop m_tapToClickEnabledByDefault = Prop("tapToClickEnabledByDefault"); - Prop m_tapToClick = Prop("tapToClick"); - - Prop m_lmrTapButtonMapEnabledByDefault = Prop("lmrTapButtonMapEnabledByDefault"); - Prop m_lmrTapButtonMap = Prop("lmrTapButtonMap"); - - Prop m_tapAndDragEnabledByDefault = Prop("tapAndDragEnabledByDefault"); - Prop m_tapAndDrag = Prop("tapAndDrag"); - Prop m_tapDragLockEnabledByDefault = Prop("tapDragLockEnabledByDefault"); - Prop m_tapDragLock = Prop("tapDragLock"); // // scrolling Prop m_supportsNaturalScroll = Prop("supportsNaturalScroll"); - Prop m_naturalScrollEnabledByDefault = Prop("naturalScrollEnabledByDefault"); - Prop m_naturalScroll = Prop("naturalScroll"); - - Prop m_supportsScrollTwoFinger = Prop("supportsScrollTwoFinger"); - Prop m_scrollTwoFingerEnabledByDefault = Prop("scrollTwoFingerEnabledByDefault"); - Prop m_isScrollTwoFinger = Prop("scrollTwoFinger"); - - Prop m_supportsScrollEdge = Prop("supportsScrollEdge"); - Prop m_scrollEdgeEnabledByDefault = Prop("scrollEdgeEnabledByDefault"); - Prop m_isScrollEdge = Prop("scrollEdge"); - - Prop m_supportsScrollOnButtonDown = Prop("supportsScrollOnButtonDown"); - Prop m_scrollOnButtonDownEnabledByDefault = Prop("scrollOnButtonDownEnabledByDefault"); - Prop m_isScrollOnButtonDown = Prop("scrollOnButtonDown"); - - Prop m_defaultScrollButton = Prop("defaultScrollButton"); - Prop m_scrollButton = Prop("scrollButton"); - - Prop m_supportsClickMethodAreas = Prop("supportsClickMethodAreas"); - Prop m_defaultClickMethodAreas = Prop("defaultClickMethodAreas"); - Prop m_clickMethodAreas = Prop("clickMethodAreas"); - - Prop m_supportsClickMethodClickfinger = Prop("supportsClickMethodClickfinger"); - Prop m_defaultClickMethodClickfinger = Prop("defaultClickMethodClickfinger"); - Prop m_clickMethodClickfinger = Prop("clickMethodClickfinger"); - QDBusInterface *m_iface; }; diff --git a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.cpp b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.cpp --- a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.cpp +++ b/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.cpp @@ -21,33 +21,12 @@ #include #include #include +#include #include "logging.h" -namespace { -template -T valueLoaderPart(QVariant const &reply) { Q_UNUSED(reply); return T(); } - -template<> -bool valueLoaderPart(QVariant const &reply) { return reply.toBool(); } - -template<> -int valueLoaderPart(QVariant const &reply) { return reply.toInt(); } - -template<> -quint32 valueLoaderPart(QVariant const &reply) { return reply.toInt(); } - -template<> -qreal valueLoaderPart(QVariant const &reply) { return reply.toReal(); } - -template<> -QString valueLoaderPart(QVariant const &reply) { return reply.toString(); } - -template<> -Qt::MouseButtons valueLoaderPart(QVariant const &reply) { return static_cast(reply.toInt()); } -} - -KWinWaylandTouchpad::KWinWaylandTouchpad(QString dbusName) +KWinWaylandTouchpad::KWinWaylandTouchpad(QString dbusName) : + LibinputCommon() { m_iface = new QDBusInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/org/kde/KWin/InputDevice/") + dbusName, @@ -236,7 +215,7 @@ if (!prop.changed()) { return QString(); } - m_iface->setProperty(prop.dbus, prop.val); + m_iface->setProperty(prop.name, prop.val); QDBusError error = m_iface->lastError(); if (error.isValid()) { qCCritical(KCM_TOUCHPAD) << error.message(); @@ -248,9 +227,9 @@ template bool KWinWaylandTouchpad::valueLoader(Prop &prop) { - QVariant reply = m_iface->property(prop.dbus); + QVariant reply = m_iface->property(prop.name); if (!reply.isValid()) { - qCCritical(KCM_TOUCHPAD) << "Error on d-bus read of" << prop.dbus; + qCCritical(KCM_TOUCHPAD) << "Error on d-bus read of" << prop.name; prop.avail = false; return false; } diff --git a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h b/kcms/touchpad/src/backends/libinputcommon.h copy from kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h copy to kcms/touchpad/src/backends/libinputcommon.h --- a/kcms/touchpad/src/backends/kwin_wayland/kwinwaylandtouchpad.h +++ b/kcms/touchpad/src/backends/libinputcommon.h @@ -1,5 +1,6 @@ /* * Copyright 2017 Roman Gilg + * Copyright 2019 Atul Bisht * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +17,36 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef KWINWAYLANDTOUCHPAD_H -#define KWINWAYLANDTOUCHPAD_H +#ifndef LIBINPUTCOMMON_H +#define LIBINPUTCOMMON_H #include -#include +#include -class QDBusInterface; +namespace { +template +T valueLoaderPart(QVariant const &reply) { Q_UNUSED(reply); return T(); } -class KWinWaylandTouchpad : public QObject +template<> +bool valueLoaderPart(QVariant const &reply) { return reply.toBool(); } + +template<> +int valueLoaderPart(QVariant const &reply) { return reply.toInt(); } + +template<> +quint32 valueLoaderPart(QVariant const &reply) { return reply.toInt(); } + +template<> +qreal valueLoaderPart(QVariant const &reply) { return reply.toReal(); } + +template<> +QString valueLoaderPart(QVariant const &reply) { return reply.toString(); } + +template<> +Qt::MouseButtons valueLoaderPart(QVariant const &reply) { return static_cast(reply.toInt()); } +} + +class LibinputCommon : public QObject { Q_OBJECT @@ -87,6 +109,10 @@ Q_PROPERTY(bool naturalScrollEnabledByDefault READ naturalScrollEnabledByDefault CONSTANT) Q_PROPERTY(bool naturalScroll READ isNaturalScroll WRITE setNaturalScroll NOTIFY naturalScrollChanged) + Q_PROPERTY(bool supportsHorizontalScrolling READ supportsHorizontalScrolling CONSTANT) + Q_PROPERTY(bool horizontalScrollingByDefault READ horizontalScrollingByDefault CONSTANT) + Q_PROPERTY(bool horizontalScrolling READ horizontalScrolling WRITE setHorizontalScrolling NOTIFY horizontalScrollingChanged) + Q_PROPERTY(bool supportsScrollTwoFinger READ supportsScrollTwoFinger CONSTANT) Q_PROPERTY(bool scrollTwoFingerEnabledByDefault READ scrollTwoFingerEnabledByDefault CONSTANT) Q_PROPERTY(bool scrollTwoFinger READ isScrollTwoFinger WRITE setScrollTwoFinger NOTIFY scrollMethodChanged) @@ -102,7 +128,7 @@ Q_PROPERTY(quint32 defaultScrollButton READ defaultScrollButton CONSTANT) Q_PROPERTY(quint32 scrollButton READ scrollButton WRITE setScrollButton NOTIFY scrollButtonChanged) - // Click Methods + // Click Methods Q_PROPERTY(bool supportsClickMethodAreas READ supportsClickMethodAreas CONSTANT) Q_PROPERTY(bool defaultClickMethodAreas READ defaultClickMethodAreas CONSTANT) Q_PROPERTY(bool clickMethodAreas READ isClickMethodAreas WRITE setClickMethodAreas NOTIFY clickMethodChanged) @@ -112,42 +138,22 @@ Q_PROPERTY(bool clickMethodClickfinger READ isClickMethodClickfinger WRITE setClickMethodClickfinger NOTIFY clickMethodChanged) public: - KWinWaylandTouchpad(QString dbusName); - ~KWinWaylandTouchpad() override; - bool init(); + LibinputCommon() {} + virtual ~LibinputCommon() {} - bool getConfig(); - bool getDefaultConfig(); - bool applyConfig(); - bool isChangedConfig() const; + virtual QString name() const = 0; + virtual bool supportsDisableEvents() const = 0; + virtual bool isEnabled() const = 0; + virtual void setEnabled(bool set) = 0; // - // general - QString name() const { - return m_name.val; - } - QString sysName() const { - return m_sysName.val; - } - bool supportsDisableEvents() const { - return m_supportsDisableEvents.val; - } - void setEnabled(bool enabled) { - m_enabled.set(enabled); - } - bool isEnabled() const { - return m_enabled.val; - } + // advanced Qt::MouseButtons supportedButtons() const { return m_supportedButtons.val; } - // - // advanced - bool supportsLeftHanded() const { - return m_supportsLeftHanded.val; - } + virtual bool supportsLeftHanded() const = 0; bool leftHandedEnabledByDefault() const { return m_leftHandedEnabledByDefault.val; } @@ -158,13 +164,9 @@ m_leftHanded.set(set); } - bool supportsDisableEventsOnExternalMouse() const { - return m_supportsDisableEventsOnExternalMouse.val; - } + virtual bool supportsDisableEventsOnExternalMouse() const = 0; - bool supportsDisableWhileTyping() const { - return m_supportsDisableWhileTyping.val; - } + virtual bool supportsDisableWhileTyping() const = 0; bool disableWhileTypingEnabledByDefault() const { return m_disableWhileTypingEnabledByDefault.val; } @@ -175,9 +177,7 @@ m_disableWhileTyping.set(set); } - bool supportsMiddleEmulation() const { - return m_supportsMiddleEmulation.val; - } + virtual bool supportsMiddleEmulation() const = 0; bool middleEmulationEnabledByDefault() const { return m_middleEmulationEnabledByDefault.val; } @@ -188,21 +188,15 @@ m_middleEmulation.set(set); } - // - // acceleration speed and profile - bool supportsPointerAcceleration() const { - return m_supportsPointerAcceleration.val; - } + virtual bool supportsPointerAcceleration() const = 0; qreal pointerAcceleration() const { return m_pointerAcceleration.val; } void setPointerAcceleration(qreal acceleration) { m_pointerAcceleration.set(acceleration); } - bool supportsPointerAccelerationProfileFlat() const { - return m_supportsPointerAccelerationProfileFlat.val; - } + virtual bool supportsPointerAccelerationProfileFlat() const = 0; bool defaultPointerAccelerationProfileFlat() const { return m_defaultPointerAccelerationProfileFlat.val; } @@ -213,9 +207,7 @@ m_pointerAccelerationProfileFlat.set(set); } - bool supportsPointerAccelerationProfileAdaptive() const { - return m_supportsPointerAccelerationProfileAdaptive.val; - } + virtual bool supportsPointerAccelerationProfileAdaptive() const = 0; bool defaultPointerAccelerationProfileAdaptive() const { return m_defaultPointerAccelerationProfileAdaptive.val; } @@ -226,59 +218,9 @@ m_pointerAccelerationProfileAdaptive.set(set); } - // - // tapping - int tapFingerCount() const { - return m_tapFingerCount.val; - } - bool tapToClickEnabledByDefault() const { - return m_tapToClickEnabledByDefault.val; - } - bool isTapToClick() const { - return m_tapToClick.val; - } - void setTapToClick(bool set) { - m_tapToClick.set(set); - } - - bool supportsLmrTapButtonMap() const { - return m_tapFingerCount.val > 1; - } - bool lmrTapButtonMapEnabledByDefault() const { - return m_lmrTapButtonMapEnabledByDefault.val; - } - bool lmrTapButtonMap() const { - return m_lmrTapButtonMap.val; - } - void setLmrTapButtonMap(bool set) { - m_lmrTapButtonMap.set(set); - } - - bool tapAndDragEnabledByDefault() const { - return m_tapAndDragEnabledByDefault.val; - } - bool isTapAndDrag() const { - return m_tapAndDrag.val; - } - void setTapAndDrag(bool set) { - m_tapAndDrag.set(set); - } - - bool tapDragLockEnabledByDefault() const { - return m_tapDragLockEnabledByDefault.val; - } - bool isTapDragLock() const { - return m_tapDragLock.val; - } - void setTapDragLock(bool set) { - m_tapDragLock.set(set); - } - // // scrolling - bool supportsNaturalScroll() const { - return m_supportsNaturalScroll.val; - } + virtual bool supportsNaturalScroll() const = 0; bool naturalScrollEnabledByDefault() const { return m_naturalScrollEnabledByDefault.val; } @@ -289,9 +231,18 @@ m_naturalScroll.set(set); } - bool supportsScrollTwoFinger() const { - return m_supportsScrollTwoFinger.val; + virtual bool supportsHorizontalScrolling() const = 0; + bool horizontalScrollingByDefault() const { + return true; + } + bool horizontalScrolling() const { + return m_horizontalScrolling.val; + } + void setHorizontalScrolling(bool set) { + m_horizontalScrolling.set(set); } + + virtual bool supportsScrollTwoFinger() const = 0; bool scrollTwoFingerEnabledByDefault() const { return m_scrollTwoFingerEnabledByDefault.val; } @@ -302,9 +253,7 @@ m_isScrollTwoFinger.set(set); } - bool supportsScrollEdge() const { - return m_supportsScrollEdge.val; - } + virtual bool supportsScrollEdge() const = 0; bool scrollEdgeEnabledByDefault() const { return m_scrollEdgeEnabledByDefault.val; } @@ -315,9 +264,7 @@ m_isScrollEdge.set(set); } - bool supportsScrollOnButtonDown() const { - return m_supportsScrollOnButtonDown.val; - } + virtual bool supportsScrollOnButtonDown() const = 0; bool scrollOnButtonDownEnabledByDefault() const { return m_scrollOnButtonDownEnabledByDefault.val; } @@ -337,10 +284,56 @@ void setScrollButton(quint32 button) { m_scrollButton.set(button); } - - bool supportsClickMethodAreas() const { - return m_supportsClickMethodAreas.val; + + // + // tapping + int tapFingerCount() const { + return m_tapFingerCount.val; + } + bool tapToClickEnabledByDefault() const { + return m_tapToClickEnabledByDefault.val; + } + bool isTapToClick() const { + return m_tapToClick.val; + } + void setTapToClick(bool set) { + m_tapToClick.set(set); + } + + bool supportsLmrTapButtonMap() const { + return m_tapFingerCount.val > 1; + } + bool lmrTapButtonMapEnabledByDefault() const { + return m_lmrTapButtonMapEnabledByDefault.val; + } + bool lmrTapButtonMap() const { + return m_lmrTapButtonMap.val; + } + virtual void setLmrTapButtonMap(bool set) = 0; + + bool tapAndDragEnabledByDefault() const { + return m_tapAndDragEnabledByDefault.val; + } + bool isTapAndDrag() const { + return m_tapAndDrag.val; + } + void setTapAndDrag(bool set) { + m_tapAndDrag.set(set); + } + + bool tapDragLockEnabledByDefault() const { + return m_tapDragLockEnabledByDefault.val; + } + bool isTapDragLock() const { + return m_tapDragLock.val; + } + void setTapDragLock(bool set) { + m_tapDragLock.set(set); } + + // + // click method + virtual bool supportsClickMethodAreas() const = 0; bool defaultClickMethodAreas() const { return m_defaultClickMethodAreas.val; } @@ -351,9 +344,7 @@ m_clickMethodAreas.set(set); } - bool supportsClickMethodClickfinger() const { - return m_supportsClickMethodClickfinger.val; - } + virtual bool supportsClickMethodClickfinger() const = 0; bool defaultClickMethodClickfinger() const { return m_defaultClickMethodClickfinger.val; } @@ -365,26 +356,32 @@ } Q_SIGNALS: - void leftHandedChanged(); - void pointerAccelerationChanged(); - void pointerAccelerationProfileChanged(); void enabledChanged(); + // Tapping void tapToClickChanged(); + void lmrTapButtonMapChanged(); void tapAndDragChanged(); void tapDragLockChanged(); - void lmrTapButtonMapChanged(); + // Advanced + void leftHandedChanged(); void disableWhileTypingChanged(); void middleEmulationChanged(); + // acceleration speed and profile + void pointerAccelerationChanged(); + void pointerAccelerationProfileChanged(); + // scrolling void naturalScrollChanged(); + void horizontalScrollingChanged(); void scrollMethodChanged(); void scrollButtonChanged(); + // click methods void clickMethodChanged(); -private: +protected: template struct Prop { - explicit Prop(const QByteArray &dbusName) - : dbus(dbusName) + explicit Prop(const QByteArray &name) + : name(name) {} void set(T newVal) { @@ -401,46 +398,38 @@ return avail && (old != val); } - QByteArray dbus; + // In wayland, name will be dbus name + QByteArray name; bool avail; T old; T val; }; - template - bool valueLoader(Prop &prop); - template - QString valueWriter(const Prop &prop); // // general - Prop m_name = Prop("name"); - Prop m_sysName = Prop("sysName"); Prop m_supportsDisableEvents = Prop("supportsDisableEvents"); + Prop m_enabledDefault = Prop("enabledDefault"); Prop m_enabled = Prop("enabled"); // // advanced Prop m_supportedButtons = Prop("supportedButtons"); - Prop m_supportsLeftHanded = Prop("supportsLeftHanded"); Prop m_leftHandedEnabledByDefault = Prop("leftHandedEnabledByDefault"); Prop m_leftHanded = Prop("leftHanded"); Prop m_supportsDisableEventsOnExternalMouse = Prop("supportsDisableEventsOnExternalMouse"); - Prop m_supportsDisableWhileTyping = Prop("supportsDisableWhileTyping"); Prop m_disableWhileTypingEnabledByDefault = Prop("disableWhileTypingEnabledByDefault"); Prop m_disableWhileTyping = Prop("disableWhileTyping"); - Prop m_supportsMiddleEmulation = Prop("supportsMiddleEmulation"); Prop m_middleEmulationEnabledByDefault = Prop("middleEmulationEnabledByDefault"); Prop m_middleEmulation = Prop("middleEmulation"); // // acceleration speed and profile - Prop m_supportsPointerAcceleration = Prop("supportsPointerAcceleration"); Prop m_defaultPointerAcceleration = Prop("defaultPointerAcceleration"); Prop m_pointerAcceleration = Prop("pointerAcceleration"); @@ -468,10 +457,11 @@ // // scrolling - Prop m_supportsNaturalScroll = Prop("supportsNaturalScroll"); Prop m_naturalScrollEnabledByDefault = Prop("naturalScrollEnabledByDefault"); Prop m_naturalScroll = Prop("naturalScroll"); + Prop m_horizontalScrolling = Prop("horizontalScrolling"); + Prop m_supportsScrollTwoFinger = Prop("supportsScrollTwoFinger"); Prop m_scrollTwoFingerEnabledByDefault = Prop("scrollTwoFingerEnabledByDefault"); Prop m_isScrollTwoFinger = Prop("scrollTwoFinger"); @@ -487,16 +477,14 @@ Prop m_defaultScrollButton = Prop("defaultScrollButton"); Prop m_scrollButton = Prop("scrollButton"); + // Click Method Prop m_supportsClickMethodAreas = Prop("supportsClickMethodAreas"); Prop m_defaultClickMethodAreas = Prop("defaultClickMethodAreas"); Prop m_clickMethodAreas = Prop("clickMethodAreas"); Prop m_supportsClickMethodClickfinger = Prop("supportsClickMethodClickfinger"); Prop m_defaultClickMethodClickfinger = Prop("defaultClickMethodClickfinger"); Prop m_clickMethodClickfinger = Prop("clickMethodClickfinger"); - - - QDBusInterface *m_iface; }; -#endif +#endif // LIBINPUTCOMMON_H diff --git a/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp b/kcms/touchpad/src/backends/libinputcommon.cpp copy from kcms/touchpad/src/kcm/touchpadconfigplugin.cpp copy to kcms/touchpad/src/backends/libinputcommon.cpp --- a/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp +++ b/kcms/touchpad/src/backends/libinputcommon.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2017 Roman Gilg + * Copyright 2019 Atul Bisht * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,11 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "touchpadconfigplugin.h" -#include "touchpadconfigcontainer.h" +#include "libinputcommon.h" -TouchpadConfigPlugin::TouchpadConfigPlugin(QWidget *parent) - : QWidget(parent), - m_parent(dynamic_cast(parent)) -{ -} + +#include "moc_libinputcommon.cpp" diff --git a/kcms/touchpad/src/backends/x11.cmake b/kcms/touchpad/src/backends/x11.cmake --- a/kcms/touchpad/src/backends/x11.cmake +++ b/kcms/touchpad/src/backends/x11.cmake @@ -16,6 +16,7 @@ SET(backend_SRCS ${backend_SRCS} + backends/libinputcommon.cpp backends/x11/propertyinfo.cpp backends/x11/xlibbackend.cpp backends/x11/synapticstouchpad.cpp diff --git a/kcms/touchpad/src/backends/x11/libinputtouchpad.h b/kcms/touchpad/src/backends/x11/libinputtouchpad.h --- a/kcms/touchpad/src/backends/x11/libinputtouchpad.h +++ b/kcms/touchpad/src/backends/x11/libinputtouchpad.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Weng Xuetian + * Copyright (C) 2019 Atul Bisht * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,12 +19,112 @@ #ifndef LIBINPUTTOUCHPAD_H #define LIBINPUTTOUCHPAD_H +#include + #include "xlibtouchpad.h" +#include "backends/libinputcommon.h" -class LibinputTouchpad : public XlibTouchpad +class LibinputTouchpad : public LibinputCommon, public XlibTouchpad { + Q_OBJECT + public: LibinputTouchpad(Display *display, int deviceId); + ~LibinputTouchpad() override {} + + bool getConfig() override; + bool applyConfig() override; + bool getDefaultConfig() override; + bool isChangedConfig() override; + +private: + + template + bool valueLoader(Prop &prop); + + template + QString valueWriter(const Prop &prop); + + // + // general + QString name() const override { + return m_name; + } + bool supportsDisableEvents() const override { + return m_supportsDisableEvents.avail && m_supportsDisableEvents.val; + } + bool isEnabled() const override { + return !m_enabled.val; + } + void setEnabled(bool set) override { + m_enabled.set(!set); + } + // + // Tapping + void setLmrTapButtonMap(bool set) override { + m_lrmTapButtonMap.set(!set); + m_lmrTapButtonMap.set(set); + } + // + // advanced + bool supportsLeftHanded() const override { + return m_leftHanded.avail; + } + bool supportsDisableEventsOnExternalMouse() const override { + return m_supportsDisableEventsOnExternalMouse.avail && m_supportsDisableEventsOnExternalMouse.val; + } + bool supportsDisableWhileTyping() const override { + return m_disableWhileTyping.avail; + } + bool supportsMiddleEmulation() const override { + return m_middleEmulation.avail; + } + // + // acceleration speed and profile + bool supportsPointerAcceleration() const override { + return m_pointerAcceleration.avail; + } + bool supportsPointerAccelerationProfileFlat() const override { + return m_supportsPointerAccelerationProfileFlat.avail && m_supportsPointerAccelerationProfileFlat.val; + } + bool supportsPointerAccelerationProfileAdaptive() const override { + return m_supportsPointerAccelerationProfileAdaptive.avail && m_supportsPointerAccelerationProfileAdaptive.val; + } + // + // scrolling + bool supportsNaturalScroll() const override { + return m_naturalScroll.avail; + } + bool supportsHorizontalScrolling() const override { + return true; + } + bool supportsScrollTwoFinger() const override { + return m_supportsScrollTwoFinger.avail && m_supportsScrollTwoFinger.val; + } + bool supportsScrollEdge() const override { + return m_supportsScrollEdge.avail && m_supportsScrollEdge.val; + } + bool supportsScrollOnButtonDown() const override { + return m_supportsScrollOnButtonDown.avail && m_supportsScrollOnButtonDown.val; + } + // + // click method + bool supportsClickMethodAreas() const override { + return m_supportsClickMethodAreas.avail && m_supportsClickMethodAreas.val; + } + bool supportsClickMethodClickfinger() const override { + return m_supportsClickMethodClickfinger.avail && m_supportsClickMethodClickfinger.val; + } + + // Tapping + Prop m_lrmTapButtonMapEnabledByDefault = Prop("lrmTapButtonMapEnabledByDefault"); + Prop m_lrmTapButtonMap = Prop("lrmTapButtonMap"); + // + // advanced + Prop m_disableEventsOnExternalMouse = Prop("disableEventsOnExternalMouse"); + Prop m_disableEventsOnExternalMouseDefault = Prop("disableEventsOnExternalMouseDefault"); + + QString m_name; }; #endif // LIBINPUTTOUCHPAD_H diff --git a/kcms/touchpad/src/backends/x11/libinputtouchpad.cpp b/kcms/touchpad/src/backends/x11/libinputtouchpad.cpp --- a/kcms/touchpad/src/backends/x11/libinputtouchpad.cpp +++ b/kcms/touchpad/src/backends/x11/libinputtouchpad.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Red Hat, Inc. + * Copyright (C) 2019 Atul Bisht * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,46 +16,389 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include +#include + #include "libinputtouchpad.h" #include #include +#include +#include +#include "logging.h" + const struct Parameter libinputProperties[] = { + + /* libinput disable supports property */ + {"supportsDisableEvents", PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_AVAILABLE, 8, 0}, + {"enabled", PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_ENABLED, 8, 0}, + {"enabledDefault", PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_ENABLED_DEFAULT, 8, 0}, + + /* LeftHandSupport */ + {"leftHandedEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_LEFT_HANDED_DEFAULT, 8, 0}, + {"leftHanded", PT_INT, 0, 1, LIBINPUT_PROP_LEFT_HANDED, 8, 0}, + + /* Disable on external mouse */ + {"supportsDisableEventsOnExternalMouse",PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_AVAILABLE, 8, 1}, + {"disableEventsOnExternalMouse", PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_ENABLED, 8, 1}, + {"disableEventsOnExternalMouseDefault", PT_INT, 0, 1, LIBINPUT_PROP_SENDEVENTS_ENABLED_DEFAULT, 8, 1}, + + /* Disable while typing */ + {"disableWhileTypingEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_DISABLE_WHILE_TYPING_DEFAULT, 8, 0}, + {"disableWhileTyping", PT_INT, 0, 1, LIBINPUT_PROP_DISABLE_WHILE_TYPING, 8, 0}, + + /* Middle Emulation */ + {"middleEmulationEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_MIDDLE_EMULATION_ENABLED_DEFAULT, 8, 0}, + {"middleEmulation", PT_INT, 0, 1, LIBINPUT_PROP_MIDDLE_EMULATION_ENABLED, 8, 0}, + /* This is a boolean for all three fingers, no per-finger config */ - {"Tapping", PT_INT, 0, 1, "libinput Tapping Enabled", 8, 0}, + {"tapToClick", PT_INT, 0, 1, LIBINPUT_PROP_TAP, 8, 0}, + {"tapToClickEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_TAP_DEFAULT, 8, 0}, + + /* LMR */ + {"lrmTapButtonMapEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_TAP_BUTTONMAP_DEFAULT, 8, 0}, + {"lrmTapButtonMap", PT_INT, 0, 1, LIBINPUT_PROP_TAP_BUTTONMAP, 8, 0}, + {"lmrTapButtonMapEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_TAP_BUTTONMAP_DEFAULT, 8, 1}, + {"lmrTapButtonMap", PT_INT, 0, 1, LIBINPUT_PROP_TAP_BUTTONMAP, 8, 1}, + + /* Tap and Drag Enabled */ + {"tapAndDragEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_TAP_DRAG_DEFAULT, 8, 0}, + {"tapAndDrag", PT_INT, 0, 1, LIBINPUT_PROP_TAP_DRAG, 8, 0}, + + /* Tap and Drag Lock Enabled */ + {"tapDragLockEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_TAP_DRAG_LOCK_DEFAULT, 8, 0}, + {"tapDragLock", PT_INT, 0, 1, LIBINPUT_PROP_TAP_DRAG_LOCK, 8, 0}, + /* libinput normalizes the accel to -1/1 */ - {"AccelFactor", PT_DOUBLE, -1.0, 1.0, "libinput Accel Speed", 0 /*float */, 0}, - /* Only one of these may be set at one time */ - {"VertEdgeScroll", PT_INT, 0, 1, "libinput Scroll Method Enabled", 8, 1}, - {"VertTwoFingerScroll", PT_INT, 0, 1, "libinput Scroll Method Enabled", 8, 0}, - {"InvertVertScroll", PT_INT, 0, 1, "libinput Natural Scrolling Enabled", 8, 0}, + {"defaultPointerAcceleration", PT_DOUBLE, -1.0, 1.0, LIBINPUT_PROP_ACCEL_DEFAULT, 0 /*float */, 0}, + {"pointerAcceleration", PT_DOUBLE, -1.0, 1.0, LIBINPUT_PROP_ACCEL, 0 /*float */, 0}, + + /* Libinput Accel Profile */ + {"supportsPointerAccelerationProfileAdaptive", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILES_AVAILABLE, 8, 0}, + {"defaultPointerAccelerationProfileAdaptive", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILE_ENABLED_DEFAULT, 8, 0}, + {"pointerAccelerationProfileAdaptive", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILE_ENABLED, 8, 0}, + {"supportsPointerAccelerationProfileFlat", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILES_AVAILABLE, 8, 1}, + {"defaultPointerAccelerationProfileFlat", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILE_ENABLED_DEFAULT, 8, 1}, + {"pointerAccelerationProfileFlat", PT_BOOL, 0, 1, LIBINPUT_PROP_ACCEL_PROFILE_ENABLED, 8, 1}, + + /* Natural Scrolling */ + {"naturalScrollEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_NATURAL_SCROLL_DEFAULT, 8, 0}, + {"naturalScroll", PT_INT, 0, 1, LIBINPUT_PROP_NATURAL_SCROLL, 8, 0}, + + /* Horizontal scrolling */ + {"horizontalScrolling", PT_INT, 0, 1, LIBINPUT_PROP_HORIZ_SCROLL_ENABLED, 8, 0}, + + /* Two-Finger Scrolling */ + {"supportsScrollTwoFinger", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHODS_AVAILABLE, 8, 0}, + {"scrollTwoFingerEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED_DEFAULT, 8, 0}, + {"scrollTwoFinger", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED, 8, 0}, + + /* Edge Scrolling */ + {"supportsScrollEdge", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHODS_AVAILABLE, 8, 1}, + {"scrollEdgeEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED_DEFAULT, 8, 1}, + {"scrollEdge", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED, 8, 1}, + + /* scroll on button */ + {"supportsScrollOnButtonDown", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHODS_AVAILABLE, 8, 2}, + {"scrollOnButtonDownEnabledByDefault", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED_DEFAULT, 8, 2}, + {"scrollOnButtonDown", PT_INT, 0, 1, LIBINPUT_PROP_SCROLL_METHOD_ENABLED, 8, 2}, + + /* Scroll Button for scroll on button Down */ + {"defaultScrollButton", PT_INT, 0, INT_MAX, LIBINPUT_PROP_SCROLL_BUTTON_DEFAULT, 32, 0}, + {"scrollButton", PT_INT, 0, INT_MAX, LIBINPUT_PROP_SCROLL_BUTTON, 32, 0}, + + /* Click Methods */ + {"supportsClickMethodAreas", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHODS_AVAILABLE, 8, 0}, + {"defaultClickMethodAreas", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHOD_ENABLED_DEFAULT, 8, 0}, + {"clickMethodAreas", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHOD_ENABLED, 8, 0}, + + {"supportsClickMethodClickfinger", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHODS_AVAILABLE, 8, 1}, + {"defaultClickMethodClickfinger", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHOD_ENABLED_DEFAULT, 8, 1}, + {"clickMethodClickfinger", PT_INT, 0, 1, LIBINPUT_PROP_CLICK_METHOD_ENABLED, 8, 1}, + /* libinput doesn't have a separate toggle for horiz scrolling */ { NULL, PT_INT, 0, 0, 0, 0, 0 } }; -LibinputTouchpad::LibinputTouchpad(Display *display, int deviceId): XlibTouchpad(display, deviceId) +Qt::MouseButtons maskBtns(Display *display, XIButtonClassInfo *buttonInfo) +{ + Qt::MouseButtons buttons = Qt::NoButton; + for (int i = 0; i < buttonInfo->num_buttons; ++i) { + QByteArray reply = XGetAtomName(display, buttonInfo->labels[i]); + + if (reply == BTN_LABEL_PROP_BTN_LEFT) { + buttons |= Qt::LeftButton; + } + if (reply == BTN_LABEL_PROP_BTN_RIGHT) { + buttons |= Qt::RightButton; + } + if (reply == BTN_LABEL_PROP_BTN_MIDDLE) { + buttons |= Qt::MiddleButton; + } + if (reply == BTN_LABEL_PROP_BTN_SIDE) { + buttons |= Qt::ExtraButton1; + } + if (reply == BTN_LABEL_PROP_BTN_EXTRA) { + buttons |= Qt::ExtraButton2; + } + if (reply == BTN_LABEL_PROP_BTN_FORWARD) { + buttons |= Qt::ForwardButton; + } + if (reply == BTN_LABEL_PROP_BTN_BACK) { + buttons |= Qt::BackButton; + } + if (reply == BTN_LABEL_PROP_BTN_TASK) { + buttons |= Qt::TaskButton; + } + } + return buttons; +} + +LibinputTouchpad::LibinputTouchpad(Display *display, int deviceId): + LibinputCommon(), + XlibTouchpad(display, deviceId) { loadSupportedProperties(libinputProperties); - /* FIXME: has a different format than Synaptics Off but we don't expose - the toggle so this is just to stop it from crashing when we check - m_touchpadOffAtom */ - m_touchpadOffAtom.intern(m_connection, - "libinput Send Events Mode enabled"); - - - XcbAtom scroll_methods(m_connection, - "libinput Scroll Methods Available", - true); - if (scroll_methods.atom() != 0) { - PropertyInfo methods(m_display, - m_deviceId, - scroll_methods.atom(), - 0); - if (!methods.value(0).toInt()) - m_supported.removeAll("VertTwoFingerScroll"); - else if (!methods.value(1).toInt()) - m_supported.removeAll("VertEdgeScroll"); + int nDevices = 0; + XIDeviceInfo *deviceInfo = XIQueryDevice(m_display, m_deviceId, &nDevices); + m_name = deviceInfo->name; + + for (int i = 0; i < deviceInfo->num_classes; ++i) { + XIAnyClassInfo *classInfo = deviceInfo->classes[i]; + + if (classInfo->type == XIButtonClass) { + XIButtonClassInfo *btnInfo = (XIButtonClassInfo*) classInfo; + m_supportedButtons.avail = true; + m_supportedButtons.set(maskBtns(m_display, btnInfo)); + } + if (classInfo->type == XITouchClass) { + XITouchClassInfo *touchInfo = (XITouchClassInfo*) classInfo; + m_tapFingerCount.avail = true; + m_tapFingerCount.set(touchInfo->num_touches); + } + } + XIFreeDeviceInfo(deviceInfo); + + /* FingerCount cannot be zero */ + if (!m_tapFingerCount.val) { + m_tapFingerCount.avail = true; + m_tapFingerCount.set(1); + } +} + +bool LibinputTouchpad::getConfig() +{ + bool success = true; + + success &= valueLoader(m_supportsDisableEvents); + success &= valueLoader(m_enabled); + success &= valueLoader(m_enabledDefault); + + success &= valueLoader(m_tapToClickEnabledByDefault); + success &= valueLoader(m_tapToClick); + success &= valueLoader(m_lrmTapButtonMapEnabledByDefault); + success &= valueLoader(m_lrmTapButtonMap); + success &= valueLoader(m_lmrTapButtonMapEnabledByDefault); + success &= valueLoader(m_lmrTapButtonMap); + success &= valueLoader(m_tapAndDragEnabledByDefault); + success &= valueLoader(m_tapAndDrag); + success &= valueLoader(m_tapDragLockEnabledByDefault); + success &= valueLoader(m_tapDragLock); + + success &= valueLoader(m_leftHandedEnabledByDefault); + success &= valueLoader(m_leftHanded); + + success &= valueLoader(m_supportsDisableEventsOnExternalMouse); + success &= valueLoader(m_disableEventsOnExternalMouse); + success &= valueLoader(m_disableEventsOnExternalMouseDefault); + + success &= valueLoader(m_disableWhileTypingEnabledByDefault); + success &= valueLoader(m_disableWhileTyping); + + success &= valueLoader(m_middleEmulationEnabledByDefault); + success &= valueLoader(m_middleEmulation); + + success &= valueLoader(m_defaultPointerAcceleration); + success &= valueLoader(m_pointerAcceleration); + + success &= valueLoader(m_supportsPointerAccelerationProfileFlat); + success &= valueLoader(m_defaultPointerAccelerationProfileFlat); + success &= valueLoader(m_pointerAccelerationProfileFlat); + success &= valueLoader(m_supportsPointerAccelerationProfileAdaptive); + success &= valueLoader(m_defaultPointerAccelerationProfileAdaptive); + success &= valueLoader(m_pointerAccelerationProfileAdaptive); + + success &= valueLoader(m_naturalScrollEnabledByDefault); + success &= valueLoader(m_naturalScroll); + + success &= valueLoader(m_horizontalScrolling); + + success &= valueLoader(m_supportsScrollTwoFinger); + success &= valueLoader(m_scrollTwoFingerEnabledByDefault); + success &= valueLoader(m_isScrollTwoFinger); + + success &= valueLoader(m_supportsScrollEdge); + success &= valueLoader(m_scrollEdgeEnabledByDefault); + success &= valueLoader(m_isScrollEdge); + + success &= valueLoader(m_supportsScrollOnButtonDown); + success &= valueLoader(m_scrollOnButtonDownEnabledByDefault); + success &= valueLoader(m_isScrollOnButtonDown); + + success &= valueLoader(m_defaultScrollButton); + success &= valueLoader(m_scrollButton); + + // click methods + success &= valueLoader(m_supportsClickMethodAreas); + success &= valueLoader(m_supportsClickMethodClickfinger); + success &= valueLoader(m_defaultClickMethodAreas); + success &= valueLoader(m_defaultClickMethodClickfinger); + success &= valueLoader(m_clickMethodAreas); + success &= valueLoader(m_clickMethodClickfinger); + + return success; +} + +bool LibinputTouchpad::applyConfig() +{ + QVector msgs; + + msgs << valueWriter(m_enabled) + << valueWriter(m_tapToClick) + << valueWriter(m_lrmTapButtonMap) + << valueWriter(m_lmrTapButtonMap) + << valueWriter(m_tapAndDrag) + << valueWriter(m_tapDragLock) + << valueWriter(m_leftHanded) + << valueWriter(m_disableWhileTyping) + << valueWriter(m_middleEmulation) + << valueWriter(m_pointerAcceleration) + << valueWriter(m_pointerAccelerationProfileFlat) + << valueWriter(m_pointerAccelerationProfileAdaptive) + << valueWriter(m_naturalScroll) + << valueWriter(m_horizontalScrolling) + << valueWriter(m_isScrollTwoFinger) + << valueWriter(m_isScrollEdge) + << valueWriter(m_isScrollOnButtonDown) + << valueWriter(m_scrollButton) + << valueWriter(m_clickMethodAreas) + << valueWriter(m_clickMethodClickfinger); + + bool success = true; + QString error_msg; + + for (QString m : msgs) { + if (!m.isNull()) { + qCCritical(KCM_TOUCHPAD) << "in error:" << m; + if (!success) { + error_msg.append("\n"); + } + error_msg.append(m); + success = false; + } + } + + if (!success) { + qCCritical(KCM_TOUCHPAD) << error_msg; + } + + flush(); + return success; +} + +bool LibinputTouchpad::getDefaultConfig() +{ + m_enabled.set(m_enabledDefault); + m_tapToClick.set(m_tapToClickEnabledByDefault); + m_lrmTapButtonMap.set(m_lrmTapButtonMap); + m_lmrTapButtonMap.set(m_lmrTapButtonMapEnabledByDefault); + m_tapAndDrag.set(m_tapAndDragEnabledByDefault); + m_tapDragLock.set(m_tapDragLockEnabledByDefault); + m_leftHanded.set(m_leftHandedEnabledByDefault); + m_disableEventsOnExternalMouse.set(m_disableEventsOnExternalMouseDefault); + m_disableWhileTyping.set(m_disableWhileTypingEnabledByDefault); + m_middleEmulation.set(m_middleEmulationEnabledByDefault); + m_pointerAcceleration.set(m_defaultPointerAcceleration); + m_pointerAccelerationProfileFlat.set(m_defaultPointerAccelerationProfileFlat); + m_pointerAccelerationProfileAdaptive.set(m_defaultPointerAccelerationProfileAdaptive); + m_naturalScroll.set(m_naturalScrollEnabledByDefault); + m_horizontalScrolling.set(true); + m_isScrollTwoFinger.set(m_scrollTwoFingerEnabledByDefault); + m_isScrollEdge.set(m_scrollEdgeEnabledByDefault); + m_isScrollOnButtonDown.set(m_scrollOnButtonDownEnabledByDefault); + m_scrollButton.set(m_defaultScrollButton); + m_clickMethodAreas.set(m_defaultClickMethodAreas); + m_clickMethodClickfinger.set(m_defaultClickMethodClickfinger); + + return true; +} + +bool LibinputTouchpad::isChangedConfig() +{ + + bool changed = m_enabled.changed() || + m_tapToClick.changed() || + m_lrmTapButtonMap.changed() || + m_lmrTapButtonMap.changed() || + m_tapAndDrag.changed() || + m_tapDragLock.changed() || + m_leftHanded.changed() || + m_disableEventsOnExternalMouse.changed() || + m_disableWhileTyping.changed() || + m_middleEmulation.changed() || + m_pointerAcceleration.changed() || + m_pointerAccelerationProfileFlat.changed() || + m_pointerAccelerationProfileAdaptive.changed() || + m_naturalScroll.changed() || + m_horizontalScrolling.changed() || + m_isScrollTwoFinger.changed() || + m_isScrollEdge.changed() || + m_isScrollOnButtonDown.changed() || + m_scrollButton.changed() || + m_clickMethodAreas.changed() || + m_clickMethodClickfinger.changed(); + + return changed; +} + +template +bool LibinputTouchpad::valueLoader(Prop &prop) +{ + const Parameter *p = findParameter(QString::fromAscii(prop.name)); + + if (!p) { + qCCritical(KCM_TOUCHPAD) << "Error on read of " << QString::fromAscii(prop.name); + } + + QVariant reply = getParameter(p); + if (!reply.isValid()) { + prop.avail = false; + return true; + } + prop.avail = true; + + T replyValue = valueLoaderPart(reply); + + prop.old = replyValue; + prop.val = replyValue; + return true; +} + +template +QString LibinputTouchpad::valueWriter(const Prop &prop) +{ + const Parameter *p = findParameter(QString::fromAscii(prop.name)); + + if (!p || !prop.changed()) { + return QString(); + } + + bool error = !setParameter( p, prop.val); + if (error) { + qCCritical(KCM_TOUCHPAD) << "Cannot set property " + QString::fromAscii(prop.name); + return QStringLiteral("Cannot set property ") + QString::fromAscii(prop.name); } + return QString(); } diff --git a/kcms/touchpad/src/backends/x11/synapticstouchpad.h b/kcms/touchpad/src/backends/x11/synapticstouchpad.h --- a/kcms/touchpad/src/backends/x11/synapticstouchpad.h +++ b/kcms/touchpad/src/backends/x11/synapticstouchpad.h @@ -22,8 +22,10 @@ #include "xlibtouchpad.h" #include "xcbatom.h" -class SynapticsTouchpad : public XlibTouchpad +class SynapticsTouchpad : public QObject, public XlibTouchpad { + Q_OBJECT + public: SynapticsTouchpad(Display *display, int deviceId); diff --git a/kcms/touchpad/src/backends/x11/xlibbackend.h b/kcms/touchpad/src/backends/x11/xlibbackend.h --- a/kcms/touchpad/src/backends/x11/xlibbackend.h +++ b/kcms/touchpad/src/backends/x11/xlibbackend.h @@ -29,6 +29,8 @@ #include "touchpadbackend.h" #include "xlibtouchpad.h" +#include "libinputtouchpad.h" +#include "synapticstouchpad.h" #include @@ -43,12 +45,18 @@ { Q_OBJECT + Q_PROPERTY(int touchpadCount READ touchpadCount CONSTANT) + public: static XlibBackend* initialize(QObject *parent = nullptr); ~XlibBackend(); bool applyConfig(const QVariantHash &) override; + bool applyConfig() override; bool getConfig(QVariantHash &) override; + bool getConfig() override; + bool getDefaultConfig() override; + bool isChangedConfig() const override; QStringList supportedParameters() const override { return m_device ? m_device->supportedParameters() : QStringList(); } @@ -65,6 +73,7 @@ void watchForEvents(bool keyboard) override; QStringList listMouses(const QStringList &blacklist) override; + QVector getDevices() const override; private slots: void propertyChanged(xcb_atom_t); diff --git a/kcms/touchpad/src/backends/x11/xlibbackend.cpp b/kcms/touchpad/src/backends/x11/xlibbackend.cpp --- a/kcms/touchpad/src/backends/x11/xlibbackend.cpp +++ b/kcms/touchpad/src/backends/x11/xlibbackend.cpp @@ -120,8 +120,10 @@ Atom *atom = properties.data(), *atomEnd = properties.data() + nProperties; for (; atom != atomEnd; atom++) { if (*atom == m_libinputIdentifierAtom.atom()) { + setMode(TouchpadInputBackendMode::XLibinput); return new LibinputTouchpad(m_display.data(), info->id); } else if (*atom == m_synapticsIdentifierAtom.atom()) { + setMode(TouchpadInputBackendMode::XSynaptics); return new SynapticsTouchpad(m_display.data(), info->id); } } @@ -144,6 +146,20 @@ return success; } +bool XlibBackend::applyConfig() +{ + if (!m_device) { + return false; + } + + bool success = m_device->applyConfig(); + if (!success) { + m_errorString = i18n("Cannot apply touchpad configuration"); + } + + return success; +} + bool XlibBackend::getConfig(QVariantHash &p) { if (!m_device) { @@ -157,6 +173,41 @@ return success; } +bool XlibBackend::getConfig() +{ + if(!m_device) { + return false; + } + + bool success = m_device->getConfig(); + if (!success) { + m_errorString = i18n("Cannot read touchpad configuration"); + } + return success; +} + +bool XlibBackend::getDefaultConfig() +{ + if (!m_device) { + return false; + } + + bool success = m_device->getDefaultConfig(); + if (!success) { + m_errorString = i18n("Cannot read default touchpad configuration"); + } + return success; +} + +bool XlibBackend::isChangedConfig() const +{ + if (!m_device) { + return false; + } + + return m_device->isChangedConfig(); +} + void XlibBackend::setTouchpadEnabled(bool enable) { if (!m_device) { @@ -295,6 +346,22 @@ return list; } +QVector XlibBackend::getDevices() const +{ + QVector touchpads; + + LibinputTouchpad* libinputtouchpad = dynamic_cast (m_device.data()); + SynapticsTouchpad* synaptics = dynamic_cast (m_device.data()); + + if ( libinputtouchpad) { + touchpads.push_back(libinputtouchpad); + } + if (synaptics) { + touchpads.push_back(synaptics); + } + return touchpads; +} + void XlibBackend::watchForEvents(bool keyboard) { if (!m_notifications) { diff --git a/kcms/touchpad/src/backends/x11/xlibtouchpad.h b/kcms/touchpad/src/backends/x11/xlibtouchpad.h --- a/kcms/touchpad/src/backends/x11/xlibtouchpad.h +++ b/kcms/touchpad/src/backends/x11/xlibtouchpad.h @@ -19,6 +19,7 @@ #ifndef XLIBTOUCHPAD_H #define XLIBTOUCHPAD_H +#include #include #include @@ -44,14 +45,19 @@ class XlibTouchpad { + public: XlibTouchpad(Display *display, int deviceId); - virtual ~XlibTouchpad() {}; + virtual ~XlibTouchpad() {} int deviceId() { return m_deviceId; } const QStringList &supportedParameters() const { return m_supported; } bool applyConfig(const QVariantHash &p); bool getConfig(QVariantHash &p); + virtual bool getConfig() { return false; } + virtual bool applyConfig() { return false; } + virtual bool getDefaultConfig() { return false; } + virtual bool isChangedConfig() { return false; } void setEnabled(bool enable); bool enabled(); void setTouchpadOff(int touchpadOff); diff --git a/kcms/touchpad/src/kcm/libinput/main.qml b/kcms/touchpad/src/kcm/libinput/main.qml --- a/kcms/touchpad/src/kcm/libinput/main.qml +++ b/kcms/touchpad/src/kcm/libinput/main.qml @@ -76,6 +76,7 @@ naturalScroll.load() rightClickMethod.load() middleClickMethod.load() + disableHorizontalScrolling.load() loading = false } @@ -271,6 +272,7 @@ enabled = touchpad.supportsPointerAccelerationProfileAdaptive if (!enabled) { + accelProfile.visible = false accelProfileFlat.checked = false accelProfileAdaptive.checked = false return @@ -568,6 +570,31 @@ } } + Controls.CheckBox { + id: disableHorizontalScrolling + text: i18nd("kcm_touchpad", "Disable horizontal scrolling") + + function load() { + visible = touchpad.supportsHorizontalScrolling + enabled = touchpad.supportsHorizontalScrolling + checked = enabled && !touchpad.horizontalScrolling + } + + onCheckedChanged: { + if (enabled && !root.loading) { + touchpad.horizontalScrolling = !checked + root.changeSignal() + } + } + + hoverEnabled: true + Controls.ToolTip { + text: i18nd("kcm_touchpad", "Disable horizontal scrolling") + visible: parent.hovered + delay: 1000 + } + } + Item { Kirigami.FormData.isSection: false } diff --git a/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.h b/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.h --- a/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.h +++ b/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.h @@ -32,6 +32,7 @@ public: explicit TouchpadConfigLibinput(TouchpadConfigContainer *parent, + TouchpadBackend *backend, const QVariantList &args = QVariantList()); virtual ~TouchpadConfigLibinput() {} diff --git a/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.cpp b/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.cpp --- a/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.cpp +++ b/kcms/touchpad/src/kcm/libinput/touchpadconfiglibinput.cpp @@ -35,8 +35,8 @@ #include "version.h" -TouchpadConfigLibinput::TouchpadConfigLibinput(TouchpadConfigContainer *parent, const QVariantList &args) - : TouchpadConfigPlugin(parent) +TouchpadConfigLibinput::TouchpadConfigLibinput(TouchpadConfigContainer *parent, TouchpadBackend* backend, const QVariantList &args) + : TouchpadConfigPlugin(parent, backend) { KAboutData* data = new KAboutData(QStringLiteral("kcm_touchpad"), i18n("Touchpad KCM"), @@ -52,7 +52,6 @@ m_parent->setAboutData(data); - m_backend = TouchpadBackend::implementation(); m_initError = !m_backend->errorString().isNull(); m_view = new QQuickWidget(this); diff --git a/kcms/touchpad/src/kcm/touchpadconfigcontainer.cpp b/kcms/touchpad/src/kcm/touchpadconfigcontainer.cpp --- a/kcms/touchpad/src/kcm/touchpadconfigcontainer.cpp +++ b/kcms/touchpad/src/kcm/touchpadconfigcontainer.cpp @@ -20,6 +20,7 @@ #include "touchpadconfigplugin.h" #include "kcm/libinput/touchpadconfiglibinput.h" #include "kcm/xlib/touchpadconfigxlib.h" +#include "touchpadbackend.h" #include @@ -36,10 +37,16 @@ TouchpadConfigContainer::TouchpadConfigContainer(QWidget *parent, const QVariantList &args) : KCModule(parent, args) { + TouchpadBackend *backend = TouchpadBackend::implementation(); if (KWindowSystem::isPlatformX11()) { - m_plugin = new TouchpadConfigXlib(this); + if (backend->getMode() == TouchpadInputBackendMode::XLibinput) { + m_plugin = new TouchpadConfigLibinput(this, backend); + } + else if (backend->getMode() == TouchpadInputBackendMode::XSynaptics) { + m_plugin = new TouchpadConfigXlib(this, backend); + } } else if (KWindowSystem::isPlatformWayland()) { - m_plugin = new TouchpadConfigLibinput(this); + m_plugin = new TouchpadConfigLibinput(this, backend); } } diff --git a/kcms/touchpad/src/kcm/touchpadconfigplugin.h b/kcms/touchpad/src/kcm/touchpadconfigplugin.h --- a/kcms/touchpad/src/kcm/touchpadconfigplugin.h +++ b/kcms/touchpad/src/kcm/touchpadconfigplugin.h @@ -29,7 +29,7 @@ Q_OBJECT public: - explicit TouchpadConfigPlugin(QWidget *parent); + TouchpadConfigPlugin(QWidget *parent, TouchpadBackend *backend); virtual ~TouchpadConfigPlugin() {} virtual void load() {} diff --git a/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp b/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp --- a/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp +++ b/kcms/touchpad/src/kcm/touchpadconfigplugin.cpp @@ -19,8 +19,9 @@ #include "touchpadconfigplugin.h" #include "touchpadconfigcontainer.h" -TouchpadConfigPlugin::TouchpadConfigPlugin(QWidget *parent) +TouchpadConfigPlugin::TouchpadConfigPlugin(QWidget *parent, TouchpadBackend *backend) : QWidget(parent), - m_parent(dynamic_cast(parent)) + m_parent(dynamic_cast(parent)), + m_backend(backend) { } diff --git a/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.h b/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.h --- a/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.h +++ b/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.h @@ -52,6 +52,7 @@ public: explicit TouchpadConfigXlib(TouchpadConfigContainer *parent, + TouchpadBackend* backend, const QVariantList &args = QVariantList()); ~TouchpadConfigXlib() override; diff --git a/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.cpp b/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.cpp --- a/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.cpp +++ b/kcms/touchpad/src/kcm/xlib/touchpadconfigxlib.cpp @@ -98,8 +98,8 @@ return widget; } -TouchpadConfigXlib::TouchpadConfigXlib(TouchpadConfigContainer *parent, const QVariantList &args) - : TouchpadConfigPlugin(parent), +TouchpadConfigXlib::TouchpadConfigXlib(TouchpadConfigContainer *parent, TouchpadBackend* backend, const QVariantList &args) + : TouchpadConfigPlugin(parent, backend), m_configOutOfSync(false) { KAboutData* data = new KAboutData(QStringLiteral("kcm_touchpad"), @@ -174,8 +174,6 @@ new SliderPair(m_pointerMotion.kcfg_PressureMotionMinZ, m_pointerMotion.kcfg_PressureMotionMaxZ, this); - m_backend = TouchpadBackend::implementation(); - KConfigDialogManager::changedMap()->insert("CustomSlider", SIGNAL(valueChanged(double))); m_manager = new CustomConfigDialogManager(this, &m_config, diff --git a/kcms/touchpad/src/touchpadbackend.h b/kcms/touchpad/src/touchpadbackend.h --- a/kcms/touchpad/src/touchpadbackend.h +++ b/kcms/touchpad/src/touchpadbackend.h @@ -24,16 +24,25 @@ #include #include +enum class TouchpadInputBackendMode { + WaylandLibinput = 0, + XLibinput = 1, + XSynaptics = 2 +}; + class Q_DECL_EXPORT TouchpadBackend : public QObject { Q_OBJECT protected: - explicit TouchpadBackend(QObject *parent) : QObject(parent) {} + explicit TouchpadBackend(QObject *parent) : QObject(parent) {} + void setMode(TouchpadInputBackendMode mode); public: static TouchpadBackend *implementation(); + TouchpadInputBackendMode getMode() const {return m_mode;} + virtual bool applyConfig(const QVariantHash &) {return false;} virtual bool getConfig(QVariantHash &) {return false;} @@ -62,6 +71,9 @@ virtual QStringList listMouses(const QStringList &blacklist) {return QStringList();} +private: + TouchpadInputBackendMode m_mode; + Q_SIGNALS: void touchpadStateChanged(); void mousesChanged(); diff --git a/kcms/touchpad/src/touchpadbackend.cpp b/kcms/touchpad/src/touchpadbackend.cpp --- a/kcms/touchpad/src/touchpadbackend.cpp +++ b/kcms/touchpad/src/touchpadbackend.cpp @@ -28,6 +28,11 @@ #include +void TouchpadBackend::setMode(TouchpadInputBackendMode mode) +{ + m_mode = mode; +} + TouchpadBackend *TouchpadBackend::implementation() { //There are multiple possible backends