OBS-URL: https://build.opensuse.org/package/show/KDE:Frameworks/kinfocenter6?expand=0&rev=36
255 lines
8.7 KiB
Diff
255 lines
8.7 KiB
Diff
From 375abcd571b991aa1ea8436fad6c7a4d30f62fa1 Mon Sep 17 00:00:00 2001
|
|
From: Kristen McWilliam <kmcwilliampublic@gmail.com>
|
|
Date: Mon, 14 Oct 2024 15:45:02 -0400
|
|
Subject: [PATCH 3/3] kcms/memory: use KAuth dmidecode helper
|
|
|
|
Refactor to use a KAuth helper to run dmidecode as
|
|
root, rather than using the CommandOutputContext.
|
|
|
|
This means the KCM no longer requires the user to
|
|
enter their password to view memory information,
|
|
and won't show an obtuse error like before if the
|
|
user cancelled the password dialog.
|
|
---
|
|
kcms/helpers/dmidecode-helper/helper.cpp | 26 ++++++++++
|
|
kcms/helpers/dmidecode-helper/helper.h | 5 ++
|
|
.../org.kde.kinfocenter.dmidecode.actions | 7 +++
|
|
kcms/memory/CMakeLists.txt | 9 +++-
|
|
kcms/memory/main.cpp | 48 ++++++++++++++++---
|
|
kcms/memory/ui/main.qml | 25 ++++++++--
|
|
6 files changed, 108 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/kcms/helpers/dmidecode-helper/helper.cpp b/kcms/helpers/dmidecode-helper/helper.cpp
|
|
index e9d068dc..11921934 100644
|
|
--- a/kcms/helpers/dmidecode-helper/helper.cpp
|
|
+++ b/kcms/helpers/dmidecode-helper/helper.cpp
|
|
@@ -26,6 +26,24 @@ DMIDecodeHelper::DMIDecodeHelper(QObject *parent)
|
|
m_dmidecodePath = QStandardPaths::findExecutable("dmidecode");
|
|
}
|
|
|
|
+KAuth::ActionReply DMIDecodeHelper::memoryinformation(const QVariantMap &args)
|
|
+{
|
|
+ Q_UNUSED(args);
|
|
+
|
|
+ KAuth::ActionReply reply;
|
|
+ auto result = executeDmidecode({QStringLiteral("--type"), QStringLiteral("17")});
|
|
+
|
|
+ if (result.failed()) {
|
|
+ qWarning() << "DMIDecodeHelper: Unable to get memory information";
|
|
+ return KAuth::ActionReply::HelperErrorReply();
|
|
+ }
|
|
+
|
|
+ const QString output = result.data().value("result").toString();
|
|
+ reply.addData("memory", output);
|
|
+
|
|
+ return reply;
|
|
+}
|
|
+
|
|
KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args)
|
|
{
|
|
Q_UNUSED(args);
|
|
@@ -45,6 +63,8 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args)
|
|
for (const auto &key : keys) {
|
|
auto result = executeDmidecode({QStringLiteral("--string"), key});
|
|
if (result.failed()) {
|
|
+ qWarning() << "DMIDecodeHelper: Unable to get system information for " << key;
|
|
+ // We don't want to fail the entire action if we can't get a single piece of information.
|
|
continue;
|
|
}
|
|
|
|
@@ -71,6 +91,12 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args)
|
|
reply.addData(key, output);
|
|
}
|
|
|
|
+ if (reply.data().isEmpty()) {
|
|
+ qWarning() << "DMIDecodeHelper: Unable to get system information";
|
|
+ // If we didn't get any data, we should fail the action.
|
|
+ return KAuth::ActionReply::HelperErrorReply();
|
|
+ }
|
|
+
|
|
return reply;
|
|
}
|
|
|
|
diff --git a/kcms/helpers/dmidecode-helper/helper.h b/kcms/helpers/dmidecode-helper/helper.h
|
|
index c1b588e8..805d5fa6 100644
|
|
--- a/kcms/helpers/dmidecode-helper/helper.h
|
|
+++ b/kcms/helpers/dmidecode-helper/helper.h
|
|
@@ -14,6 +14,11 @@ public:
|
|
explicit DMIDecodeHelper(QObject *parent = nullptr);
|
|
|
|
public Q_SLOTS:
|
|
+ /**
|
|
+ * Retrieves memory (RAM) information from dmidecode.
|
|
+ */
|
|
+ KAuth::ActionReply memoryinformation(const QVariantMap &args);
|
|
+
|
|
KAuth::ActionReply systeminformation(const QVariantMap &args);
|
|
|
|
private:
|
|
diff --git a/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions b/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions
|
|
index 66d3aa99..9f0c76f3 100644
|
|
--- a/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions
|
|
+++ b/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions
|
|
@@ -1,5 +1,7 @@
|
|
# SPDX-License-Identifier: CC0-1.0
|
|
# SPDX-FileCopyrightText: 2021 Harald Sitter <sitter@kde.org>
|
|
+# SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com>
|
|
+
|
|
[Domain]
|
|
Icon=computer
|
|
URL=https://www.kde.org
|
|
@@ -47,6 +49,11 @@ Name[x-test]=xxDesktop Management Interfacexx
|
|
Name[zh_CN]=桌面管理界面 (DMI)
|
|
Name[zh_TW]=桌面管理介面
|
|
|
|
+[org.kde.kinfocenter.dmidecode.memoryinformation]
|
|
+Policy=yes
|
|
+Name=Memory Information
|
|
+Description=Read memory information from system's Desktop Management Interface (DMI)
|
|
+
|
|
[org.kde.kinfocenter.dmidecode.systeminformation]
|
|
Policy=yes
|
|
PolicyInactive=yes
|
|
diff --git a/kcms/memory/CMakeLists.txt b/kcms/memory/CMakeLists.txt
|
|
index 49219ac4..59c93b69 100644
|
|
--- a/kcms/memory/CMakeLists.txt
|
|
+++ b/kcms/memory/CMakeLists.txt
|
|
@@ -1,5 +1,6 @@
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com>
|
|
+# SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com>
|
|
|
|
find_package(dmidecode)
|
|
set_package_properties(dmidecode PROPERTIES TYPE RUNTIME)
|
|
@@ -7,4 +8,10 @@ set_package_properties(dmidecode PROPERTIES TYPE RUNTIME)
|
|
add_definitions(-DTRANSLATION_DOMAIN=\"kcm_memory\")
|
|
|
|
kinfocenter_add_kcm(kcm_memory main.cpp)
|
|
-target_link_libraries(kcm_memory PRIVATE KF6::CoreAddons KF6::KCMUtilsQuick KF6::I18n KInfoCenterInternal)
|
|
+target_link_libraries(kcm_memory PRIVATE
|
|
+ KF6::AuthCore
|
|
+ KF6::CoreAddons
|
|
+ KF6::KCMUtilsQuick
|
|
+ KF6::I18n
|
|
+ KInfoCenterInternal
|
|
+)
|
|
diff --git a/kcms/memory/main.cpp b/kcms/memory/main.cpp
|
|
index d2190140..7aab18ce 100644
|
|
--- a/kcms/memory/main.cpp
|
|
+++ b/kcms/memory/main.cpp
|
|
@@ -1,30 +1,64 @@
|
|
/*
|
|
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com>
|
|
+ SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com>
|
|
*/
|
|
|
|
+#include <KAuth/Action>
|
|
+#include <KAuth/ExecuteJob>
|
|
+#include <KLocalizedString>
|
|
#include <KPluginFactory>
|
|
#include <KQuickConfigModule>
|
|
|
|
-#include "CommandOutputContext.h"
|
|
-
|
|
class KCMMemory : public KQuickConfigModule
|
|
{
|
|
Q_OBJECT
|
|
- Q_PROPERTY(CommandOutputContext *infoOutputContext READ outputContext CONSTANT FINAL)
|
|
+ Q_PROPERTY(QString memoryInformation READ memoryInformation NOTIFY changed)
|
|
public:
|
|
explicit KCMMemory(QObject *parent, const KPluginMetaData &data)
|
|
: KQuickConfigModule(parent, data)
|
|
{
|
|
- m_outputContext = new CommandOutputContext(QStringLiteral("pkexec"), {"dmidecode", "--type", "17"}, parent);
|
|
+ loadData();
|
|
}
|
|
- CommandOutputContext *outputContext() const
|
|
+
|
|
+ QString memoryInformation() const
|
|
{
|
|
- return m_outputContext;
|
|
+ return m_memoryInformation;
|
|
}
|
|
|
|
private:
|
|
- CommandOutputContext *m_outputContext;
|
|
+ Q_SIGNAL void changed();
|
|
+
|
|
+ /**
|
|
+ * The memory information that will be displayed in the KCM.
|
|
+ */
|
|
+ QString m_memoryInformation;
|
|
+
|
|
+ /**
|
|
+ * Load the memory information from the dmidecode helper.
|
|
+ */
|
|
+ void loadData()
|
|
+ {
|
|
+ KAuth::Action action(QStringLiteral("org.kde.kinfocenter.dmidecode.memoryinformation"));
|
|
+ action.setHelperId(QStringLiteral("org.kde.kinfocenter.dmidecode"));
|
|
+ KAuth::ExecuteJob *job = action.execute();
|
|
+
|
|
+ connect(job, &KJob::result, this, [this, job]() {
|
|
+ if (job->error()) {
|
|
+ qWarning() << "Failed to retrieve memory information: " << job->errorString();
|
|
+ return;
|
|
+ } else {
|
|
+ const auto reply = job->data();
|
|
+ if (reply.contains("memory")) {
|
|
+ m_memoryInformation = reply["memory"].toString();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ Q_EMIT changed();
|
|
+ });
|
|
+
|
|
+ job->start();
|
|
+ }
|
|
};
|
|
|
|
K_PLUGIN_CLASS_WITH_JSON(KCMMemory, "kcm_memory.json")
|
|
diff --git a/kcms/memory/ui/main.qml b/kcms/memory/ui/main.qml
|
|
index 0300d619..42fdcbc7 100644
|
|
--- a/kcms/memory/ui/main.qml
|
|
+++ b/kcms/memory/ui/main.qml
|
|
@@ -1,14 +1,31 @@
|
|
/*
|
|
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com>
|
|
+ SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com>
|
|
*/
|
|
|
|
-import QtQuick 2.5
|
|
+import QtQuick 2.15
|
|
|
|
+import org.kde.kirigami 2.20 as Kirigami
|
|
import org.kde.kcmutils as KCM
|
|
|
|
-import org.kde.kinfocenter.private 1.0 as KInfoCenter
|
|
+KCM.SimpleKCM {
|
|
+ id: kcm_memory
|
|
+ Kirigami.Theme.colorSet: Kirigami.Theme.View
|
|
+ Kirigami.Theme.inherit: false
|
|
|
|
-KInfoCenter.CommandOutputKCM {
|
|
- output: kcm.infoOutputContext
|
|
+ Kirigami.PlaceholderMessage {
|
|
+ anchors.centerIn: parent
|
|
+ width: parent.width - (Kirigami.Units.largeSpacing * 8)
|
|
+ visible: kcm.memoryInformation === ""
|
|
+ icon.name: "data-warning"
|
|
+ text: i18ndc("kinfocenter", "@info the KCM has no data to display", "No data available")
|
|
+ }
|
|
+
|
|
+ Kirigami.SelectableLabel {
|
|
+ id: text
|
|
+ text: kcm.memoryInformation
|
|
+ font.family: "monospace"
|
|
+ visible: kcm.memoryInformation !== ""
|
|
+ }
|
|
}
|
|
--
|
|
2.47.0
|
|
|