refactor GameModeToggle's conf opt fetching

This commit is contained in:
end-4
2026-03-19 12:39:12 +01:00
parent 74ce3378d0
commit 7cf704d450
4 changed files with 90 additions and 10 deletions
@@ -0,0 +1,6 @@
import QtQuick
// QtObject that allows stuff to be freely declared inside
QtObject {
default property list<QtObject> data
}
@@ -0,0 +1,63 @@
pragma ComponentBehavior: Bound
import QtQml
import QtQuick
import Quickshell.Io
import qs.services
import "../"
NestableObject {
id: root
required property string key
property alias fetching: fetchProc.running
property bool set
property var value
Component.onCompleted: fetch()
Connections {
target: HyprlandConfig
function onReloaded() {
root.fetch();
}
}
function fetch() {
fetchProc.command = fetchProc.baseCommand.concat([root.key]);
fetchProc.running = true;
}
function setValue(newValue) {
HyprlandConfig.set(root.key, newValue)
}
function reset() {
HyprlandConfig.reset(root.key)
}
Process {
id: fetchProc
property list<string> baseCommand: ["hyprctl", "getoption", "-j"]
stdout: StdioCollector {
onStreamFinished: {
if (text == "no such option")
return;
try {
const obj = JSON.parse(text);
// Note that the value is returned as "<data type>": <value>
// It's the only field that isn't always in the same key so we put it in an else
for (const key in obj) {
if (key == "option")
continue;
else if (key == "set")
root.set = obj[key];
else
root.value = obj[key];
}
} catch (e) {
console.log(`[HyprlandConfigOption] Failed to fetch option "${root.key}":\n - Output: ${text.trim()}\n - Error: ${e}`);
}
}
}
}
}
@@ -1,11 +1,12 @@
import QtQuick
import Quickshell.Io
import qs.modules.common.models.hyprland
import qs.services
QuickToggleModel {
id: root
name: Translation.tr("Game mode")
toggled: toggled
toggled: !confOpt.value
icon: "gamepad"
mainAction: () => {
@@ -34,13 +35,11 @@ QuickToggleModel {
]);
}
}
Process {
id: fetchActiveState
running: true
command: ["bash", "-c", `test "$(hyprctl getoption animations:enabled -j | jq ".int")" -ne 0`]
onExited: (exitCode, exitStatus) => {
root.toggled = exitCode !== 0; // Inverted because enabled = nonzero exit
}
HyprlandConfigOption {
id: confOpt
key: "animations:enabled"
}
tooltipText: Translation.tr("Game mode")
}
@@ -3,7 +3,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import Quickshell.Io
import Quickshell.Hyprland
import qs.modules.common
import qs.modules.common.functions
@@ -14,6 +14,8 @@ import qs.modules.common.functions
Singleton {
id: root
signal reloaded()
readonly property string configuratorScriptPath: Quickshell.shellPath("scripts/hyprland/hyprconfigurator.py")
readonly property string shellOverridesPath: FileUtils.trimFileProtocol(`${Directories.config}/hypr/hyprland/shellOverrides/main.conf`)
@@ -39,7 +41,7 @@ Singleton {
])
}
function resetMany(keys: var) {
function resetMany(keys: list<string>) {
let args = ""
for (let i = 0; i < keys.length; i++) {
args += `--reset "${keys[i]}" `
@@ -48,4 +50,14 @@ Singleton {
`${root.configuratorScriptPath} --file ${root.shellOverridesPath} ${args}` //
])
}
Connections {
target: Hyprland
function onRawEvent(event) {
if (event.name == "configreloaded") {
root.reloaded()
}
}
}
}