diff --git a/src/solid/devices/backends/udev/udevmanager.cpp b/src/solid/devices/backends/udev/udevmanager.cpp --- a/src/solid/devices/backends/udev/udevmanager.cpp +++ b/src/solid/devices/backends/udev/udevmanager.cpp @@ -175,30 +175,41 @@ QStringList UDevManager::devicesFromQuery(const QString &parentUdi, Solid::DeviceInterface::Type type) { - QStringList allDev = allDevices(); QStringList result; + UdevQt::DeviceList deviceList; + + //keep in Sync with UdevDevice::queryDeviceInterface + switch (type) { + case Solid::DeviceInterface::Processor: + deviceList = d->m_client->devicesBySubsystem("cpu"); + break; + case Solid::DeviceInterface::Camera: + deviceList = d->m_client->devicesByProperty("ID_GPHOTO2", 1); + break; + case Solid::DeviceInterface::PortableMediaPlayer: + deviceList = d->m_client->devicesByProperty("ID_MEDIA_PLAYER", QVariant()); + break; + case Solid::DeviceInterface::Block: + deviceList = d->m_client->devicesByProperty("MAJOR", QVariant()); + break; + case Solid::DeviceInterface::Unknown: + /*Fallthrough*/ + default: + deviceList = d->m_client->allDevices(); + break; + } - if (!parentUdi.isEmpty()) { - Q_FOREACH (const QString &udi, allDev) { - UDevDevice device(d->m_client->deviceBySysfsPath(udi.right(udi.size() - udiPrefix().size()))); - if (device.queryDeviceInterface(type) && device.parentUdi() == parentUdi) { - result << udi; - } + for (const UdevQt::Device &device: deviceList) { + const QString udi = udiPrefix() + device.sysfsPath(); + if (!d->isOfInterest(udi, device)) { + continue; } - - return result; - } else if (type != Solid::DeviceInterface::Unknown) { - Q_FOREACH (const QString &udi, allDev) { - UDevDevice device(d->m_client->deviceBySysfsPath(udi.right(udi.size() - udiPrefix().size()))); - if (device.queryDeviceInterface(type)) { - result << udi; - } + if (!parentUdi.isEmpty() && parentUdi != UDEV_UDI_PREFIX) { + continue; } - - return result; - } else { - return allDev; + result << udi; } + return result; } QObject *UDevManager::createDevice(const QString &udi_)