aboutsummaryrefslogtreecommitdiffstats
path: root/desktop
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-17 13:12:57 +0200
committerDanilo M. <danix@danix.xyz>2026-10-17 13:12:57 +0200
commit9fad151c2782366a948882e1ae6aa725ed155a18 (patch)
tree445431446ed6662ab7c6740eec73f7fff95f7e88 /desktop
parentf114ab947afbca8b301ae5d2fa903667ef200711 (diff)
downloadquickshell-9fad151c2782366a948882e1ae6aa725ed155a18.tar.gz
quickshell-9fad151c2782366a948882e1ae6aa725ed155a18.zip
island: corner position helper for the OBS webcam
Diffstat (limited to 'desktop')
-rw-r--r--desktop/island/Logic.js8
-rw-r--r--desktop/island/test_logic.js8
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");