Persist complete monitor layouts
This commit is contained in:
@@ -126,6 +126,16 @@ Singleton {
|
||||
function parse(text: string, generation: int): void {
|
||||
try {
|
||||
const raw = JSON.parse(text);
|
||||
const stored = DesktopPreferences.get("displays");
|
||||
const persisted = stored && typeof stored === "object" ? stored : {};
|
||||
const persistedPrimaries = raw.filter(monitor => {
|
||||
const entry = persisted[monitor.name ?? ""];
|
||||
return root.isPersistedLayoutEntry(entry) && entry.primary === true;
|
||||
});
|
||||
const origin = raw.find(monitor => monitor.x === 0 && monitor.y === 0);
|
||||
const primaryName = persistedPrimaries.length === 1
|
||||
? persistedPrimaries[0].name
|
||||
: (origin?.name ?? raw[0]?.name ?? "");
|
||||
root.monitors = raw.map(monitor => {
|
||||
const modes = root.normaliseModes(monitor.availableModes ?? []);
|
||||
const width = monitor.width ?? 0;
|
||||
@@ -144,6 +154,9 @@ Singleton {
|
||||
mode: current?.mode ?? `${width}x${height}@${refreshRate}`,
|
||||
scale: monitor.scale ?? 1,
|
||||
transform: monitor.transform ?? 0,
|
||||
x: Number.isInteger(monitor.x) ? monitor.x : 0,
|
||||
y: Number.isInteger(monitor.y) ? monitor.y : 0,
|
||||
primary: monitor.name === primaryName,
|
||||
currentFormat: monitor.currentFormat ?? "",
|
||||
colorPreset: monitor.colorManagementPreset ?? "",
|
||||
vrr: monitor.vrr === true,
|
||||
@@ -216,6 +229,17 @@ Singleton {
|
||||
return root.monitors.find(monitor => monitor.name === name) ?? null;
|
||||
}
|
||||
|
||||
function isPersistedLayoutEntry(entry: var): bool {
|
||||
return !!entry && typeof entry === "object"
|
||||
&& root.modeParts(entry.mode) !== null
|
||||
&& Number.isFinite(entry.scale) && entry.scale > 0
|
||||
&& Number.isInteger(entry.transform)
|
||||
&& entry.transform >= 0 && entry.transform <= 3
|
||||
&& Number.isInteger(entry.x) && entry.x >= -100000 && entry.x <= 100000
|
||||
&& Number.isInteger(entry.y) && entry.y >= -100000 && entry.y <= 100000
|
||||
&& typeof entry.primary === "boolean";
|
||||
}
|
||||
|
||||
function modeParts(mode: string): var {
|
||||
const match = String(mode).match(/^(\d+)x(\d+)@(\d+(?:\.\d+)?)$/);
|
||||
if (!match)
|
||||
|
||||
Reference in New Issue
Block a user