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,32 @@ #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 QList devices = watcher->future(); + for (const Solid::Device &dev : devices) { + m_devices.insert(dev.udi(), dev); + connectSignals(&m_devices[dev.udi()]); + } - 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); + return Solid::Device::listFromQuery(p); + })); } void KSolidNotify::onDeviceAdded(const QString &udi) 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,32 @@ { 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"); + QFutureWatcher>* watcher = new QFutureWatcher>(this); + connect(watcher, &QFutureWatcher>::finished, this, [this, watcher] { + const QList devices = watcher->future(); + foreach (const Solid::Device &dev, devices) { + m_startList.insert(dev.udi(), dev); + } - processNextStartupDevice(); + 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); + + return Solid::Device::listFromQuery(p); + })); } Plasma::Service* HotplugEngine::serviceForSource(const QString& source)