diff --git a/dataengines/devicenotifications/CMakeLists.txt b/dataengines/devicenotifications/CMakeLists.txt --- a/dataengines/devicenotifications/CMakeLists.txt +++ b/dataengines/devicenotifications/CMakeLists.txt @@ -13,6 +13,7 @@ KF5::Solid KF5::I18n KF5::ProcessCore + Qt5::Concurrent ) # todo: add kworkspace once ported kcoreaddons_desktop_to_json(plasma_engine_devicenotifications plasma-dataengine-devicenotifications.desktop) diff --git a/dataengines/devicenotifications/ksolidnotify.cpp b/dataengines/devicenotifications/ksolidnotify.cpp --- a/dataengines/devicenotifications/ksolidnotify.cpp +++ b/dataengines/devicenotifications/ksolidnotify.cpp @@ -37,23 +37,39 @@ #include #include +#include +#include KSolidNotify::KSolidNotify(QObject *parent): QObject(parent) { - Solid::Predicate p(Solid::DeviceInterface::StorageAccess); - p |= Solid::Predicate(Solid::DeviceInterface::OpticalDrive); - p |= Solid::Predicate(Solid::DeviceInterface::PortableMediaPlayer); - const QList &devices = Solid::Device::listFromQuery(p); - for (const Solid::Device &dev : devices) { - m_devices.insert(dev.udi(), dev); - connectSignals(&m_devices[dev.udi()]); - } + QFutureWatcher>* watcher = new QFutureWatcher>(this); + connect(watcher, &QFutureWatcher>::finished, this, [this, watcher] { + const QVector devices = watcher->future(); + for (const QString & udi: devices) { + auto it = m_devices.insert(udi, Solid::Device(udi)); + connectSignals(&*it); + } - connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, - this, &KSolidNotify::onDeviceAdded); - connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, - this, &KSolidNotify::onDeviceRemoved); + connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, + this, &KSolidNotify::onDeviceAdded); + connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, + this, &KSolidNotify::onDeviceRemoved); + watcher->deleteLater(); + }); + watcher->setFuture(QtConcurrent::run([] { + Solid::Predicate p(Solid::DeviceInterface::StorageAccess); + p |= Solid::Predicate(Solid::DeviceInterface::OpticalDrive); + p |= Solid::Predicate(Solid::DeviceInterface::PortableMediaPlayer); + const auto devices = Solid::Device::listFromQuery(p); + + QVector ret; + ret.reserve(devices.size()); + for (const Solid::Device &dev : devices) { + ret << dev.udi(); + } + return ret; + })); } void KSolidNotify::onDeviceAdded(const QString &udi) diff --git a/dataengines/hotplug/hotplugengine.h b/dataengines/hotplug/hotplugengine.h --- a/dataengines/hotplug/hotplugengine.h +++ b/dataengines/hotplug/hotplugengine.h @@ -59,8 +59,8 @@ private: QHash m_predicates; - QHash m_startList; QHash m_devices; + QVector m_startList; Solid::Predicate m_encryptedPredicate; KDirWatch *m_dirWatch; }; diff --git a/dataengines/hotplug/hotplugengine.cpp b/dataengines/hotplug/hotplugengine.cpp --- a/dataengines/hotplug/hotplugengine.cpp +++ b/dataengines/hotplug/hotplugengine.cpp @@ -27,6 +27,9 @@ #include #include +#include +#include +#include #include #include #include @@ -66,26 +69,35 @@ { findPredicates(); - Solid::Predicate p(Solid::DeviceInterface::StorageAccess); - p |= Solid::Predicate(Solid::DeviceInterface::StorageDrive); - p |= Solid::Predicate(Solid::DeviceInterface::StorageVolume); - p |= Solid::Predicate(Solid::DeviceInterface::OpticalDrive); - p |= Solid::Predicate(Solid::DeviceInterface::OpticalDisc); - p |= Solid::Predicate(Solid::DeviceInterface::PortableMediaPlayer); - p |= Solid::Predicate(Solid::DeviceInterface::Camera); - QList devices = Solid::Device::listFromQuery(p); - foreach (const Solid::Device &dev, devices) { - m_startList.insert(dev.udi(), dev); - } - - connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(QString)), - this, SLOT(onDeviceAdded(QString))); - connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, - this, &HotplugEngine::onDeviceRemoved); - - m_encryptedPredicate = Solid::Predicate(QStringLiteral("StorageVolume"), QStringLiteral("usage"), "Encrypted"); - - processNextStartupDevice(); + QFutureWatcher>* watcher = new QFutureWatcher>(this); + connect(watcher, &QFutureWatcher>::finished, this, [this, watcher] { + m_startList = watcher->future(); + + connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(QString)), + this, SLOT(onDeviceAdded(QString))); + connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, + this, &HotplugEngine::onDeviceRemoved); + + m_encryptedPredicate = Solid::Predicate(QStringLiteral("StorageVolume"), QStringLiteral("usage"), "Encrypted"); + watcher->deleteLater(); + }); + watcher->setFuture(QtConcurrent::run([] { + Solid::Predicate p(Solid::DeviceInterface::StorageAccess); + p |= Solid::Predicate(Solid::DeviceInterface::StorageDrive); + p |= Solid::Predicate(Solid::DeviceInterface::StorageVolume); + p |= Solid::Predicate(Solid::DeviceInterface::OpticalDrive); + p |= Solid::Predicate(Solid::DeviceInterface::OpticalDisc); + p |= Solid::Predicate(Solid::DeviceInterface::PortableMediaPlayer); + p |= Solid::Predicate(Solid::DeviceInterface::Camera); + + const auto devices = Solid::Device::listFromQuery(p); + QVector ret; + ret.reserve(devices.count()); + for (const Solid::Device &dev : devices) { + ret << dev.udi(); + } + return ret; + })); } Plasma::Service* HotplugEngine::serviceForSource(const QString& source) @@ -96,9 +108,9 @@ void HotplugEngine::processNextStartupDevice() { if (!m_startList.isEmpty()) { - QHash::iterator it = m_startList.begin(); + auto it = m_startList.begin(); //Solid::Device dev = const_cast(m_startList.takeFirst()); - onDeviceAdded(it.value(), false); + onDeviceAdded(*it); m_startList.erase(it); } @@ -274,8 +286,9 @@ { //qDebug() << "remove hardware:" << udi; - if (m_startList.contains(udi)) { - m_startList.remove(udi); + auto idx = m_startList.indexOf(udi); + if (idx >= 0) { + m_startList.removeAt(idx); return; }