pragma Singleton pragma ComponentBehavior: Bound import QtQuick import Quickshell import qs.Common import qs.Services Singleton { id: root property var status: ({}) // outputName -> ICCStatus {path, description, version, colorSpace, hasVCGT, active} property var outputNames: [] // list of all available output names property var outputTemps: ({}) // outputName -> color temperature (K) // statusChanged signal is auto-generated by the status property Connections { target: DMSService function onCapabilitiesReceived() { requestStatus() } function onConnectionStateChanged() { if (DMSService.isConnected) { requestStatus() return } status = ({}) outputNames = [] outputTemps = ({}) } function onGammaStateUpdate(data) { if (!data) return if (data.iccProfiles) status = data.iccProfiles if (data.outputTemps) outputTemps = data.outputTemps if (data.outputs) outputNames = data.outputs } } Component.onCompleted: { if (DMSService.dmsAvailable) { requestStatus() } } function requestStatus() { if (!DMSService.isConnected) return DMSService.sendRequest("wayland.icc.getStatus", null, response => { if (!response.result) return status = response.result.profiles || ({}) outputNames = response.result.outputs || [] }) DMSService.sendRequest("wayland.icc.getTemps", null, response => { if (response.result) outputTemps = response.result }) } function applyICC(outputName, iccPath) { DMSService.sendRequest("wayland.icc.apply", { "output": outputName, "path": iccPath }, response => { if (response.error) { ToastService.showError(I18n.tr("ICC Error", "Toast title when an ICC IPC request fails"), response.error) return } ToastService.showInfo(I18n.tr("ICC profile applied to %1", "Toast confirming an ICC profile was applied to an output").arg(outputName)) requestStatus() }) } function removeICC(outputName) { DMSService.sendRequest("wayland.icc.remove", { "output": outputName }, response => { if (response.error) { ToastService.showError(I18n.tr("ICC Error", "Toast title when an ICC IPC request fails"), response.error) return } ToastService.showInfo(I18n.tr("ICC profile removed from %1", "Toast confirming an ICC profile was removed from an output").arg(outputName)) requestStatus() }) } function setOutputTemp(outputName, temp) { DMSService.sendRequest("wayland.icc.setTemp", { "output": outputName, "temp": temp }, response => { if (response.error) { ToastService.showError(I18n.tr("Color Temperature Error", "Toast title when setting a per-output color temperature fails"), response.error) return } requestStatus() }) } }