diff --git a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml index ce686dc9..5e7fa4fb 100644 --- a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml +++ b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml @@ -205,6 +205,27 @@ Singleton { const result = {}; const lines = content.split("\n"); for (const line of lines) { + const disableMatch = line.match(/^\s*monitor\s*=\s*([^,]+),\s*disable\s*$/); + if (disableMatch) { + const name = disableMatch[1].trim(); + result[name] = { + "name": name, + "logical": { + "x": 0, + "y": 0, + "scale": 1.0, + "transform": "Normal" + }, + "modes": [], + "current_mode": -1, + "vrr_enabled": false, + "vrr_supported": false, + "hyprlandSettings": { + "disabled": true + } + }; + continue; + } const match = line.match(/^\s*monitor\s*=\s*([^,]+),\s*(\d+)x(\d+)@([\d.]+),\s*(-?\d+)x(-?\d+),\s*([\d.]+)/); if (!match) continue; @@ -842,6 +863,8 @@ Singleton { for (const outputId in pendingHyprlandChanges) { const changes = pendingHyprlandChanges[outputId]; + if (changes.disabled !== undefined) + changeDescriptions.push(outputId + ": " + I18n.tr("Disabled") + " → " + (changes.disabled ? I18n.tr("Yes") : I18n.tr("No"))); if (changes.bitdepth !== undefined) changeDescriptions.push(outputId + ": " + I18n.tr("Bit Depth") + " → " + changes.bitdepth); if (changes.colorManagement !== undefined) diff --git a/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml b/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml index 5018bf58..7c36e4be 100644 --- a/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml +++ b/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml @@ -71,6 +71,13 @@ Column { } property bool isHdrMode: currentCm === "hdr" || currentCm === "hdredid" + DankToggle { + width: parent.width + text: I18n.tr("Disable Output") + checked: DisplayConfigState.getHyprlandSetting(root.outputData, root.outputName, "disabled", false) + onToggled: checked => DisplayConfigState.setHyprlandSetting(root.outputData, root.outputName, "disabled", checked) + } + DankDropdown { width: parent.width text: I18n.tr("Mirror Display") @@ -138,26 +145,26 @@ Column { options: [I18n.tr("Auto (Wide)"), I18n.tr("Wide (BT2020)"), "DCI-P3", "Apple P3", "Adobe RGB", "EDID", "HDR", I18n.tr("HDR (EDID)")] property var cmValueMap: ({ - [I18n.tr("Auto (Wide)")]: "auto", - [I18n.tr("Wide (BT2020)")]: "wide", - "DCI-P3": "dcip3", - "Apple P3": "dp3", - "Adobe RGB": "adobe", - "EDID": "edid", - "HDR": "hdr", - [I18n.tr("HDR (EDID)")]: "hdredid" - }) + [I18n.tr("Auto (Wide)")]: "auto", + [I18n.tr("Wide (BT2020)")]: "wide", + "DCI-P3": "dcip3", + "Apple P3": "dp3", + "Adobe RGB": "adobe", + "EDID": "edid", + "HDR": "hdr", + [I18n.tr("HDR (EDID)")]: "hdredid" + }) property var cmLabelMap: ({ - "auto": I18n.tr("Auto (Wide)"), - "wide": I18n.tr("Wide (BT2020)"), - "dcip3": "DCI-P3", - "dp3": "Apple P3", - "adobe": "Adobe RGB", - "edid": "EDID", - "hdr": "HDR", - "hdredid": I18n.tr("HDR (EDID)") - }) + "auto": I18n.tr("Auto (Wide)"), + "wide": I18n.tr("Wide (BT2020)"), + "dcip3": "DCI-P3", + "dp3": "Apple P3", + "adobe": "Adobe RGB", + "edid": "EDID", + "hdr": "HDR", + "hdredid": I18n.tr("HDR (EDID)") + }) onValueChanged: value => { const cmValue = cmValueMap[value] || "auto"; diff --git a/quickshell/Services/HyprlandService.qml b/quickshell/Services/HyprlandService.qml index 223b4891..02725597 100644 --- a/quickshell/Services/HyprlandService.qml +++ b/quickshell/Services/HyprlandService.qml @@ -35,6 +35,11 @@ Singleton { const identifier = getOutputIdentifier(output, outputName); const outputSettings = settings[identifier] || {}; + if (outputSettings.disabled) { + lines.push("monitor = " + identifier + ", disable"); + continue; + } + let resolution = "preferred"; if (output.modes && output.current_mode !== undefined) { const mode = output.modes[output.current_mode]; @@ -73,10 +78,7 @@ Singleton { lines.push(monitorLine); - const needsMonitorv2 = outputSettings.supportsHdr || outputSettings.supportsWideColor || - outputSettings.sdrMinLuminance !== undefined || outputSettings.sdrMaxLuminance !== undefined || - outputSettings.minLuminance !== undefined || outputSettings.maxLuminance !== undefined || - outputSettings.maxAvgLuminance !== undefined; + const needsMonitorv2 = outputSettings.supportsHdr || outputSettings.supportsWideColor || outputSettings.sdrMinLuminance !== undefined || outputSettings.sdrMaxLuminance !== undefined || outputSettings.minLuminance !== undefined || outputSettings.maxLuminance !== undefined || outputSettings.maxAvgLuminance !== undefined; if (needsMonitorv2) { let block = "monitorv2 {\n";