/*************************************************************************** * 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 "extsysmon.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "extquotes.h" #include "extscript.h" #include "extupgrade.h" #include "extweather.h" #include "version.h" ExtendedSysMon::ExtendedSysMon(QObject* parent, const QVariantList &args) : Plasma::DataEngine(parent, args) { Q_UNUSED(args) qInstallMessageHandler(debugString); // debug QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); QString debugEnv = environment.value(QString("DEBUG"), QString("no")); debug = (debugEnv == QString("yes")); setMinimumPollingInterval(333); readConfiguration(); externalQuotes = new ExtItemAggregator(nullptr, QString("quotes"), debug); externalScripts = new ExtItemAggregator(nullptr, QString("scripts"), debug); externalUpgrade = new ExtItemAggregator(nullptr, QString("upgrade"), debug); externalWeather = new ExtItemAggregator(nullptr, QString("weather"), debug); } ExtendedSysMon::~ExtendedSysMon() { if (debug) qDebug() << PDEBUG; delete externalQuotes; delete externalScripts; delete externalUpgrade; delete externalWeather; } QStringList ExtendedSysMon::getAllHdd() const { if (debug) qDebug() << PDEBUG; QStringList allDevices = QDir(QString("/dev")).entryList(QDir::System, QDir::Name); QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); for (int i=0; icall(QDBus::BlockWithGui, QString("ListNames")); if (listServices.arguments().isEmpty()) return QString(); QStringList arguments = listServices.arguments().at(0).toStringList(); for (int i=0; i rawConfig; settings.beginGroup(QString("Configuration")); rawConfig[QString("ACPIPATH")] = settings.value(QString("ACPIPATH"), QString("/sys/class/power_supply/")).toString(); rawConfig[QString("GPUDEV")] = settings.value(QString("GPUDEV"), QString("auto")).toString(); rawConfig[QString("HDDDEV")] = settings.value(QString("HDDDEV"), QString("all")).toString(); rawConfig[QString("HDDTEMPCMD")] = settings.value(QString("HDDTEMPCMD"), QString("sudo smartctl -a")).toString(); rawConfig[QString("MPDADDRESS")] = settings.value(QString("MPDADDRESS"), QString("localhost")).toString(); rawConfig[QString("MPDPORT")] = settings.value(QString("MPDPORT"), QString("6600")).toString(); rawConfig[QString("MPRIS")] = settings.value(QString("MPRIS"), QString("auto")).toString(); rawConfig[QString("PLAYER")] = settings.value(QString("PLAYER"), QString("mpris")).toString(); settings.endGroup(); configuration = updateConfiguration(rawConfig); } QHash ExtendedSysMon::updateConfiguration(QHash rawConfig) const { if (debug) qDebug() << PDEBUG; // gpudev if (rawConfig[QString("GPUDEV")] == QString("disable")) rawConfig[QString("GPUDEV")] = QString("disable"); else if (rawConfig[QString("GPUDEV")] == QString("auto")) rawConfig[QString("GPUDEV")] = getAutoGpu(); else if ((rawConfig[QString("GPUDEV")] != QString("ati")) && (rawConfig[QString("GPUDEV")] != QString("nvidia"))) rawConfig[QString("GPUDEV")] = getAutoGpu(); // hdddev QStringList allHddDevices = getAllHdd(); if (rawConfig[QString("HDDDEV")] == QString("all")) rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); else if (rawConfig[QString("HDDDEV")] == QString("disable")) rawConfig[QString("HDDDEV")] = QString(""); else { QStringList deviceList = rawConfig[QString("HDDDEV")].split(QChar(','), QString::SkipEmptyParts); QStringList devices; QRegExp diskRegexp = QRegExp("^/dev/[hms]d[a-z]$"); for (int i=0; i -1)) devices.append(deviceList.at(i)); if (devices.isEmpty()) rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); else rawConfig[QString("HDDDEV")] = devices.join(QChar(',')); } // player if ((rawConfig[QString("PLAYER")] != QString("mpd")) && (rawConfig[QString("PLAYER")] != QString("mpris")) && (rawConfig[QString("PLAYER")] != QString("disable"))) rawConfig[QString("PLAYER")] = QString("mpris"); for (int i=0; i(100 * batCurrent / batFull); currentLevel += batCurrent; fullLevel += batFull; } currentLevelFile.close(); fullLevelFile.close(); } battery[QString("bat")] = static_cast(100 * currentLevel / fullLevel); return battery; } QVariantHash ExtendedSysMon::getCurrentDesktop() const { if (debug) qDebug() << PDEBUG; int number = KWindowSystem::currentDesktop(); int total = KWindowSystem::numberOfDesktops(); QVariantHash currentDesktop; currentDesktop[QString("currentName")] = KWindowSystem::desktopName(number); currentDesktop[QString("currentNumber")] = number; currentDesktop[QString("list")] = QStringList(); for (int i=1; itoUnicode(process.output).trimmed(); if (configuration[QString("GPUDEV")] == QString("nvidia")) for (int i=0; i"))) { QString load = qoutput.split(QChar('\n'), QString::SkipEmptyParts)[i] .remove(QString("")) .remove(QString("")) .remove(QChar('%')); value = load.toFloat(); } } else if (configuration[QString("GPUDEV")] == QString("ati")) for (int i=0; itoUnicode(process.output); if (configuration[QString("GPUDEV")] == QString("nvidia")) for (int i=0; i"))) { QString temp = qoutput.split(QChar('\n'), QString::SkipEmptyParts)[i] .remove(QString("")) .remove(QString("C")); value = temp.toFloat(); } } else if (configuration[QString("GPUDEV")] == QString("ati")) for (int i=0; itoUnicode(process.output).trimmed(); if (smartctl) { for (int i=0; i= 3) { QString temp = qoutput.split(QChar(':'), QString::SkipEmptyParts).at(2); temp.remove(QChar(0260)).remove(QChar('C')); value = temp.toFloat(); } } return value; } QString ExtendedSysMon::getNetworkDevice() const { if (debug) qDebug() << PDEBUG; QString device = QString("lo"); QList rawInterfaceList = QNetworkInterface::allInterfaces(); for (int i=0; itoUnicode(process.output).trimmed(); QString qstr = QString(""); for (int i=0; i 1) { if (qstr.split(QString(": "), QString::SkipEmptyParts).at(0) == QString("Album")) info[QString("album")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts).at(0) == QString("Artist")) info[QString("artist")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); else if (qstr.split(QString(": "), QString::SkipEmptyParts).at(0) == QString("time")) { info[QString("duration")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[0]; info[QString("progress")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed().split(QString(":"))[1]; } else if (qstr.split(QString(": "), QString::SkipEmptyParts).at(0) == QString("Title")) info[QString("title")] = qstr.split(QString(": "), QString::SkipEmptyParts)[1].trimmed(); } } return info; } QVariantHash ExtendedSysMon::getPlayerMprisInfo(const QString mpris) const { if (debug) qDebug() << PDEBUG; if (debug) qDebug() << PDEBUG << "MPRIS" << mpris; QVariantHash info; info[QString("album")] = QString("unknown"); info[QString("artist")] = QString("unknown"); info[QString("duration")] = 0; info[QString("progress")] = 0; info[QString("title")] = QString("unknown"); QDBusConnection bus = QDBusConnection::sessionBus(); // comes from the following request: // qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get org.mpris.MediaPlayer2.Player Metadata // or the same but using dbus-send: // dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' QVariantList args = QVariantList() << QString("org.mpris.MediaPlayer2.Player") << QString("Metadata"); QDBusMessage request = QDBusMessage::createMethodCall(QString("org.mpris.MediaPlayer2.%1").arg(mpris), QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get")); request.setArguments(args); QDBusMessage response = bus.call(request, QDBus::BlockWithGui); if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) { if (debug) qDebug() << PDEBUG << ":" << "Error message" << response.errorMessage(); } else { // another portion of dirty magic QVariantHash map = qdbus_cast(response.arguments().at(0) .value().variant() .value()); info[QString("album")] = map.value(QString("xesam:album"), QString("unknown")); // artist is array info[QString("artist")] = map.value(QString("xesam:artist"), QString("unknown")).toString(); info[QString("duration")] = map.value(QString("mpris:length"), 0).toInt() / (1000 * 1000); info[QString("title")] = map.value(QString("xesam:title"), QString("unknown")); } // position args[1] = QString("Position"); request.setArguments(args); response = bus.call(request, QDBus::BlockWithGui); if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) { if (debug) qDebug() << PDEBUG << ":" << "Error message" << response.errorMessage(); } else // this cast is simpler than the previous one ;) info[QString("progress")] = response.arguments().at(0).value() .variant().toLongLong() / (1000 * 1000); return info; } QVariantHash ExtendedSysMon::getPsStats() const { if (debug) qDebug() << PDEBUG; QStringList allDirectories = QDir(QString("/proc")).entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); QStringList directories = allDirectories.filter(QRegExp(QString("(\\d+)"))); QStringList running; for (int i=0; iitems().count(); i++) { QVariantHash data = externalScripts->items().at(i)->run(); for (int j=0; jitems().count(); i++) { QVariantHash data = externalUpgrade->items().at(i)->run(); for (int j=0; jitems().count(); i++) { QVariantHash data = externalQuotes->items().at(i)->run(); for (int j=0; jitems().count(); i++) { QVariantHash data = externalWeather->items().at(i)->run(); for (int j=0; j