136 lines
3.2 KiB
C++
136 lines
3.2 KiB
C++
|
#include "devicemanager.h"
|
||
|
|
||
|
DeviceManager::~DeviceManager() { destroyDevice(); }
|
||
|
|
||
|
QString DeviceManager::name() const
|
||
|
{
|
||
|
return m_name;
|
||
|
}
|
||
|
|
||
|
void DeviceManager::setName(const QString &name)
|
||
|
{
|
||
|
if (m_name != name)
|
||
|
{
|
||
|
m_name = name;
|
||
|
Q_EMIT nameChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool DeviceManager::direct() const
|
||
|
{
|
||
|
return m_direct;
|
||
|
}
|
||
|
|
||
|
void DeviceManager::setDirect(bool direct)
|
||
|
{
|
||
|
if (m_direct != direct)
|
||
|
{
|
||
|
m_direct = direct;
|
||
|
Q_EMIT directChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool DeviceManager::pad() const
|
||
|
{
|
||
|
return m_pad;
|
||
|
}
|
||
|
|
||
|
void DeviceManager::setPad(bool pad)
|
||
|
{
|
||
|
if (m_pad != pad)
|
||
|
{
|
||
|
m_pad = pad;
|
||
|
Q_EMIT padChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DeviceManager::recreateDevice()
|
||
|
{
|
||
|
destroyDevice();
|
||
|
|
||
|
input_absinfo xInfo{
|
||
|
.value = 28166,
|
||
|
.minimum = 0,
|
||
|
.maximum = 47664,
|
||
|
.resolution = 100,
|
||
|
};
|
||
|
|
||
|
input_absinfo yInfo{
|
||
|
.value = 22040,
|
||
|
.minimum = 0,
|
||
|
.maximum = 26778,
|
||
|
.resolution = 100,
|
||
|
};
|
||
|
|
||
|
input_absinfo pressureInfo{
|
||
|
.minimum = 0,
|
||
|
.maximum = 8191,
|
||
|
};
|
||
|
|
||
|
input_absinfo tiltInfo{
|
||
|
.minimum = -127,
|
||
|
.maximum = 127,
|
||
|
};
|
||
|
|
||
|
dev = libevdev_new();
|
||
|
libevdev_set_name(dev, m_name.toUtf8().constData());
|
||
|
libevdev_enable_event_type(dev, EV_SYN);
|
||
|
libevdev_enable_event_type(dev, EV_KEY);
|
||
|
if (!m_pad)
|
||
|
{
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_TOOL_PEN, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_TOOL_RUBBER, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_TOUCH, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_STYLUS, NULL);
|
||
|
|
||
|
libevdev_enable_event_type(dev, EV_ABS);
|
||
|
libevdev_enable_event_code(dev, EV_ABS, ABS_X, &xInfo);
|
||
|
libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &yInfo);
|
||
|
libevdev_enable_event_code(dev, EV_ABS, ABS_PRESSURE, &pressureInfo);
|
||
|
libevdev_enable_event_code(dev, EV_ABS, ABS_TILT_Y, &tiltInfo);
|
||
|
libevdev_enable_event_code(dev, EV_ABS, ABS_TILT_X, &tiltInfo);
|
||
|
|
||
|
if (m_direct)
|
||
|
{
|
||
|
libevdev_enable_property(dev, INPUT_PROP_DIRECT);
|
||
|
}
|
||
|
} else
|
||
|
{
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_0, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_1, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_2, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_KEY, BTN_3, NULL);
|
||
|
|
||
|
libevdev_enable_event_type(dev, EV_REL);
|
||
|
libevdev_enable_event_code(dev, EV_REL, REL_HWHEEL, NULL);
|
||
|
libevdev_enable_event_code(dev, EV_REL, REL_WHEEL, NULL);
|
||
|
|
||
|
libevdev_enable_event_type(dev, EV_MSC);
|
||
|
libevdev_enable_event_code(dev, EV_MSC, MSC_SCAN, NULL);
|
||
|
}
|
||
|
|
||
|
rc = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev);
|
||
|
|
||
|
uinput_fd = libevdev_uinput_get_fd(uidev);
|
||
|
|
||
|
devnode = libevdev_uinput_get_devnode(uidev);
|
||
|
|
||
|
fd = open(devnode, O_RDONLY);
|
||
|
}
|
||
|
|
||
|
void DeviceManager::testButton()
|
||
|
{
|
||
|
libevdev_uinput_write_event(uidev, EV_KEY, BTN_TOOL_PEN, 1);
|
||
|
libevdev_uinput_write_event(uidev, EV_KEY, BTN_TOOL_PEN, 0);
|
||
|
}
|
||
|
|
||
|
void DeviceManager::destroyDevice()
|
||
|
{
|
||
|
libevdev_free(dev);
|
||
|
libevdev_uinput_destroy(uidev);
|
||
|
close(fd);
|
||
|
|
||
|
/* uinput fd is managed, so make sure it did get closed */
|
||
|
close(uinput_fd);
|
||
|
}
|