#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(); } } int DeviceManager::penButtons() const { return m_penButtons; } void DeviceManager::setPenButtons(int num) { if (m_penButtons != num) { m_penButtons = num; Q_EMIT penButtonsChanged(); } } 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) { if (m_penButtons >= 1) { libevdev_enable_event_code(dev, EV_KEY, BTN_TOOL_PEN, NULL); } if (m_penButtons >= 2) { libevdev_enable_event_code(dev, EV_KEY, BTN_TOOL_RUBBER, NULL); } if (m_penButtons >= 3) { 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); }