[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 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-03-27 16:01:08 +00:00
committed by Stan Grams
parent ec0e41fe29
commit 434a7f899d
@@ -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) => {