Widget KDE Plasma 6 (org.enne2.cpufreq) per pilotare il profilo energetico della CPU: governor, limiti min/max, energy_performance_preference, boost/turbo, quattro profili pronti (Silenzioso, Risparmio, Bilanciato, Performance) e task con profilo dedicato che ripristina lo stato precedente alla fine del comando. Privilegi separati: il widget resta non privilegiato e l'unica operazione root passa da un helper a interfaccia ristretta in /usr/local/libexec/enne2-cpufreq/ (comandi a elenco chiuso, argomenti validati su sysfs, rilettura di verifica), invocato via pkexec con l'azione polkit dedicata org.enne2.cpufreq.set. La regola in /etc/polkit-1/rules.d/ concede il consenso senza prompt a utenti locali in sessione attiva nel gruppo wheel; senza la regola la policy chiede la password. Dettagli verificati su frigate (Plasma 6.7.5, kernel 7.2, amd-pstate-epp): - con boost disattivato cpuinfo_max_freq scende alla frequenza nominale, quindi il tetto hardware si legge da amd_pstate_max_freq e i profili applicano il boost prima dei limiti; - scrittura dei limiti in ordine sicuro (mai min > max intermedio); - baseline e contatore di riferimento per i task paralleli; - syncControls protetto da uiReady e try/catch: un ReferenceError su un id della rappresentazione non deve interrompere l'aggiornamento dello stato; - implicitWidth/Height costanti, altrimenti il containment riduce il widget a 68x68. Include install.sh/uninstall.sh (widget, backend, dry-run), README con modello di sicurezza e diagnostica, screenshot docs/widget.png. Licenza MIT.
56 lines
1.4 KiB
QML
56 lines
1.4 KiB
QML
/*
|
|
* SPDX-FileCopyrightText: 2026 enne2
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Pillola selezionabile usata per governor ed EPP: alternativa compatta a una
|
|
* ComboBox, senza stato interno (attivo/inattivo derivano dalle proprietà).
|
|
*/
|
|
|
|
import QtQuick
|
|
import org.kde.plasma.components 3.0 as PlasmaComponents
|
|
import org.kde.kirigami as Kirigami
|
|
|
|
Rectangle {
|
|
id: pill
|
|
|
|
property string text: ""
|
|
property bool active: false
|
|
property color accent: "#55c5c0"
|
|
signal clicked()
|
|
|
|
implicitWidth: label.implicitWidth + 16
|
|
implicitHeight: label.implicitHeight + 8
|
|
radius: 4
|
|
color: active
|
|
? Qt.rgba(accent.r, accent.g, accent.b, 0.22)
|
|
: (pillMouse.containsMouse ? Qt.rgba(1, 1, 1, 0.10) : Qt.rgba(1, 1, 1, 0.05))
|
|
border.width: 1
|
|
border.color: active
|
|
? Qt.rgba(accent.r, accent.g, accent.b, 0.8)
|
|
: Qt.rgba(1, 1, 1, 0.10)
|
|
opacity: enabled ? 1.0 : 0.5
|
|
|
|
Behavior on color {
|
|
ColorAnimation { duration: 120 }
|
|
}
|
|
|
|
PlasmaComponents.Label {
|
|
id: label
|
|
anchors.centerIn: parent
|
|
text: pill.text
|
|
font.family: "monospace"
|
|
font.pointSize: 8
|
|
font.bold: pill.active
|
|
color: pill.active ? pill.accent : Kirigami.Theme.textColor
|
|
opacity: pill.active ? 1.0 : 0.78
|
|
}
|
|
|
|
MouseArea {
|
|
id: pillMouse
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: pill.clicked()
|
|
}
|
|
}
|