From a94d3a92922970752526e0fa8fb0944b5025422d Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Thu, 21 Apr 2022 07:50:54 +0300 Subject: [PATCH] kpowercontrol: update batteries actions on hot-plug events Signed-off-by: Ivailo Monev --- kpowercontrol/kpowercontrol.cpp | 54 ++++++++++++++++++++++++++++----- kpowercontrol/kpowercontrol.h | 3 ++ 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/kpowercontrol/kpowercontrol.cpp b/kpowercontrol/kpowercontrol.cpp index 5139b458..24838f62 100644 --- a/kpowercontrol/kpowercontrol.cpp +++ b/kpowercontrol/kpowercontrol.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -136,9 +137,17 @@ KPowerControl::KPowerControl(QObject* parent) } } setBattery(batteryudi); - - m_menu->addSeparator(); } + m_menu->addSeparator(); + + connect( + Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(QString)), + this, SLOT(slotDeviceAdded(QString)) + ); + connect( + Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(QString)), + this, SLOT(slotDeviceRemoved(QString)) + ); m_helpmenu = new KHelpMenu(associatedWidget(), KGlobal::mainComponent().aboutData()); m_menu->addMenu(m_helpmenu->menu()); @@ -191,8 +200,13 @@ void KPowerControl::setBattery(const QString &solidudi) Solid::Device soliddevice(solidudi); const Solid::Battery* solidbattery = soliddevice.as(); - if (!solidbattery) { - kWarning() << "Null battery device pointer"; + if (!soliddevice.isValid() || !solidbattery) { + setIconByName("preferences-system-power-management"); + setStatus(KStatusNotifierItem::Passive); + setToolTip(KIcon("preferences-system-power-management"), QString(), QString()); + if (!solidbattery) { + kWarning() << "Null battery device pointer"; + } return; } @@ -221,7 +235,7 @@ bool KPowerControl::isSelectedBattery(const QString &solidudi) const const QString qactionobjectname = qaction->objectName(); if (qactionobjectname.startsWith(QLatin1String("battery_"))) { const QString qactiondata = qaction->data().toString(); - if (qactiondata == solidudi) { + if (qactiondata == solidudi && qaction->isChecked()) { return true; } } @@ -231,7 +245,7 @@ bool KPowerControl::isSelectedBattery(const QString &solidudi) const void KPowerControl::slotChargeStateChanged(const int newstate, const QString &solidudi) { - qDebug() << Q_FUNC_INFO << newstate << solidudi << isSelectedBattery(solidudi); + // qDebug() << Q_FUNC_INFO << newstate << solidudi << isSelectedBattery(solidudi); if (isSelectedBattery(solidudi)) { setBattery(solidudi); } @@ -239,7 +253,7 @@ void KPowerControl::slotChargeStateChanged(const int newstate, const QString &so void KPowerControl::slotPowerSupplyStateChanged(const bool newstate, const QString &solidudi) { - qDebug() << Q_FUNC_INFO << newstate << solidudi << isSelectedBattery(solidudi); + // qDebug() << Q_FUNC_INFO << newstate << solidudi << isSelectedBattery(solidudi); if (isSelectedBattery(solidudi)) { setBattery(solidudi); } @@ -262,4 +276,28 @@ void KPowerControl::slotPlugStateChanged(const bool newstate, const QString &sol } } } -} \ No newline at end of file +} + +void KPowerControl::slotDeviceAdded(const QString &solidudi) +{ + // qDebug() << Q_FUNC_INFO << solidudi; + Solid::Device soliddevice(solidudi); + if (soliddevice.is()) { + slotPlugStateChanged(true, solidudi); + } +} + +void KPowerControl::slotDeviceRemoved(const QString &solidudi) +{ + // qDebug() << Q_FUNC_INFO << solidudi; + foreach (QAction* qaction, actionCollection()->actions()) { + const QString qactionobjectname = qaction->objectName(); + if (qactionobjectname.startsWith(QLatin1String("battery_"))) { + const QString qactiondata = qaction->data().toString(); + if (qactiondata == solidudi) { + slotPlugStateChanged(false, solidudi); + break; + } + } + } +} diff --git a/kpowercontrol/kpowercontrol.h b/kpowercontrol/kpowercontrol.h index aa8e23eb..f4530e46 100644 --- a/kpowercontrol/kpowercontrol.h +++ b/kpowercontrol/kpowercontrol.h @@ -40,6 +40,9 @@ private Q_SLOTS: void slotPowerSupplyStateChanged(const bool newstate, const QString &solidudi); void slotPlugStateChanged(const bool newstate, const QString &solidudi); + void slotDeviceAdded(const QString &solidudi); + void slotDeviceRemoved(const QString &solidudi); + private: void setBattery(const QString &solidudi); bool isSelectedBattery(const QString &solidudi) const;