From 9e4038f06835a18b275291f1159cb29eb4473277 Mon Sep 17 00:00:00 2001 From: SaneSanders <129727118+SaneSanders@users.noreply.github.com> Date: Thu, 24 Sep 2026 22:31:46 +0300 Subject: [PATCH] fix(canvas): stop the layer-order render loop during region drag --- src/renderer/src/features/workspace/canvasStacking.ts | 4 ++-- tests/canvas-stacking.test.mjs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/features/workspace/canvasStacking.ts b/src/renderer/src/features/workspace/canvasStacking.ts index bf9415c6..4a8ee179 100644 --- a/src/renderer/src/features/workspace/canvasStacking.ts +++ b/src/renderer/src/features/workspace/canvasStacking.ts @@ -1,7 +1,7 @@ import type { CameraState, SessionBounds } from "../../../../shared/contracts"; export function reconcileCanvasLayerOrder( - current: readonly string[], + current: string[], active: readonly string[] ): string[] { const activeSet = new Set(active); @@ -9,7 +9,7 @@ export function reconcileCanvasLayerOrder( for (const id of active) { if (!next.includes(id)) next.push(id); } - return next; + return next.length === current.length && next.every((id, index) => id === current[index]) ? current : next; } export function bringCanvasLayerToFront(current: readonly string[], id: string): string[] { diff --git a/tests/canvas-stacking.test.mjs b/tests/canvas-stacking.test.mjs index 804ded57..2329bc0a 100644 --- a/tests/canvas-stacking.test.mjs +++ b/tests/canvas-stacking.test.mjs @@ -32,6 +32,12 @@ test("layer reconciliation keeps user order and appends only new live windows", ); }); +test("an unchanged layer order reconciles to the same array", () => { + const order = ["browser", "terminal:a", "note:n"]; + assert.equal(reconcileCanvasLayerOrder(order, ["note:n", "terminal:a", "browser"]), order); + assert.notEqual(reconcileCanvasLayerOrder(order, ["terminal:a", "browser"]), order); +}); + test("the native Browser surface is hidden only under a higher overlapping layer", () => { const map = new Map([ ["browser", bounds(0, 0)],