[Samenwerken][P1] Elke eigen toetsaanslag remount de editor: focus en cursor weg, bij de gast springt tekst terug #2680
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2680
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?
Symptoom
In een samenwerksessie verliest het veld waarin je typt de focus en de cursorpositie na vrijwel elke toetsaanslag:
Daarnaast wordt het deck bij elke echo als gewijzigd gemarkeerd, en lopen per aanslag drie volledige deck-diffs.
Oorzaak
CollabSessionControllerluistert opsession.deckChanges(lib/collab/collab_session_controller.dart:43). Die stream vuurt ook voor de eigen, net vastgelegde op. Bij de host gebeurt dat inCollabSession._commit(lib/collab/collab_session.dart:133-138), bij de gast via de echo in_onRemoteOp._applySessionDeck(collab_session_controller.dart:74-85) roeptwriteDeck(merged)ook aan alsdeckDiffToOpsleeg is.mergedis dan gewoon het lokale deck.writeDeckisDeckNotifier.applyCollabDeck(lib/state/deck_provider.dart:750-757). Die hoogt altijdrevisionop en zetisDirty.EditorPanelsleutelt zijn hele editorkolom op die revisie:KeyedSubtree(key: ValueKey('editor-rev-$revision'))(lib/widgets/panels/editor_panel.dart:93-94). Elk veld wordt dus opnieuw opgebouwd, met een nieuwe FocusNode en controller.deckDiffToOps(local, sessionDeck)levert dan eenSetSlideFielddie het hele veld terugzet op de oudere waarde (lib/collab/collab_deck_diff.dart:42-58)._applyingRemotewerkt niet voor de deckstream.StateNotifier.streamlevert asynchroon af, dusonLocalEditnaapplyCollabDeckdraait pas als de vlag alweer uit staat. Elke diff loopt over dia's × 109SlideFields, zonder kortsluiting voor ongewijzigde dia's.Voorgestelde oplossing
_applySessionDeck:if (ops.isEmpty) return;. Een echo die niets verandert, schrijft dan niets, verhoogt de revisie niet en maakt het deck niet vuil. Dit alleen lost het hostgeval al op.applyCollabDeck: hoogrevisionalleen op als de samengevoegde wijziging de geselecteerde dia raakt. Velden van andere dia's lezen bij een selectiewissel toch opnieuw. Op termijn kan het beter zonder remount: werk de controller van een veld zonder focus bij, en meld een wijziging in het veld mét focus in plaats van het te overschrijven.deckDiffToOps: zetif (identical(old, slide)) continue;vóór de veldlus.Wat overeind moet blijven
deck_provider.dart:747).test/collab_session_controller_test.dart(echo guard, merge van niet-syncbare velden) blijven groen.Toets
CollabSessionControllermet eenwriteDeck-spion. Eén lokale bewerking bij de host geeft nul aanroepen vanwriteDeck.FocusManager.instance.primaryFocusblijft hetzelfde node en de tekst isabc.abcvóór de echo vanabinnen is. De tekst blijftabc.Gevonden bij codelezing tijdens de vervolginspectie van 31-10-2026. Nog niet in een live sessie nagespeeld.
Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: de bestanden die in de oorzaak van dit issue staan, plus een regressietest.
Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: lib/collab/, lib/state/deck_provider.dart, lib/widgets/panels/editor_panel.dart.
Staat op main in
a6b4dc066(5ca53eed8,6779d989f). Een eigen aanslag schrijft het deck niet terug en hermount de editor niet. Een co-auteur blijft zichtbaar na de eigen echo. Een widgettoets die drie tekens typt en hetzelfde focusknooppunt vasthoudt is niet geschreven.Opgelost op main in
a6b4dc066. De zin „het veld verliest de focus en de cursorpositie na vrijwel elke toetsaanslag“ is gedekt doordat een lege echo niets schrijft (lib/collab/collab_session_controller.dart) en applyCollabDeck de revisie alleen ophoogt als de open dia verandert (lib/state/deck_provider.dart). Niet meegenomen: de widgettoets die drie tekens typt en hetzelfde focusknooppunt vasthoudt. De eenheidstoetsen dekken wel dat de host writeDeck niet aanroept en dat de gast abc houdt.