diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-17 13:12:57 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-17 13:12:57 +0200 |
| commit | 9fad151c2782366a948882e1ae6aa725ed155a18 (patch) | |
| tree | 445431446ed6662ab7c6740eec73f7fff95f7e88 | |
| parent | f114ab947afbca8b301ae5d2fa903667ef200711 (diff) | |
| download | quickshell-9fad151c2782366a948882e1ae6aa725ed155a18.tar.gz quickshell-9fad151c2782366a948882e1ae6aa725ed155a18.zip | |
island: corner position helper for the OBS webcam
| -rw-r--r-- | desktop/island/Logic.js | 8 | ||||
| -rw-r--r-- | desktop/island/test_logic.js | 8 |
2 files changed, 15 insertions, 1 deletions
diff --git a/desktop/island/Logic.js b/desktop/island/Logic.js index 24458cd..e687ac1 100644 --- a/desktop/island/Logic.js +++ b/desktop/island/Logic.js @@ -71,3 +71,11 @@ function obsElapsed(ms) { const mmss = `${two(Math.floor(s / 60) % 60)}:${two(s % 60)}`; return h ? `${h}:${mmss}` : mmss; } + +// Top-left position for a w x h source on a W x H canvas with margin m, in one +// of the four corners. Anything unrecognised reads as top-left. +function cornerPos(corner, W, H, w, h, m) { + const right = corner === "tr" || corner === "br"; + const bottom = corner === "bl" || corner === "br"; + return { x: right ? W - w - m : m, y: bottom ? H - h - m : m }; +} diff --git a/desktop/island/test_logic.js b/desktop/island/test_logic.js index ee237cc..d504c60 100644 --- a/desktop/island/test_logic.js +++ b/desktop/island/test_logic.js @@ -8,7 +8,7 @@ const assert = require("assert"); const src = fs.readFileSync(__dirname + "/Logic.js", "utf8") .replace(/^\.pragma library$/m, ""); const L = new Function(src + - "\nreturn { volumeIcon, vmRole, flagFor, privacyRoles, parseOpenWindow, obsElapsed };")(); + "\nreturn { volumeIcon, vmRole, flagFor, privacyRoles, parseOpenWindow, obsElapsed, cornerPos };")(); // Volume: muted or zero is muted, then thirds. assert.strictEqual(L.volumeIcon(0.5, true), "audio-volume-muted"); @@ -59,4 +59,10 @@ assert.strictEqual(L.obsElapsed(3599999), "59:59"); assert.strictEqual(L.obsElapsed(3661000), "1:01:01"); assert.strictEqual(L.obsElapsed(undefined), "00:00"); +// Corner positions: 1920x1080 canvas, 298x168 webcam, 16px margin. +for (const [c, x, y] of [["tl", 16, 16], ["tr", 1606, 16], ["bl", 16, 896], ["br", 1606, 896]]) + assert.deepStrictEqual(L.cornerPos(c, 1920, 1080, 298, 168, 16), { x, y }); +// An unknown corner reads as top-left, never undefined. +assert.deepStrictEqual(L.cornerPos("xx", 1920, 1080, 298, 168, 16), { x: 16, y: 16 }); + console.log("ok"); |
