diff --git a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml index 370944c9d..327f838cc 100644 --- a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml +++ b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml @@ -991,31 +991,27 @@ Singleton { } function initHyprlandSettingsFromConfig(parsedOutputs) { + const importedFields = ["colorManagement", "bitdepth", "sdrBrightness", "sdrSaturation", "supportsWideColor", "supportsHdr", "sdrEotf", "icc", "sdrMinLuminance", "sdrMaxLuminance", "minLuminance", "maxLuminance", "maxAvgLuminance"]; const current = JSON.parse(JSON.stringify(SessionData.hyprlandOutputSettings)); let changed = false; for (const outputName in parsedOutputs) { - const output = parsedOutputs[outputName]; - const settings = output.hyprlandSettings; + const settings = parsedOutputs[outputName]?.hyprlandSettings; if (!settings) continue; if (current[outputName]) continue; - const hasSettings = settings.colorManagement || settings.bitdepth || settings.sdrBrightness !== undefined || settings.sdrSaturation !== undefined; - if (!hasSettings) + const entry = {}; + for (const field of importedFields) { + if (settings[field] !== undefined) + entry[field] = settings[field]; + } + if (Object.keys(entry).length === 0) continue; - current[outputName] = {}; - if (settings.colorManagement) - current[outputName].colorManagement = settings.colorManagement; - if (settings.bitdepth) - current[outputName].bitdepth = settings.bitdepth; - if (settings.sdrBrightness !== undefined) - current[outputName].sdrBrightness = settings.sdrBrightness; - if (settings.sdrSaturation !== undefined) - current[outputName].sdrSaturation = settings.sdrSaturation; + current[outputName] = entry; changed = true; } @@ -1103,9 +1099,9 @@ Singleton { const serial = o.serial || "Unknown"; const id = (o.make + " " + o.model + " " + serial).trim(); liveByIdentifier[id] = true; - liveByIdentifier[o.make + " " + o.model] = true; + liveByIdentifier[(o.make + " " + o.model).trim()] = true; if (CompositorService.isHyprland) - liveByIdentifier[getHyprlandOutputIdentifier(o, name)] = true; + liveByIdentifier[getHyprlandOutputIdentifier(o, name).trim()] = true; } liveByIdentifier[name] = true; } @@ -1254,6 +1250,13 @@ Singleton { "sdrSaturation": hyprLuaField(line, "sdrsaturation"), "supportsWideColor": hyprLuaField(line, "supports_wide_color"), "supportsHdr": hyprLuaField(line, "supports_hdr"), + "sdrEotf": hyprLuaField(line, "sdr_eotf"), + "icc": hyprLuaField(line, "icc"), + "sdrMinLuminance": hyprLuaField(line, "sdr_min_luminance"), + "sdrMaxLuminance": hyprLuaField(line, "sdr_max_luminance"), + "minLuminance": hyprLuaField(line, "min_luminance"), + "maxLuminance": hyprLuaField(line, "max_luminance"), + "maxAvgLuminance": hyprLuaField(line, "max_avg_luminance"), "vrrFullscreenOnly": vrrMode === 2 ? true : undefined }; return { diff --git a/quickshell/Services/HyprlandService.qml b/quickshell/Services/HyprlandService.qml index 803476d0c..7736ebb00 100644 --- a/quickshell/Services/HyprlandService.qml +++ b/quickshell/Services/HyprlandService.qml @@ -183,12 +183,22 @@ Singleton { const settings = hyprlandSettings || SessionData.hyprlandOutputSettings; let lines = ["-- Auto-generated by DMS — do not edit manually", ""]; + const liveIdentifiers = {}; + for (const outputName in outputsData) { + const output = outputsData[outputName]; + if (output?.make && output?.model) + liveIdentifiers[getOutputIdentifier(output, outputName).trim()] = true; + } + for (const outputName in outputsData) { const output = outputsData[outputName]; if (!output) continue; const identifier = getOutputIdentifier(output, outputName); + if (!(output.make && output.model) && liveIdentifiers[identifier.trim()]) + continue; + const outputSettings = settings[identifier] || {}; if (outputSettings.disabled) { @@ -228,6 +238,12 @@ Singleton { if (outputSettings.colorManagement && outputSettings.colorManagement !== "auto") parts.push(`cm = ${luaQuoted(outputSettings.colorManagement)}`); + if (outputSettings.sdrEotf) + parts.push(`sdr_eotf = ${luaQuoted(outputSettings.sdrEotf)}`); + + if (outputSettings.icc) + parts.push(`icc = ${luaQuoted(outputSettings.icc)}`); + if (outputSettings.sdrBrightness !== undefined && outputSettings.sdrBrightness !== 1.0) parts.push(`sdrbrightness = ${Number(outputSettings.sdrBrightness)}`); @@ -240,6 +256,21 @@ Singleton { if (outputSettings.supportsHdr !== undefined) parts.push(`supports_hdr = ${forceFlagValue(outputSettings.supportsHdr)}`); + if (outputSettings.sdrMinLuminance !== undefined) + parts.push(`sdr_min_luminance = ${Number(outputSettings.sdrMinLuminance)}`); + + if (outputSettings.sdrMaxLuminance !== undefined) + parts.push(`sdr_max_luminance = ${Number(outputSettings.sdrMaxLuminance)}`); + + if (outputSettings.minLuminance !== undefined) + parts.push(`min_luminance = ${Number(outputSettings.minLuminance)}`); + + if (outputSettings.maxLuminance !== undefined) + parts.push(`max_luminance = ${Number(outputSettings.maxLuminance)}`); + + if (outputSettings.maxAvgLuminance !== undefined) + parts.push(`max_avg_luminance = ${Number(outputSettings.maxAvgLuminance)}`); + lines.push("hl.monitor({ " + parts.join(", ") + " })"); }