From 4b11a5d319d31ac5160bf45e1f678d7af7306ef6 Mon Sep 17 00:00:00 2001 From: jahorton Date: Wed, 6 Mar 2024 15:16:24 +0700 Subject: [PATCH 1/2] fix(ios): selection range sync for long contexts --- web/src/app/webview/src/contextManager.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/web/src/app/webview/src/contextManager.ts b/web/src/app/webview/src/contextManager.ts index 2f6cfd6ae7a..d9ef2c6e52b 100644 --- a/web/src/app/webview/src/contextManager.ts +++ b/web/src/app/webview/src/contextManager.ts @@ -60,18 +60,24 @@ export class ContextHost extends Mock { updateContext(text: string, selStart: number, selEnd: number): boolean { let shouldResetContext = false; - if(text != this.text) { - let tempMock = new Mock(text, selStart ?? text._kmwLength(), selEnd ?? text._kmwLength()); - - let newLeft = tempMock.getTextBeforeCaret(); - let oldLeft = this.getTextBeforeCaret(); + let tempMock = new Mock(text, selStart ?? text._kmwLength(), selEnd ?? text._kmwLength()); + let newLeft = tempMock.getTextBeforeCaret(); + let oldLeft = this.getTextBeforeCaret(); + if(text != this.text) { let unexpectedBeforeCharCount = findCommonSubstringEndIndex(newLeft, oldLeft, true) + 1; shouldResetContext = !!unexpectedBeforeCharCount; } if(shouldResetContext) { this.text = text; + this.selStart = selStart; + this.selEnd = selEnd; + } else { + // Transform selection coordinates to their location within the longform context window. + let delta = oldLeft._kmwLength() - newLeft._kmwLength(); + this.selStart = selStart - delta; + this.selEnd = selEnd - delta; } if(selStart === undefined || selEnd === undefined) { From 3240ee72c0e7ba48fb0797ba34d0368a7f1e1013 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Tue, 12 Mar 2024 23:37:45 +0700 Subject: [PATCH 2/2] fix(ios): hard context resets --- .../Keyman.bundle/Contents/Resources/ios-host.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js index 621e643bb94..d5eb798b67d 100644 --- a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js +++ b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js @@ -287,9 +287,16 @@ function setKeymanContext(text, doSync, selStart, selLength) { let selEnd = selStart + selLength; selEnd = isNaN(selEnd) ? undefined : selEnd; - const shouldReset = keyman.context.updateContext(text, selStart, selEnd); - if(!doSync || shouldReset) { + if(doSync) { + const shouldReset = keyman.context.updateContext(text, selStart, selEnd); + if(shouldReset) { keyman.resetContext(); + } + } else { + // if not in "sync" mode, we have a hard context reset; just full-reset it. + keyman.context.setText(text); + keyman.context.setSelection(selStart, selStart+selLength); + keyman.resetContext(); } }