displays: round-trip hyprland HDR metadata and dedupe whitespace-duplicated outputs

fixes #3221
fixes #3219
This commit is contained in:
bbedward committed 2026-08-29 15:24:34 -04:00
1 parent f29a48f681
commit 6ce86a07a5
2 files changed
+49 -15

No files matched your search

@@ -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 {
+31
View File
@@ -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(", ") + " })");
}