Files
Panama/config/dot/quickshell/display-arrangement-harness.qml
T

112 lines
3.9 KiB
QML

import Quickshell
import Quickshell.Io
import QtQuick
import qs.modules.settings
import qs.services
ShellRoot {
DisplayIdentify {}
QtObject {
id: fixtureService
property var monitors: [
{
name: "DP-2", description: "Primary display", width: 4500, height: 3000,
refreshRate: 60, mode: "[email protected]", scale: 1.5,
transform: 0, x: 0, y: 0, primary: true
},
{
name: "HDMI-A-1", description: "Second display", width: 2560, height: 1440,
refreshRate: 60, mode: "[email protected]", scale: 1,
transform: 0, x: 3000, y: 0, primary: false
}
]
property var applied: []
function currentLayout(): var {
return monitors.map(record => Object.assign({}, record));
}
function applyLayout(layout: var): bool {
applied = layout.map(record => Object.assign({}, record));
return true;
}
}
DisplayArrangement {
id: arrangement
width: 800
displayService: fixtureService
selectedOutput: "HDMI-A-1"
}
IpcHandler {
target: "display-arrangement-test"
function status(width: int): string {
arrangement.width = width;
arrangement.resetDraft();
return JSON.stringify(arrangement.canvasSnapshot());
}
function dragFixture(): string {
arrangement.resetDraft();
arrangement.setDraftPosition("HDMI-A-1", 3016, 0, true);
arrangement.applyDraft();
return JSON.stringify(fixtureService.applied);
}
function keyboardFixture(): string {
arrangement.resetDraft();
arrangement.nudge("HDMI-A-1", -10, 0);
const afterArrow = arrangement.draftLayout.find(record => record.name === "HDMI-A-1").x;
arrangement.nudge("HDMI-A-1", -100, 0);
const afterShiftArrow = arrangement.draftLayout.find(record => record.name === "HDMI-A-1").x;
return JSON.stringify({ afterArrow, afterShiftArrow });
}
function primaryFixture(): string {
arrangement.resetDraft();
arrangement.makePrimary("HDMI-A-1");
return JSON.stringify(fixtureService.applied.map(record => ({
name: record.name, x: record.x, y: record.y, primary: record.primary
})));
}
// One display is the common case on a laptop, and the canvas is the
// page's hero now: it renders that display rather than disappearing and
// leaving a picker for a list of one. Only dragging goes away, because
// there is nothing to arrange it against.
function soloFixture(): string {
const previous = fixtureService.monitors;
fixtureService.monitors = [previous[0]];
arrangement.resetDraft();
const snapshot = arrangement.canvasSnapshot();
fixtureService.monitors = previous;
arrangement.resetDraft();
return JSON.stringify(snapshot);
}
// A mirrored display has no position of its own -- the compositor puts
// it on top of its target -- so the canvas stacks it there and says so
// rather than drawing it wherever its stale coordinates point.
function mirrorFixture(): string {
const previous = fixtureService.monitors;
fixtureService.monitors = [
previous[0],
Object.assign({}, previous[1], { mirrorOf: "DP-2" })
];
arrangement.resetDraft();
const snapshot = arrangement.canvasSnapshot();
fixtureService.monitors = previous;
arrangement.resetDraft();
return JSON.stringify(snapshot);
}
function identify(): void { Displays.identify(); }
function identifying(): bool { return Displays.identifying; }
}
}