From 434a7f899dceef80035f1ab2c9ea997558f08b6f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 16:01:08 +0000 Subject: [PATCH] [fix](trx-frontend-http): stop SSE updates from resetting frequency input and causing redundant spectrum redraws SSE status updates called applyLocalTunedFrequency with forceDisplay=true, clearing the freqDirty flag on every update and overwriting user input mid- typing. Remove forceDisplay from SSE path so the dirty flag is respected. Skip applyLocalTunedFrequency entirely when frequency hasn't changed to avoid redundant spectrum redraws and overlay repositioning on every SSE frame. Only trigger scheduleSpectrumDraw when frequency actually changes. Add blur and Escape handlers on frequency inputs to cleanly exit editing mode when the user abandons input. https://claude.ai/code/session_01H2VMATj29FPgR64t9YMdSR Signed-off-by: Claude --- .../trx-frontend-http/assets/web/app.js | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js index be23825..e7e3524 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js @@ -1848,6 +1848,7 @@ function positionFastOverlay(freqHz, bwHz) { function applyLocalTunedFrequency(hz, forceDisplay = false) { if (!Number.isFinite(hz)) return; const freqChanged = lastFreqHz !== hz; + if (!freqChanged && !forceDisplay) return; if (freqChanged) { primaryRds = null; resetRdsDisplay(); @@ -1873,7 +1874,7 @@ function applyLocalTunedFrequency(hz, forceDisplay = false) { } // Instant CSS marker repositioning (GPU-composited, no WebGL). positionFastOverlay(lastFreqHz, currentBandwidthHz); - if (lastSpectrumData) { + if (freqChanged && lastSpectrumData) { scheduleSpectrumDraw(); } positionRdsPsOverlay(); @@ -3058,7 +3059,7 @@ function render(update) { if (_freqOptimisticHz != null && Math.abs(sseHz - _freqOptimisticHz) <= 1) { _freqOptimisticHz = null; // server confirmed — clear guard early } - applyLocalTunedFrequency(sseHz, true); + applyLocalTunedFrequency(sseHz); } } if (update.status && update.status.mode) { @@ -3735,6 +3736,16 @@ freqEl.addEventListener("keydown", (e) => { if (e.key === "Enter") { e.preventDefault(); applyFreqFromInput(); + } else if (e.key === "Escape") { + freqDirty = false; + refreshFreqDisplay(); + freqEl.blur(); + } +}); +freqEl.addEventListener("blur", () => { + if (freqDirty) { + freqDirty = false; + refreshFreqDisplay(); } }); if (centerFreqEl) { @@ -3743,6 +3754,16 @@ if (centerFreqEl) { if (e.key === "Enter") { e.preventDefault(); applyCenterFreqFromInput(); + } else if (e.key === "Escape") { + centerFreqDirty = false; + refreshCenterFreqDisplay(); + centerFreqEl.blur(); + } + }); + centerFreqEl.addEventListener("blur", () => { + if (centerFreqDirty) { + centerFreqDirty = false; + refreshCenterFreqDisplay(); } }); centerFreqEl.addEventListener("wheel", (e) => {