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);
48 n = qMin(n,
int(
sizeof(buf)) - 1);
49 if (buf[n - 1] ==
'\n')
51 qCDebug(qLcLibInput,
"libinput: %s", buf);
61 if (Q_UNLIKELY(!m_udev))
62 qFatal(
"Failed to get udev context for libinput");
64 m_li = libinput_udev_create_context(&
liInterface,
nullptr, m_udev);
65 if (Q_UNLIKELY(!m_li))
66 qFatal(
"Failed to get libinput context");
68 libinput_log_set_handler(m_li, liLogHandler);
69 if (qLcLibInput().isDebugEnabled())
70 libinput_log_set_priority(m_li, LIBINPUT_LOG_PRIORITY_DEBUG);
72 if (Q_UNLIKELY(libinput_udev_assign_seat(m_li,
"seat0")))
73 qFatal(
"Failed to assign seat");
75 m_liFd = libinput_get_fd(m_li);
76 m_notifier.reset(
new QSocketNotifier(m_liFd, QSocketNotifier::Read));
80 m_pointer.reset(
new QLibInputPointer);
81 m_keyboard.reset(
new QLibInputKeyboard);
82 m_touch.reset(
new QLibInputTouch);
84 QInputDeviceManager *manager = QGuiApplicationPrivate::inputDeviceManager();
85 connect(manager, &QInputDeviceManager::cursorPositionChangeRequested,
this, [
this](
const QPoint &pos) {
86 m_pointer->setPos(pos);
104 if (libinput_dispatch(m_li)) {
105 qWarning(
"libinput_dispatch failed");
110 while ((ev = libinput_get_event(m_li)) !=
nullptr) {
112 libinput_event_destroy(ev);
118 libinput_event_type type = libinput_event_get_type(ev);
119 libinput_device *dev = libinput_event_get_device(ev);
122 case LIBINPUT_EVENT_DEVICE_ADDED:
127 QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get(
128 QGuiApplicationPrivate::inputDeviceManager());
129 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) {
130 m_touch->registerDevice(dev);
131 int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]);
133 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count);
135 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) {
136 int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]);
138 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count);
140 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) {
141 int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]);
143 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count);
147 case LIBINPUT_EVENT_DEVICE_REMOVED:
149 QInputDeviceManagerPrivate *inputManagerPriv = QInputDeviceManagerPrivate::get(
150 QGuiApplicationPrivate::inputDeviceManager());
151 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_TOUCH)) {
152 m_touch->unregisterDevice(dev);
153 int &count(m_devCount[QInputDeviceManager::DeviceTypeTouch]);
155 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeTouch, count);
157 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_POINTER)) {
158 int &count(m_devCount[QInputDeviceManager::DeviceTypePointer]);
160 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypePointer, count);
162 if (libinput_device_has_capability(dev, LIBINPUT_DEVICE_CAP_KEYBOARD)) {
163 int &count(m_devCount[QInputDeviceManager::DeviceTypeKeyboard]);
165 inputManagerPriv->setDeviceCount(QInputDeviceManager::DeviceTypeKeyboard, count);
169 case LIBINPUT_EVENT_POINTER_BUTTON:
170 m_pointer->processButton(libinput_event_get_pointer_event(ev));
172 case LIBINPUT_EVENT_POINTER_MOTION:
173 m_pointer->processMotion(libinput_event_get_pointer_event(ev));
175 case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
176 m_pointer->processAbsMotion(libinput_event_get_pointer_event(ev));
178#if QT_CONFIG(libinput_hires_wheel_support)
179 case LIBINPUT_EVENT_POINTER_SCROLL_WHEEL:
181 case LIBINPUT_EVENT_POINTER_AXIS:
183 m_pointer->processAxis(libinput_event_get_pointer_event(ev));
185 case LIBINPUT_EVENT_KEYBOARD_KEY:
186 m_keyboard->processKey(libinput_event_get_keyboard_event(ev));
188 case LIBINPUT_EVENT_TOUCH_DOWN:
189 m_touch->processTouchDown(libinput_event_get_touch_event(ev));
191 case LIBINPUT_EVENT_TOUCH_MOTION:
192 m_touch->processTouchMotion(libinput_event_get_touch_event(ev));
194 case LIBINPUT_EVENT_TOUCH_UP:
195 m_touch->processTouchUp(libinput_event_get_touch_event(ev));
197 case LIBINPUT_EVENT_TOUCH_CANCEL:
198 m_touch->processTouchCancel(libinput_event_get_touch_event(ev));
200 case LIBINPUT_EVENT_TOUCH_FRAME:
201 m_touch->processTouchFrame(libinput_event_get_touch_event(ev));
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")