[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:
@@ -1848,6 +1848,7 @@ function positionFastOverlay(freqHz, bwHz) {
|
|||||||
function applyLocalTunedFrequency(hz, forceDisplay = false) {
|
function applyLocalTunedFrequency(hz, forceDisplay = false) {
|
||||||
if (!Number.isFinite(hz)) return;
|
if (!Number.isFinite(hz)) return;
|
||||||
const freqChanged = lastFreqHz !== hz;
|
const freqChanged = lastFreqHz !== hz;
|
||||||
|
if (!freqChanged && !forceDisplay) return;
|
||||||
if (freqChanged) {
|
if (freqChanged) {
|
||||||
primaryRds = null;
|
primaryRds = null;
|
||||||
resetRdsDisplay();
|
resetRdsDisplay();
|
||||||
@@ -1873,7 +1874,7 @@ function applyLocalTunedFrequency(hz, forceDisplay = false) {
|
|||||||
}
|
}
|
||||||
// Instant CSS marker repositioning (GPU-composited, no WebGL).
|
// Instant CSS marker repositioning (GPU-composited, no WebGL).
|
||||||
positionFastOverlay(lastFreqHz, currentBandwidthHz);
|
positionFastOverlay(lastFreqHz, currentBandwidthHz);
|
||||||
if (lastSpectrumData) {
|
if (freqChanged && lastSpectrumData) {
|
||||||
scheduleSpectrumDraw();
|
scheduleSpectrumDraw();
|
||||||
}
|
}
|
||||||
positionRdsPsOverlay();
|
positionRdsPsOverlay();
|
||||||
@@ -3058,7 +3059,7 @@ function render(update) {
|
|||||||
if (_freqOptimisticHz != null && Math.abs(sseHz - _freqOptimisticHz) <= 1) {
|
if (_freqOptimisticHz != null && Math.abs(sseHz - _freqOptimisticHz) <= 1) {
|
||||||
_freqOptimisticHz = null; // server confirmed — clear guard early
|
_freqOptimisticHz = null; // server confirmed — clear guard early
|
||||||
}
|
}
|
||||||
applyLocalTunedFrequency(sseHz, true);
|
applyLocalTunedFrequency(sseHz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (update.status && update.status.mode) {
|
if (update.status && update.status.mode) {
|
||||||
@@ -3735,6 +3736,16 @@ freqEl.addEventListener("keydown", (e) => {
|
|||||||
if (e.key === "Enter") {
|
if (e.key === "Enter") {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
applyFreqFromInput();
|
applyFreqFromInput();
|
||||||
|
} else if (e.key === "Escape") {
|
||||||
|
freqDirty = false;
|
||||||
|
refreshFreqDisplay();
|
||||||
|
freqEl.blur();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
freqEl.addEventListener("blur", () => {
|
||||||
|
if (freqDirty) {
|
||||||
|
freqDirty = false;
|
||||||
|
refreshFreqDisplay();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (centerFreqEl) {
|
if (centerFreqEl) {
|
||||||
@@ -3743,6 +3754,16 @@ if (centerFreqEl) {
|
|||||||
if (e.key === "Enter") {
|
if (e.key === "Enter") {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
applyCenterFreqFromInput();
|
applyCenterFreqFromInput();
|
||||||
|
} else if (e.key === "Escape") {
|
||||||
|
centerFreqDirty = false;
|
||||||
|
refreshCenterFreqDisplay();
|
||||||
|
centerFreqEl.blur();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
centerFreqEl.addEventListener("blur", () => {
|
||||||
|
if (centerFreqDirty) {
|
||||||
|
centerFreqDirty = false;
|
||||||
|
refreshCenterFreqDisplay();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
centerFreqEl.addEventListener("wheel", (e) => {
|
centerFreqEl.addEventListener("wheel", (e) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user