diff --git a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml index 82221e7d..6f163cc9 100644 --- a/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml +++ b/quickshell/Modules/Settings/DisplayConfig/DisplayConfigState.qml @@ -10,7 +10,7 @@ import qs.Services Singleton { id: root - readonly property bool hasOutputBackend: WlrOutputService.wlrOutputAvailable + readonly property bool hasOutputBackend: WlrOutputService.wlrOutputAvailable readonly property var wlrOutputs: WlrOutputService.outputs property var outputs: ({}) property var savedOutputs: ({}) @@ -238,6 +238,11 @@ Singleton { if (sdrSaturationMatch) sdrSaturation = parseFloat(sdrSaturationMatch[1]); + let mirror = ""; + const mirrorMatch = rest.match(/,\s*mirror,\s*([^,\s]+)/); + if (mirrorMatch) + mirror = mirrorMatch[1]; + result[name] = { "name": name, "logical": { @@ -261,7 +266,8 @@ Singleton { "colorManagement": cm, "sdrBrightness": sdrBrightness, "sdrSaturation": sdrSaturation - } + }, + "mirror": mirror }; } return result; @@ -573,6 +579,8 @@ Singleton { result[outputName].logical.transform = changes.transform; if (changes.vrr !== undefined) result[outputName].vrr_enabled = changes.vrr; + if (changes.mirror !== undefined) + result[outputName].mirror = changes.mirror; } return normalizeOutputPositions(result); } diff --git a/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml b/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml index 1a1085bd..e0ba4ea0 100644 --- a/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml +++ b/quickshell/Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml @@ -71,6 +71,34 @@ Column { } property bool isHdrMode: currentCm === "hdr" || currentCm === "hdredid" + DankDropdown { + width: parent.width + text: I18n.tr("Mirror Display") + addHorizontalPadding: true + + property var otherOutputs: { + const list = [I18n.tr("None")]; + for (const name in DisplayConfigState.outputs) { + if (name !== root.outputName) + list.push(name); + } + return list; + } + options: otherOutputs + + currentValue: { + DisplayConfigState.pendingChanges; + const pending = DisplayConfigState.getPendingValue(root.outputName, "mirror"); + const val = pending !== undefined ? pending : (root.outputData.mirror || ""); + return val === "" ? I18n.tr("None") : val; + } + + onValueChanged: value => { + const realVal = value === I18n.tr("None") ? "" : value; + DisplayConfigState.setPendingChange(root.outputName, "mirror", realVal); + } + } + DankToggle { width: parent.width text: I18n.tr("10-bit Color") diff --git a/quickshell/Services/HyprlandService.qml b/quickshell/Services/HyprlandService.qml index 17c05453..223b4891 100644 --- a/quickshell/Services/HyprlandService.qml +++ b/quickshell/Services/HyprlandService.qml @@ -56,6 +56,9 @@ Singleton { if (output.vrr_supported && output.vrr_enabled) monitorLine += ", vrr, 1"; + if (output.mirror && output.mirror.length > 0) + monitorLine += ", mirror, " + output.mirror; + if (outputSettings.bitdepth && outputSettings.bitdepth !== 8) monitorLine += ", bitdepth, " + outputSettings.bitdepth;