11#include <QtCore/QLoggingCategory>
12#include <QtCore/QSocketNotifier>
13#include <QtCore/private/qcore_unix_p.h>
14#include <private/qguiapplication_p.h>
15#include <private/qinputdevicemanager_p_p.h>
21static int liOpen(
const char *path,
int flags,
void *user_data)
24 return qt_safe_open(path, flags);
27static void liClose(
int fd,
void *user_data)
38static void liLogHandler(libinput *libinput, libinput_log_priority priority,
const char *format, va_list args)
44 int n = vsnprintf(buf,
sizeof(buf), format, args);
46 if (buf[n - 1] ==
'\n')
48 qCDebug(qLcLibInput,
"libinput: %s", buf);
58 if (Q_UNLIKELY(!m_udev))
59 qFatal(
"Failed to get udev context for libinput");
61 m_li = libinput_udev_create_context(&
liInterface,
nullptr, m_udev);
62 if (Q_UNLIKELY(!m_li))
63 qFatal(
"Failed to get libinput context");
65 libinput_log_set_handler(m_li, liLogHandler);
66 if (qLcLibInput().isDebugEnabled())
67 libinput_log_set_priority(m_li, LIBINPUT_LOG_PRIORITY_DEBUG);
69 if (Q_UNLIKELY(libinput_udev_assign_seat(m_li,
"seat0")))
70 qFatal(
"Failed to assign seat");
72 m_liFd = libinput_get_fd(m_li);
73 m_notifier.reset(
new QSocketNotifier(m_liFd, QSocketNotifier::Read));
75 connect(m_notifier.data(), &QSocketNotifier::activated,
this, &QLibInputHandler::onReadyRead);
77 m_pointer.reset(
new QLibInputPointer);
78 m_keyboard.reset(
new QLibInputKeyboard);
79 m_touch.reset(
new QLibInputTouch);
81 QInputDeviceManager *manager = QGuiApplicationPrivate::inputDeviceManager();
82 connect(manager, &QInputDeviceManager::cursorPositionChangeRequested,
this, [
this](
const QPoint &pos) {
83 m_pointer->setPos(pos);
101 if (libinput_dispatch(m_li)) {
102 qWarning(
"libinput_dispatch failed");
107 while ((ev = libinput_get_event(m_li)) !=
nullptr) {
109 libinput_event_destroy(ev);
115 libinput_event_type type = libinput_event_get_type(ev);
116 libinput_device *dev = libinput_event_get_device(ev);
119 case LIBINPUT_EVENT_DEVICE_ADDED:
124 QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get(
125 QGuiApplicationPrivate::inputDeviceManager());
126 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) {
127 m_touch->registerDevice(dev);
128 int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]);
130 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count);
132 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) {
133 int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]);
135 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count);
137 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) {
138 int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]);
140 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count);
144 case LIBINPUT_EVENT_DEVICE_REMOVED:
146 QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get(
147 QGuiApplicationPrivate::inputDeviceManager());
148 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) {
149 m_touch->unregisterDevice(dev);
150 int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]);
152 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count);
154 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) {
155 int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]);
157 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count);
159 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) {
160 int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]);
162 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count);
166 case LIBINPUT_EVENT_POINTER_BUTTON:
167 m_pointer->processButton(libinput_event_get_pointer_event(ev));
169 case LIBINPUT_EVENT_POINTER_MOTION:
170 m_pointer->processMotion(libinput_event_get_pointer_event(ev));
172 case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
173 m_pointer->processAbsMotion(libinput_event_get_pointer_event(ev));
175#if QT_CONFIG(libinput_hires_wheel_support)
176 case LIBINPUT_EVENT_POINTER_SCROLL_WHEEL:
178 case LIBINPUT_EVENT_POINTER_AXIS:
180 m_pointer->processAxis(libinput_event_get_pointer_event(ev));
182 case LIBINPUT_EVENT_KEYBOARD_KEY:
183 m_keyboard->processKey(libinput_event_get_keyboard_event(ev));
185 case LIBINPUT_EVENT_TOUCH_DOWN:
186 m_touch->processTouchDown(libinput_event_get_touch_event(ev));
188 case LIBINPUT_EVENT_TOUCH_MOTION:
189 m_touch->processTouchMotion(libinput_event_get_touch_event(ev));
191 case LIBINPUT_EVENT_TOUCH_UP:
192 m_touch->processTouchUp(libinput_event_get_touch_event(ev));
194 case LIBINPUT_EVENT_TOUCH_CANCEL:
195 m_touch->processTouchCancel(libinput_event_get_touch_event(ev));
197 case LIBINPUT_EVENT_TOUCH_FRAME:
198 m_touch->processTouchFrame(libinput_event_get_touch_event(ev));
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")