backends/libinput: Rework Device getter
libinput_device_get_user_data() can be used to get the associated Device object with libinput_device. That way, we won't need to maintain a private list of all input devices.
This commit is contained in:
parent
eb058a4a2a
commit
066ac3200a
6 changed files with 21 additions and 69 deletions
|
@ -26,7 +26,6 @@ class TestLibinputDevice : public QObject
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
void testStaticGetter();
|
|
||||||
void testDeviceType_data();
|
void testDeviceType_data();
|
||||||
void testDeviceType();
|
void testDeviceType();
|
||||||
void testGestureSupport_data();
|
void testGestureSupport_data();
|
||||||
|
@ -181,48 +180,6 @@ void TestLibinputDevice::initTestCase()
|
||||||
QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.kwin.tests.libinputdevice"));
|
QDBusConnection::sessionBus().registerService(QStringLiteral("org.kde.kwin.tests.libinputdevice"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestLibinputDevice::testStaticGetter()
|
|
||||||
{
|
|
||||||
// this test verifies that the static getter for Device works as expected
|
|
||||||
QVERIFY(Device::devices().isEmpty());
|
|
||||||
|
|
||||||
// create some device
|
|
||||||
libinput_device device1;
|
|
||||||
libinput_device device2;
|
|
||||||
// at the moment not yet known to Device
|
|
||||||
QVERIFY(!Device::getDevice(&device1));
|
|
||||||
QVERIFY(!Device::getDevice(&device2));
|
|
||||||
QVERIFY(Device::devices().isEmpty());
|
|
||||||
|
|
||||||
// now create a Device for one
|
|
||||||
Device *d1 = new Device(&device1);
|
|
||||||
QCOMPARE(Device::devices().count(), 1);
|
|
||||||
QCOMPARE(Device::devices().first(), d1);
|
|
||||||
QCOMPARE(Device::getDevice(&device1), d1);
|
|
||||||
QVERIFY(!Device::getDevice(&device2));
|
|
||||||
|
|
||||||
// and a second Device
|
|
||||||
Device *d2 = new Device(&device2);
|
|
||||||
QCOMPARE(Device::devices().count(), 2);
|
|
||||||
QCOMPARE(Device::devices().first(), d1);
|
|
||||||
QCOMPARE(Device::devices().last(), d2);
|
|
||||||
QCOMPARE(Device::getDevice(&device1), d1);
|
|
||||||
QCOMPARE(Device::getDevice(&device2), d2);
|
|
||||||
|
|
||||||
// now delete d1
|
|
||||||
delete d1;
|
|
||||||
QCOMPARE(Device::devices().count(), 1);
|
|
||||||
QCOMPARE(Device::devices().first(), d2);
|
|
||||||
QCOMPARE(Device::getDevice(&device2), d2);
|
|
||||||
QVERIFY(!Device::getDevice(&device1));
|
|
||||||
|
|
||||||
// and delete d2
|
|
||||||
delete d2;
|
|
||||||
QVERIFY(!Device::getDevice(&device1));
|
|
||||||
QVERIFY(!Device::getDevice(&device2));
|
|
||||||
QVERIFY(Device::devices().isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
void TestLibinputDevice::testDeviceType_data()
|
void TestLibinputDevice::testDeviceType_data()
|
||||||
{
|
{
|
||||||
QTest::addColumn<bool>("keyboard");
|
QTest::addColumn<bool>("keyboard");
|
||||||
|
|
|
@ -956,3 +956,14 @@ void libinput_device_led_update(struct libinput_device *device,
|
||||||
Q_UNUSED(device)
|
Q_UNUSED(device)
|
||||||
Q_UNUSED(leds)
|
Q_UNUSED(leds)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void libinput_device_set_user_data(struct libinput_device *device, void *user_data)
|
||||||
|
{
|
||||||
|
device->userData = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
libinput_device_get_user_data(struct libinput_device *device)
|
||||||
|
{
|
||||||
|
return device->userData;
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
struct libinput_device
|
struct libinput_device
|
||||||
{
|
{
|
||||||
|
void *userData = nullptr;
|
||||||
bool keyboard = false;
|
bool keyboard = false;
|
||||||
bool pointer = false;
|
bool pointer = false;
|
||||||
bool touch = false;
|
bool touch = false;
|
||||||
|
|
|
@ -77,20 +77,6 @@ static bool checkAlphaNumericKeyboard(libinput_device *device)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<Device *> Device::s_devices;
|
|
||||||
|
|
||||||
Device *Device::getDevice(libinput_device *native)
|
|
||||||
{
|
|
||||||
auto it = std::find_if(s_devices.constBegin(), s_devices.constEnd(),
|
|
||||||
[native](const Device *d) {
|
|
||||||
return d->device() == native;
|
|
||||||
});
|
|
||||||
if (it != s_devices.constEnd()) {
|
|
||||||
return *it;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class ConfigKey {
|
enum class ConfigKey {
|
||||||
Enabled,
|
Enabled,
|
||||||
LeftHanded,
|
LeftHanded,
|
||||||
|
@ -336,6 +322,7 @@ Device::Device(libinput_device *device, QObject *parent)
|
||||||
, m_clickMethod(libinput_device_config_click_get_method(m_device))
|
, m_clickMethod(libinput_device_config_click_get_method(m_device))
|
||||||
{
|
{
|
||||||
libinput_device_ref(m_device);
|
libinput_device_ref(m_device);
|
||||||
|
libinput_device_set_user_data(m_device, this);
|
||||||
|
|
||||||
qreal width = 0;
|
qreal width = 0;
|
||||||
qreal height = 0;
|
qreal height = 0;
|
||||||
|
@ -385,7 +372,6 @@ Device::Device(libinput_device *device, QObject *parent)
|
||||||
|
|
||||||
qDBusRegisterMetaType<QMatrix4x4>();
|
qDBusRegisterMetaType<QMatrix4x4>();
|
||||||
|
|
||||||
s_devices << this;
|
|
||||||
QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/kde/KWin/InputDevice/") + m_sysName,
|
QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/kde/KWin/InputDevice/") + m_sysName,
|
||||||
QStringLiteral("org.kde.KWin.InputDevice"),
|
QStringLiteral("org.kde.KWin.InputDevice"),
|
||||||
this,
|
this,
|
||||||
|
@ -394,11 +380,16 @@ Device::Device(libinput_device *device, QObject *parent)
|
||||||
|
|
||||||
Device::~Device()
|
Device::~Device()
|
||||||
{
|
{
|
||||||
s_devices.removeOne(this);
|
|
||||||
QDBusConnection::sessionBus().unregisterObject(QStringLiteral("/org/kde/KWin/InputDevice/") + m_sysName);
|
QDBusConnection::sessionBus().unregisterObject(QStringLiteral("/org/kde/KWin/InputDevice/") + m_sysName);
|
||||||
|
libinput_device_set_user_data(m_device, nullptr);
|
||||||
libinput_device_unref(m_device);
|
libinput_device_unref(m_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Device *Device::get(libinput_device *native)
|
||||||
|
{
|
||||||
|
return static_cast<Device *>(libinput_device_get_user_data(native));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void Device::writeEntry(const ConfigKey &key, const T &value)
|
void Device::writeEntry(const ConfigKey &key, const T &value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -619,17 +619,10 @@ public:
|
||||||
LEDs leds() const override;
|
LEDs leds() const override;
|
||||||
void setLeds(LEDs leds) override;
|
void setLeds(LEDs leds) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* All created Devices
|
|
||||||
*/
|
|
||||||
static QVector<Device *> devices()
|
|
||||||
{
|
|
||||||
return s_devices;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Gets the Device for @p native. @c null if there is no Device for @p native.
|
* Gets the Device for @p native. @c null if there is no Device for @p native.
|
||||||
*/
|
*/
|
||||||
static Device *getDevice(libinput_device *native);
|
static Device *get(libinput_device *native);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void tapButtonMapChanged();
|
void tapButtonMapChanged();
|
||||||
|
@ -736,7 +729,6 @@ private:
|
||||||
enum libinput_config_click_method m_clickMethod;
|
enum libinput_config_click_method m_clickMethod;
|
||||||
|
|
||||||
LEDs m_leds;
|
LEDs m_leds;
|
||||||
static QVector<Device *> s_devices;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ Event::~Event()
|
||||||
Device *Event::device() const
|
Device *Event::device() const
|
||||||
{
|
{
|
||||||
if (!m_device) {
|
if (!m_device) {
|
||||||
m_device = Device::getDevice(libinput_event_get_device(m_event));
|
m_device = Device::get(libinput_event_get_device(m_event));
|
||||||
}
|
}
|
||||||
return m_device;
|
return m_device;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue