File indexing completed on 2024-06-16 05:09:01

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 };