diff --git a/src/solid/devices/backends/udev/udevdevice.cpp b/src/solid/devices/backends/udev/udevdevice.cpp --- a/src/solid/devices/backends/udev/udevdevice.cpp +++ b/src/solid/devices/backends/udev/udevdevice.cpp @@ -150,7 +150,7 @@ return property("ID_GPHOTO2").toInt() == 1; case Solid::DeviceInterface::PortableMediaPlayer: - return !property("ID_MEDIA_PLAYER").toString().isEmpty(); + return m_device.subsystem() == QLatin1String("usb") && !property("ID_MEDIA_PLAYER").toString().isEmpty(); case Solid::DeviceInterface::Block: return !property("MAJOR").toString().isEmpty(); 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 @@ -179,25 +179,39 @@ if (!parentUdi.isEmpty()) { const UdevQt::DeviceList deviceList = d->m_client->allDevices(); - Q_FOREACH (const UdevQt::Device &dev, deviceList) { + for (const UdevQt::Device &dev : deviceList) { UDevDevice device(dev); if (device.queryDeviceInterface(type) && d->isOfInterest(udiPrefix() + dev.sysfsPath(), dev) && device.parentUdi() == parentUdi) { result << udiPrefix() + dev.sysfsPath(); } } return result; + } + + if (type == DeviceInterface::Unknown) { + return allDevices(); + } + + UdevQt::DeviceList deviceList; + + // Already limit the number of devices we query and have to create wrapper items for here + if (type == Solid::DeviceInterface::Processor) { + deviceList = d->m_client->devicesBySubsystem(QStringLiteral("processor")) + + d->m_client->devicesBySubsystem(QStringLiteral("cpu")); + } else if (type == Solid::DeviceInterface::PortableMediaPlayer) { + deviceList = d->m_client->devicesBySubsystem(QStringLiteral("usb")); } else if (type != Solid::DeviceInterface::Unknown) { - const UdevQt::DeviceList deviceList = d->m_client->allDevices(); - Q_FOREACH (const UdevQt::Device &dev, deviceList) { - UDevDevice device(dev); - if (device.queryDeviceInterface(type) && d->isOfInterest(udiPrefix() + dev.sysfsPath(), dev)) { - result << udiPrefix() + dev.sysfsPath(); - } + deviceList = d->m_client->allDevices(); + } + + for (const UdevQt::Device &dev : deviceList) { + UDevDevice device(dev); + if (device.queryDeviceInterface(type) && d->isOfInterest(udiPrefix() + dev.sysfsPath(), dev)) { + result << udiPrefix() + dev.sysfsPath(); } - return result; - } else { - return allDevices(); } + + return result; } QObject *UDevManager::createDevice(const QString &udi_)