diff --git a/solid-device-automounter/kcm/CMakeLists.txt b/solid-device-automounter/kcm/CMakeLists.txt --- a/solid-device-automounter/kcm/CMakeLists.txt +++ b/solid-device-automounter/kcm/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(kcm_device_automounter ${kcm_device_automounter_SRCS} ${device_automounter_lib_SRCS}) target_link_libraries(kcm_device_automounter + Qt5::DBus KF5::CoreAddons KF5::KCMUtils KF5::ConfigWidgets diff --git a/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp b/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp --- a/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp +++ b/solid-device-automounter/kcm/DeviceAutomounterKCM.cpp @@ -20,6 +20,8 @@ #include "DeviceAutomounterKCM.h" +#include +#include #include #include #include @@ -129,7 +131,8 @@ { saveLayout(); - AutomounterSettings::setAutomountEnabled(automountEnabled->isChecked()); + const bool enabled = automountEnabled->isChecked(); + AutomounterSettings::setAutomountEnabled(enabled); AutomounterSettings::setAutomountUnknownDevices(automountUnknownDevices->isChecked()); AutomounterSettings::setAutomountOnLogin(automountOnLogin->isChecked()); AutomounterSettings::setAutomountOnPlugin(automountOnPlugin->isChecked()); @@ -166,6 +169,23 @@ } AutomounterSettings::self()->save(); + + // Now tell kded to automatically load the module if loaded + QDBusConnection dbus = QDBusConnection::sessionBus(); + QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kded5"), + QStringLiteral("/kded"), + QStringLiteral("org.kde.kded5"), + QStringLiteral("setModuleAutoloading")); + msg.setArguments({QVariant(QStringLiteral("device_automounter")), QVariant(enabled)}); + dbus.call(msg, QDBus::NoBlock); + + // Load or unload right away + msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kded5"), + QStringLiteral("/kded"), + QStringLiteral("org.kde.kded5"), + enabled ? QStringLiteral("loadModule") : QStringLiteral("unloadModule")); + msg.setArguments({QVariant(QStringLiteral("device_automounter"))}); + dbus.call(msg, QDBus::NoBlock); } void DeviceAutomounterKCM::saveLayout() diff --git a/solid-device-automounter/kded/CMakeLists.txt b/solid-device-automounter/kded/CMakeLists.txt --- a/solid-device-automounter/kded/CMakeLists.txt +++ b/solid-device-automounter/kded/CMakeLists.txt @@ -5,6 +5,6 @@ add_library(kded_device_automounter MODULE ${device_automounter_lib_SRCS} ${kded_device_automounter_SRCS}) set_target_properties(kded_device_automounter PROPERTIES OUTPUT_NAME device_automounter) kcoreaddons_desktop_to_json(kded_device_automounter device_automounter.desktop) -target_link_libraries(kded_device_automounter KF5::CoreAddons KF5::Service KF5::ConfigCore KF5::ConfigGui KF5::DBusAddons KF5::Solid) +target_link_libraries(kded_device_automounter Qt5::DBus KF5::CoreAddons KF5::Service KF5::ConfigCore KF5::ConfigGui KF5::DBusAddons KF5::Solid) install(TARGETS kded_device_automounter DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf5/kded) diff --git a/solid-device-automounter/kded/DeviceAutomounter.cpp b/solid-device-automounter/kded/DeviceAutomounter.cpp --- a/solid-device-automounter/kded/DeviceAutomounter.cpp +++ b/solid-device-automounter/kded/DeviceAutomounter.cpp @@ -26,6 +26,9 @@ #include #include +#include +#include + #include K_PLUGIN_FACTORY_WITH_JSON(DeviceAutomounterFactory, @@ -45,6 +48,26 @@ void DeviceAutomounter::init() { + if (!AutomounterSettings::automountEnabled()) { + // Automounting is disabled, no point in hanging around. + QDBusConnection dbus = QDBusConnection::sessionBus(); + QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kded5"), + QStringLiteral("/kded"), + QStringLiteral("org.kde.kded5"), + QStringLiteral("setModuleAutoloading")); + msg.setArguments({QVariant(QStringLiteral("device_automounter")), QVariant(false)}); + dbus.call(msg, QDBus::NoBlock); + + // Unload right away + msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kded5"), + QStringLiteral("/kded"), + QStringLiteral("org.kde.kded5"), + QStringLiteral("unloadModule")); + msg.setArguments({QVariant(QStringLiteral("device_automounter"))}); + dbus.call(msg, QDBus::NoBlock); + return; + } + connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, this, &DeviceAutomounter::deviceAdded); QList volumes = Solid::Device::listFromType(Solid::DeviceInterface::StorageVolume); foreach(Solid::Device volume, volumes) { diff --git a/solid-device-automounter/kded/device_automounter.desktop b/solid-device-automounter/kded/device_automounter.desktop --- a/solid-device-automounter/kded/device_automounter.desktop +++ b/solid-device-automounter/kded/device_automounter.desktop @@ -1,6 +1,8 @@ [Desktop Entry] Type=Service X-KDE-ServiceTypes=KDEDModule +# Needs to stay this way for compatibility +# It will disable autoload on initialization when automounting is disabled X-KDE-Kded-autoload=true X-KDE-Kded-load-on-demand=false X-KDE-Kded-phase=1