File indexing completed on 2024-06-23 05:29:38
0001 /* 0002 SPDX-FileCopyrightText: 2013 Alexander Mezin <mezin.alexander@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QLatin1String> 0010 #include <QMap> 0011 #include <QSet> 0012 #include <QStringList> 0013 #include <QtGui/private/qtx11extras_p.h> 0014 0015 #include "libinputtouchpad.h" 0016 #include "touchpadbackend.h" 0017 #include "xlibtouchpad.h" 0018 0019 #include <xcb/xcb.h> 0020 0021 #include "propertyinfo.h" 0022 #include "xcbatom.h" 0023 0024 class XlibTouchpad; 0025 class XlibNotifications; 0026 class XRecordKeyboardMonitor; 0027 0028 class XlibBackend : public TouchpadBackend 0029 { 0030 Q_OBJECT 0031 0032 Q_PROPERTY(int touchpadCount READ touchpadCount CONSTANT) 0033 0034 public: 0035 static XlibBackend *initialize(QObject *parent = nullptr); 0036 ~XlibBackend(); 0037 0038 bool applyConfig(const QVariantHash &) override; 0039 bool applyConfig() override; 0040 bool getConfig(QVariantHash &) override; 0041 bool getConfig() override; 0042 bool getDefaultConfig() override; 0043 bool isChangedConfig() const override; 0044 QStringList supportedParameters() const override 0045 { 0046 return m_device ? m_device->supportedParameters() : QStringList(); 0047 } 0048 QString errorString() const override 0049 { 0050 return m_errorString; 0051 } 0052 int touchpadCount() const override 0053 { 0054 return m_device ? 1 : 0; 0055 } 0056 0057 void setTouchpadOff(TouchpadOffState) override; 0058 TouchpadOffState getTouchpadOff() override; 0059 0060 bool isTouchpadAvailable() override; 0061 bool isTouchpadEnabled() override; 0062 void setTouchpadEnabled(bool) override; 0063 0064 void watchForEvents(bool keyboard) override; 0065 0066 QStringList listMouses(const QStringList &blacklist) override; 0067 QList<QObject *> getDevices() const override; 0068 0069 private Q_SLOTS: 0070 void propertyChanged(xcb_atom_t); 0071 void touchpadDetached(); 0072 void devicePlugged(int); 0073 0074 protected: 0075 explicit XlibBackend(QObject *parent); 0076 0077 struct XDisplayCleanup { 0078 void operator()(Display *); 0079 }; 0080 0081 std::unique_ptr<Display, XDisplayCleanup> m_display; 0082 xcb_connection_t *m_connection; 0083 0084 XcbAtom m_enabledAtom, m_mouseAtom, m_keyboardAtom, m_touchpadAtom; 0085 XcbAtom m_libinputIdentifierAtom; 0086 0087 XlibTouchpad *findTouchpad(); 0088 std::unique_ptr<XlibTouchpad> m_device; 0089 0090 QString m_errorString; 0091 std::unique_ptr<XlibNotifications> m_notifications; 0092 std::unique_ptr<XRecordKeyboardMonitor> m_keyboard; 0093 };