on 15/03/2012 09:31 Andriy Gapon said the following: > I'd rather fix the Device Notifier behavior.
The following patch seems to work. The idea is to correctly go from a filesystem Solid device to its StorageDrive device ancestor while ignoring intermediate volume/partition devices. A direct parent of a filesystem device could be a partition which does not support StorageDrive interface and thus nothing intelligent could be deduced about its hot plug properties. --- plasma/generic/applets/devicenotifier/devicenotifier.cpp.orig 2012-03-15 10:19:48.791075156 +0200 +++ plasma/generic/applets/devicenotifier/devicenotifier.cpp 2012-03-15 11:14:46.896071677 +0200 @@ -241,6 +241,20 @@ QGraphicsWidget *DeviceNotifier::graphic return m_dialog->dialog(); } +namespace { + Solid::StorageDrive * getStorageDriveParent(const Solid::Device &device) + { + Solid::Device parentDevice = device; + + while ((parentDevice = parentDevice.parent()).isValid()) { + if (parentDevice.is<Solid::StorageDrive>()) { + return parentDevice.as<Solid::StorageDrive>(); + } + } + return NULL; + } +} + void DeviceNotifier::fillPreviousDevices() { m_fillingPreviousDevices = true; @@ -249,8 +263,7 @@ void DeviceNotifier::fillPreviousDevices foreach (const Solid::Device &device, list) { // We manually add non-removable devices that are a priori ignored // discard swap and partition tables - Solid::Device parentDevice = device.parent(); - Solid::StorageDrive *drive = parentDevice.as<Solid::StorageDrive>(); + Solid::StorageDrive *drive = getStorageDriveParent(device); const Solid::StorageVolume *volume = device.as<Solid::StorageVolume>(); if (drive && (!drive->isHotpluggable() && !drive->isRemovable()) && (volume->usage() == Solid::StorageVolume::FileSystem)) { @@ -364,15 +377,12 @@ void DeviceNotifier::deviceAdded(const S { const QString udi = device.udi(); if (m_showDevices == NonRemovableOnly) { - Solid::Device parentDevice = device.parent(); - Solid::StorageDrive *drive = parentDevice.as<Solid::StorageDrive>(); + Solid::StorageDrive *drive = getStorageDriveParent(device); if (drive && (drive->isHotpluggable() || drive->isRemovable())) { return; } } else if (m_showDevices == RemovableOnly) { - Solid::Device device = Solid::Device(udi); - Solid::Device parentDevice = device.parent(); - Solid::StorageDrive *drive = parentDevice.as<Solid::StorageDrive>(); + Solid::StorageDrive *drive = getStorageDriveParent(device); if (drive && (!drive->isHotpluggable() && !drive->isRemovable())) { return; } -- Andriy Gapon _______________________________________________ kde-freebsd mailing list kde-freebsd@kde.org https://mail.kde.org/mailman/listinfo/kde-freebsd See also http://freebsd.kde.org/ for latest information