File sm_hdd_activity.patch of Package kdebase4-workspace

diff -Pdpru kde-workspace-4.11.22.orig/plasma/generic/applets/system-monitor/hdd_activity.cpp kde-workspace-4.11.22/plasma/generic/applets/system-monitor/hdd_activity.cpp
--- kde-workspace-4.11.22.orig/plasma/generic/applets/system-monitor/hdd_activity.cpp	2015-08-12 10:03:15.000000000 +0300
+++ kde-workspace-4.11.22/plasma/generic/applets/system-monitor/hdd_activity.cpp	2025-03-06 11:48:06.941916328 +0300
@@ -42,18 +42,23 @@
  *
  * RAID blocks (there *could* be more if not using mdadm, I think):
  *
- * disk/md<something>/Rate/rio
- * disk/md<something>/Rate/wio
+ * disk/md<something>/Rate/rblk
+ * disk/md<something>/Rate/wblk
  *
  * SATA disks:
  *
- * disk/sd<something>/Rate/rio
- * disk/sd<something>/Rate/wio
+ * disk/sd<something>/Rate/rblk
+ * disk/sd<something>/Rate/wblk
  *
  * IDE/PATA disks:
  *
- * disk/hd<something>/Rate/rio
- * disk/hd<something>/Rate/wio
+ * disk/hd<something>/Rate/rblk
+ * disk/hd<something>/Rate/wblk
+ *
+ * NVMe SSD disks:
+ *
+ * disk/nvme<something>/Rate/rblk
+ * disk/nvme<something>/Rate/wblk
  *
  * Does NOT include partitions, since I don't think many people will use that.
  *
@@ -62,7 +67,7 @@
  */
 Hdd_Activity::Hdd_Activity(QObject *parent, const QVariantList &args)
     : SM::Applet(parent, args),
-    m_regexp("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk|wblk)")
+    m_regexp("^disk/(?:md|sd|hd|nvme)[^_]+_[^/]+/Rate/[rw]blk$")
 {
     setHasConfigurationInterface(true);
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -78,6 +83,15 @@ void Hdd_Activity::init()
     setEngine(dataEngine("systemmonitor"));
     setTitle(i18n("Disk Activity"));
 
+    Plasma::DataEngine *solidEngine = dataEngine("soliddevice");
+    QStringList uuids = solidEngine->query("IS StorageVolume")["IS StorageVolume"].toStringList();
+    foreach (const QString &uuid, uuids) {
+        Plasma::DataEngine::Data data = solidEngine->query(uuid);
+        QString device = data["Device"].toString().mid(5);
+        if (data.contains("Label") && !data["Label"].toString().isEmpty())
+            m_deviceLabels[device] = data["Label"].toString();
+    }
+
     /* At the time this method is running, not all sources may be connected. */
     connect(engine(), SIGNAL(sourceAdded(QString)), this, SLOT(sourceChanged(QString)));
     connect(engine(), SIGNAL(sourceRemoved(QString)), this, SLOT(sourceChanged(QString)));
@@ -106,9 +120,7 @@ void Hdd_Activity::sourcesChanged()
 
 void Hdd_Activity::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data)
 {
-
-
-    const double value = data["value"].toDouble();
+    const double value = data["value"].toDouble()/1024;
     QVector<double>& valueVector = m_data[source];
 
     if (valueVector.size() < 2) {
@@ -141,14 +153,14 @@ void Hdd_Activity::dataUpdated(const QSt
 
     //only graph it if it's got both rblk and wblk
     if (valueVector.count() == 2) {
-        QString read = KGlobal::locale()->formatNumber(valueVector.at(0), 1);
-        QString write = KGlobal::locale()->formatNumber(valueVector.at(1), 1);
+        QString read = KGlobal::locale()->formatNumber(valueVector.at(0)*1024, 1);
+        QString write = KGlobal::locale()->formatNumber(valueVector.at(1)*1024, 1);
 
         //FIXME: allow plotter->addSample overload for QVector.
         plotter->addSample(valueVector.toList());
 
         if (mode() == SM::Applet::Panel) {
-            const QString tooltip = QString("<tr><td>%1&nbsp;</td><td>rio: %2%</td><td>wio: %3</td></tr>")
+            const QString tooltip = QString("<tr><td>%1&nbsp;</td><td>rblk: %2%</td><td>wblk: %3</td></tr>")
                                     .arg(plotter->title()).arg(read).arg(write);
 
             setToolTip(source, tooltip);
@@ -168,12 +180,14 @@ void Hdd_Activity::createConfigurationIn
     foreach (const QString& hdd, m_possibleHdds) {
         if (m_regexp.indexIn(hdd) != -1) {
             if (hdd.endsWith("rblk")) {
-
                 // so the user only sees 1 device (which includes both rblk/wblk
                 QString trimmedHdd = hdd;
                 trimmedHdd.remove("rblk");
 
-                QStandardItem *item1 = new QStandardItem(trimmedHdd);
+                QString device = hdd.mid(5, hdd.indexOf('_', 5) - 5);
+                if (m_deviceLabels.contains(device))
+                    device = m_deviceLabels[device] + " (" + device + ")";
+                QStandardItem *item1 = new QStandardItem(device);
                 item1->setEditable(false);
                 item1->setCheckable(true);
 
@@ -261,18 +275,13 @@ bool Hdd_Activity::addVisualization(cons
     // but only need 1 vis per actual device (otherwise there'd be 1 for rblk, 1
     // for wblk, which isn't what I have in mind -sreich
     if (splits.at(3) == "rblk") {
-
-        QString hdd = source;
-        hdd = hdd.remove("rblk");
-
-        //kDebug() << "#### ADD VIS hdd: " << hdd;
-
         SM::Plotter *plotter = new SM::Plotter(this);
-        plotter->setTitle(hdd);
+        QString device = source.mid(5, source.indexOf('_', 5) - 5);
+        plotter->setTitle(m_deviceLabels.contains(device) ?m_deviceLabels[device] :device);
 
         // FIXME: localize properly..including units.
         // ksysguard just gives us 1024 KiB for sources, we need to convert for anything else.
-        plotter->setUnit("KiB/s");
+        plotter->setUnit("MiB/s");
 
         // should be read, write, respectively
         plotter->setCustomPlots(QList<QColor>() << QColor("#0057AE") << QColor("#E20800"));
diff -Pdpru kde-workspace-4.11.22.orig/plasma/generic/applets/system-monitor/hdd_activity.h kde-workspace-4.11.22/plasma/generic/applets/system-monitor/hdd_activity.h
--- kde-workspace-4.11.22.orig/plasma/generic/applets/system-monitor/hdd_activity.h	2015-08-12 10:03:15.000000000 +0300
+++ kde-workspace-4.11.22/plasma/generic/applets/system-monitor/hdd_activity.h	2025-03-06 09:56:57.212509357 +0300
@@ -57,6 +57,7 @@ public slots:
 private:
     Ui::config ui;
     QStandardItemModel m_hddModel;
+    QHash<QString, QString> m_deviceLabels;
 
     /**
      * The hdd sources that would be interesting to watch.
openSUSE Build Service is sponsored by