Eingabe-Eingebungen: Fokus doppelt gebunden ohne Modifikator-Prüfung, gehaltene Zeiger-Eingabe kann hängen bleiben #8
Labels
No labels
accessibility
bug
cleanup
consistency
crash
critical
game-feel
gameplay
high
input
level-generation
low
maintainability
medium
pause
physics
responsive
security
spec-gap
ui
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gilli/pulse-sprint#8
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Eingabe-Eingebungen: Fokus doppelt gebunden ohne Modifikator-Prüfung, gehaltene Zeiger-Eingabe kann hängen bleiben #8"
By gilli — Closed
bug
input
low
1 comments
Behoben in
9cd8ba8(main).Teil 1 – Doppelbindung und Modifikatoren
INPUT.init()ist der einzigekeydown-Listener. Der Fokus liegt inder
KEYMAP(f/F/Shift/ShiftLeft/ShiftRight) und rufthooks.onFocus– denselbenHook, den der Fokus-Button bedient. Der zweite Listener in
boot()entfällt (inkl. seinesTab-Noops), das leselosestate.focusEdgeebenfalls.const chord = ev.ctrlKey || ev.metaKey || ev.altKey;undif (ev.repeat || chord) return;.preventDefault()für Leertaste/Pfeiltasten läuft nur ohneChord, damit
Cmd+P,Strg+S& Co. beim Browser bleiben.Shift(Großbuchstaben erreichen die Keymap überev.key,"S"ist die Rolle – ein Shift-Filter hätte sie verschluckt) und der
keyup-Handler (eine beigedrücktem Shift freigegebene Taste muss ihr Halte-Flag verlieren, sonst entsteht das Klemmen
aus Teil 2 neu).
Gemessen vorher (Fokus-Balken voll, echte Tastaturevents):
Strg+F,Cmd+F,Alt+FsetztenS.focusActive = trueund leerten den Balken;Strg+Mschaltete den Ton von an auf aus. Nachher:keine Reaktion, Balken bleibt voll.
Teil 2 – gehaltene Zeiger-Eingabe
War mit dem gemeinsamen
endPointer(ev, withTap)in5884804(Issue #14) bereits erledigt undist jetzt erstmals eigens gemessen:
pointerup→endPointer(ev, true),pointercancel/pointerleave→endPointer(ev, false)(Halte-Flag des diesen Zeigerszurücksetzen, kein Tap).
Test
tests/browser_issue8.py(intests/run-all.sh), Viewport 1440×760 – nur dort liegt Rand nebender 16:9-Bühne, sonst kann der Zeiger das Spielfeld nicht verlassen. Echte Pointer-/Tastaturevents,
requestAnimationFramestillgelegt, Simulation überPULSE.update(1/120):Strg+F/Cmd+F/Alt+Fkein Fokus,Strg+Mkein Tonwechsel,ev.repeatverbraucht keinGreifen – und unverändert grün:
FundShiftallein lösen Fokus aus,Shift+Srollt,Escapepausiert und setzt fort.jumpHeldendet in dem Augenblick, in dem der Zeiger denCanvas verlässt (Scheitel 203 px statt 229 px Dauerhalt; Kontrolle Kurzhub 165 px), außerhalb
loslassen hinterlässt kein
jumpHeldund keinen halboffenen Zeiger, das nächsteSprung-Kommando meldet
jumpHeld false,pointercancelbricht ohne Tap-Aktion ab.Gegenüberstellung, jeweils mit
PULSE_HTML: gegengit show 9a1fd56:index.html(Stand vor diesemFix) sind 4 Prüfungen rot und nach dem Fix grün; gegen eine Fassung, die
pointercancel/pointerleavezurück auf
delete pointers[ev.pointerId]reduziert, sind 6 Prüfungen rot(
jumpHeld/anyPointerDownbleibentrue, Scheitel 229 = voller Boost).Übrige Suite grün: alle Node-Suiten,
soak.mjs,browser_smoke.py,browser_issue5/7/14.py.browser_flow.pyzeigt wie dokumentiert (AGENTS.md, „Bekannte Test-Unschärfe“) vereinzelt Framesknapp über der Bildraten-Schranke – wechselt zwischen alter und neuer Fassung (3× alternierend:
HEAD 1 Treffer, neue Fassung 1 Treffer), also kein Zusammenhang mit dieser Änderung.
Doku nachgezogen:
AGENTS.md(Invarianten-Abschnitt „Tastatur hat genau einen Eingang“),tests/README.md,tests/run-all.sh.