7#include <QCoreApplication>
10#include <QSocketNotifier>
11#include <QLoggingCategory>
14#include <dev/evdev/input.h>
16#include <linux/input.h>
27 qCDebug(lcDD) <<
"udev device discovery for type" <<
types;
36 qWarning(
"Failed to get udev library context");
49 m_udevMonitor = udev_monitor_new_from_netlink(
m_udev,
"udev");
51 qWarning(
"Unable to create an udev monitor. No devices can be detected.");
55 udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor,
"input", 0);
56 udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor,
"drm", 0);
57 udev_monitor_enable_receiving(m_udevMonitor);
58 m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor);
67 udev_monitor_unref(m_udevMonitor);
80 udev_enumerate *ue = udev_enumerate_new(
m_udev);
81 udev_enumerate_add_match_subsystem(ue,
"input");
82 udev_enumerate_add_match_subsystem(ue,
"drm");
85 udev_enumerate_add_match_property(ue,
"ID_INPUT_MOUSE",
"1");
87 udev_enumerate_add_match_property(ue,
"ID_INPUT_TOUCHPAD",
"1");
89 udev_enumerate_add_match_property(ue,
"ID_INPUT_TOUCHSCREEN",
"1");
91 udev_enumerate_add_match_property(ue,
"ID_INPUT_KEYBOARD",
"1");
92 udev_enumerate_add_match_property(ue,
"ID_INPUT_KEY",
"1");
95 udev_enumerate_add_match_property(ue,
"ID_INPUT_TABLET",
"1");
97 udev_enumerate_add_match_property(ue,
"ID_INPUT_JOYSTICK",
"1");
99 if (udev_enumerate_scan_devices(ue) != 0) {
104 udev_list_entry *
entry;
105 udev_list_entry_foreach (
entry, udev_enumerate_get_list_entry(ue)) {
106 const char *syspath = udev_list_entry_get_name(
entry);
107 udev_device *udevice = udev_device_new_from_syspath(
m_udev, syspath);
113 udev_device *pci = udev_device_get_parent_with_subsystem_devtype(udevice,
"pci", 0);
115 if (
qstrcmp(udev_device_get_sysattr_value(pci,
"boot_vga"),
"1") == 0)
122 udev_device_unref(udevice);
124 udev_enumerate_unref(ue);
131void QDeviceDiscoveryUDev::handleUDevNotification()
136 struct udev_device *dev;
139 dev = udev_monitor_receive_device(m_udevMonitor);
144 action = udev_device_get_action(dev);
149 str = udev_device_get_devnode(dev);
153 const char *subsystem;
162 if (!checkDeviceType(dev)) {
164 struct udev_device *parent_dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
168 if (!checkDeviceType(parent_dev))
172 if (
qstrcmp(action,
"add") == 0)
175 if (
qstrcmp(action,
"remove") == 0)
179 udev_device_unref(dev);
182bool QDeviceDiscoveryUDev::checkDeviceType(udev_device *dev)
190 if (!
val.isEmpty()) {
192 unsigned long long keys =
val.last().toULongLong(&
ok, 16);
195 bool test = (
keys >> KEY_Q) & 1;
228#include "moc_qdevicediscovery_udev_p.cpp"
QStringList scanConnectedDevices() override
QDeviceDiscoveryUDev(QDeviceTypes types, struct udev *udev, QObject *parent=nullptr)
void deviceDetected(const QString &deviceNode)
void deviceRemoved(const QString &deviceNode)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Combined button and popup list for selecting options.
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLsizei GLenum GLenum * types
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent