46 std::vector<std::unique_ptr<UdevDevice>>
find();
51 struct EnumerateDeleter
53 void operator()(udev_enumerate *e)
55 udev_enumerate_unref(e);
58 std::unique_ptr<udev_enumerate, EnumerateDeleter> m_enumerate;
63 , m_enumerate(udev_enumerate_new(*m_udev))
76 udev_enumerate_add_match_subsystem(m_enumerate.get(), name);
79 udev_enumerate_add_match_sysname(m_enumerate.get(), name);
92 udev_enumerate_scan_devices(m_enumerate.get());
100 std::vector<std::unique_ptr<UdevDevice>> vect;
101 udev_list_entry *it = udev_enumerate_get_list_entry(m_enumerate.get());
104 it = udev_list_entry_get_next(it);
107 vect.push_back(std::move(device));
118#if defined(Q_OS_FREEBSD)
119 std::vector<std::unique_ptr<UdevDevice>> r;
127 auto vect = enumerate.
find();
128 std::sort(vect.begin(), vect.end(), [](
const auto &device1,
const auto &device2) {
130 if (device1->isHotpluggable()) {
134 if (device2->isHotpluggable()) {
139 if (device1->isBootVga()) {
143 if (device2->isBootVga()) {
152std::unique_ptr<UdevDevice> Udev::deviceFromSyspath(
const char *syspath)
154 auto dev = udev_device_new_from_syspath(m_udev, syspath);
156 qCWarning(KWIN_CORE) <<
"failed to retrieve device for" << syspath << strerror(errno);
159 return std::make_unique<UdevDevice>(dev);
162std::unique_ptr<UdevMonitor> Udev::monitor()
164 auto m = std::make_unique<UdevMonitor>(
this);
172UdevDevice::UdevDevice(udev_device *device)
180 udev_device_unref(m_device);
185 return QString::fromUtf8(udev_device_get_devnode(m_device));
190 return udev_device_get_devnum(m_device);
195 return udev_device_get_property_value(m_device, key);
200 QMap<QByteArray, QByteArray> r;
201 auto it = udev_device_get_properties_list_entry(m_device);
203 udev_list_entry_foreach(current, it)
205 r.insert(udev_list_entry_get_name(current), udev_list_entry_get_value(current));
216 return qstrcmp(p, value) == 0;
221 auto pci = udev_device_get_parent_with_subsystem_devtype(m_device,
"pci",
nullptr);
225 const char *systAttrValue = udev_device_get_sysattr_value(pci,
"boot_vga");
226 return systAttrValue && qstrcmp(systAttrValue,
"1") == 0;
231 QString deviceSeat = udev_device_get_property_value(m_device,
"ID_SEAT");
232 if (deviceSeat.isEmpty()) {
233 deviceSeat = QStringLiteral(
"seat0");
240 return QString::fromLocal8Bit(udev_device_get_action(m_device));
245 QString devPath = QString::fromUtf8(udev_device_get_devpath(m_device));
246 return devPath.toLower().contains(
"usb");
250 : m_monitor(udev_monitor_new_from_netlink(*udev,
"udev"))
257 udev_monitor_unref(m_monitor);
264 return udev_monitor_get_fd(m_monitor);
274 udev_monitor_filter_add_match_subsystem_devtype(m_monitor, subSystem, devType);
282 udev_monitor_enable_receiving(m_monitor);
290 auto dev = udev_monitor_receive_device(m_monitor);
291 return dev ? std::make_unique<UdevDevice>(dev) :
nullptr;
bool hasProperty(const char *key, const char *value)
QMap< QByteArray, QByteArray > properties() const
const char * property(const char *key)
bool isHotpluggable() const
UdevEnumerate(Udev *udev)
void addMatch(Match match, const char *name)
std::vector< std::unique_ptr< UdevDevice > > find()
std::vector< std::unique_ptr< UdevDevice > > listGPUs()
std::unique_ptr< UdevDevice > deviceFromSyspath(const char *syspath)
std::unique_ptr< UdevDevice > getDevice()
void filterSubsystemDevType(const char *subSystem, const char *devType=nullptr)
bool match(QList< GlobalShortcut > &shortcuts, Args... args)