diff --git a/packages/PKGBUILD b/packages/PKGBUILD index 1dfe05c..0ed64fe 100644 --- a/packages/PKGBUILD +++ b/packages/PKGBUILD @@ -9,10 +9,7 @@ arch=('x86_64') url="https://arcanis.me/projects/awesome-widgets" license=('GPL3') depends=('plasma-workspace') -optdepends=("hddtemp: for HDD temperature monitor" - "smartmontools: for HDD temperature monitor" - "mpd: for music player monitor" - "nvidia-utils: for GPU monitor") +optdepends=("mpd: for music player monitor") makedepends=('cmake' 'extra-cmake-modules' 'python') source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz) install="$pkgname.install" diff --git a/sources/awesome-widget/package/contents/ui/dataengine.qml b/sources/awesome-widget/package/contents/ui/dataengine.qml index 7af7fbf..9b2ff95 100644 --- a/sources/awesome-widget/package/contents/ui/dataengine.qml +++ b/sources/awesome-widget/package/contents/ui/dataengine.qml @@ -58,57 +58,6 @@ Item { } } - GroupBox { - height: implicitHeight - width: parent.width - title: i18n("GPU") - ComboBoxSelector { - model: [ - { - 'label': "auto", - 'name': "auto" - }, - { - 'label': "disable", - 'name': "disable" - }, - { - 'label': "ati", - 'name': "ati" - }, - { - 'label': "nvidia", - 'name': "nvidia" - } - ] - text: i18n("GPU device") - value: cfg_dataengine["GPUDEV"] - onValueEdited: newValue => cfg_dataengine["GPUDEV"] = newValue - } - } - - GroupBox { - height: implicitHeight - width: parent.width - title: i18n("HDD temperature") - Column { - height: implicitHeight - width: parent.width - ComboBoxSelector { - id: hdd - text: i18n("HDD") - value: cfg_dataengine["HDDDEV"] - onValueEdited: newValue => cfg_dataengine["HDDDEV"] = newValue - } - - LineSelector { - text: i18n("hddtemp cmd") - value: cfg_dataengine["HDDTEMPCMD"] - onValueEdited: newValue => cfg_dataengine["HDDTEMPCMD"] = newValue - } - } - } - GroupBox { height: implicitHeight width: parent.width diff --git a/sources/awesome-widget/package/metadata.json b/sources/awesome-widget/package/metadata.json index 83ea5d6..d287ef0 100644 --- a/sources/awesome-widget/package/metadata.json +++ b/sources/awesome-widget/package/metadata.json @@ -19,7 +19,7 @@ "Id": "org.kde.plasma.awesomewidget", "License": "GPLv3", "Name": "Awesome Widget", - "Version": "3.5.1", + "Version": "4.0.0", "Website": "https://arcanis.me/projects/awesome-widgets/" }, "X-Plasma-API-Minimum-Version": "6.0" diff --git a/sources/awesome-widget/plugin/awconfighelper.cpp b/sources/awesome-widget/plugin/awconfighelper.cpp index cdfedc0..baa369d 100644 --- a/sources/awesome-widget/plugin/awconfighelper.cpp +++ b/sources/awesome-widget/plugin/awconfighelper.cpp @@ -170,9 +170,6 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration() settings.beginGroup("Configuration"); configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/"); - configuration["GPUDEV"] = settings.value("GPUDEV", "auto"); - configuration["HDDDEV"] = settings.value("HDDDEV", "all"); - configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a"); configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost"); configuration["MPDPORT"] = settings.value("MPDPORT", "6600"); configuration["MPRIS"] = settings.value("MPRIS", "auto"); @@ -197,9 +194,6 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat settings.beginGroup("Configuration"); settings.setValue("ACPIPATH", _configuration["ACPIPATH"]); - settings.setValue("GPUDEV", _configuration["GPUDEV"]); - settings.setValue("HDDDEV", _configuration["HDDDEV"]); - settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]); settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]); settings.setValue("MPDPORT", _configuration["MPDPORT"]); settings.setValue("MPRIS", _configuration["MPRIS"]); diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.cpp b/sources/awesome-widget/plugin/awdataengineaggregator.cpp index 4e86701..36be7bd 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataengineaggregator.cpp @@ -89,6 +89,9 @@ void AWDataEngineAggregator::loadSources() auto sensors = response.value(); updateSensors(sensors); connectSources(); + + for (auto &sensor : m_sensors.keys()) + emit(deviceAdded(sensor)); } @@ -121,6 +124,9 @@ void AWDataEngineAggregator::sensorAdded(const QString &_sensor) m_interface->subscribe({_sensor}).waitForFinished(); m_subscribed.insert(_sensor); } + + // notify about new device + emit(deviceAdded(_sensor)); } diff --git a/sources/awesome-widget/plugin/awdataenginemapper.cpp b/sources/awesome-widget/plugin/awdataenginemapper.cpp index 09f4fab..0bade0e 100644 --- a/sources/awesome-widget/plugin/awdataenginemapper.cpp +++ b/sources/awesome-widget/plugin/awdataenginemapper.cpp @@ -85,6 +85,8 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$"); auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$"); auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); + auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$"); + auto gpuTempRegExp = QRegularExpression("^gpu/gpu.*/temperature$"); auto hddrRegExp = QRegularExpression("^disk/.*/read$"); auto hddwRegExp = QRegularExpression("^disk/.*/write$"); auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$"); @@ -99,7 +101,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat; } else if (_source.startsWith("extsysmon/battery/")) { // battery stats - QString key = _source; + auto key = _source; key.remove("extsysmon/battery/"); m_map.insert(_source, key); m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float @@ -110,7 +112,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float; } else if (_source.contains(cpuRegExp)) { // cpus - QString key = _source; + auto key = _source; key.remove("cpu/").remove("/usage"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Float; @@ -120,14 +122,14 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer; } else if (_source.contains(cpuclRegExp)) { // cpucls - QString key = _source; + auto key = _source; key.remove("cpu/cpu").remove("/frequency"); key = QString("cpucl%1").arg(key); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Integer; } else if (_source.startsWith("extsysmon/custom")) { // custom - QString key = _source; + auto key = _source; key.remove("extsysmon/custom/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; @@ -145,9 +147,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat; } else if (_source.contains(hddrRegExp)) { // read speed - QString device = _source; + auto device = _source; device.remove("disk/").remove("/read"); - int index = m_devices["disk"].indexOf(device); + auto index = m_devices["disk"].indexOf(device); if (index > -1) { QString key = QString("hddr%1").arg(index); m_map.insert(_source, key); @@ -155,29 +157,45 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy } } else if (_source.contains(hddwRegExp)) { // write speed - QString device = _source; + auto device = _source; device.remove("disk/").remove("/write"); - int index = m_devices["disk"].indexOf(device); + auto index = m_devices["disk"].indexOf(device); if (index > -1) { QString key = QString("hddw%1").arg(index); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Integer; } - } else if (_source == "extsysmon/gpuload/load") { + } else if (_source == "gpu/all/usage") { // gpu load m_map.insert(_source, "gpu"); m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float; - } else if (_source == "extsysmon/gputemp/temperature") { - // gpu temperature - m_map.insert(_source, "gputemp"); - m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature; + } else if (_source.contains(gpuRegExp)) { + // gpus + auto device = _source; + device.remove("gpu/").remove("/usage"); + auto index = m_devices["gpu"].indexOf(device); + if (index > -1) { + auto key = QString("gpu%1").arg(index); + m_map.insert(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::Float; + } + } else if (_source.contains(gpuTempRegExp)) { + // gpus temps + auto device = _source; + device.remove("gpu/").remove("/temperature"); + auto index = m_devices["gpu"].indexOf(device); + if (index > -1) { + auto key = QString("gputemp%1").arg(index); + m_map.insert(_source, key); + m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; + } } else if (_source.contains(mountFillRegExp)) { // fill level - QString device = _source; + auto device = _source; device.remove("disk/").remove("/usedPercent"); - int index = m_devices["mount"].indexOf(device); + auto index = m_devices["mount"].indexOf(device); if (index > -1) { - QString key = QString("hdd%1").arg(index); + auto key = QString("hdd%1").arg(index); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Float; // additional keys @@ -186,9 +204,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy } } else if (_source.contains(mountFreeRegExp)) { // free space - QString device = _source; + auto device = _source; device.remove("disk/").remove("/free"); - int index = m_devices["mount"].indexOf(device); + auto index = m_devices["mount"].indexOf(device); if (index > -1) { // mb QString key = QString("hddfreemb%1").arg(index); @@ -201,9 +219,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy } } else if (_source.contains(mountUsedRegExp)) { // used - QString device = _source; + auto device = _source; device.remove("disk/").remove("/used"); - int index = m_devices["mount"].indexOf(device); + auto index = m_devices["mount"].indexOf(device); if (index > -1) { // mb QString key = QString("hddmb%1").arg(index); @@ -214,21 +232,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat; } - } else if (_source.startsWith("extsysmon/hdd/temperature")) { - // hdd temperature - QString device = _source; - device.remove("extsysmon/hdd/temperature"); - int index = m_devices["hdd"].indexOf(device); - if (index > -1) { - QString key = QString("hddtemp%1").arg(index); - m_map.insert(_source, key); - m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; - } } else if (_source.startsWith("cpu/loadaverages/loadaverage")) { // load average - QString time = _source; + auto time = _source; time.remove("cpu/loadaverages/loadaverage"); - QString key = QString("la%1").arg(time); + auto key = QString("la%1").arg(time); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols; } else if (_source == "memory/physical/application") { @@ -265,17 +273,17 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat; } else if (_source.startsWith("extsysmon/requests/response")) { // network response - QString key = _source; + auto key = _source; key.remove("extsysmon/requests/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; } else if (_source.contains(netRegExp)) { // network speed - QString type = _source.contains("download") ? "down" : "up"; - int index = m_devices["net"].indexOf(_source.split('/')[2]); + auto type = _source.endsWith("download") ? "down" : "up"; + auto index = m_devices["net"].indexOf(_source.split('/')[1]); if (index > -1) { // kb - QString key = QString("%1kb%2").arg(type).arg(index); + auto key = QString("%1kb%2").arg(type).arg(index); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Integer; // smart @@ -289,11 +297,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy } } else if (_source.contains(netTotalRegExp)) { // network data total - QString type = _source.contains("download") ? "down" : "up"; - int index = m_devices["net"].indexOf(_source.split('/')[2]); + auto type = _source.endsWith("Download") ? "down" : "up"; + auto index = m_devices["net"].indexOf(_source.split('/')[1]); if (index > -1) { // kb - QString key = QString("%1totkb%2").arg(type).arg(index); + auto key = QString("%1totkb%2").arg(type).arg(index); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Integer; // mb @@ -303,13 +311,13 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy } } else if (_source.startsWith("extsysmon/upgrade")) { // package manager - QString key = _source; + auto key = _source; key.remove("extsysmon/upgrade/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree; } else if (_source.startsWith("extsysmon/player")) { // player - QString key = _source; + auto key = _source; key.remove("extsysmon/player/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; @@ -327,7 +335,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat; } else if (_source.startsWith("extsysmon/quotes")) { // quotes - QString key = _source; + auto key = _source; key.remove("extsysmon/quotes/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Quotes; @@ -355,7 +363,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy if (_units == KSysGuard::UnitInvalid) return QStringList({QString("temp%1").arg(index)}); if (index > -1) { - QString key = QString("temp%1").arg(index); + auto key = QString("temp%1").arg(index); m_map.insert(_source, key); m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature : AWKeysAggregator::FormatterType::Integer; @@ -394,19 +402,19 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom; } else if (_source.startsWith("extsysmon/weather/temperature")) { // temperature - QString key = _source; + auto key = _source; key.remove("extsysmon/weather/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; } else if (_source.startsWith("extsysmon/weather/")) { // other weather - QString key = _source; + auto key = _source; key.remove("extsysmon/weather/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat; } else if (_source.startsWith("extsysmon/load/load")) { // load source - QString key = _source; + auto key = _source; key.remove("extsysmon/load/"); m_map.insert(_source, key); m_formatter[key] = AWKeysAggregator::FormatterType::Temperature; diff --git a/sources/awesome-widget/plugin/awkeycache.cpp b/sources/awesome-widget/plugin/awkeycache.cpp index f0985ca..f22c26f 100644 --- a/sources/awesome-widget/plugin/awkeycache.cpp +++ b/sources/awesome-widget/plugin/awkeycache.cpp @@ -31,7 +31,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key) { qCDebug(LOG_AW) << "Key" << _key << "with type" << _type; - QString fileName + auto fileName = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); qCInfo(LOG_AW) << "Cache file" << fileName; QSettings cache(fileName, QSettings::IniFormat); @@ -41,19 +41,8 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key) for (auto &number : cache.allKeys()) cachedValues.append(cache.value(number).toString()); - if (_type == "hdd") { - QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name); - QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$")); - for (auto &dev : devices) { - QString device = QString("/dev/%1").arg(dev); - if (cachedValues.contains(device)) - continue; - qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type; - cachedValues.append(device); - cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device); - } - } else if (_type == "net") { - QList rawInterfaceList = QNetworkInterface::allInterfaces(); + if (_type == "net") { + auto rawInterfaceList = QNetworkInterface::allInterfaces(); for (auto &interface : rawInterfaceList) { QString device = interface.name(); if (cachedValues.contains(device)) @@ -98,7 +87,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL if (!used.contains(key)) continue; key.remove("hddtotmb"); - int index = key.toInt(); + auto index = key.toInt(); used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index); } // hddtotgb* @@ -106,7 +95,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL if (!used.contains(key)) continue; key.remove("hddtotgb"); - int index = key.toInt(); + auto index = key.toInt(); used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index); } // mem @@ -139,7 +128,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL for (auto &key : netKeys) { if (!used.contains(key)) continue; - QStringList filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key))); + auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key))); for (auto &filtered : filt) used << filtered; } @@ -158,7 +147,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL QHash AWKeyCache::loadKeysFromCache() { - QString fileName + auto fileName = QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation)); qCInfo(LOG_AW) << "Cache file" << fileName; QSettings cache(fileName, QSettings::IniFormat); diff --git a/sources/awesome-widget/plugin/awkeyoperations.cpp b/sources/awesome-widget/plugin/awkeyoperations.cpp index 41456ef..6f8c89e 100644 --- a/sources/awesome-widget/plugin/awkeyoperations.cpp +++ b/sources/awesome-widget/plugin/awkeyoperations.cpp @@ -72,7 +72,6 @@ QHash AWKeyOperations::devices() const void AWKeyOperations::updateCache() { // update network and hdd list - addKeyToCache("hdd"); addKeyToCache("net"); } @@ -90,15 +89,20 @@ QStringList AWKeyOperations::dictKeys() const allKeys.append(item->tag("timestamp")); } // cpuclock & cpu - for (int i = 0; i < QThread::idealThreadCount(); i++) { + for (auto i = 0; i < QThread::idealThreadCount(); i++) { allKeys.append(QString("cpucl%1").arg(i)); allKeys.append(QString("cpu%1").arg(i)); } // temperature - for (int i = 0; i < m_devices["temp"].count(); i++) + for (auto i = 0; i < m_devices["temp"].count(); i++) allKeys.append(QString("temp%1").arg(i)); + // gpu + for (auto i = 0; i < m_devices["gpu"].count(); i++) { + allKeys.append(QString("gpu%1").arg(i)); + allKeys.append(QString("gputemp%1").arg(i)); + } // hdd - for (int i = 0; i < m_devices["mount"].count(); i++) { + for (auto i = 0; i < m_devices["mount"].count(); i++) { allKeys.append(QString("hddmb%1").arg(i)); allKeys.append(QString("hddgb%1").arg(i)); allKeys.append(QString("hddfreemb%1").arg(i)); @@ -108,15 +112,12 @@ QStringList AWKeyOperations::dictKeys() const allKeys.append(QString("hdd%1").arg(i)); } // hdd speed - for (int i = 0; i < m_devices["disk"].count(); i++) { + for (auto i = 0; i < m_devices["disk"].count(); i++) { allKeys.append(QString("hddr%1").arg(i)); allKeys.append(QString("hddw%1").arg(i)); } - // hdd temp - for (int i = 0; i < m_devices["hdd"].count(); i++) - allKeys.append(QString("hddtemp%1").arg(i)); // network - for (int i = 0; i < m_devices["net"].count(); i++) { + for (auto i = 0; i < m_devices["net"].count(); i++) { allKeys.append(QString("downunits%1").arg(i)); allKeys.append(QString("upunits%1").arg(i)); allKeys.append(QString("downtotkb%1").arg(i)); @@ -129,7 +130,7 @@ QStringList AWKeyOperations::dictKeys() const allKeys.append(QString("up%1").arg(i)); } // battery - QStringList allBatteryDevices + auto allBatteryDevices = QDir("/sys/class/power_supply") .entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); for (int i = 0; i < allBatteryDevices.count(); i++) { @@ -205,52 +206,48 @@ QString AWKeyOperations::infoByKey(const QString &_key) const { qCDebug(LOG_AW) << "Requested key" << _key; - QString stripped = _key; + auto stripped = _key; stripped.remove(QRegularExpression("\\d+")); QString output; if (_key.startsWith("bar")) { - AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped); + auto *item = m_graphicalItems->itemByTag(_key, stripped); if (item) output = item->uniq(); } else if (_key.startsWith("custom")) { - AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped); + auto *item = m_extScripts->itemByTag(_key, stripped); if (item) output = item->uniq(); } else if (_key.contains(QRegularExpression("^hdd[rw]"))) { - QString index = _key; + auto index = _key; index.remove(QRegularExpression("hdd[rw]")); output = m_devices["disk"][index.toInt()]; } else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) { - QString index = _key; + auto index = _key; index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)")); output = m_devices["mount"][index.toInt()]; - } else if (_key.startsWith("hddtemp")) { - QString index = _key; - index.remove("hddtemp"); - output = m_devices["hdd"][index.toInt()]; } else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) { - QString index = _key; + auto index = _key; index.remove(QRegularExpression("^(down|up)")); output = m_devices["net"][index.toInt()]; } else if (_key.startsWith("pkgcount")) { - AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped); + auto *item = m_extUpgrade->itemByTag(_key, stripped); if (item) output = item->uniq(); } else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) { - AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped); + auto *item = m_extQuotes->itemByTag(_key, stripped); if (item) output = item->uniq(); } else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) { - AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped); + auto *item = m_extWeather->itemByTag(_key, stripped); if (item) output = item->uniq(); } else if (_key.startsWith("temp")) { - QString index = _key; + auto index = _key; index.remove("temp"); output = m_devices["temp"][index.toInt()]; } else if (_key.startsWith("response")) { - AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped); + auto *item = m_extNetRequest->itemByTag(_key, stripped); if (item) output = item->uniq(); } else { @@ -302,9 +299,10 @@ void AWKeyOperations::addDevice(const QString &_source) { qCDebug(LOG_AW) << "Source" << _source; - auto diskRegexp = QRegularExpression("disk/.*/read"); - auto mountRegexp = QRegularExpression("disk/.*/usedPercent"); + auto diskRegexp = QRegularExpression("^disk/.*/read$"); + auto mountRegexp = QRegularExpression("^disk/.*/usedPercent$"); auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$"); + auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$"); if (_source.contains(diskRegexp)) { auto device = _source; @@ -317,6 +315,10 @@ void AWKeyOperations::addDevice(const QString &_source) } else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp) || _source == "cpu/all/averageTemperature") { addKeyToCache("temp", _source); + } else if (_source.contains(gpuRegExp)) { + auto device = _source; + device.remove("gpu/").remove("/usage"); + addKeyToCache("gpu", device); } } diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 9374dd2..8009849 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -103,7 +103,7 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const m_aggregator->initFormatters(); m_keyOperator->setPattern(_currentPattern); m_keyOperator->updateCache(); - m_dataEngineAggregator->connectSources(); + m_dataEngineAggregator->loadSources(); // timer m_timer->setInterval(_interval); diff --git a/sources/awesomewidgets/extquotes.cpp b/sources/awesomewidgets/extquotes.cpp index 84a8cf6..8023c99 100644 --- a/sources/awesomewidgets/extquotes.cpp +++ b/sources/awesomewidgets/extquotes.cpp @@ -46,9 +46,8 @@ ExtQuotes::ExtQuotes(QObject *_parent, const QString &_filePath) // HACK declare as child of nullptr to avoid crash with plasmawindowed // in the destructor m_manager = new QNetworkAccessManager(nullptr); - connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *))); - - connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); + connect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived); + connect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest); } @@ -56,8 +55,8 @@ ExtQuotes::~ExtQuotes() { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *))); - disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest())); + disconnect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived); + disconnect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest); m_manager->deleteLater(); } diff --git a/sources/awesomewidgets/quotes/aapl.desktop b/sources/awesomewidgets/quotes/aapl.desktop index c2eb130..fbe3889 100644 --- a/sources/awesomewidgets/quotes/aapl.desktop +++ b/sources/awesomewidgets/quotes/aapl.desktop @@ -1,8 +1,8 @@ [Desktop Entry] Encoding=UTF-8 -Name=AAPL.NASDAQ +Name=AAPL Comment=Apple Inc -X-AW-Ticker="AAPL" +X-AW-Ticker="AAPL.US" X-AW-Active=false X-AW-ApiVersion=5 X-AW-Interval=60 diff --git a/sources/awesomewidgets/quotes/goog.desktop b/sources/awesomewidgets/quotes/goog.desktop index 85003b6..c223de4 100644 --- a/sources/awesomewidgets/quotes/goog.desktop +++ b/sources/awesomewidgets/quotes/goog.desktop @@ -1,8 +1,8 @@ [Desktop Entry] Encoding=UTF-8 -Name=GOOG.NASDAQ +Name=GOOG Comment=Google Inc -X-AW-Ticker="GOOG" +X-AW-Ticker="GOOG.US" X-AW-Active=false X-AW-ApiVersion=5 X-AW-Interval=60 diff --git a/sources/awesomewidgets/quotes/msft.desktop b/sources/awesomewidgets/quotes/msft.desktop index 2fdcea3..0049c21 100644 --- a/sources/awesomewidgets/quotes/msft.desktop +++ b/sources/awesomewidgets/quotes/msft.desktop @@ -1,8 +1,8 @@ [Desktop Entry] Encoding=UTF-8 -Name=MSFT.NASDAQ +Name=MSFT Comment=Microsoft Corp -X-AW-Ticker="MSFT" +X-AW-Ticker="MSFT.US" X-AW-Active=false X-AW-ApiVersion=5 X-AW-Interval=60 diff --git a/sources/awesomewidgets/stooqquotesprovider.cpp b/sources/awesomewidgets/stooqquotesprovider.cpp index 036adbf..5067379 100644 --- a/sources/awesomewidgets/stooqquotesprovider.cpp +++ b/sources/awesomewidgets/stooqquotesprovider.cpp @@ -54,7 +54,7 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian QVariantHash values; - QStringList sourceValues = QString::fromUtf8(_source).trimmed().split(','); + auto sourceValues = QString::fromUtf8(_source).trimmed().split(','); if (sourceValues.count() != 2) { qCWarning(LOG_LIB) << "Parse error" << sourceValues; return values; @@ -67,12 +67,12 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian // last trade auto price = sourceValues.at(0).toDouble(); values[tag("pricechg")] = oldPrice == 0.0 ? 0.0 : price - oldPrice; - values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / price; + values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / oldPrice; values[tag("price")] = price; // volume auto volume = sourceValues.at(1).toInt(); values[tag("volumechg")] = oldVolume == 0 ? 0 : volume - oldVolume; - values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / volume; + values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / oldVolume; values[tag("volume")] = volume; return values; diff --git a/sources/desktop-panel/package/metadata.json b/sources/desktop-panel/package/metadata.json index 5ceb3d0..2565d8c 100644 --- a/sources/desktop-panel/package/metadata.json +++ b/sources/desktop-panel/package/metadata.json @@ -19,7 +19,7 @@ "Id": "org.kde.plasma.desktoppanel", "License": "GPLv3", "Name": "Desktop Panel", - "Version": "3.5.1", + "Version": "4.0.0", "Website": "https://arcanis.me/projects/awesome-widgets/" }, "X-Plasma-API-Minimum-Version": "6.0" diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp index 65b583f..ea73879 100644 --- a/sources/extsysmon/extsysmon.cpp +++ b/sources/extsysmon/extsysmon.cpp @@ -27,8 +27,6 @@ #include "awdebug.h" #include "extsysmonaggregator.h" -#include "gpuloadsource.h" -#include "hddtempsource.h" ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args) @@ -53,9 +51,6 @@ void ExtendedSysMon::readConfiguration() settings.beginGroup("Configuration"); rawConfig["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/").toString(); - rawConfig["GPUDEV"] = settings.value("GPUDEV", "auto").toString(); - rawConfig["HDDDEV"] = settings.value("HDDDEV", "all").toString(); - rawConfig["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a").toString(); rawConfig["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost").toString(); rawConfig["MPDPORT"] = settings.value("MPDPORT", "6600").toString(); rawConfig["MPRIS"] = settings.value("MPRIS", "auto").toString(); @@ -71,31 +66,6 @@ QHash ExtendedSysMon::updateConfiguration(QHash &_config) // desktop // FIXME causes segfault in kde libs // createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {})); - // gpu load - createSensor("gpuload", i18n("GPU load"), new GPULoadSource(this, {_config["GPUDEV"]})); - // gpu temperature - createSensor("gputemp", i18n("GPU temperature"), new GPUTemperatureSource(this, {_config["GPUDEV"]})); - // hdd temperature - createSensor("hdd", i18n("HDD temperature"), - new HDDTemperatureSource(this, {_config["HDDDEV"], _config["HDDTEMPCMD"]})); // network createSensor("network", i18n("Network"), new NetworkSource(this, {})); // player diff --git a/sources/extsysmon/plasma-dataengine-extsysmon.conf b/sources/extsysmon/plasma-dataengine-extsysmon.conf index 906dffa..1fc7ddc 100644 --- a/sources/extsysmon/plasma-dataengine-extsysmon.conf +++ b/sources/extsysmon/plasma-dataengine-extsysmon.conf @@ -1,13 +1,6 @@ [Configuration] # ACPI devices ACPIPATH=/sys/class/power_supply/ -# May be 'nvidia' (for nvidia), 'ati' (for ATI RADEON), 'disable' or 'auto' -GPUDEV=auto -# HDD temperature -## Set block device for hddtemp comma separated or use 'all' or 'disable' -HDDDEV=all -# cmd -HDDTEMPCMD=sudo smartctl -a # mpd server settings MPDADDRESS=localhost MPDPORT=6600 diff --git a/sources/extsysmonsources/gpuloadsource.cpp b/sources/extsysmonsources/gpuloadsource.cpp deleted file mode 100644 index 565cbd2..0000000 --- a/sources/extsysmonsources/gpuloadsource.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ -#include "gpuloadsource.h" - -#include -#include - -#include -#include - -#include "awdebug.h" - - -GPULoadSource::GPULoadSource(QObject *_parent, const QStringList &_args) - : AbstractExtSysMonSource(_parent, _args) -{ - Q_ASSERT(_args.count() == 1); - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - m_device = _args.at(0); - - m_process = new QProcess(nullptr); - // fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished - connect(m_process, QOverload::of(&QProcess::finished), - [this](int, QProcess::ExitStatus) { return updateValue(); }); - m_process->waitForFinished(0); -} - - -GPULoadSource::~GPULoadSource() -{ - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - m_process->kill(); - m_process->deleteLater(); -} - - -QString GPULoadSource::autoGpu() -{ - QString gpu = "disable"; - QFile moduleFile("/proc/modules"); - if (!moduleFile.open(QIODevice::ReadOnly | QIODevice::Text)) { - qCWarning(LOG_AW) << "Could not open file as text" << moduleFile.fileName(); - return gpu; - } - - QString output = moduleFile.readAll(); - moduleFile.close(); - if (output.contains("fglrx")) - gpu = "ati"; - else if (output.contains("nvidia")) - gpu = "nvidia"; - - qCInfo(LOG_ESM) << "Device" << gpu; - return gpu; -} - - -QVariant GPULoadSource::data(const QString &_source) -{ - qCDebug(LOG_ESS) << "Source" << _source; - - if (_source == "load") - run(); - - return m_values[_source]; -} - - -KSysGuard::SensorInfo *GPULoadSource::initialData(const QString &_source) const -{ - qCDebug(LOG_ESS) << "Source" << _source; - - auto data = new KSysGuard::SensorInfo(); - if (_source == "load") { - data->min = 0.0; - data->max = 100.0; - data->name = "GPU usage"; - data->variantType = QVariant::Double; - data->unit = KSysGuard::UnitPercent; - } - - return data; -} - - -void GPULoadSource::run() -{ - if ((m_device != "nvidia") && (m_device != "ati")) - return; - // build cmd - QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig"; - auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-getclocks"}); - qCInfo(LOG_ESS) << "cmd" << cmd; - - m_process->start(cmd, args); -} - - -QStringList GPULoadSource::sources() const -{ - QStringList sources; - sources.append("load"); - - return sources; -} - - -void GPULoadSource::updateValue() -{ - qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode(); - QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed(); - qCInfo(LOG_ESS) << "Error" << qdebug; - QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed(); - qCInfo(LOG_ESS) << "Output" << qoutput; - - if (m_device == "nvidia") { - for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) { - if (!str.contains("")) - continue; - auto load = str.remove("").remove("").remove('%'); - m_values["load"] = load.toFloat(); - break; - } - } else if (m_device == "ati") { - for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) { - if (!str.contains("load")) - continue; - QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%'); - m_values["load"] = load.toFloat(); - break; - } - } - - emit(dataReceived(m_values)); -} diff --git a/sources/extsysmonsources/gpuloadsource.h b/sources/extsysmonsources/gpuloadsource.h deleted file mode 100644 index cb5b4ae..0000000 --- a/sources/extsysmonsources/gpuloadsource.h +++ /dev/null @@ -1,52 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - -#ifndef GPULOADSOURCE_H -#define GPULOADSOURCE_H - -#include - -#include "abstractextsysmonsource.h" - - -class QProcess; - -class GPULoadSource : public AbstractExtSysMonSource -{ - Q_OBJECT - -public: - explicit GPULoadSource(QObject *_parent, const QStringList &_args); - ~GPULoadSource() override; - static QString autoGpu(); - QVariant data(const QString &_source) override; - [[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override; - void run() override; - [[nodiscard]] QStringList sources() const override; - -private slots: - void updateValue(); - -private: - // configuration and values - QString m_device; - QProcess *m_process = nullptr; - QVariantHash m_values; -}; - - -#endif /* GPULOADSOURCE_H */ diff --git a/sources/extsysmonsources/gputempsource.cpp b/sources/extsysmonsources/gputempsource.cpp deleted file mode 100644 index f926817..0000000 --- a/sources/extsysmonsources/gputempsource.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - -#include "gputempsource.h" - -#include -#include - -#include -#include - -#include "awdebug.h" - - -GPUTemperatureSource::GPUTemperatureSource(QObject *_parent, const QStringList &_args) - : AbstractExtSysMonSource(_parent, _args) -{ - Q_ASSERT(_args.count() == 1); - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - m_device = _args.at(0); - - m_process = new QProcess(nullptr); - // fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished - connect(m_process, QOverload::of(&QProcess::finished), - [this](int, QProcess::ExitStatus) { return updateValue(); }); - m_process->waitForFinished(0); -} - - -GPUTemperatureSource::~GPUTemperatureSource() -{ - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - m_process->kill(); - m_process->deleteLater(); -} - - -QVariant GPUTemperatureSource::data(const QString &_source) -{ - qCDebug(LOG_ESS) << "Source" << _source; - - if (_source == "temperature") - run(); - - return m_values[_source]; -} - - -KSysGuard::SensorInfo *GPUTemperatureSource::initialData(const QString &_source) const -{ - qCDebug(LOG_ESS) << "Source" << _source; - - auto data = new KSysGuard::SensorInfo(); - if (_source == "temperature") { - data->min = 0.0; - data->max = 0.0; - data->name = "GPU temperature"; - data->variantType = QVariant::Double; - data->unit = KSysGuard::UnitCelsius; - } - - return data; -} - - -void GPUTemperatureSource::run() -{ - if ((m_device != "nvidia") && (m_device != "ati")) - return; - // build cmd - QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig"; - auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-gettemperature"}); - qCInfo(LOG_ESS) << "cmd" << cmd; - - m_process->start(cmd, args); -} - - -QStringList GPUTemperatureSource::sources() const -{ - QStringList sources; - sources.append("temperature"); - - return sources; -} - - -void GPUTemperatureSource::updateValue() -{ - qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode(); - QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed(); - qCInfo(LOG_ESS) << "Error" << qdebug; - QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed(); - qCInfo(LOG_ESS) << "Output" << qoutput; - - if (m_device == "nvidia") { - for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) { - if (!str.contains("")) - continue; - QString temp = str.remove("").remove("C"); - m_values["temperature"] = temp.toFloat(); - break; - } - } else if (m_device == "ati") { - for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) { - if (!str.contains("Temperature")) - continue; - QString temp = str.split(' ', Qt::SkipEmptyParts).at(4); - m_values["temperature"] = temp.toFloat(); - break; - } - } - - emit(dataReceived(m_values)); -} diff --git a/sources/extsysmonsources/gputempsource.h b/sources/extsysmonsources/gputempsource.h deleted file mode 100644 index abd4c7b..0000000 --- a/sources/extsysmonsources/gputempsource.h +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - -#ifndef GPUTEMPSOURCE_H -#define GPUTEMPSOURCE_H - -#include - -#include "abstractextsysmonsource.h" - - -class QProcess; - -class GPUTemperatureSource : public AbstractExtSysMonSource -{ - Q_OBJECT - -public: - explicit GPUTemperatureSource(QObject *_parent, const QStringList &_args); - ~GPUTemperatureSource() override; - QVariant data(const QString &_source) override; - [[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override; - void run() override; - [[nodiscard]] QStringList sources() const override; - -private slots: - void updateValue(); - -private: - // configuration and values - QString m_device; - QProcess *m_process = nullptr; - QVariantHash m_values; -}; - - -#endif /* GPUTEMPSOURCE_H */ diff --git a/sources/extsysmonsources/hddtempsource.cpp b/sources/extsysmonsources/hddtempsource.cpp deleted file mode 100644 index 50c11fa..0000000 --- a/sources/extsysmonsources/hddtempsource.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#include "hddtempsource.h" - -#include -#include - -#include -#include - -#include "awdebug.h" - - -HDDTemperatureSource::HDDTemperatureSource(QObject *_parent, const QStringList &_args) - : AbstractExtSysMonSource(_parent, _args) -{ - Q_ASSERT(_args.count() == 2); - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - m_devices = _args.at(0).split(',', Qt::SkipEmptyParts); - m_cmd = _args.at(1).split(' '); // lets hope no one put cmd with spaces here lol - - m_smartctl = m_cmd.contains("smartctl"); - qCInfo(LOG_ESS) << "Parse as smartctl" << m_smartctl; - - for (auto &device : m_devices) { - m_processes[device] = new QProcess(nullptr); - // fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished - connect(m_processes[device], QOverload::of(&QProcess::finished), - [this, &device](int, QProcess::ExitStatus) { return updateValue(device); }); - m_processes[device]->waitForFinished(0); - } -} - - -HDDTemperatureSource::~HDDTemperatureSource() -{ - qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; - - for (auto &device : m_devices) { - m_processes[device]->kill(); - m_processes[device]->deleteLater(); - } -} - - -QStringList HDDTemperatureSource::allHdd() -{ - QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name); - QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$")); - for (int i = 0; i < devices.count(); i++) - devices[i] = QString("/dev/%1").arg(devices.at(i)); - - qCInfo(LOG_ESS) << "Device list" << devices; - return devices; -} - - -QVariant HDDTemperatureSource::data(const QString &_source) -{ - qCDebug(LOG_ESS) << "Source" << _source; - - QString device = _source; - device.remove("temperature"); - // run cmd - if (m_processes[device]->state() == QProcess::NotRunning) { - auto cmd = m_cmd.first(); - auto args = m_cmd.mid(1); - args.append(device); - m_processes[device]->start(cmd, args); - } - - return m_values[device]; -} - - -KSysGuard::SensorInfo *HDDTemperatureSource::initialData(const QString &_source) const -{ - qCDebug(LOG_ESS) << "Source" << _source; - - auto device = _source; - device.remove("temperature"); - - auto data = new KSysGuard::SensorInfo(); - data->min = 0.0; - data->max = 0.0; - data->name = QString("HDD '%1' temperature").arg(device); - data->variantType = QVariant::Double; - data->unit = KSysGuard::UnitCelsius; - - return data; -} - - -QStringList HDDTemperatureSource::sources() const -{ - QStringList sources; - for (auto &device : m_devices) - sources.append(QString("temperature%1").arg(device)); - - return sources; -} - - -void HDDTemperatureSource::updateValue(const QString &_device) -{ - qCDebug(LOG_ESS) << "Called with device" << _device; - - qCInfo(LOG_ESS) << "Cmd returns" << m_processes[_device]->exitCode(); - QString qdebug = QString::fromUtf8(m_processes[_device]->readAllStandardError()).trimmed(); - qCInfo(LOG_ESS) << "Error" << qdebug; - QString qoutput = QString::fromUtf8(m_processes[_device]->readAllStandardOutput()).trimmed(); - qCInfo(LOG_ESS) << "Output" << qoutput; - - // parse - if (m_smartctl) { - QStringList lines = qoutput.split('\n', Qt::SkipEmptyParts); - for (auto &str : lines) { - if (!str.startsWith("194")) - continue; - if (str.split(' ', Qt::SkipEmptyParts).count() < 9) - continue; - m_values[_device] = str.split(' ', Qt::SkipEmptyParts).at(9).toFloat(); - break; - } - } else { - QStringList lines = qoutput.split(':', Qt::SkipEmptyParts); - if (lines.count() >= 3) { - QString temp = lines.at(2); - temp.remove(QChar(0260)).remove('C'); - m_values[_device] = temp.toFloat(); - } - } - - emit(dataReceived(m_values)); -} diff --git a/sources/extsysmonsources/hddtempsource.h b/sources/extsysmonsources/hddtempsource.h deleted file mode 100644 index a573f50..0000000 --- a/sources/extsysmonsources/hddtempsource.h +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - -#ifndef HDDTEMPSOURCE_H -#define HDDTEMPSOURCE_H - -#include - -#include "abstractextsysmonsource.h" - - -class QProcess; - -class HDDTemperatureSource : public AbstractExtSysMonSource -{ - Q_OBJECT - -public: - explicit HDDTemperatureSource(QObject *_parent, const QStringList &_args); - ~HDDTemperatureSource() override; - static QStringList allHdd(); - QVariant data(const QString &_source) override; - [[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override; - void run() override{}; - [[nodiscard]] QStringList sources() const override; - -private slots: - void updateValue(const QString &_device); - -private: - // properties - QHash m_processes; - // configuration and values - QStringList m_cmd; - QStringList m_devices; - bool m_smartctl; - QHash m_values; -}; - - -#endif /* HDDTEMPSOURCE_H */ diff --git a/sources/test/CMakeLists.txt b/sources/test/CMakeLists.txt index 0d6d5f1..3903a3a 100644 --- a/sources/test/CMakeLists.txt +++ b/sources/test/CMakeLists.txt @@ -29,7 +29,7 @@ set(TEST_MODULES abstractextitem extquotes extscript extupgrade extweather abstractformatter datetimeformatter floatformatter jsonformatter listformatter noformatter scriptformatter stringformatter extitemaggregator - batterysource desktopsource gpuloadsource gputempsource hddtempsource networksource playersource processessource + batterysource desktopsource networksource playersource processessource awbugreporter awconfighelper awkeycache awkeys awpatternfunctions awtelemetryhandler awupdatehelper dpplugin) foreach (TEST_MODULE ${TEST_MODULES}) diff --git a/sources/test/testgpuloadsource.cpp b/sources/test/testgpuloadsource.cpp deleted file mode 100644 index f6d6461..0000000 --- a/sources/test/testgpuloadsource.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#include "testgpuloadsource.h" - -#include - -#include "awtestlibrary.h" -#include "gpuloadsource.h" - - -void TestGPULoadSource::initTestCase() -{ - AWTestLibrary::init(); - device = GPULoadSource::autoGpu(); - QVERIFY(!device.isEmpty()); - - source = new GPULoadSource(this, QStringList() << device); -} - - -void TestGPULoadSource::cleanupTestCase() -{ - delete source; -} - - -void TestGPULoadSource::test_sources() -{ - QCOMPARE(source->sources(), QStringList() << src); -} - - -void TestGPULoadSource::test_gpuload() -{ - if (device == "disable") - QSKIP("Not supported device, test will be skipped"); - - QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &))); - float firstValue = source->data(src).toFloat(); - - QVERIFY(spy.wait(5000)); - QVariantHash arguments = spy.takeFirst().at(0).toHash(); - float secondValue = arguments[src].toFloat(); - - QCOMPARE(firstValue, 0.0f); - QVERIFY((secondValue >= load.first) && (secondValue <= load.second)); -} - - -QTEST_MAIN(TestGPULoadSource); diff --git a/sources/test/testgpuloadsource.h b/sources/test/testgpuloadsource.h deleted file mode 100644 index 93ee7ce..0000000 --- a/sources/test/testgpuloadsource.h +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#ifndef TESTGPULOADSOURCE_H -#define TESTGPULOADSOURCE_H - -#include -#include - - -class GPULoadSource; - -class TestGPULoadSource : public QObject -{ - Q_OBJECT - -private slots: - // initialization - void initTestCase(); - void cleanupTestCase(); - // test - void test_sources(); - void test_gpuload(); - -private: - GPULoadSource *source = nullptr; - QString device; - QString src = "gpu/load"; - QPair load = QPair(0.0f, 100.0f); -}; - - -#endif /* TESTGPULOADSOURCE_H */ diff --git a/sources/test/testgputempsource.cpp b/sources/test/testgputempsource.cpp deleted file mode 100644 index efad21d..0000000 --- a/sources/test/testgputempsource.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#include "testgputempsource.h" - -#include - -#include "awtestlibrary.h" -#include "gpuloadsource.h" -#include "gputempsource.h" - - -void TestGPUTemperatureSource::initTestCase() -{ - AWTestLibrary::init(); - device = GPULoadSource::autoGpu(); - QVERIFY(!device.isEmpty()); - - source = new GPUTemperatureSource(this, QStringList() << device); -} - - -void TestGPUTemperatureSource::cleanupTestCase() -{ - delete source; -} - - -void TestGPUTemperatureSource::test_sources() -{ - QCOMPARE(source->sources(), QStringList() << src); -} - - -void TestGPUTemperatureSource::test_gputemp() -{ - if (device == "disable") - QSKIP("Not supported device, test will be skipped"); - - QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &))); - float firstValue = source->data(src).toFloat(); - - QVERIFY(spy.wait(5000)); - QVariantHash arguments = spy.takeFirst().at(0).toHash(); - float secondValue = arguments[src].toFloat(); - - QCOMPARE(firstValue, 0.0f); - QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); -} - - -QTEST_MAIN(TestGPUTemperatureSource); diff --git a/sources/test/testgputempsource.h b/sources/test/testgputempsource.h deleted file mode 100644 index 3f7ce9b..0000000 --- a/sources/test/testgputempsource.h +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#ifndef TESTGPUTEMPSOURCE_H -#define TESTGPUTEMPSOURCE_H - -#include -#include - - -class GPUTemperatureSource; - -class TestGPUTemperatureSource : public QObject -{ - Q_OBJECT - -private slots: - // initialization - void initTestCase(); - void cleanupTestCase(); - // test - void test_sources(); - void test_gputemp(); - -private: - GPUTemperatureSource *source = nullptr; - QString device; - QString src = "gpu/temperature"; - QPair temp = QPair(0.0f, 120.0f); -}; - - -#endif /* TESTGPUTEMPSOURCE_H */ diff --git a/sources/test/testhddtempsource.cpp b/sources/test/testhddtempsource.cpp deleted file mode 100644 index 5e675bb..0000000 --- a/sources/test/testhddtempsource.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#include "testhddtempsource.h" - -#include - -#include "awtestlibrary.h" -#include "hddtempsource.h" - - -void TestHDDTemperatureSource::initTestCase() -{ - AWTestLibrary::init(); - devices = HDDTemperatureSource::allHdd(); - - hddtempSource = new HDDTemperatureSource(this, QStringList() << devices.join(',') << hddtempCmd); - smartctlSource = new HDDTemperatureSource(this, QStringList() << devices.join(',') << smartctlCmd); -} - - -void TestHDDTemperatureSource::cleanupTestCase() -{ - delete hddtempSource; - delete smartctlSource; -} - - -void TestHDDTemperatureSource::test_sources() -{ - if (devices.isEmpty()) - QSKIP("No hdd devices found, test will be skipped"); - - std::for_each(devices.begin(), devices.end(), [](QString &device) { device.prepend("hdd/temperature"); }); - - QCOMPARE(hddtempSource->sources(), devices); - QCOMPARE(smartctlSource->sources(), devices); -} - - -void TestHDDTemperatureSource::test_hddtemp() -{ - if (devices.isEmpty()) - QSKIP("No hdd devices found, test will be skipped"); - - std::for_each(devices.begin(), devices.end(), [this](QString device) { - QSignalSpy spy(hddtempSource, SIGNAL(dataReceived(const QVariantHash &))); - float firstValue = hddtempSource->data(device).toFloat(); - - QVERIFY(spy.wait(5000)); - QVariantHash arguments = spy.takeFirst().at(0).toHash(); - device.remove("hdd/temperature"); - float secondValue = arguments[device].toFloat(); - - QCOMPARE(firstValue, 0.0f); - QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); - }); -} - - -void TestHDDTemperatureSource::test_smartctl() -{ - if (devices.isEmpty()) - QSKIP("No hdd devices found, test will be skipped"); - - std::for_each(devices.begin(), devices.end(), [this](QString &device) { - QSignalSpy spy(smartctlSource, SIGNAL(dataReceived(const QVariantHash &))); - float firstValue = smartctlSource->data(device).toFloat(); - - QVERIFY(spy.wait(5000)); - QVariantHash arguments = spy.takeFirst().at(0).toHash(); - device.remove("hdd/temperature"); - float secondValue = arguments[device].toFloat(); - - QCOMPARE(firstValue, 0.0f); - QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); - }); -} - - -QTEST_MAIN(TestHDDTemperatureSource); diff --git a/sources/test/testhddtempsource.h b/sources/test/testhddtempsource.h deleted file mode 100644 index f687c0a..0000000 --- a/sources/test/testhddtempsource.h +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************** - * This file is part of awesome-widgets * - * * - * awesome-widgets is free software: you can redistribute it and/or * - * modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation, either version 3 of the * - * License, or (at your option) any later version. * - * * - * awesome-widgets is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * - ***************************************************************************/ - - -#ifndef TESTHDDTEMPSOURCE_H -#define TESTHDDTEMPSOURCE_H - -#include -#include - - -class HDDTemperatureSource; - -class TestHDDTemperatureSource : public QObject -{ - Q_OBJECT - -private slots: - // initialization - void initTestCase(); - void cleanupTestCase(); - // test - void test_sources(); - void test_hddtemp(); - void test_smartctl(); - -private: - HDDTemperatureSource *hddtempSource = nullptr; - HDDTemperatureSource *smartctlSource = nullptr; - QStringList devices; - QString hddtempCmd = "sudo hddtemp"; - QString smartctlCmd = "sudo smartctl -a"; - QPair temp = QPair(0.0f, 120.0f); -}; - - -#endif /* TESTHDDTEMPSOURCE_H */ diff --git a/sources/version.h.in b/sources/version.h.in index 1c1a18b..7416679 100644 --- a/sources/version.h.in +++ b/sources/version.h.in @@ -54,7 +54,7 @@ const char STATIC_FUNCTIONS[] = "{{\n\n}},template{{\n\n}},aw_all<>{{}},aw_" "count<>{{}},aw_keys<>{{}},aw_macro<>{{}},aw_" "names<>{{}}"; const char STATIC_KEYS[] = "time,isotime,shorttime,longtime,tstime,ctime,uptime,cuptime,cpucl,cpu," - "gputemp,gpu,memmb,memgb,memfreemb,memfreegb,memtotmb,memtotgb,memusedmb," + "gpu,memmb,memgb,memfreemb,memfreegb,memtotmb,memtotgb,memusedmb," "memusedgb,mem,swapmb,swapgb,swapfreemb,swapfreegb,swaptotmb,swaptotgb," "swap,downunits,upunits,downkb,downtotkb,downtot,down,uptotkb,uptot,upkb," "up,netdev,ac,bat,batleft,batnow,batrate,battotal,album,artist,duration,"